From 774ccf1be5f88bf0f1a685e5ee2cc834c932ebc7 Mon Sep 17 00:00:00 2001 From: Ammar Abou Zor Date: Fri, 22 May 2026 12:32:57 +0200 Subject: [PATCH 01/10] Remove legacy electron based application * Remove all electron legacy application parts * Remove development cli tool as it's not needed anymore * Remove development ruby scripts as they are not needed anymore as well * Remove electron related code from stypes --- application/apps/indexer/Cargo.lock | 544 +- .../indexer/addons/shell-tools/Cargo.toml | 2 +- .../apps/indexer/gui/application/Cargo.toml | 2 +- .../gui/application/data}/icons/ico/icon.ico | Bin .../gui/application/data}/icons/png/128.png | Bin .../gui/application/data}/icons/png/16.png | Bin .../gui/application/data}/icons/png/24.png | Bin .../gui/application/data}/icons/png/256.png | Bin .../gui/application/data}/icons/png/32.png | Bin .../gui/application/data}/icons/png/512.png | Bin .../gui/application/data}/icons/png/64.png | Bin .../gui/application/data}/icons/png/icon.png | Bin .../application/data}/linux/chipmunk.desktop | 0 .../gui/application/data}/linux/chipmunk.png | Bin .../gui/application/data}/mac/chipmunk.icns | Bin .../data}/mac/entitlements.mac.plist | 0 .../gui/application/data}/win/chipmunk.ico | Bin .../gui/application/src/common/app_info.rs | 2 +- .../apps/indexer/plugins_host/Cargo.toml | 3 +- application/apps/indexer/processor/Cargo.toml | 2 +- application/apps/indexer/session/Cargo.toml | 3 +- .../apps/indexer/session/src/operations.rs | 2 +- application/apps/indexer/sources/Cargo.toml | 2 +- application/apps/indexer/stypes/Cargo.toml | 42 +- .../indexer/stypes/bindings/attachment.ts | 42 - .../apps/indexer/stypes/bindings/callback.ts | 61 - .../apps/indexer/stypes/bindings/command.ts | 159 - .../apps/indexer/stypes/bindings/dlt.ts | 28 - .../apps/indexer/stypes/bindings/error.ts | 33 - .../apps/indexer/stypes/bindings/index.ts | 16 - .../indexer/stypes/bindings/lf_transition.ts | 23 - .../indexer/stypes/bindings/miscellaneous.ts | 105 - .../apps/indexer/stypes/bindings/observe.ts | 185 - .../indexer/stypes/bindings/operations.ts | 48 - .../apps/indexer/stypes/bindings/plugins.ts | 241 - .../apps/indexer/stypes/bindings/progress.ts | 43 - application/apps/indexer/stypes/generate.sh | 23 - .../apps/indexer/stypes/src/attachment/mod.rs | 19 - .../indexer/stypes/src/attachment/nodejs.rs | 4 - .../indexer/stypes/src/attachment/proptest.rs | 65 - .../apps/indexer/stypes/src/callback/mod.rs | 27 - .../indexer/stypes/src/callback/nodejs.rs | 4 - .../indexer/stypes/src/callback/proptest.rs | 85 - .../indexer/stypes/src/command/dltstat/mod.rs | 17 - .../stypes/src/command/dltstat/nodejs.rs | 4 - .../stypes/src/command/dltstat/proptest.rs | 67 - .../indexer/stypes/src/command/folders/mod.rs | 29 - .../stypes/src/command/folders/nodejs.rs | 6 - .../stypes/src/command/folders/proptest.rs | 124 - .../apps/indexer/stypes/src/command/mod.rs | 8 - .../apps/indexer/stypes/src/command/nodejs.rs | 18 - .../stypes/src/command/profiles/converting.rs | 13 - .../stypes/src/command/profiles/mod.rs | 23 - .../stypes/src/command/profiles/nodejs.rs | 5 - .../stypes/src/command/profiles/proptest.rs | 54 - .../indexer/stypes/src/command/proptest.rs | 195 - .../indexer/stypes/src/command/serial/mod.rs | 9 - .../stypes/src/command/serial/proptest.rs | 21 - .../apps/indexer/stypes/src/command/ts.rs | 146 - .../apps/indexer/stypes/src/error/mod.rs | 30 - .../apps/indexer/stypes/src/error/nodejs.rs | 6 - .../apps/indexer/stypes/src/error/proptest.rs | 128 - .../indexer/stypes/src/lf_transition/mod.rs | 11 - .../stypes/src/lf_transition/nodejs.rs | 3 - .../stypes/src/lf_transition/proptest.rs | 28 - application/apps/indexer/stypes/src/lib.rs | 112 +- .../indexer/stypes/src/miscellaneous/mod.rs | 87 - .../stypes/src/miscellaneous/nodejs.rs | 12 - .../stypes/src/miscellaneous/proptest.rs | 202 - application/apps/indexer/stypes/src/nodejs.rs | 25 - .../apps/indexer/stypes/src/observe/mod.rs | 85 - .../apps/indexer/stypes/src/observe/nodejs.rs | 14 - .../indexer/stypes/src/observe/proptest.rs | 284 - .../apps/indexer/stypes/src/operations/mod.rs | 73 +- .../indexer/stypes/src/operations/nodejs.rs | 12 - .../indexer/stypes/src/operations/proptest.rs | 166 - .../apps/indexer/stypes/src/plugins/mod.rs | 151 - .../apps/indexer/stypes/src/plugins/nodejs.rs | 21 - .../indexer/stypes/src/plugins/proptest.rs | 432 - .../apps/indexer/stypes/src/progress/mod.rs | 28 - .../indexer/stypes/src/progress/nodejs.rs | 5 - .../indexer/stypes/src/progress/proptest.rs | 71 - application/apps/indexer/stypes/src/tests.rs | 231 - .../apps/indexer/tools/extend/.gitignore | 1 - .../apps/indexer/tools/extend/Cargo.toml | 15 - .../apps/indexer/tools/extend/src/lib.rs | 75 - application/apps/protocol/.gitignore | 4 - application/apps/protocol/Cargo.toml | 17 - application/apps/protocol/src/err.rs | 34 - application/apps/protocol/src/generate.rs | 106 - application/apps/protocol/src/lib.rs | 208 - application/apps/protocol/test.sh | 35 - .../apps/rustcore/rs-bindings/Cargo.lock | 4585 ------- .../apps/rustcore/rs-bindings/Cargo.toml | 50 - .../apps/rustcore/rs-bindings/build.rs | 3 - .../apps/rustcore/rs-bindings/log4rs.yaml | 47 - .../apps/rustcore/rs-bindings/rustfmt.toml | 1 - .../rs-bindings/src/js/converting/concat.rs | 46 - .../rs-bindings/src/js/converting/filter.rs | 72 - .../rs-bindings/src/js/converting/mod.rs | 2 - .../rustcore/rs-bindings/src/js/jobs/mod.rs | 351 - .../apps/rustcore/rs-bindings/src/js/mod.rs | 3 - .../rs-bindings/src/js/session/mod.rs | 767 -- .../src/js/session/progress_tracker.rs | 69 - .../apps/rustcore/rs-bindings/src/lib.rs | 21 - .../apps/rustcore/rs-bindings/src/logging.rs | 177 - .../apps/rustcore/ts-bindings/.eslintrc.json | 30 - .../apps/rustcore/ts-bindings/.yarnrc.yml | 1 - .../rustcore/ts-bindings/eslint.config.mjs | 51 - .../apps/rustcore/ts-bindings/launch.json | 18 - .../apps/rustcore/ts-bindings/package.json | 45 - .../spec/_session.benchmark.spec.ts | 319 - .../rustcore/ts-bindings/spec/benchmarks.json | 52 - .../apps/rustcore/ts-bindings/spec/common.ts | 281 - .../apps/rustcore/ts-bindings/spec/config.ts | 115 - .../ts-bindings/spec/config_benchmarks.ts | 53 - .../rustcore/ts-bindings/spec/defaults.json | 290 - .../apps/rustcore/ts-bindings/spec/logger.ts | 101 - .../apps/rustcore/ts-bindings/spec/runners.ts | 143 - .../ts-bindings/spec/session.cancel.spec.ts | 181 - .../ts-bindings/spec/session.concat.spec.ts | 228 - .../ts-bindings/spec/session.errors.spec.ts | 335 - .../spec/session.exporting.spec.ts | 1311 -- .../ts-bindings/spec/session.extract.spec.ts | 148 - .../ts-bindings/spec/session.indexes.spec.ts | 259 - .../ts-bindings/spec/session.jobs.spec.ts | 270 - .../ts-bindings/spec/session.map.spec.ts | 523 - .../ts-bindings/spec/session.observe.spec.ts | 796 -- .../spec/session.observing.spec.ts | 462 - .../ts-bindings/spec/session.promises.spec.ts | 334 - .../ts-bindings/spec/session.protocol.spec.ts | 358 - .../ts-bindings/spec/session.ranges.spec.ts | 100 - .../ts-bindings/spec/session.search.spec.ts | 845 -- .../ts-bindings/spec/session.stream.spec.ts | 488 - .../ts-bindings/spec/session.values.spec.ts | 140 - .../rustcore/ts-bindings/spec/setup_config.sh | 8 - .../ts-bindings/spec/support/jasmine.json | 7 - .../rustcore/ts-bindings/spec/tests.notes.md | 85 - .../rustcore/ts-bindings/spec/tsconfig.json | 27 - .../api/executors/executor.async.results.ts | 167 - .../executor.async.void.confirmed.ts | 189 - .../ts-bindings/src/api/executors/executor.ts | 15 - .../src/api/executors/session.executors.ts | 5 - .../api/executors/session.sleep.executor.ts | 51 - .../api/executors/session.stream.executors.ts | 21 - .../session.stream.export.executor.ts | 46 - .../session.stream.export_raw.executor.ts | 44 - .../session.stream.extract.executor.ts | 101 - .../session.stream.get_values.executor.ts | 62 - .../executors/session.stream.map.executor.ts | 74 - .../session.stream.nearest.executor.ts | 50 - .../session.stream.observe.executor.ts | 35 - .../session.stream.search.executor.ts | 39 - .../session.stream.searchvalues.executor.ts | 24 - .../src/api/executors/single.task.extract.ts | 22 - .../src/api/executors/single.task.search.ts | 22 - .../src/api/executors/single.task.ts | 90 - .../src/api/executors/single.task.values.ts | 21 - .../apps/rustcore/ts-bindings/src/api/jobs.ts | 382 - .../ts-bindings/src/api/session.provider.ts | 226 - .../ts-bindings/src/api/session.search.ts | 126 - .../ts-bindings/src/api/session.stream.ts | 121 - .../rustcore/ts-bindings/src/api/session.ts | 515 - .../ts-bindings/src/api/tracker.provider.ts | 106 - .../rustcore/ts-bindings/src/api/tracker.ts | 84 - .../apps/rustcore/ts-bindings/src/index.ts | 31 - .../ts-bindings/src/interfaces/debug.ts | 6 - .../ts-bindings/src/interfaces/errors.ts | 230 - .../ts-bindings/src/interfaces/index.ts | 1 - .../ts-bindings/src/native/native.jobs.ts | 248 - .../src/native/native.session.required.ts | 15 - .../ts-bindings/src/native/native.session.ts | 1206 -- .../ts-bindings/src/native/native.tracker.ts | 7 - .../rustcore/ts-bindings/src/native/native.ts | 38 - .../ts-bindings/src/native/remarks.txt | 52 - .../src/provider/provider.errors.ts | 9 - .../src/provider/provider.general.ts | 1 - .../ts-bindings/src/provider/provider.ts | 314 - .../src/services/service.production.ts | 19 - .../rustcore/ts-bindings/src/util/numbers.ts | 6 - .../rustcore/ts-bindings/src/util/units.ts | 53 - .../apps/rustcore/ts-bindings/tsconfig.json | 27 - .../apps/rustcore/ts-bindings/yarn.lock | 4218 ------- .../apps/rustcore/wasm-bindings/.gitignore | 4 - .../apps/rustcore/wasm-bindings/.yarnrc.yml | 1 - .../apps/rustcore/wasm-bindings/Cargo.lock | 465 - .../apps/rustcore/wasm-bindings/Cargo.toml | 19 - .../apps/rustcore/wasm-bindings/karma.conf.js | 71 - .../apps/rustcore/wasm-bindings/package.json | 30 - .../rustcore/wasm-bindings/spec/ansi.spec.ts | 28 - .../wasm-bindings/spec/filter.spec.ts | 51 - .../wasm-bindings/spec/matcher.spec.ts | 152 - .../apps/rustcore/wasm-bindings/src/ansi.rs | 244 - .../apps/rustcore/wasm-bindings/src/filter.rs | 84 - .../apps/rustcore/wasm-bindings/src/lib.rs | 3 - .../rustcore/wasm-bindings/src/matcher.rs | 334 - .../apps/rustcore/wasm-bindings/tsconfig.json | 21 - .../rustcore/wasm-bindings/webpack.config.js | 36 - .../apps/rustcore/wasm-bindings/yarn.lock | 5821 --------- application/client/.yarnrc.yml | 1 - application/client/angular.json | 130 - application/client/eslint.config.mjs | 51 - application/client/package.json | 62 - application/client/src/app/app.component.html | 1 - application/client/src/app/app.component.less | 0 application/client/src/app/app.component.ts | 33 - application/client/src/app/app.module.ts | 25 - .../src/app/env/decorators/component.ts | 132 - .../client/src/app/env/decorators/initial.ts | 38 - application/client/src/app/env/fsstorage.ts | 38 - application/client/src/app/env/logs/index.ts | 48 - application/client/src/app/env/reflect.ts | 33 - application/client/src/app/env/storage.ts | 24 - .../src/app/env/storages/recent/item.ts | 76 - .../src/app/env/storages/recent/list.ts | 158 - application/client/src/app/env/str.ts | 16 - .../client/src/app/env/urlfilereader.ts | 49 - .../client/src/app/loader/controllers.ts | 4 - application/client/src/app/loader/init.ts | 17 - application/client/src/app/loader/services.ts | 7 - application/client/src/app/loader/system.ts | 6 - application/client/src/app/loader/wasm.ts | 36 - application/client/src/app/module/ansi.ts | 49 - application/client/src/app/module/ipc.ts | 98 - .../client/src/app/module/matcher/holder.ts | 11 - .../client/src/app/module/matcher/index.ts | 2 - .../client/src/app/module/matcher/matchee.ts | 73 - application/client/src/app/module/util.ts | 15 - .../client/src/app/register/services.ts | 169 - .../client/src/app/schema/content/row.ts | 396 - application/client/src/app/schema/ids.ts | 14 - .../client/src/app/schema/render/columns.ts | 339 - .../client/src/app/schema/render/dlt.ts | 80 - .../client/src/app/schema/render/index.ts | 23 - .../client/src/app/schema/render/plugin.ts | 59 - .../client/src/app/schema/render/someip.ts | 75 - .../client/src/app/schema/render/text.ts | 8 - .../client/src/app/schema/render/tools.ts | 57 - application/client/src/app/service/actions.ts | 420 - .../client/src/app/service/actions/about.ts | 33 - .../client/src/app/service/actions/action.ts | 6 - .../client/src/app/service/actions/exit.ts | 34 - .../service/actions/export.session.state.ts | 42 - .../src/app/service/actions/file.any.ts | 84 - .../src/app/service/actions/file.dlt.ts | 46 - .../app/service/actions/file.parserPlugin.ts | 51 - .../src/app/service/actions/file.pcap.ts | 44 - .../src/app/service/actions/file.pcapng.ts | 44 - .../src/app/service/actions/file.plugins.ts | 51 - .../src/app/service/actions/file.text.ts | 42 - .../client/src/app/service/actions/find.ts | 25 - .../src/app/service/actions/folder.any.ts | 86 - .../src/app/service/actions/folder.dlt.ts | 54 - .../service/actions/folder.parserPlugin.ts | 60 - .../src/app/service/actions/folder.pcap.ts | 51 - .../src/app/service/actions/folder.pcapng.ts | 51 - .../src/app/service/actions/folder.plugins.ts | 60 - .../src/app/service/actions/folder.text.ts | 53 - .../client/src/app/service/actions/help.ts | 32 - .../service/actions/import.session.state.ts | 48 - .../client/src/app/service/actions/index.ts | 109 - .../client/src/app/service/actions/jumpto.ts | 39 - .../app/service/actions/plugins_manager.ts | 31 - .../service/actions/serial.parserPlugin.ts | 24 - .../src/app/service/actions/serial.text.ts | 24 - .../src/app/service/actions/settings.ts | 32 - .../src/app/service/actions/stdout.plugin.ts | 23 - .../src/app/service/actions/stdout.text.ts | 24 - .../client/src/app/service/actions/storage.ts | 110 - .../client/src/app/service/actions/tcp.dlt.ts | 24 - .../app/service/actions/tcp.parserPlugin.ts | 24 - .../src/app/service/actions/theme.dark.ts | 21 - .../src/app/service/actions/theme.light.ts | 21 - .../client/src/app/service/actions/udp.dlt.ts | 24 - .../app/service/actions/udp.parserPlugin.ts | 24 - .../client/src/app/service/actions/updates.ts | 46 - application/client/src/app/service/api.ts | 29 - .../src/app/service/api/transport/electron.ts | 516 - application/client/src/app/service/bridge.ts | 793 -- .../client/src/app/service/changelogs.ts | 39 - application/client/src/app/service/cli.ts | 80 - .../client/src/app/service/cli/index.ts | 3 - .../client/src/app/service/cli/multi_files.ts | 20 - .../client/src/app/service/cli/observe.ts | 63 - .../client/src/app/service/cli/search.ts | 36 - application/client/src/app/service/env.ts | 57 - .../client/src/app/service/favorites.ts | 257 - application/client/src/app/service/history.ts | 93 - .../service/history/collection.bookmarks.ts | 69 - .../app/service/history/collection.charts.ts | 83 - .../service/history/collection.disabled.ts | 67 - .../app/service/history/collection.filters.ts | 86 - .../src/app/service/history/collection.ts | 77 - .../src/app/service/history/collections.ts | 404 - .../app/service/history/definition.concat.ts | 59 - .../app/service/history/definition.file.ts | 94 - .../app/service/history/definition.stream.ts | 59 - .../src/app/service/history/definition.ts | 240 - .../src/app/service/history/definitions.ts | 21 - .../src/app/service/history/provider.ts | 205 - .../client/src/app/service/history/session.ts | 221 - .../service/history/storage.collections.ts | 175 - .../service/history/storage.definitions.ts | 62 - .../src/app/service/history/suitable.ts | 69 - application/client/src/app/service/hotkeys.ts | 328 - .../client/src/app/service/hotkeys/emitter.ts | 102 - .../src/app/service/hotkeys/listener.ts | 103 - application/client/src/app/service/ilc.ts | 234 - .../service/ilc/declarations/backend/job.ts | 6 - .../service/ilc/declarations/backend/state.ts | 9 - .../service/ilc/declarations/contextmenu.ts | 1 - .../app/service/ilc/declarations/hotkey.ts | 27 - .../src/app/service/ilc/declarations/index.ts | 9 - .../src/app/service/ilc/declarations/popup.ts | 1 - .../app/service/ilc/declarations/sidebar.ts | 2 - .../app/service/ilc/declarations/toolbar.ts | 2 - .../app/service/ilc/declarations/ui/index.ts | 1 - .../app/service/ilc/declarations/ui/rank.ts | 4 - .../src/app/service/ilc/events.channel.ts | 161 - .../src/app/service/ilc/events.emitter.ts | 155 - .../client/src/app/service/ilc/events.ts | 158 - .../client/src/app/service/ilc/services.ts | 93 - application/client/src/app/service/jobs.ts | 79 - .../client/src/app/service/jobs/job.ts | 55 - application/client/src/app/service/plugins.ts | 167 - application/client/src/app/service/recent.ts | 112 - .../client/src/app/service/recent/action.ts | 184 - .../src/app/service/recent/compatibility.ts | 110 - .../client/src/app/service/recent/stat.ts | 79 - application/client/src/app/service/session.ts | 395 - .../client/src/app/service/session/base.ts | 11 - .../session/dependencies/attachments.ts | 77 - .../session/dependencies/bookmark/bookmark.ts | 58 - .../service/session/dependencies/bookmarks.ts | 294 - .../session/dependencies/charts/cursor.ts | 78 - .../session/dependencies/charts/index.ts | 365 - .../app/service/session/dependencies/cli.ts | 273 - .../session/dependencies/comments/comment.ts | 70 - .../session/dependencies/comments/index.ts | 529 - .../service/session/dependencies/cursor.ts | 161 - .../service/session/dependencies/exporter.ts | 103 - .../service/session/dependencies/indexed.ts | 219 - .../app/service/session/dependencies/info.ts | 100 - .../observing/implementations/files.ts | 144 - .../observing/implementations/index.ts | 7 - .../observing/implementations/processes.ts | 110 - .../observing/implementations/serial.ts | 112 - .../observing/implementations/tcp.ts | 111 - .../observing/implementations/udp.ts | 111 - .../dependencies/observing/operation.ts | 70 - .../dependencies/observing/provider.ts | 162 - .../dependencies/observing/providers.ts | 69 - .../session/dependencies/observing/sde.ts | 157 - .../session/dependencies/observing/source.ts | 27 - .../app/service/session/dependencies/rank.ts | 22 - .../service/session/dependencies/search.ts | 229 - .../dependencies/search/charts/request.ts | 331 - .../dependencies/search/charts/store.ts | 65 - .../search/charts/store.update.ts | 115 - .../search/disabled/converting.ts | 13 - .../dependencies/search/disabled/request.ts | 131 - .../dependencies/search/disabled/store.ts | 21 - .../dependencies/search/filters/request.ts | 360 - .../dependencies/search/filters/store.ts | 38 - .../search/filters/store.update.ts | 74 - .../session/dependencies/search/highlights.ts | 125 - .../search/highlights/modifier.ts | 65 - .../search/highlights/modifiers/active.ts | 106 - .../search/highlights/modifiers/asci.ts | 91 - .../search/highlights/modifiers/charts.ts | 106 - .../search/highlights/modifiers/comments.ts | 178 - .../search/highlights/modifiers/filtres.ts | 106 - .../search/highlights/modifiers/index.ts | 6 - .../search/highlights/modifiers/nested.ts | 96 - .../search/highlights/processor.ts | 192 - .../dependencies/search/highlights/tools.ts | 77 - .../session/dependencies/search/state.ts | 406 - .../session/dependencies/search/store.ts | 146 - .../dependencies/search/store.update.ts | 15 - .../service/session/dependencies/stream.ts | 425 - .../service/session/dependencies/teamwork.ts | 712 -- .../client/src/app/service/session/session.ts | 517 - .../client/src/app/service/session/tab.ts | 39 - .../client/src/app/service/session/unbound.ts | 47 - .../client/src/app/service/settings.ts | 133 - application/client/src/app/service/state.ts | 72 - application/client/src/app/service/sys.ts | 145 - .../app/ui/elements/autocomplete/component.ts | 133 - .../src/app/ui/elements/autocomplete/error.ts | 54 - .../src/app/ui/elements/autocomplete/input.ts | 104 - .../app/ui/elements/autocomplete/module.ts | 26 - .../app/ui/elements/autocomplete/styles.less | 16 - .../ui/elements/autocomplete/template.html | 38 - .../ui/elements/color.selector/component.ts | 31 - .../app/ui/elements/color.selector/module.ts | 10 - .../ui/elements/color.selector/styles.less | 45 - .../ui/elements/color.selector/template.html | 5 - .../elements/containers/dynamic/component.ts | 79 - .../ui/elements/containers/frame/component.ts | 40 - .../ui/elements/containers/frame/styles.less | 61 - .../elements/containers/frame/template.html | 9 - .../src/app/ui/elements/containers/module.ts | 12 - .../src/app/ui/elements/editable/component.ts | 75 - .../src/app/ui/elements/editable/module.ts | 13 - .../src/app/ui/elements/editable/styles.less | 28 - .../app/ui/elements/editable/template.html | 7 - .../ui/elements/filter.hidden/component.ts | 30 - .../app/ui/elements/filter.hidden/module.ts | 12 - .../app/ui/elements/filter.hidden/styles.less | 16 - .../ui/elements/filter.hidden/template.html | 3 - .../src/app/ui/elements/filter/component.ts | 61 - .../src/app/ui/elements/filter/filter.ts | 72 - .../src/app/ui/elements/filter/input.ts | 68 - .../src/app/ui/elements/filter/module.ts | 14 - .../src/app/ui/elements/filter/styles.less | 12 - .../src/app/ui/elements/filter/template.html | 14 - .../app/ui/elements/folderinput/component.ts | 143 - .../src/app/ui/elements/folderinput/error.ts | 38 - .../src/app/ui/elements/folderinput/folder.ts | 34 - .../app/ui/elements/folderinput/folders.ts | 111 - .../src/app/ui/elements/folderinput/input.ts | 96 - .../src/app/ui/elements/folderinput/module.ts | 26 - .../app/ui/elements/folderinput/styles.less | 21 - .../app/ui/elements/folderinput/template.html | 35 - .../ui/elements/locks.history/component.ts | 47 - .../elements/locks.history/entry/component.ts | 19 - .../elements/locks.history/entry/styles.less | 35 - .../locks.history/entry/template.html | 7 - .../app/ui/elements/locks.history/module.ts | 13 - .../app/ui/elements/locks.history/styles.less | 9 - .../ui/elements/locks.history/template.html | 1 - .../elements/menu.attachsource/component.ts | 94 - .../ui/elements/menu.attachsource/module.ts | 22 - .../ui/elements/menu.attachsource/styles.less | 17 - .../elements/menu.attachsource/template.html | 14 - .../client/src/app/ui/elements/module.ts | 67 - .../app/ui/elements/navigator/component.ts | 85 - .../src/app/ui/elements/navigator/module.ts | 24 - .../ui/elements/navigator/providers/entity.ts | 66 - .../elements/navigator/providers/entries.ts | 233 - .../navigator/providers/provider.files.ts | 331 - .../navigator/providers/provider.recent.ts | 97 - .../elements/navigator/providers/provider.ts | 43 - .../elements/navigator/providers/providers.ts | 93 - .../src/app/ui/elements/navigator/state.ts | 135 - .../src/app/ui/elements/navigator/styles.less | 141 - .../app/ui/elements/navigator/template.html | 43 - .../src/app/ui/elements/pairs/component.ts | 75 - .../src/app/ui/elements/pairs/module.ts | 13 - .../client/src/app/ui/elements/pairs/pair.ts | 33 - .../client/src/app/ui/elements/pairs/state.ts | 22 - .../src/app/ui/elements/pairs/styles.less | 50 - .../src/app/ui/elements/pairs/template.html | 21 - .../src/app/ui/elements/recent/action.ts | 32 - .../src/app/ui/elements/recent/component.ts | 111 - .../app/ui/elements/recent/icon/component.ts | 81 - .../app/ui/elements/recent/icon/styles.less | 26 - .../app/ui/elements/recent/icon/template.html | 8 - .../src/app/ui/elements/recent/module.ts | 28 - .../ui/elements/recent/nature/component.ts | 61 - .../recent/nature/concat/component.ts | 31 - .../elements/recent/nature/concat/styles.less | 15 - .../recent/nature/concat/template.html | 1 - .../elements/recent/nature/file/component.ts | 27 - .../elements/recent/nature/file/styles.less | 19 - .../elements/recent/nature/file/template.html | 2 - .../app/ui/elements/recent/nature/module.ts | 25 - .../recent/nature/process/component.ts | 22 - .../recent/nature/process/styles.less | 19 - .../recent/nature/process/template.html | 2 - .../recent/nature/serial/component.ts | 22 - .../elements/recent/nature/serial/styles.less | 15 - .../recent/nature/serial/template.html | 1 - .../app/ui/elements/recent/nature/styles.less | 8 - .../elements/recent/nature/tcp/component.ts | 22 - .../ui/elements/recent/nature/tcp/styles.less | 15 - .../elements/recent/nature/tcp/template.html | 1 - .../ui/elements/recent/nature/template.html | 7 - .../elements/recent/nature/udp/component.ts | 22 - .../ui/elements/recent/nature/udp/styles.less | 15 - .../elements/recent/nature/udp/template.html | 4 - .../ui/elements/recent/parser/component.ts | 46 - .../elements/recent/parser/dlt/component.ts | 42 - .../ui/elements/recent/parser/dlt/styles.less | 31 - .../elements/recent/parser/dlt/template.html | 14 - .../app/ui/elements/recent/parser/module.ts | 13 - .../recent/parser/someip/component.ts | 28 - .../elements/recent/parser/someip/styles.less | 31 - .../recent/parser/someip/template.html | 13 - .../app/ui/elements/recent/parser/styles.less | 8 - .../ui/elements/recent/parser/template.html | 4 - .../src/app/ui/elements/recent/state.ts | 84 - .../src/app/ui/elements/recent/styles.less | 60 - .../src/app/ui/elements/recent/template.html | 18 - .../app/ui/elements/scrollarea/component.ts | 228 - .../elements/scrollarea/controllers/frame.ts | 155 - .../elements/scrollarea/controllers/holder.ts | 49 - .../scrollarea/controllers/keyboard.ts | 64 - .../elements/scrollarea/controllers/range.ts | 107 - .../scrollarea/controllers/selection.node.ts | 41 - .../controllers/selection.nodeinfo.ts | 201 - .../scrollarea/controllers/selection.ts | 491 - .../scrollarea/controllers/service.ts | 167 - .../src/app/ui/elements/scrollarea/module.ts | 16 - .../elements/scrollarea/row/columns/cell.ts | 48 - .../scrollarea/row/columns/component.ts | 84 - .../scrollarea/row/columns/styles.less | 32 - .../scrollarea/row/columns/template.html | 4 - .../ui/elements/scrollarea/row/component.ts | 491 - .../app/ui/elements/scrollarea/row/module.ts | 28 - .../scrollarea/row/separator/component.ts | 28 - .../scrollarea/row/separator/styles.less | 59 - .../scrollarea/row/separator/template.html | 3 - .../scrollarea/row/standard/component.ts | 59 - .../scrollarea/row/standard/styles.less | 25 - .../scrollarea/row/standard/template.html | 2 - .../ui/elements/scrollarea/row/styles.less | 317 - .../ui/elements/scrollarea/row/template.html | 30 - .../app/ui/elements/scrollarea/styles.less | 105 - .../app/ui/elements/scrollarea/template.html | 31 - .../elements/scrollarea/vertical/component.ts | 131 - .../elements/scrollarea/vertical/styles.less | 21 - .../scrollarea/vertical/template.html | 1 - .../src/app/ui/elements/tabs/component.ts | 73 - .../app/ui/elements/tabs/content/component.ts | 85 - .../app/ui/elements/tabs/content/styles.less | 7 - .../ui/elements/tabs/content/template.html | 2 - .../ui/elements/tabs/controller.histroy.ts | 24 - .../app/ui/elements/tabs/list/component.ts | 255 - .../src/app/ui/elements/tabs/list/styles.less | 265 - .../app/ui/elements/tabs/list/template.html | 24 - .../client/src/app/ui/elements/tabs/module.ts | 17 - .../src/app/ui/elements/tabs/options.ts | 42 - .../src/app/ui/elements/tabs/service.ts | 305 - .../src/app/ui/elements/tabs/styles.less | 63 - .../src/app/ui/elements/tabs/template.html | 2 - .../src/app/ui/elements/teamwork/component.ts | 89 - .../src/app/ui/elements/teamwork/module.ts | 25 - .../src/app/ui/elements/teamwork/styles.less | 45 - .../app/ui/elements/teamwork/template.html | 57 - .../app/ui/elements/timezones/component.ts | 67 - .../src/app/ui/elements/timezones/module.ts | 12 - .../src/app/ui/elements/timezones/state.ts | 46 - .../src/app/ui/elements/timezones/styles.less | 45 - .../app/ui/elements/timezones/template.html | 6 - .../src/app/ui/elements/timezones/timezone.ts | 52 - .../src/app/ui/elements/tooltip/component.ts | 45 - .../src/app/ui/elements/tooltip/styles.less | 9 - .../src/app/ui/elements/tooltip/template.html | 5 - .../src/app/ui/elements/tree/component.ts | 245 - .../client/src/app/ui/elements/tree/entity.ts | 147 - .../client/src/app/ui/elements/tree/module.ts | 30 - .../client/src/app/ui/elements/tree/scheme.ts | 274 - .../client/src/app/ui/elements/tree/state.ts | 191 - .../src/app/ui/elements/tree/styles.less | 139 - .../src/app/ui/elements/tree/template.html | 48 - .../ui/env/directives/contextmenu.trigger.ts | 39 - .../app/ui/env/directives/dragdrop.file.ts | 86 - .../src/app/ui/env/directives/dragging.ts | 101 - .../client/src/app/ui/env/directives/input.ts | 24 - .../ui/env/directives/material.dragdrop.ts | 85 - .../src/app/ui/env/directives/module.ts | 25 - .../app/ui/env/directives/resize.observer.ts | 62 - .../src/app/ui/env/directives/resizer.ts | 111 - application/client/src/app/ui/env/dom.ts | 58 - .../client/src/app/ui/env/entities/filter.ts | 98 - .../src/app/ui/env/entities/range.limited.ts | 110 - .../src/app/ui/env/entities/value.limited.ts | 104 - .../src/app/ui/env/extentions/changes.ts | 49 - application/client/src/app/ui/env/globals.ts | 88 - .../client/src/app/ui/env/lock.token.ts | 27 - .../client/src/app/ui/layout/component.ts | 306 - .../app/ui/layout/contextmenu/component.ts | 131 - .../src/app/ui/layout/contextmenu/styles.less | 72 - .../app/ui/layout/contextmenu/template.html | 11 - .../src/app/ui/layout/focus/component.ts | 32 - .../src/app/ui/layout/focus/styles.less | 19 - .../src/app/ui/layout/focus/template.html | 1 - .../client/src/app/ui/layout/module.ts | 92 - .../src/app/ui/layout/popups/component.ts | 80 - .../app/ui/layout/popups/popup/component.ts | 94 - .../app/ui/layout/popups/popup/styles.less | 41 - .../app/ui/layout/popups/popup/template.html | 3 - .../src/app/ui/layout/popups/styles.less | 32 - .../src/app/ui/layout/popups/template.html | 2 - .../ui/layout/sidebar/caption/component.ts | 29 - .../app/ui/layout/sidebar/caption/styles.less | 10 - .../ui/layout/sidebar/caption/template.html | 1 - .../src/app/ui/layout/sidebar/component.ts | 37 - .../ui/layout/sidebar/controls/component.ts | 39 - .../ui/layout/sidebar/controls/styles.less | 10 - .../ui/layout/sidebar/controls/template.html | 1 - .../src/app/ui/layout/sidebar/styles.less | 17 - .../src/app/ui/layout/sidebar/template.html | 1 - .../src/app/ui/layout/snackbar/component.ts | 34 - .../ui/layout/snackbar/message/component.ts | 53 - .../ui/layout/snackbar/message/styles.less | 21 - .../ui/layout/snackbar/message/template.html | 14 - .../src/app/ui/layout/snackbar/styles.less | 3 - .../src/app/ui/layout/snackbar/template.html | 0 application/client/src/app/ui/layout/state.ts | 41 - .../src/app/ui/layout/statusbar/component.ts | 18 - .../src/app/ui/layout/statusbar/styles.less | 50 - .../src/app/ui/layout/statusbar/template.html | 7 - .../client/src/app/ui/layout/styles.less | 276 - .../client/src/app/ui/layout/template.html | 52 - .../src/app/ui/layout/toolbar/component.ts | 31 - .../ui/layout/toolbar/controls/component.ts | 79 - .../ui/layout/toolbar/controls/styles.less | 38 - .../ui/layout/toolbar/controls/template.html | 9 - .../src/app/ui/layout/toolbar/styles.less | 19 - .../src/app/ui/layout/toolbar/template.html | 1 - .../src/app/ui/layout/workspace/component.ts | 74 - .../ui/layout/workspace/controls/component.ts | 24 - .../ui/layout/workspace/controls/styles.less | 13 - .../layout/workspace/controls/template.html | 2 - .../no-tabs-content/action/component.ts | 41 - .../no-tabs-content/action/styles.less | 43 - .../no-tabs-content/action/template.html | 7 - .../workspace/no-tabs-content/component.ts | 83 - .../workspace/no-tabs-content/module.ts | 31 - .../workspace/no-tabs-content/styles.less | 65 - .../workspace/no-tabs-content/template.html | 64 - .../src/app/ui/layout/workspace/styles.less | 19 - .../src/app/ui/layout/workspace/template.html | 1 - .../client/src/app/ui/service/contextmenu.ts | 53 - .../client/src/app/ui/service/dropfiles.ts | 108 - .../client/src/app/ui/service/filters.ts | 31 - .../client/src/app/ui/service/layout.ts | 68 - .../client/src/app/ui/service/listener.ts | 44 - .../src/app/ui/service/listener/handler.ts | 18 - .../src/app/ui/service/listener/options.ts | 3 - .../src/app/ui/service/listener/target.ts | 103 - .../client/src/app/ui/service/lockers.ts | 99 - .../src/app/ui/service/lokers/locker.ts | 77 - .../src/app/ui/service/notification/index.ts | 7 - .../ui/service/notification/notification.ts | 41 - .../src/app/ui/service/notifications.ts | 51 - .../client/src/app/ui/service/popup.ts | 44 - .../client/src/app/ui/service/popup/popup.ts | 68 - .../client/src/app/ui/service/sidebar.ts | 183 - .../src/app/ui/service/sidebar/register.ts | 121 - .../client/src/app/ui/service/sidebar/tabs.ts | 46 - .../client/src/app/ui/service/styles.ts | 139 - .../client/src/app/ui/service/toolbar.ts | 205 - .../src/app/ui/service/toolbar/register.ts | 64 - .../client/src/app/ui/service/toolbar/tabs.ts | 52 - .../client/src/app/ui/styles/borders.less | 27 - .../client/src/app/ui/styles/buttons.less | 87 - .../src/app/ui/styles/codicons/codicon.less | 582 - .../src/app/ui/styles/codicons/codicon.ttf | Bin 73504 -> 0 bytes .../client/src/app/ui/styles/colors.less | 74 - .../client/src/app/ui/styles/colors.ts | 263 - .../client/src/app/ui/styles/containers.less | 52 - .../src/app/ui/styles/fontawesome/LICENSE.txt | 34 - .../ui/styles/fontawesome/less/_animated.less | 19 - .../fontawesome/less/_bordered-pulled.less | 16 - .../app/ui/styles/fontawesome/less/_core.less | 12 - .../styles/fontawesome/less/_fixed-width.less | 6 - .../ui/styles/fontawesome/less/_icons.less | 1333 -- .../ui/styles/fontawesome/less/_larger.less | 27 - .../app/ui/styles/fontawesome/less/_list.less | 18 - .../ui/styles/fontawesome/less/_mixins.less | 57 - .../fontawesome/less/_rotated-flipped.less | 23 - .../fontawesome/less/_screen-reader.less | 5 - .../ui/styles/fontawesome/less/_shims.less | 2062 ---- .../ui/styles/fontawesome/less/_stacked.less | 22 - .../styles/fontawesome/less/_variables.less | 1342 -- .../ui/styles/fontawesome/less/brands.less | 17 - .../styles/fontawesome/less/fontawesome.less | 12 - .../ui/styles/fontawesome/less/regular.less | 18 - .../app/ui/styles/fontawesome/less/solid.less | 19 - .../ui/styles/fontawesome/less/v4-shims.less | 2 - .../fontawesome/webfonts/fa-brands-400.eot | Bin 134396 -> 0 bytes .../fontawesome/webfonts/fa-brands-400.svg | 1260 -- .../fontawesome/webfonts/fa-brands-400.ttf | Bin 134160 -> 0 bytes .../fontawesome/webfonts/fa-brands-400.woff | Bin 87048 -> 0 bytes .../fontawesome/webfonts/fa-brands-400.woff2 | Bin 74288 -> 0 bytes .../fontawesome/webfonts/fa-regular-400.eot | Bin 40308 -> 0 bytes .../fontawesome/webfonts/fa-regular-400.svg | 471 - .../fontawesome/webfonts/fa-regular-400.ttf | Bin 40080 -> 0 bytes .../fontawesome/webfonts/fa-regular-400.woff | Bin 18164 -> 0 bytes .../fontawesome/webfonts/fa-regular-400.woff2 | Bin 14872 -> 0 bytes .../fontawesome/webfonts/fa-solid-900.eot | Bin 209012 -> 0 bytes .../fontawesome/webfonts/fa-solid-900.svg | 2763 ----- .../fontawesome/webfonts/fa-solid-900.ttf | Bin 208792 -> 0 bytes .../fontawesome/webfonts/fa-solid-900.woff | Bin 102224 -> 0 bytes .../fontawesome/webfonts/fa-solid-900.woff2 | Bin 79100 -> 0 bytes .../client/src/app/ui/styles/fonts.less | 102 - .../fonts/Menlo-Regular-Logviewer.woff2 | Bin 169256 -> 0 bytes .../ui/styles/fonts/SourceSansPro-Black.woff | Bin 121756 -> 0 bytes .../ui/styles/fonts/SourceSansPro-Black.woff2 | Bin 82004 -> 0 bytes .../fonts/SourceSansPro-BlackItalic.woff | Bin 48156 -> 0 bytes .../fonts/SourceSansPro-BlackItalic.woff2 | Bin 35032 -> 0 bytes .../ui/styles/fonts/SourceSansPro-Bold.woff | Bin 126204 -> 0 bytes .../ui/styles/fonts/SourceSansPro-Bold.woff2 | Bin 85604 -> 0 bytes .../fonts/SourceSansPro-BoldItalic.woff | Bin 49028 -> 0 bytes .../fonts/SourceSansPro-BoldItalic.woff2 | Bin 35760 -> 0 bytes .../fonts/SourceSansPro-ExtraLight.woff | Bin 122548 -> 0 bytes .../fonts/SourceSansPro-ExtraLight.woff2 | Bin 82716 -> 0 bytes .../fonts/SourceSansPro-ExtraLightItalic.woff | Bin 48124 -> 0 bytes .../SourceSansPro-ExtraLightItalic.woff2 | Bin 34548 -> 0 bytes .../ui/styles/fonts/SourceSansPro-Italic.woff | Bin 49352 -> 0 bytes .../styles/fonts/SourceSansPro-Italic.woff2 | Bin 36020 -> 0 bytes .../ui/styles/fonts/SourceSansPro-Light.woff | Bin 126460 -> 0 bytes .../ui/styles/fonts/SourceSansPro-Light.woff2 | Bin 86104 -> 0 bytes .../fonts/SourceSansPro-LightItalic.woff | Bin 49360 -> 0 bytes .../fonts/SourceSansPro-LightItalic.woff2 | Bin 35788 -> 0 bytes .../styles/fonts/SourceSansPro-Regular.woff | Bin 127484 -> 0 bytes .../styles/fonts/SourceSansPro-Regular.woff2 | Bin 87612 -> 0 bytes .../styles/fonts/SourceSansPro-SemiBold.woff | Bin 126516 -> 0 bytes .../styles/fonts/SourceSansPro-SemiBold.woff2 | Bin 86328 -> 0 bytes .../fonts/SourceSansPro-SemiBoldItalic.woff | Bin 49232 -> 0 bytes .../fonts/SourceSansPro-SemiBoldItalic.woff2 | Bin 36004 -> 0 bytes .../app/ui/styles/fonts/materialicons.woff2 | Bin 60840 -> 0 bytes .../styles/fonts/roboto_light_cyrillic.woff2 | Bin 6720 -> 0 bytes .../fonts/roboto_light_cyrillic_ext.woff2 | Bin 10640 -> 0 bytes .../ui/styles/fonts/roboto_light_greek.woff2 | Bin 5108 -> 0 bytes .../styles/fonts/roboto_light_greek_ext.woff2 | Bin 792 -> 0 bytes .../ui/styles/fonts/roboto_light_latin.woff2 | Bin 11180 -> 0 bytes .../styles/fonts/roboto_light_latin_ext.woff2 | Bin 8088 -> 0 bytes .../fonts/roboto_light_vietnamese.woff2 | Bin 3384 -> 0 bytes .../styles/fonts/roboto_medium_cyrillic.woff2 | Bin 6864 -> 0 bytes .../fonts/roboto_medium_cyrillic_ext.woff2 | Bin 10552 -> 0 bytes .../ui/styles/fonts/roboto_medium_greek.woff2 | Bin 5080 -> 0 bytes .../fonts/roboto_medium_greek_ext.woff2 | Bin 824 -> 0 bytes .../ui/styles/fonts/roboto_medium_latin.woff2 | Bin 11056 -> 0 bytes .../fonts/roboto_medium_latin_ext.woff2 | Bin 7924 -> 0 bytes .../fonts/roboto_medium_vietnamese.woff2 | Bin 3380 -> 0 bytes .../fonts/roboto_regular_cyrillic.woff2 | Bin 6720 -> 0 bytes .../fonts/roboto_regular_cyrillic_ext.woff2 | Bin 10576 -> 0 bytes .../styles/fonts/roboto_regular_greek.woff2 | Bin 5004 -> 0 bytes .../fonts/roboto_regular_greek_ext.woff2 | Bin 796 -> 0 bytes .../styles/fonts/roboto_regular_latin.woff2 | Bin 11016 -> 0 bytes .../fonts/roboto_regular_latin_ext.woff2 | Bin 8024 -> 0 bytes .../fonts/roboto_regular_vietnamese.woff2 | Bin 3384 -> 0 bytes .../client/src/app/ui/styles/global.less | 8 - .../client/src/app/ui/styles/markdown.less | 45 - .../src/app/ui/styles/material.fonts.scss | 213 - .../client/src/app/ui/styles/material.less | 485 - .../src/app/ui/styles/meterial.theme.scss | 38 - .../client/src/app/ui/styles/reset.less | 13 - .../client/src/app/ui/styles/rows.less | 68 - .../client/src/app/ui/styles/scheme.less | 16 - .../client/src/app/ui/styles/scheme.scss | 2 - .../client/src/app/ui/styles/scrollbars.less | 14 - application/client/src/app/ui/styles/sizes.ts | 1 - .../client/src/app/ui/styles/support.less | 11 - .../client/src/app/ui/styles/text.less | 45 - .../client/src/app/ui/styles/variables.less | 162 - .../src/app/ui/tabs/changelogs/component.ts | 63 - .../src/app/ui/tabs/changelogs/module.ts | 14 - .../src/app/ui/tabs/changelogs/styles.less | 22 - .../src/app/ui/tabs/changelogs/template.html | 10 - .../client/src/app/ui/tabs/help/component.ts | 240 - .../client/src/app/ui/tabs/help/module.ts | 15 - .../client/src/app/ui/tabs/help/styles.less | 102 - .../client/src/app/ui/tabs/help/template.html | 23 - application/client/src/app/ui/tabs/module.ts | 24 - .../app/ui/tabs/multiplefiles/component.ts | 69 - .../app/ui/tabs/multiplefiles/file.holder.ts | 70 - .../src/app/ui/tabs/multiplefiles/module.ts | 29 - .../src/app/ui/tabs/multiplefiles/state.ts | 407 - .../tabs/multiplefiles/structure/component.ts | 268 - .../tabs/multiplefiles/structure/styles.less | 137 - .../multiplefiles/structure/template.html | 53 - .../src/app/ui/tabs/multiplefiles/styles.less | 142 - .../app/ui/tabs/multiplefiles/template.html | 90 - .../client/src/app/ui/tabs/observe/action.ts | 50 - .../src/app/ui/tabs/observe/component.ts | 47 - .../tabs/observe/config-schema/component.ts | 34 - .../observe/config-schema/entry/component.ts | 19 - .../observe/config-schema/entry/styles.less | 6 - .../observe/config-schema/entry/template.html | 41 - .../ui/tabs/observe/config-schema/module.ts | 63 - .../config-schema/renders/bool/component.ts | 32 - .../config-schema/renders/bool/styles.less | 1 - .../config-schema/renders/bool/template.html | 9 - .../config-schema/renders/dirs/component.ts | 55 - .../config-schema/renders/dirs/styles.less | 27 - .../config-schema/renders/dirs/template.html | 23 - .../renders/dropdown/component.ts | 47 - .../renders/dropdown/styles.less | 7 - .../renders/dropdown/template.html | 7 - .../config-schema/renders/files/component.ts | 65 - .../config-schema/renders/files/styles.less | 14 - .../config-schema/renders/files/template.html | 19 - .../config-schema/renders/float/component.ts | 53 - .../config-schema/renders/float/styles.less | 12 - .../config-schema/renders/float/template.html | 11 - .../renders/integer/component.ts | 49 - .../config-schema/renders/integer/styles.less | 12 - .../renders/integer/template.html | 11 - .../config-schema/renders/string/component.ts | 47 - .../config-schema/renders/string/styles.less | 7 - .../renders/string/template.html | 10 - .../ui/tabs/observe/config-schema/state.ts | 52 - .../ui/tabs/observe/config-schema/styles.less | 10 - .../tabs/observe/config-schema/template.html | 6 - .../app/ui/tabs/observe/error/component.ts | 34 - .../src/app/ui/tabs/observe/error/module.ts | 13 - .../src/app/ui/tabs/observe/error/styles.less | 14 - .../app/ui/tabs/observe/error/template.html | 6 - .../client/src/app/ui/tabs/observe/module.ts | 30 - .../tabs/observe/origin/concat/component.ts | 58 - .../ui/tabs/observe/origin/concat/module.ts | 20 - .../ui/tabs/observe/origin/concat/styles.less | 37 - .../tabs/observe/origin/concat/template.html | 6 - .../ui/tabs/observe/origin/file/component.ts | 58 - .../app/ui/tabs/observe/origin/file/module.ts | 20 - .../ui/tabs/observe/origin/file/styles.less | 12 - .../ui/tabs/observe/origin/file/template.html | 6 - .../tabs/observe/origin/stream/component.ts | 60 - .../ui/tabs/observe/origin/stream/module.ts | 22 - .../ui/tabs/observe/origin/stream/styles.less | 12 - .../tabs/observe/origin/stream/template.html | 17 - .../stream/transport/listed/component.ts | 130 - .../origin/stream/transport/listed/module.ts | 12 - .../stream/transport/listed/styles.less | 57 - .../stream/transport/listed/template.html | 10 - .../setup/bases/process/component.ts | 227 - .../transport/setup/bases/process/error.ts | 30 - .../transport/setup/bases/serial/component.ts | 97 - .../transport/setup/bases/serial/error.ts | 27 - .../transport/setup/bases/serial/module.ts | 34 - .../transport/setup/bases/tcp/component.ts | 46 - .../stream/transport/setup/bases/tcp/error.ts | 89 - .../transport/setup/bases/udp/component.ts | 54 - .../stream/transport/setup/bases/udp/error.ts | 88 - .../transport/setup/bases/udp/module.ts | 24 - .../setup/bases/udp/multicast/component.ts | 44 - .../setup/bases/udp/multicast/styles.less | 26 - .../setup/bases/udp/multicast/template.html | 22 - .../setup/complete/process/component.ts | 65 - .../setup/complete/process/module.ts | 24 - .../setup/complete/process/styles.less | 61 - .../setup/complete/process/template.html | 50 - .../setup/complete/serial/component.ts | 30 - .../transport/setup/complete/serial/module.ts | 41 - .../setup/complete/serial/styles.less | 24 - .../setup/complete/serial/template.html | 96 - .../transport/setup/complete/tcp/component.ts | 30 - .../transport/setup/complete/tcp/module.ts | 31 - .../transport/setup/complete/tcp/styles.less | 14 - .../setup/complete/tcp/template.html | 20 - .../transport/setup/complete/udp/component.ts | 30 - .../transport/setup/complete/udp/module.ts | 34 - .../transport/setup/complete/udp/styles.less | 28 - .../setup/complete/udp/template.html | 20 - .../stream/transport/setup/component.ts | 52 - .../origin/stream/transport/setup/module.ts | 32 - .../setup/quick/process/component.ts | 54 - .../transport/setup/quick/process/module.ts | 24 - .../transport/setup/quick/process/styles.less | 67 - .../setup/quick/process/template.html | 50 - .../transport/setup/quick/serial/component.ts | 21 - .../transport/setup/quick/serial/module.ts | 39 - .../transport/setup/quick/serial/styles.less | 12 - .../setup/quick/serial/template.html | 4 - .../transport/setup/quick/tcp/component.ts | 21 - .../transport/setup/quick/tcp/module.ts | 32 - .../transport/setup/quick/tcp/styles.less | 25 - .../transport/setup/quick/tcp/template.html | 13 - .../transport/setup/quick/udp/component.ts | 21 - .../transport/setup/quick/udp/module.ts | 34 - .../transport/setup/quick/udp/styles.less | 31 - .../transport/setup/quick/udp/template.html | 21 - .../origin/stream/transport/setup/state.ts | 45 - .../stream/transport/setup/states/process.ts | 104 - .../stream/transport/setup/states/serial.ts | 269 - .../stream/transport/setup/states/tcp.ts | 38 - .../stream/transport/setup/states/udp.ts | 45 - .../origin/stream/transport/setup/styles.less | 19 - .../stream/transport/setup/template.html | 4 - .../tabs/observe/parsers/extra/component.ts | 26 - .../observe/parsers/extra/dlt/component.ts | 168 - .../tabs/observe/parsers/extra/dlt/module.ts | 40 - .../tabs/observe/parsers/extra/dlt/state.ts | 192 - .../parsers/extra/dlt/structure/component.ts | 98 - .../parsers/extra/dlt/structure/section.ts | 23 - .../parsers/extra/dlt/structure/statentity.ts | 61 - .../parsers/extra/dlt/structure/styles.less | 40 - .../parsers/extra/dlt/structure/template.html | 62 - .../observe/parsers/extra/dlt/styles.less | 116 - .../tabs/observe/parsers/extra/dlt/summary.ts | 51 - .../observe/parsers/extra/dlt/template.html | 67 - .../ui/tabs/observe/parsers/extra/module.ts | 17 - .../observe/parsers/extra/someip/component.ts | 30 - .../observe/parsers/extra/someip/module.ts | 35 - .../observe/parsers/extra/someip/state.ts | 3 - .../observe/parsers/extra/someip/styles.less | 111 - .../parsers/extra/someip/template.html | 2 - .../ui/tabs/observe/parsers/extra/styles.less | 111 - .../tabs/observe/parsers/extra/template.html | 2 - .../tabs/observe/parsers/general/component.ts | 28 - .../observe/parsers/general/dlt/component.ts | 54 - .../observe/parsers/general/dlt/module.ts | 35 - .../tabs/observe/parsers/general/dlt/state.ts | 118 - .../observe/parsers/general/dlt/styles.less | 17 - .../observe/parsers/general/dlt/template.html | 48 - .../ui/tabs/observe/parsers/general/module.ts | 31 - .../parsers/general/plugin/component.ts | 58 - .../observe/parsers/general/plugin/module.ts | 37 - .../observe/parsers/general/plugin/state.ts | 100 - .../parsers/general/plugin/styles.less | 8 - .../parsers/general/plugin/template.html | 6 - .../parsers/general/someip/component.ts | 33 - .../observe/parsers/general/someip/module.ts | 35 - .../observe/parsers/general/someip/state.ts | 47 - .../parsers/general/someip/styles.less | 18 - .../parsers/general/someip/template.html | 24 - .../tabs/observe/parsers/general/styles.less | 111 - .../observe/parsers/general/template.html | 18 - .../observe/parsers/general/text/component.ts | 17 - .../observe/parsers/general/text/module.ts | 14 - .../observe/parsers/general/text/styles.less | 9 - .../parsers/general/text/template.html | 7 - .../src/app/ui/tabs/observe/parsers/module.ts | 12 - .../src/app/ui/tabs/observe/parsers/state.ts | 16 - .../client/src/app/ui/tabs/observe/state.ts | 347 - .../src/app/ui/tabs/observe/styles.less | 74 - .../src/app/ui/tabs/observe/template.html | 35 - .../src/app/ui/tabs/plugins/component.ts | 86 - .../client/src/app/ui/tabs/plugins/desc.ts | 118 - .../app/ui/tabs/plugins/details/component.ts | 302 - .../app/ui/tabs/plugins/details/styles.less | 98 - .../app/ui/tabs/plugins/details/template.html | 50 - .../src/app/ui/tabs/plugins/list/component.ts | 70 - .../src/app/ui/tabs/plugins/list/styles.less | 8 - .../app/ui/tabs/plugins/list/template.html | 18 - .../client/src/app/ui/tabs/plugins/module.ts | 27 - .../app/ui/tabs/plugins/plugin/component.ts | 35 - .../app/ui/tabs/plugins/plugin/styles.less | 36 - .../app/ui/tabs/plugins/plugin/template.html | 10 - .../src/app/ui/tabs/plugins/provider.ts | 193 - .../src/app/ui/tabs/plugins/styles.less | 88 - .../src/app/ui/tabs/plugins/template.html | 47 - .../src/app/ui/tabs/settings/component.ts | 34 - .../app/ui/tabs/settings/entry/component.ts | 35 - .../app/ui/tabs/settings/entry/styles.less | 7 - .../app/ui/tabs/settings/entry/template.html | 15 - .../client/src/app/ui/tabs/settings/module.ts | 48 - .../client/src/app/ui/tabs/settings/node.ts | 53 - .../app/ui/tabs/settings/node/component.ts | 22 - .../src/app/ui/tabs/settings/node/styles.less | 36 - .../app/ui/tabs/settings/node/template.html | 3 - .../tabs/settings/renders/bool/component.ts | 37 - .../ui/tabs/settings/renders/bool/styles.less | 6 - .../tabs/settings/renders/bool/template.html | 2 - .../tabs/settings/renders/color/component.ts | 75 - .../tabs/settings/renders/color/styles.less | 16 - .../tabs/settings/renders/color/template.html | 9 - .../tabs/settings/renders/string/component.ts | 43 - .../ui/tabs/settings/renders/string/error.ts | 64 - .../tabs/settings/renders/string/styles.less | 8 - .../settings/renders/string/template.html | 8 - .../app/ui/tabs/settings/renders/validator.ts | 7 - .../client/src/app/ui/tabs/settings/state.ts | 19 - .../src/app/ui/tabs/settings/styles.less | 70 - .../src/app/ui/tabs/settings/template.html | 20 - .../app/ui/views/dialogs/about/component.ts | 46 - .../src/app/ui/views/dialogs/about/module.ts | 12 - .../app/ui/views/dialogs/about/styles.less | 68 - .../app/ui/views/dialogs/about/template.html | 14 - .../app/ui/views/dialogs/colors/component.ts | 25 - .../src/app/ui/views/dialogs/colors/module.ts | 13 - .../app/ui/views/dialogs/colors/styles.less | 9 - .../app/ui/views/dialogs/colors/template.html | 5 - .../dialogs/columnsselector/component.ts | 73 - .../views/dialogs/columnsselector/module.ts | 22 - .../views/dialogs/columnsselector/styles.less | 53 - .../dialogs/columnsselector/template.html | 31 - .../app/ui/views/dialogs/comment/component.ts | 104 - .../app/ui/views/dialogs/comment/module.ts | 24 - .../app/ui/views/dialogs/comment/styles.less | 27 - .../ui/views/dialogs/comment/template.html | 29 - .../app/ui/views/dialogs/hotkeys/component.ts | 63 - .../app/ui/views/dialogs/hotkeys/module.ts | 12 - .../app/ui/views/dialogs/hotkeys/styles.less | 47 - .../ui/views/dialogs/hotkeys/template.html | 16 - .../app/ui/views/dialogs/jumpto/component.ts | 79 - .../src/app/ui/views/dialogs/jumpto/module.ts | 14 - .../app/ui/views/dialogs/jumpto/styles.less | 42 - .../app/ui/views/dialogs/jumpto/template.html | 22 - .../app/ui/views/dialogs/locker/component.ts | 43 - .../src/app/ui/views/dialogs/locker/module.ts | 21 - .../app/ui/views/dialogs/locker/styles.less | 75 - .../app/ui/views/dialogs/locker/template.html | 14 - .../client/src/app/ui/views/dialogs/module.ts | 27 - application/client/src/app/ui/views/module.ts | 39 - .../attachments/attachment/component.ts | 25 - .../sidebar/attachments/attachment/module.ts | 13 - .../attachments/attachment/styles.less | 51 - .../attachments/attachment/template.html | 5 - .../sidebar/attachments/attachment/wrapper.ts | 21 - .../ui/views/sidebar/attachments/component.ts | 436 - .../ui/views/sidebar/attachments/module.ts | 31 - .../attachments/preview/audio/component.ts | 19 - .../attachments/preview/audio/styles.less | 10 - .../attachments/preview/audio/template.html | 1 - .../sidebar/attachments/preview/component.ts | 116 - .../attachments/preview/image/component.ts | 239 - .../attachments/preview/image/styles.less | 43 - .../attachments/preview/image/template.html | 24 - .../sidebar/attachments/preview/module.ts | 18 - .../sidebar/attachments/preview/styles.less | 67 - .../sidebar/attachments/preview/template.html | 18 - .../attachments/preview/text/component.ts | 115 - .../attachments/preview/text/styles.less | 47 - .../attachments/preview/text/template.html | 9 - .../attachments/preview/unknown/component.ts | 19 - .../attachments/preview/unknown/styles.less | 15 - .../attachments/preview/unknown/template.html | 1 - .../attachments/preview/video/component.ts | 19 - .../attachments/preview/video/styles.less | 10 - .../attachments/preview/video/template.html | 1 - .../ui/views/sidebar/attachments/styles.less | 85 - .../views/sidebar/attachments/template.html | 40 - .../sidebar/comments/comment/component.ts | 198 - .../sidebar/comments/comment/styles.less | 64 - .../sidebar/comments/comment/template.html | 98 - .../ui/views/sidebar/comments/component.ts | 165 - .../sidebar/comments/editor/component.ts | 84 - .../views/sidebar/comments/editor/styles.less | 34 - .../sidebar/comments/editor/template.html | 29 - .../app/ui/views/sidebar/comments/module.ts | 44 - .../views/sidebar/comments/reply/component.ts | 58 - .../views/sidebar/comments/reply/styles.less | 57 - .../sidebar/comments/reply/template.html | 30 - .../app/ui/views/sidebar/comments/styles.less | 90 - .../ui/views/sidebar/comments/template.html | 97 - .../client/src/app/ui/views/sidebar/module.ts | 22 - .../ui/views/sidebar/observe/common/module.ts | 10 - .../sidebar/observe/common/title/component.ts | 33 - .../sidebar/observe/common/title/styles.less | 23 - .../observe/common/title/template.html | 5 - .../app/ui/views/sidebar/observe/component.ts | 23 - .../sidebar/observe/element/component.ts | 44 - .../views/sidebar/observe/element/element.ts | 42 - .../sidebar/observe/element/file/component.ts | 55 - .../sidebar/observe/element/file/styles.less | 51 - .../observe/element/file/template.html | 14 - .../views/sidebar/observe/element/module.ts | 16 - .../observe/element/process/component.ts | 61 - .../observe/element/process/styles.less | 51 - .../observe/element/process/template.html | 16 - .../observe/element/serial/component.ts | 60 - .../observe/element/serial/styles.less | 51 - .../observe/element/serial/template.html | 16 - .../observe/element/signature/component.ts | 36 - .../observe/element/signature/styles.less | 26 - .../observe/element/signature/template.html | 2 - .../views/sidebar/observe/element/styles.less | 18 - .../sidebar/observe/element/tcp/component.ts | 60 - .../sidebar/observe/element/tcp/styles.less | 51 - .../sidebar/observe/element/tcp/template.html | 13 - .../sidebar/observe/element/template.html | 6 - .../sidebar/observe/element/udp/component.ts | 60 - .../sidebar/observe/element/udp/styles.less | 51 - .../sidebar/observe/element/udp/template.html | 14 - .../views/sidebar/observe/lists/component.ts | 40 - .../sidebar/observe/lists/file/component.ts | 163 - .../sidebar/observe/lists/file/module.ts | 13 - .../sidebar/observe/lists/file/styles.less | 23 - .../sidebar/observe/lists/file/template.html | 15 - .../observe/lists/process/component.ts | 100 - .../sidebar/observe/lists/process/module.ts | 13 - .../sidebar/observe/lists/process/styles.less | 15 - .../observe/lists/process/template.html | 12 - .../sidebar/observe/lists/serial/component.ts | 95 - .../sidebar/observe/lists/serial/module.ts | 13 - .../sidebar/observe/lists/serial/styles.less | 12 - .../observe/lists/serial/template.html | 12 - .../sidebar/observe/lists/tcp/component.ts | 95 - .../views/sidebar/observe/lists/tcp/module.ts | 13 - .../sidebar/observe/lists/tcp/styles.less | 15 - .../sidebar/observe/lists/tcp/template.html | 12 - .../sidebar/observe/lists/udp/component.ts | 95 - .../views/sidebar/observe/lists/udp/module.ts | 13 - .../sidebar/observe/lists/udp/styles.less | 15 - .../sidebar/observe/lists/udp/template.html | 12 - .../app/ui/views/sidebar/observe/module.ts | 39 - .../ui/views/sidebar/observe/states/files.ts | 11 - .../views/sidebar/observe/states/process.ts | 12 - .../ui/views/sidebar/observe/states/serial.ts | 10 - .../ui/views/sidebar/observe/states/state.ts | 19 - .../ui/views/sidebar/observe/states/tcp.ts | 10 - .../ui/views/sidebar/observe/states/udp.ts | 10 - .../app/ui/views/sidebar/observe/styles.less | 61 - .../ui/views/sidebar/observe/template.html | 29 - .../ui/views/sidebar/search/base/entity.ts | 84 - .../app/ui/views/sidebar/search/base/list.ts | 111 - .../ui/views/sidebar/search/bin/component.ts | 87 - .../ui/views/sidebar/search/bin/styles.less | 29 - .../ui/views/sidebar/search/bin/template.html | 2 - .../sidebar/search/charts/chart/component.ts | 102 - .../sidebar/search/charts/chart/state.ts | 103 - .../sidebar/search/charts/chart/styles.less | 136 - .../sidebar/search/charts/chart/template.html | 13 - .../search/charts/details/component.ts | 119 - .../sidebar/search/charts/details/styles.less | 31 - .../search/charts/details/template.html | 44 - .../sidebar/search/charts/list/component.ts | 22 - .../sidebar/search/charts/list/styles.less | 7 - .../sidebar/search/charts/list/template.html | 5 - .../search/charts/placeholder/component.ts | 22 - .../search/charts/placeholder/styles.less | 4 - .../search/charts/placeholder/template.html | 1 - .../views/sidebar/search/charts/provider.ts | 296 - .../app/ui/views/sidebar/search/component.ts | 181 - .../search/disabled/entity/component.ts | 41 - .../search/disabled/entity/styles.less | 56 - .../search/disabled/entity/template.html | 4 - .../sidebar/search/disabled/list/component.ts | 25 - .../sidebar/search/disabled/list/styles.less | 7 - .../search/disabled/list/template.html | 5 - .../views/sidebar/search/disabled/provider.ts | 262 - .../search/filters/details/component.ts | 146 - .../search/filters/details/styles.less | 22 - .../search/filters/details/template.html | 16 - .../search/filters/filter/component.ts | 123 - .../sidebar/search/filters/filter/state.ts | 123 - .../sidebar/search/filters/filter/styles.less | 146 - .../search/filters/filter/template.html | 19 - .../sidebar/search/filters/list/component.ts | 22 - .../sidebar/search/filters/list/styles.less | 7 - .../sidebar/search/filters/list/template.html | 5 - .../search/filters/placeholder/component.ts | 22 - .../search/filters/placeholder/styles.less | 4 - .../search/filters/placeholder/template.html | 1 - .../views/sidebar/search/filters/provider.ts | 309 - .../src/app/ui/views/sidebar/search/module.ts | 74 - .../providers/definitions/entity.data.ts | 20 - .../definitions/entity.state.edit.ts | 15 - .../search/providers/definitions/entity.ts | 27 - .../search/providers/definitions/events.ts | 19 - .../definitions/keyboard.listener.ts | 48 - .../search/providers/definitions/provider.ts | 433 - .../sidebar/search/providers/providers.ts | 547 - .../app/ui/views/sidebar/search/styles.less | 57 - .../app/ui/views/sidebar/search/template.html | 43 - .../ui/views/sidebar/teamwork/component.ts | 250 - .../app/ui/views/sidebar/teamwork/module.ts | 38 - .../sidebar/teamwork/repository/component.ts | 15 - .../sidebar/teamwork/repository/module.ts | 13 - .../sidebar/teamwork/repository/styles.less | 52 - .../sidebar/teamwork/repository/template.html | 14 - .../sidebar/teamwork/repository/wrapper.ts | 21 - .../app/ui/views/sidebar/teamwork/styles.less | 109 - .../ui/views/sidebar/teamwork/template.html | 155 - .../app/ui/views/statusbar/info/component.ts | 49 - .../src/app/ui/views/statusbar/info/module.ts | 11 - .../app/ui/views/statusbar/info/styles.less | 21 - .../app/ui/views/statusbar/info/template.html | 1 - .../app/ui/views/statusbar/jobs/component.ts | 80 - .../src/app/ui/views/statusbar/jobs/module.ts | 23 - .../app/ui/views/statusbar/jobs/styles.less | 93 - .../app/ui/views/statusbar/jobs/template.html | 44 - .../ui/views/statusbar/session/component.ts | 75 - .../app/ui/views/statusbar/session/module.ts | 12 - .../app/ui/views/statusbar/session/state.ts | 17 - .../ui/views/statusbar/session/styles.less | 0 .../ui/views/statusbar/session/template.html | 1 - .../ui/views/toolbar/chart/base/component.ts | 65 - .../app/ui/views/toolbar/chart/component.ts | 69 - .../src/app/ui/views/toolbar/chart/cursor.ts | 189 - .../views/toolbar/chart/cursor/component.ts | 149 - .../ui/views/toolbar/chart/cursor/styles.less | 110 - .../views/toolbar/chart/cursor/template.html | 12 - .../src/app/ui/views/toolbar/chart/module.ts | 24 - .../views/toolbar/chart/output/component.ts | 108 - .../ui/views/toolbar/chart/output/styles.less | 61 - .../views/toolbar/chart/output/template.html | 25 - .../views/toolbar/chart/render/chart.coors.ts | 56 - .../views/toolbar/chart/render/chart.label.ts | 18 - .../ui/views/toolbar/chart/render/chart.ts | 291 - .../ui/views/toolbar/chart/render/filters.ts | 63 - .../ui/views/toolbar/chart/render/render.ts | 58 - .../src/app/ui/views/toolbar/chart/service.ts | 88 - .../src/app/ui/views/toolbar/chart/state.ts | 42 - .../app/ui/views/toolbar/chart/styles.less | 32 - .../views/toolbar/chart/summary/component.ts | 49 - .../views/toolbar/chart/summary/styles.less | 22 - .../views/toolbar/chart/summary/template.html | 1 - .../app/ui/views/toolbar/chart/template.html | 6 - .../app/ui/views/toolbar/details/component.ts | 108 - .../app/ui/views/toolbar/details/module.ts | 11 - .../app/ui/views/toolbar/details/styles.less | 44 - .../ui/views/toolbar/details/template.html | 17 - .../app/ui/views/toolbar/history/component.ts | 116 - .../app/ui/views/toolbar/history/module.ts | 34 - .../views/toolbar/history/preset/component.ts | 119 - .../views/toolbar/history/preset/styles.less | 40 - .../toolbar/history/preset/template.html | 60 - .../history/preview/chart/component.ts | 20 - .../toolbar/history/preview/chart/styles.less | 68 - .../history/preview/chart/template.html | 4 - .../history/preview/filter/component.ts | 20 - .../history/preview/filter/styles.less | 68 - .../history/preview/filter/template.html | 10 - .../src/app/ui/views/toolbar/history/state.ts | 220 - .../app/ui/views/toolbar/history/styles.less | 63 - .../ui/views/toolbar/history/template.html | 32 - .../client/src/app/ui/views/toolbar/module.ts | 14 - .../app/ui/views/toolbar/search/component.ts | 48 - .../ui/views/toolbar/search/input/active.ts | 35 - .../views/toolbar/search/input/component.ts | 226 - .../ui/views/toolbar/search/input/error.ts | 74 - .../ui/views/toolbar/search/input/input.ts | 165 - .../ui/views/toolbar/search/input/progress.ts | 52 - .../ui/views/toolbar/search/input/styles.less | 122 - .../views/toolbar/search/input/template.html | 94 - .../src/app/ui/views/toolbar/search/module.ts | 40 - .../views/toolbar/search/nested/component.ts | 150 - .../views/toolbar/search/nested/styles.less | 55 - .../views/toolbar/search/nested/template.html | 81 - .../views/toolbar/search/results/backing.ts | 95 - .../views/toolbar/search/results/component.ts | 203 - .../views/toolbar/search/results/styles.less | 9 - .../toolbar/search/results/template.html | 1 - .../app/ui/views/toolbar/search/styles.less | 22 - .../app/ui/views/toolbar/search/template.html | 3 - .../src/app/ui/views/workspace/backing.ts | 70 - .../src/app/ui/views/workspace/component.ts | 212 - .../ui/views/workspace/headers/component.ts | 125 - .../views/workspace/headers/menu/component.ts | 78 - .../views/workspace/headers/menu/styles.less | 100 - .../workspace/headers/menu/template.html | 29 - .../ui/views/workspace/headers/styles.less | 49 - .../ui/views/workspace/headers/template.html | 16 - .../app/ui/views/workspace/map/component.ts | 57 - .../src/app/ui/views/workspace/map/state.ts | 120 - .../app/ui/views/workspace/map/styles.less | 19 - .../app/ui/views/workspace/map/template.html | 1 - .../src/app/ui/views/workspace/module.ts | 52 - .../app/ui/views/workspace/sde/component.ts | 99 - .../src/app/ui/views/workspace/sde/state.ts | 143 - .../app/ui/views/workspace/sde/styles.less | 87 - .../app/ui/views/workspace/sde/template.html | 29 - .../src/app/ui/views/workspace/styles.less | 18 - .../src/app/ui/views/workspace/template.html | 9 - .../app/ui/views/workspace/title/component.ts | 43 - .../src/app/ui/views/workspace/title/state.ts | 109 - .../app/ui/views/workspace/title/styles.less | 24 - .../ui/views/workspace/title/template.html | 5 - application/client/src/assets/.gitkeep | 0 application/client/src/assets/about.gif | Bin 4546328 -> 0 bytes .../client/src/assets/documentation/about.md | 88 - .../documentation/charts/charts_dynamic.gif | Bin 1603145 -> 0 bytes .../documentation/charts/charts_filters.gif | Bin 2737209 -> 0 bytes .../src/assets/documentation/charts/create.md | 18 - .../assets/documentation/charts/dynamic.md | 10 - .../src/assets/documentation/charts/readme.md | 2 - .../src/assets/documentation/features.md | 38 - .../documentation/navigation/favorites.md | 12 - .../assets/documentation/navigation/readme.md | 2 - .../navigation/recent_actions_favorities.gif | Bin 1052548 -> 0 bytes .../documentation/navigation/recents.md | 12 - .../client/src/assets/documentation/readme.md | 6 - .../src/assets/documentation/search/active.md | 17 - .../documentation/search/breadcrumbs.gif | Bin 1886348 -> 0 bytes .../documentation/search/breadcrumbs.md | 13 - .../src/assets/documentation/search/create.md | 21 - .../documentation/search/filters_create.gif | Bin 2275763 -> 0 bytes .../search/filters_enable_disable.gif | Bin 794421 -> 0 bytes .../search/filters_show_matches.gif | Bin 677384 -> 0 bytes .../assets/documentation/search/importing.gif | Bin 274858 -> 0 bytes .../assets/documentation/search/importing.md | 18 - .../documentation/search/manipulation.md | 15 - .../src/assets/documentation/search/readme.md | 6 - .../teamwork/add_new_repository.md | 25 - .../assets/documentation/teamwork/readme.md | 2 - .../assets/documentation/teamwork/sharing.md | 38 - .../src/environments/environment.prod.ts | 3 - .../client/src/environments/environment.ts | 16 - application/client/src/index.html | 12 - application/client/src/main.ts | 41 - application/client/src/polyfills.ts | 53 - application/client/src/test.ts | 14 - application/client/tsconfig.app.json | 9 - application/client/tsconfig.json | 51 - application/client/tsconfig.spec.json | 10 - application/client/yarn.lock | 10231 ---------------- application/holder/.eslintrc.json | 35 - application/holder/.yarnrc.yml | 1 - .../holder/electron.config.darwin.arm64.json | 42 - .../holder/electron.config.darwin.x86.json | 42 - application/holder/electron.config.linux.json | 50 - application/holder/electron.config.win.json | 30 - application/holder/eslint.config.mjs | 51 - application/holder/package.json | 75 - application/holder/src/app.ts | 4 - application/holder/src/controller/settings.ts | 151 - application/holder/src/env/fs/accessor.ts | 72 - application/holder/src/env/fs/index.ts | 150 - application/holder/src/env/fs/stream.ts | 53 - application/holder/src/env/logs/filestore.ts | 52 - application/holder/src/env/logs/index.ts | 42 - application/holder/src/env/os/index.ts | 199 - application/holder/src/env/os/platform.ts | 74 - application/holder/src/loaders/aliases.ts | 37 - application/holder/src/loaders/cli.ts | 222 - application/holder/src/loaders/controllers.ts | 4 - application/holder/src/loaders/envvars.ts | 261 - .../holder/src/loaders/exitcases/index.ts | 2 - .../holder/src/loaders/exitcases/restart.ts | 7 - .../holder/src/loaders/exitcases/update.ts | 11 - application/holder/src/loaders/init.ts | 17 - application/holder/src/loaders/logger.ts | 55 - application/holder/src/loaders/services.ts | 20 - application/holder/src/loaders/system.ts | 191 - application/holder/src/modules/github.ts | 251 - application/holder/src/modules/index.ts | 22 - application/holder/src/modules/module.ts | 19 - application/holder/src/modules/net.ts | 327 - application/holder/src/modules/version.ts | 45 - application/holder/src/preload/preload.ts | 57 - application/holder/src/register/global.ts | 13 - application/holder/src/register/services.ts | 69 - .../holder/src/service/actions/about.ts | 10 - .../service/actions/export.session.state.ts | 10 - .../holder/src/service/actions/find.ts | 10 - .../holder/src/service/actions/help.ts | 10 - .../service/actions/import.session.state.ts | 10 - .../holder/src/service/actions/index.ts | 14 - .../holder/src/service/actions/jumpto.ts | 10 - .../holder/src/service/actions/open.file.ts | 17 - .../holder/src/service/actions/open.folder.ts | 17 - .../src/service/actions/plugins_manager.ts | 10 - .../holder/src/service/actions/settings.ts | 10 - .../holder/src/service/actions/stream.ts | 20 - .../holder/src/service/actions/theme.dark.ts | 10 - .../holder/src/service/actions/theme.light.ts | 10 - .../holder/src/service/actions/updates.ts | 10 - application/holder/src/service/bridge.ts | 221 - .../src/service/bridge/actions/browserurl.ts | 24 - .../src/service/bridge/actions/index.ts | 1 - .../src/service/bridge/app/alpha_release.ts | 48 - .../src/service/bridge/app/changelogs.ts | 73 - .../holder/src/service/bridge/app/index.ts | 3 - .../holder/src/service/bridge/app/version.ts | 24 - .../holder/src/service/bridge/file/copy.ts | 57 - .../src/service/bridge/file/copyfile.ts | 30 - .../holder/src/service/bridge/file/exists.ts | 23 - .../src/service/bridge/file/exportsession.ts | 67 - .../holder/src/service/bridge/file/file.ts | 38 - .../holder/src/service/bridge/file/index.ts | 10 - .../holder/src/service/bridge/file/name.ts | 26 - .../holder/src/service/bridge/file/read.ts | 44 - .../holder/src/service/bridge/file/save.ts | 37 - .../holder/src/service/bridge/file/select.ts | 150 - .../holder/src/service/bridge/file/write.ts | 42 - .../src/service/bridge/folder/choose.ts | 29 - .../src/service/bridge/folder/delimiter.ts | 19 - .../holder/src/service/bridge/folder/index.ts | 4 - .../src/service/bridge/folder/select.ts | 143 - .../src/service/bridge/folder/shell_open.ts | 24 - .../holder/src/service/bridge/index.ts | 5 - .../holder/src/service/bridge/os/entity.ts | 66 - .../holder/src/service/bridge/os/homedir.ts | 23 - .../holder/src/service/bridge/os/index.ts | 2 - application/holder/src/service/cli.ts | 310 - application/holder/src/service/cli/action.ts | 43 - application/holder/src/service/cli/index.ts | 6 - application/holder/src/service/cli/open.ts | 129 - application/holder/src/service/cli/parser.ts | 61 - application/holder/src/service/cli/search.ts | 70 - application/holder/src/service/cli/stream.ts | 234 - application/holder/src/service/electron.ts | 119 - .../holder/src/service/electron/dialogs.ts | 133 - .../src/service/electron/handles/clipboard.ts | 28 - .../src/service/electron/handles/index.ts | 18 - .../holder/src/service/electron/protocol.ts | 101 - .../holder/src/service/electron/transport.ts | 278 - .../holder/src/service/electron/window.ts | 136 - .../src/service/electron/window/settings.ts | 45 - application/holder/src/service/env.ts | 178 - application/holder/src/service/env/storage.ts | 83 - application/holder/src/service/github.ts | 742 -- .../holder/src/service/github/request.ts | 18 - .../service/github/requests/createcommit.ts | 93 - .../src/service/github/requests/createtree.ts | 75 - .../service/github/requests/getbranchsha.ts | 53 - .../src/service/github/requests/getcommit.ts | 88 - .../github/requests/getcommitbyfile.ts | 90 - .../service/github/requests/getfilecontent.ts | 88 - .../service/github/requests/getusername.ts | 85 - .../src/service/github/requests/index.ts | 8 - .../src/service/github/requests/updateref.ts | 63 - .../holder/src/service/github/tools.ts | 48 - application/holder/src/service/hotkeys.ts | 200 - application/holder/src/service/jobs.ts | 76 - .../holder/src/service/jobs/aliases.ts | 3 - application/holder/src/service/jobs/job.ts | 139 - application/holder/src/service/menu.ts | 622 - .../holder/src/service/notifications.ts | 112 - application/holder/src/service/paths.ts | 352 - application/holder/src/service/production.ts | 33 - application/holder/src/service/sessions.ts | 331 - .../holder/src/service/sessions/active.ts | 9 - .../holder/src/service/sessions/holder.ts | 203 - .../src/service/sessions/requests/index.ts | 5 - .../sessions/requests/observe/abort.ts | 40 - .../sessions/requests/observe/index.ts | 5 - .../service/sessions/requests/observe/list.ts | 28 - .../service/sessions/requests/observe/sde.ts | 42 - .../sessions/requests/observe/sources.ts | 34 - .../sessions/requests/observe/start.ts | 40 - .../service/sessions/requests/search/drop.ts | 44 - .../service/sessions/requests/search/index.ts | 5 - .../service/sessions/requests/search/map.ts | 41 - .../sessions/requests/search/nearest.ts | 47 - .../sessions/requests/search/next_nested.ts | 38 - .../sessions/requests/search/search.ts | 61 - .../sessions/requests/session/create.ts | 151 - .../sessions/requests/session/destroy.ts | 49 - .../requests/session/export.raw.awailable.ts | 43 - .../sessions/requests/session/export.raw.ts | 65 - .../sessions/requests/session/export.ts | 65 - .../sessions/requests/session/index.ts | 5 - .../sessions/requests/stream/add_bookmark.ts | 40 - .../service/sessions/requests/stream/chunk.ts | 36 - .../requests/stream/expand_indexing_map.ts | 40 - .../service/sessions/requests/stream/index.ts | 11 - .../sessions/requests/stream/indexed.ts | 36 - .../sessions/requests/stream/indexed_len.ts | 34 - .../requests/stream/indexes_around.ts | 44 - .../requests/stream/indexes_as_ranges.ts | 34 - .../sessions/requests/stream/ranges.ts | 34 - .../requests/stream/remove_bookmark.ts | 40 - .../sessions/requests/stream/set_bookmarks.ts | 40 - .../requests/stream/set_indexing_mode.ts | 40 - .../sessions/requests/values/extract.ts | 58 - .../service/sessions/requests/values/frame.ts | 61 - .../service/sessions/requests/values/index.ts | 2 - application/holder/src/service/settings.ts | 133 - .../holder/src/service/settings/colors.ts | 43 - .../holder/src/service/settings/index.ts | 3 - .../holder/src/service/settings/network.ts | 43 - .../src/service/settings/requests/entries.ts | 23 - .../src/service/settings/requests/get.ts | 24 - .../src/service/settings/requests/index.ts | 4 - .../src/service/settings/requests/set.ts | 47 - .../src/service/settings/requests/validate.ts | 47 - .../holder/src/service/settings/updater.ts | 31 - application/holder/src/service/storage.ts | 285 - .../holder/src/service/storage/entries.ts | 169 - application/holder/src/service/unbound.ts | 178 - .../holder/src/service/unbound/dlt/index.ts | 1 - .../holder/src/service/unbound/dlt/stat.ts | 42 - .../src/service/unbound/file/checksum.ts | 36 - .../holder/src/service/unbound/file/index.ts | 2 - .../src/service/unbound/file/isbinary.ts | 36 - .../holder/src/service/unbound/index.ts | 6 - .../holder/src/service/unbound/os/index.ts | 2 - .../holder/src/service/unbound/os/list.ts | 36 - .../holder/src/service/unbound/os/shells.ts | 32 - .../src/service/unbound/plugins/add_plugin.ts | 24 - .../src/service/unbound/plugins/index.ts | 10 - .../unbound/plugins/installed_plugin_info.ts | 24 - .../unbound/plugins/invalid_plugin_info.ts | 24 - .../service/unbound/plugins/list_installed.ts | 24 - .../unbound/plugins/list_installed_paths.ts | 24 - .../service/unbound/plugins/list_invalid.ts | 24 - .../unbound/plugins/list_invalid_paths.ts | 24 - .../src/service/unbound/plugins/reload.ts | 24 - .../service/unbound/plugins/remove_plugin.ts | 24 - .../src/service/unbound/plugins/rundata.ts | 24 - .../src/service/unbound/serial/index.ts | 1 - .../src/service/unbound/serial/ports.ts | 39 - .../src/service/unbound/someip/index.ts | 1 - .../src/service/unbound/someip/statistic.ts | 42 - application/holder/src/service/updater.ts | 546 - .../holder/src/service/updater/alpha.ts | 80 - .../holder/src/service/updater/metadata.ts | 55 - .../holder/src/service/updater/releasefile.ts | 37 - .../holder/src/service/updater/version.ts | 58 - application/holder/tsconfig.json | 37 - application/holder/yarn.lock | 5159 -------- application/platform/.eslintrc.json | 42 - application/platform/.yarnrc.yml | 3 - application/platform/entity/controller.ts | 72 - application/platform/entity/index.ts | 3 - application/platform/entity/logger.ts | 39 - application/platform/entity/service.ts | 104 - application/platform/env/decorators.ts | 84 - application/platform/env/filters.ts | 35 - application/platform/env/globals.ts | 37 - application/platform/env/hash.ts | 12 - application/platform/env/index.ts | 16 - application/platform/env/ipaddr.ts | 88 - application/platform/env/lock.token.ts | 78 - application/platform/env/normalized.ts | 39 - application/platform/env/num.ts | 39 - application/platform/env/obj.ts | 434 - application/platform/env/observer.ts | 164 - application/platform/env/promise.ts | 553 - application/platform/env/queue.ts | 91 - application/platform/env/regex.ts | 59 - application/platform/env/runner.ts | 62 - application/platform/env/scope.ts | 54 - application/platform/env/sequence.ts | 32 - application/platform/env/str.ts | 29 - application/platform/env/subscription.ts | 350 - application/platform/env/togglers.ts | 42 - application/platform/eslint.config.mjs | 51 - application/platform/ipc/event/cli/done.ts | 10 - application/platform/ipc/event/cli/index.ts | 1 - .../platform/ipc/event/declarations.ts | 95 - .../platform/ipc/event/github/conflict.ts | 27 - .../platform/ipc/event/github/fileupdated.ts | 18 - .../platform/ipc/event/github/index.ts | 2 - application/platform/ipc/event/hotkey/emit.ts | 16 - .../platform/ipc/event/hotkey/index.ts | 1 - application/platform/ipc/event/index.ts | 11 - application/platform/ipc/event/logs/index.ts | 1 - application/platform/ipc/event/logs/write.ts | 19 - .../platform/ipc/event/notification/index.ts | 1 - .../platform/ipc/event/notification/pop.ts | 21 - .../platform/ipc/event/observe/finished.ts | 20 - .../platform/ipc/event/observe/index.ts | 2 - .../platform/ipc/event/observe/started.ts | 20 - .../platform/ipc/event/search/index.ts | 2 - .../platform/ipc/event/search/mapupdated.ts | 18 - .../platform/ipc/event/search/updated.ts | 20 - .../platform/ipc/event/state/backend.ts | 23 - .../platform/ipc/event/state/client.ts | 23 - application/platform/ipc/event/state/index.ts | 3 - application/platform/ipc/event/state/job.ts | 36 - .../platform/ipc/event/stream/attachment.ts | 27 - .../platform/ipc/event/stream/index.ts | 3 - .../ipc/event/stream/indexed_map_updated.ts | 18 - .../platform/ipc/event/stream/updated.ts | 21 - .../platform/ipc/event/values/index.ts | 1 - .../platform/ipc/event/values/updated.ts | 18 - application/platform/ipc/index.ts | 4 - .../platform/ipc/request/action/call.ts | 33 - .../platform/ipc/request/action/index.ts | 1 - .../platform/ipc/request/actions/about.ts | 10 - .../request/actions/export.session.state.ts | 10 - .../platform/ipc/request/actions/find.ts | 10 - .../platform/ipc/request/actions/help.ts | 10 - .../request/actions/import.session.state.ts | 10 - .../platform/ipc/request/actions/index.ts | 15 - .../platform/ipc/request/actions/jumpto.ts | 10 - .../ipc/request/actions/open.browserurl.ts | 20 - .../platform/ipc/request/actions/open.file.ts | 31 - .../ipc/request/actions/open.folder.ts | 31 - .../ipc/request/actions/plugins_manager.ts | 10 - .../platform/ipc/request/actions/settings.ts | 10 - .../platform/ipc/request/actions/stream.ts | 32 - .../ipc/request/actions/theme.dark.ts | 10 - .../ipc/request/actions/theme.light.ts | 10 - .../platform/ipc/request/actions/updates.ts | 10 - .../platform/ipc/request/app/alpha_release.ts | 23 - .../platform/ipc/request/app/changelogs.ts | 31 - application/platform/ipc/request/app/index.ts | 3 - .../platform/ipc/request/app/version.ts | 21 - .../platform/ipc/request/cli/getcommand.ts | 20 - application/platform/ipc/request/cli/index.ts | 4 - .../platform/ipc/request/cli/multi_files.ts | 22 - .../platform/ipc/request/cli/observe.ts | 38 - .../platform/ipc/request/cli/search.ts | 29 - application/platform/ipc/request/cwd/get.ts | 29 - application/platform/ipc/request/cwd/index.ts | 2 - application/platform/ipc/request/cwd/set.ts | 31 - .../platform/ipc/request/declarations.ts | 82 - application/platform/ipc/request/dlt/index.ts | 1 - application/platform/ipc/request/dlt/stat.ts | 28 - application/platform/ipc/request/env/get.ts | 21 - application/platform/ipc/request/env/index.ts | 1 - .../platform/ipc/request/file/checksum.ts | 30 - application/platform/ipc/request/file/copy.ts | 30 - .../platform/ipc/request/file/copyfile.ts | 30 - .../platform/ipc/request/file/exists.ts | 28 - .../ipc/request/file/exportsession.ts | 28 - application/platform/ipc/request/file/file.ts | 29 - .../platform/ipc/request/file/index.ts | 12 - .../platform/ipc/request/file/isbinary.ts | 29 - application/platform/ipc/request/file/name.ts | 34 - application/platform/ipc/request/file/read.ts | 30 - application/platform/ipc/request/file/save.ts | 32 - .../platform/ipc/request/file/select.ts | 34 - .../platform/ipc/request/file/write.ts | 32 - .../platform/ipc/request/folder/choose.ts | 20 - .../platform/ipc/request/folder/delimiter.ts | 20 - .../platform/ipc/request/folder/index.ts | 4 - .../platform/ipc/request/folder/select.ts | 34 - .../platform/ipc/request/folder/shell_open.ts | 19 - .../platform/ipc/request/github/addrepo.ts | 52 - .../ipc/request/github/checkupdates.ts | 31 - .../platform/ipc/request/github/getactive.ts | 20 - .../ipc/request/github/getfilemeta.ts | 42 - .../platform/ipc/request/github/getrepos.ts | 26 - .../ipc/request/github/getusername.ts | 22 - .../platform/ipc/request/github/index.ts | 10 - .../platform/ipc/request/github/removerepo.ts | 28 - .../platform/ipc/request/github/setactive.ts | 28 - .../ipc/request/github/setfilemeta.ts | 39 - .../platform/ipc/request/github/updaterepo.ts | 53 - .../platform/ipc/request/hotkey/index.ts | 2 - .../platform/ipc/request/hotkey/off.ts | 20 - application/platform/ipc/request/hotkey/on.ts | 20 - application/platform/ipc/request/index.ts | 24 - .../platform/ipc/request/observe/abort.ts | 33 - .../platform/ipc/request/observe/index.ts | 5 - .../platform/ipc/request/observe/list.ts | 31 - .../platform/ipc/request/observe/sde.ts | 38 - .../platform/ipc/request/observe/sources.ts | 32 - .../platform/ipc/request/observe/start.ts | 38 - application/platform/ipc/request/os/entity.ts | 31 - .../platform/ipc/request/os/homedir.ts | 20 - application/platform/ipc/request/os/index.ts | 4 - application/platform/ipc/request/os/list.ts | 44 - application/platform/ipc/request/os/shells.ts | 21 - .../ipc/request/plugins/add_plugin.ts | 28 - .../platform/ipc/request/plugins/index.ts | 10 - .../request/plugins/installed_plugin_info.ts | 29 - .../request/plugins/invalid_plugin_info.ts | 29 - .../ipc/request/plugins/list_installed.ts | 22 - .../request/plugins/list_installed_paths.ts | 20 - .../ipc/request/plugins/list_invalid.ts | 22 - .../ipc/request/plugins/list_invalid_paths.ts | 20 - .../platform/ipc/request/plugins/reload.ts | 20 - .../ipc/request/plugins/remove_plugin.ts | 28 - .../platform/ipc/request/plugins/rundata.ts | 30 - .../platform/ipc/request/search/drop.ts | 29 - .../platform/ipc/request/search/index.ts | 5 - .../platform/ipc/request/search/map.ts | 47 - .../platform/ipc/request/search/nearest.ts | 34 - .../ipc/request/search/next_nested.ts | 38 - .../platform/ipc/request/search/search.ts | 38 - .../platform/ipc/request/serial/index.ts | 1 - .../platform/ipc/request/serial/ports.ts | 23 - .../platform/ipc/request/session/create.ts | 25 - .../platform/ipc/request/session/destroy.ts | 30 - .../request/session/export.raw.available.ts | 29 - .../ipc/request/session/export.raw.ts | 34 - .../platform/ipc/request/session/export.ts | 49 - .../platform/ipc/request/session/index.ts | 5 - .../platform/ipc/request/settings/entries.ts | 21 - .../platform/ipc/request/settings/get.ts | 30 - .../platform/ipc/request/settings/index.ts | 4 - .../platform/ipc/request/settings/set.ts | 36 - .../platform/ipc/request/settings/validate.ts | 36 - .../platform/ipc/request/someip/index.ts | 1 - .../platform/ipc/request/someip/statistic.ts | 29 - .../platform/ipc/request/storage/delete.ts | 20 - .../ipc/request/storage/entries.delete.ts | 22 - .../ipc/request/storage/entries.get.ts | 35 - .../ipc/request/storage/entries.set.ts | 31 - .../platform/ipc/request/storage/index.ts | 6 - .../platform/ipc/request/storage/read.ts | 30 - .../platform/ipc/request/storage/write.ts | 22 - .../ipc/request/stream/add_bookmark.ts | 33 - .../platform/ipc/request/stream/chunk.ts | 39 - .../platform/ipc/request/stream/expand.ts | 37 - .../platform/ipc/request/stream/index.ts | 11 - .../platform/ipc/request/stream/indexed.ts | 39 - .../ipc/request/stream/indexed_len.ts | 31 - .../ipc/request/stream/indexes_around.ts | 42 - .../ipc/request/stream/indexes_as_ranges.ts | 32 - .../platform/ipc/request/stream/mode.ts | 34 - .../platform/ipc/request/stream/ranges.ts | 34 - .../ipc/request/stream/remove_bookmark.ts | 33 - .../ipc/request/stream/set_bookmarks.ts | 33 - .../ipc/request/system/check_updates.ts | 22 - .../platform/ipc/request/system/exit.ts | 10 - .../platform/ipc/request/system/index.ts | 3 - .../platform/ipc/request/system/shutdown.ts | 32 - .../platform/ipc/request/values/extract.ts | 35 - .../platform/ipc/request/values/frame.ts | 47 - .../platform/ipc/request/values/index.ts | 2 - application/platform/ipc/setup/channels.ts | 24 - .../platform/ipc/transport/errors/index.ts | 1 - .../platform/ipc/transport/errors/native.ts | 29 - application/platform/ipc/transport/index.ts | 268 - application/platform/lib.ts | 5 - application/platform/log/defaults.ts | 19 - application/platform/log/index.ts | 5 - application/platform/log/levels.ts | 30 - application/platform/log/logger.ts | 225 - application/platform/log/state.ts | 50 - application/platform/log/utils.ts | 66 - application/platform/modules/index.ts | 1 - application/platform/modules/system.ts | 170 - application/platform/package.json | 150 - application/platform/tsconfig.json | 28 - .../platform/types/bindings/attachment.ts | 43 - .../platform/types/bindings/callback.ts | 61 - .../platform/types/bindings/command.ts | 186 - application/platform/types/bindings/dlt.ts | 22 - application/platform/types/bindings/error.ts | 33 - application/platform/types/bindings/index.ts | 11 - .../platform/types/bindings/lf_transition.ts | 23 - .../platform/types/bindings/miscellaneous.ts | 109 - .../platform/types/bindings/observe.ts | 185 - .../platform/types/bindings/operations.ts | 48 - .../platform/types/bindings/plugins.ts | 241 - .../platform/types/bindings/progress.ts | 43 - application/platform/types/bookmark.ts | 3 - application/platform/types/chart.ts | 17 - application/platform/types/comment.ts | 36 - application/platform/types/content.ts | 166 - application/platform/types/env/types.ts | 35 - application/platform/types/exporting.ts | 5 - application/platform/types/files.ts | 129 - application/platform/types/filter.ts | 75 - .../platform/types/github/bookmarks.ts | 20 - application/platform/types/github/chart.ts | 27 - application/platform/types/github/comment.ts | 48 - .../platform/types/github/filemetadata.ts | 114 - application/platform/types/github/filter.ts | 30 - application/platform/types/github/index.ts | 44 - application/platform/types/hotkeys/map.ts | 307 - application/platform/types/index.ts | 13 - application/platform/types/io/read.ts | 7 - application/platform/types/io/write.ts | 7 - .../platform/types/life/destroyable.ts | 3 - application/platform/types/net.ts | 3 - .../platform/types/notification/index.ts | 6 - .../platform/types/observe/compatibility.ts | 91 - .../platform/types/observe/configuration.ts | 254 - .../platform/types/observe/description.ts | 39 - application/platform/types/observe/factory.ts | 370 - application/platform/types/observe/index.ts | 193 - .../platform/types/observe/origin/concat.ts | 176 - .../platform/types/observe/origin/file.ts | 170 - .../platform/types/observe/origin/index.ts | 258 - .../platform/types/observe/origin/plugin.ts | 123 - .../platform/types/observe/origin/stream.ts | 150 - .../types/observe/origin/stream/index.ts | 255 - .../observe/origin/stream/process/index.ts | 109 - .../observe/origin/stream/serial/index.ts | 105 - .../types/observe/origin/stream/tcp/index.ts | 80 - .../types/observe/origin/stream/udp/index.ts | 113 - .../types/observe/parser/dlt/index.ts | 185 - .../platform/types/observe/parser/index.ts | 235 - .../types/observe/parser/plugin/index.ts | 129 - .../types/observe/parser/someip/index.ts | 87 - .../types/observe/parser/text/index.ts | 62 - application/platform/types/observe/sde.ts | 3 - .../types/observe/types/file/index.ts | 38 - .../platform/types/observe/types/index.ts | 3 - .../types/observe/types/plugin/index.ts | 1 - .../types/observe/types/sourcelink.ts | 4 - application/platform/types/range.ts | 187 - application/platform/types/sde/index.ts | 8 - .../types/settings/entry.description.ts | 93 - application/platform/types/settings/entry.ts | 33 - application/platform/types/storage/entry.ts | 41 - application/platform/types/storage/index.ts | 5 - application/platform/types/storage/json.ts | 28 - .../platform/types/storage/storage.record.ts | 91 - .../storage/storage.record.validators.ts | 76 - application/platform/types/storage/storage.ts | 78 - application/platform/types/unity/mutable.ts | 3 - application/platform/yarn.lock | 2414 ---- cli/development-cli/.dockerignore | 14 - cli/development-cli/.gitignore | 6 - cli/development-cli/CHANGELOG.md | 232 - cli/development-cli/Cargo.lock | 1635 --- cli/development-cli/Cargo.toml | 48 - cli/development-cli/README.md | 44 - cli/development-cli/config/bench_core.toml | 43 - .../config/codesign_macos.toml | 59 - cli/development-cli/config/min_versions.toml | 33 - .../integration_tests/.gitignore | 1 - .../integration_tests/bench.py | 36 - .../integration_tests/build.py | 338 - .../integration_tests/clean.py | 93 - .../integration_tests/environment.py | 41 - cli/development-cli/integration_tests/lint.py | 37 - .../integration_tests/print_dot.py | 41 - .../integration_tests/release.py | 45 - .../integration_tests/run_all.py | 119 - .../integration_tests/shell_compl.py | 31 - .../integration_tests/test_cmd.py | 31 - .../integration_tests/user_config.py | 33 - cli/development-cli/integration_tests/utls.py | 81 - cli/development-cli/src/benchmark/core.rs | 159 - cli/development-cli/src/benchmark/mod.rs | 61 - .../src/build_state_records.rs | 269 - cli/development-cli/src/chipmunk_runner.rs | 25 - cli/development-cli/src/cli_args.rs | 252 - .../src/dev_environment/min_versions.rs | 74 - .../src/dev_environment/mod.rs | 179 - cli/development-cli/src/dev_tools.rs | 77 - cli/development-cli/src/fstools.rs | 91 - cli/development-cli/src/job_type.rs | 106 - .../src/jobs_runner/additional_features.rs | 31 - .../src/jobs_runner/job_definition.rs | 103 - .../src/jobs_runner/jobs_resolver.rs | 663 - .../src/jobs_runner/jobs_state.rs | 187 - cli/development-cli/src/jobs_runner/mod.rs | 236 - cli/development-cli/src/location.rs | 80 - cli/development-cli/src/log_print.rs | 46 - cli/development-cli/src/main.rs | 369 - cli/development-cli/src/print_dot.rs | 49 - cli/development-cli/src/release/bundle.rs | 201 - .../src/release/codesign/macos.rs | 315 - .../src/release/codesign/mod.rs | 62 - cli/development-cli/src/release/compress.rs | 238 - cli/development-cli/src/release/env_utls.rs | 28 - cli/development-cli/src/release/metadata.rs | 61 - cli/development-cli/src/release/mod.rs | 254 - cli/development-cli/src/release/paths.rs | 84 - cli/development-cli/src/shell.rs | 175 - cli/development-cli/src/spawner.rs | 182 - cli/development-cli/src/target/app.rs | 42 - cli/development-cli/src/target/binding.rs | 94 - cli/development-cli/src/target/client.rs | 68 - cli/development-cli/src/target/mod.rs | 740 -- cli/development-cli/src/target/protocol.rs | 19 - cli/development-cli/src/target/target_kind.rs | 64 - cli/development-cli/src/target/updater.rs | 16 - cli/development-cli/src/target/wasm.rs | 52 - cli/development-cli/src/target/wrapper.rs | 127 - cli/development-cli/src/tracker.rs | 642 - cli/development-cli/src/user_config.rs | 176 - cli/development-cli/src/version.rs | 268 - crates/dir_checksum/.gitignore | 1 + crates/dir_checksum/Cargo.lock | 470 + .../dir_checksum/Cargo.toml | 8 +- .../dir_checksum/src/file_hash_digest.rs | 0 .../dir_checksum/src/hash_digest.rs | 0 .../dir_checksum/src/hash_error.rs | 0 .../dir_checksum/src/input.rs | 0 .../dir_checksum/src/lib.rs | 0 .../dir_checksum/tests/integration_tests.rs | 0 docker/ubuntu-20.04/Dockerfile | 82 - docker/ubuntu-20.04/build.sh | 16 - docker/ubuntu-20.04/run.sh | 14 - scripts/README.md | 70 - scripts/benchmarks/process.rb | 201 - scripts/benchmarks/setup_dependencies.sh | 9 - scripts/benchmarks/setup_dev_tools.sh | 23 - scripts/build_times.md | 90 - scripts/elements/bindings.rb | 165 - scripts/elements/client.rb | 110 - scripts/elements/electron.rb | 109 - scripts/elements/indexer.rb | 29 - scripts/elements/matcher.rb | 72 - scripts/elements/platform.rb | 124 - scripts/elements/protocol.rb | 45 - scripts/elements/release.rb | 139 - scripts/elements/updater.rb | 27 - scripts/elements/wasm.rb | 76 - scripts/env/env.rb | 76 - scripts/env/paths.rb | 76 - scripts/images/tasks_1.png | Bin 42539 -> 0 bytes scripts/images/tasks_2.png | Bin 129149 -> 0 bytes scripts/images/tasks_3.png | Bin 119434 -> 0 bytes scripts/os/ubuntu_enabler.sh | 34 - scripts/release_app.py | 11 +- scripts/tools/change_checker.rb | 96 - scripts/tools/compressor.rb | 23 - scripts/tools/mod.rb | 7 - scripts/tools/os.rb | 45 - scripts/tools/reporter.rb | 80 - scripts/tools/shell.rb | 79 - scripts/tools/spec/change_checker_spec.rb | 46 - 1862 files changed, 554 insertions(+), 166635 deletions(-) rename application/{holder/resources => apps/indexer/gui/application/data}/icons/ico/icon.ico (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/icons/png/128.png (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/icons/png/16.png (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/icons/png/24.png (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/icons/png/256.png (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/icons/png/32.png (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/icons/png/512.png (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/icons/png/64.png (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/icons/png/icon.png (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/linux/chipmunk.desktop (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/linux/chipmunk.png (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/mac/chipmunk.icns (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/mac/entitlements.mac.plist (100%) rename application/{holder/resources => apps/indexer/gui/application/data}/win/chipmunk.ico (100%) delete mode 100644 application/apps/indexer/stypes/bindings/attachment.ts delete mode 100644 application/apps/indexer/stypes/bindings/callback.ts delete mode 100644 application/apps/indexer/stypes/bindings/command.ts delete mode 100644 application/apps/indexer/stypes/bindings/dlt.ts delete mode 100644 application/apps/indexer/stypes/bindings/error.ts delete mode 100644 application/apps/indexer/stypes/bindings/index.ts delete mode 100644 application/apps/indexer/stypes/bindings/lf_transition.ts delete mode 100644 application/apps/indexer/stypes/bindings/miscellaneous.ts delete mode 100644 application/apps/indexer/stypes/bindings/observe.ts delete mode 100644 application/apps/indexer/stypes/bindings/operations.ts delete mode 100644 application/apps/indexer/stypes/bindings/plugins.ts delete mode 100644 application/apps/indexer/stypes/bindings/progress.ts delete mode 100755 application/apps/indexer/stypes/generate.sh delete mode 100644 application/apps/indexer/stypes/src/attachment/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/attachment/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/callback/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/callback/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/command/dltstat/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/command/dltstat/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/command/folders/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/command/folders/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/command/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/command/profiles/converting.rs delete mode 100644 application/apps/indexer/stypes/src/command/profiles/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/command/profiles/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/command/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/command/serial/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/command/ts.rs delete mode 100644 application/apps/indexer/stypes/src/error/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/error/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/lf_transition/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/lf_transition/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/miscellaneous/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/miscellaneous/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/observe/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/observe/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/operations/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/operations/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/plugins/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/plugins/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/progress/nodejs.rs delete mode 100644 application/apps/indexer/stypes/src/progress/proptest.rs delete mode 100644 application/apps/indexer/stypes/src/tests.rs delete mode 100644 application/apps/indexer/tools/extend/.gitignore delete mode 100644 application/apps/indexer/tools/extend/Cargo.toml delete mode 100644 application/apps/indexer/tools/extend/src/lib.rs delete mode 100644 application/apps/protocol/.gitignore delete mode 100644 application/apps/protocol/Cargo.toml delete mode 100644 application/apps/protocol/src/err.rs delete mode 100644 application/apps/protocol/src/generate.rs delete mode 100644 application/apps/protocol/src/lib.rs delete mode 100755 application/apps/protocol/test.sh delete mode 100644 application/apps/rustcore/rs-bindings/Cargo.lock delete mode 100644 application/apps/rustcore/rs-bindings/Cargo.toml delete mode 100644 application/apps/rustcore/rs-bindings/build.rs delete mode 100644 application/apps/rustcore/rs-bindings/log4rs.yaml delete mode 100644 application/apps/rustcore/rs-bindings/rustfmt.toml delete mode 100644 application/apps/rustcore/rs-bindings/src/js/converting/concat.rs delete mode 100644 application/apps/rustcore/rs-bindings/src/js/converting/filter.rs delete mode 100644 application/apps/rustcore/rs-bindings/src/js/converting/mod.rs delete mode 100644 application/apps/rustcore/rs-bindings/src/js/jobs/mod.rs delete mode 100644 application/apps/rustcore/rs-bindings/src/js/mod.rs delete mode 100644 application/apps/rustcore/rs-bindings/src/js/session/mod.rs delete mode 100644 application/apps/rustcore/rs-bindings/src/js/session/progress_tracker.rs delete mode 100644 application/apps/rustcore/rs-bindings/src/lib.rs delete mode 100644 application/apps/rustcore/rs-bindings/src/logging.rs delete mode 100644 application/apps/rustcore/ts-bindings/.eslintrc.json delete mode 100644 application/apps/rustcore/ts-bindings/.yarnrc.yml delete mode 100644 application/apps/rustcore/ts-bindings/eslint.config.mjs delete mode 100644 application/apps/rustcore/ts-bindings/launch.json delete mode 100644 application/apps/rustcore/ts-bindings/package.json delete mode 100644 application/apps/rustcore/ts-bindings/spec/_session.benchmark.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/benchmarks.json delete mode 100644 application/apps/rustcore/ts-bindings/spec/common.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/config.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/config_benchmarks.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/defaults.json delete mode 100644 application/apps/rustcore/ts-bindings/spec/logger.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/runners.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.cancel.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.concat.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.errors.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.exporting.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.extract.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.indexes.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.jobs.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.map.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.observe.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.observing.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.promises.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.protocol.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.ranges.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.search.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.stream.spec.ts delete mode 100644 application/apps/rustcore/ts-bindings/spec/session.values.spec.ts delete mode 100755 application/apps/rustcore/ts-bindings/spec/setup_config.sh delete mode 100644 application/apps/rustcore/ts-bindings/spec/support/jasmine.json delete mode 100644 application/apps/rustcore/ts-bindings/spec/tests.notes.md delete mode 100644 application/apps/rustcore/ts-bindings/spec/tsconfig.json delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/executor.async.results.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/executor.async.void.confirmed.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/executor.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/session.executors.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/session.sleep.executor.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/session.stream.executors.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/session.stream.export.executor.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/session.stream.export_raw.executor.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/session.stream.extract.executor.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/session.stream.get_values.executor.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/session.stream.map.executor.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/session.stream.nearest.executor.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/session.stream.observe.executor.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/session.stream.search.executor.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/session.stream.searchvalues.executor.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/single.task.extract.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/single.task.search.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/single.task.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/executors/single.task.values.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/jobs.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/session.provider.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/session.search.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/session.stream.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/session.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/tracker.provider.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/api/tracker.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/index.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/interfaces/debug.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/interfaces/errors.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/interfaces/index.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/native/native.jobs.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/native/native.session.required.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/native/native.session.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/native/native.tracker.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/native/native.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/native/remarks.txt delete mode 100644 application/apps/rustcore/ts-bindings/src/provider/provider.errors.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/provider/provider.general.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/provider/provider.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/services/service.production.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/util/numbers.ts delete mode 100644 application/apps/rustcore/ts-bindings/src/util/units.ts delete mode 100644 application/apps/rustcore/ts-bindings/tsconfig.json delete mode 100644 application/apps/rustcore/ts-bindings/yarn.lock delete mode 100644 application/apps/rustcore/wasm-bindings/.gitignore delete mode 100644 application/apps/rustcore/wasm-bindings/.yarnrc.yml delete mode 100644 application/apps/rustcore/wasm-bindings/Cargo.lock delete mode 100644 application/apps/rustcore/wasm-bindings/Cargo.toml delete mode 100644 application/apps/rustcore/wasm-bindings/karma.conf.js delete mode 100644 application/apps/rustcore/wasm-bindings/package.json delete mode 100644 application/apps/rustcore/wasm-bindings/spec/ansi.spec.ts delete mode 100644 application/apps/rustcore/wasm-bindings/spec/filter.spec.ts delete mode 100644 application/apps/rustcore/wasm-bindings/spec/matcher.spec.ts delete mode 100644 application/apps/rustcore/wasm-bindings/src/ansi.rs delete mode 100644 application/apps/rustcore/wasm-bindings/src/filter.rs delete mode 100644 application/apps/rustcore/wasm-bindings/src/lib.rs delete mode 100644 application/apps/rustcore/wasm-bindings/src/matcher.rs delete mode 100644 application/apps/rustcore/wasm-bindings/tsconfig.json delete mode 100644 application/apps/rustcore/wasm-bindings/webpack.config.js delete mode 100644 application/apps/rustcore/wasm-bindings/yarn.lock delete mode 100644 application/client/.yarnrc.yml delete mode 100644 application/client/angular.json delete mode 100644 application/client/eslint.config.mjs delete mode 100644 application/client/package.json delete mode 100644 application/client/src/app/app.component.html delete mode 100644 application/client/src/app/app.component.less delete mode 100644 application/client/src/app/app.component.ts delete mode 100644 application/client/src/app/app.module.ts delete mode 100644 application/client/src/app/env/decorators/component.ts delete mode 100644 application/client/src/app/env/decorators/initial.ts delete mode 100644 application/client/src/app/env/fsstorage.ts delete mode 100644 application/client/src/app/env/logs/index.ts delete mode 100644 application/client/src/app/env/reflect.ts delete mode 100644 application/client/src/app/env/storage.ts delete mode 100644 application/client/src/app/env/storages/recent/item.ts delete mode 100644 application/client/src/app/env/storages/recent/list.ts delete mode 100644 application/client/src/app/env/str.ts delete mode 100644 application/client/src/app/env/urlfilereader.ts delete mode 100644 application/client/src/app/loader/controllers.ts delete mode 100644 application/client/src/app/loader/init.ts delete mode 100644 application/client/src/app/loader/services.ts delete mode 100644 application/client/src/app/loader/system.ts delete mode 100644 application/client/src/app/loader/wasm.ts delete mode 100644 application/client/src/app/module/ansi.ts delete mode 100644 application/client/src/app/module/ipc.ts delete mode 100644 application/client/src/app/module/matcher/holder.ts delete mode 100644 application/client/src/app/module/matcher/index.ts delete mode 100644 application/client/src/app/module/matcher/matchee.ts delete mode 100644 application/client/src/app/module/util.ts delete mode 100644 application/client/src/app/register/services.ts delete mode 100644 application/client/src/app/schema/content/row.ts delete mode 100644 application/client/src/app/schema/ids.ts delete mode 100644 application/client/src/app/schema/render/columns.ts delete mode 100644 application/client/src/app/schema/render/dlt.ts delete mode 100644 application/client/src/app/schema/render/index.ts delete mode 100644 application/client/src/app/schema/render/plugin.ts delete mode 100644 application/client/src/app/schema/render/someip.ts delete mode 100644 application/client/src/app/schema/render/text.ts delete mode 100644 application/client/src/app/schema/render/tools.ts delete mode 100644 application/client/src/app/service/actions.ts delete mode 100644 application/client/src/app/service/actions/about.ts delete mode 100644 application/client/src/app/service/actions/action.ts delete mode 100644 application/client/src/app/service/actions/exit.ts delete mode 100644 application/client/src/app/service/actions/export.session.state.ts delete mode 100644 application/client/src/app/service/actions/file.any.ts delete mode 100644 application/client/src/app/service/actions/file.dlt.ts delete mode 100644 application/client/src/app/service/actions/file.parserPlugin.ts delete mode 100644 application/client/src/app/service/actions/file.pcap.ts delete mode 100644 application/client/src/app/service/actions/file.pcapng.ts delete mode 100644 application/client/src/app/service/actions/file.plugins.ts delete mode 100644 application/client/src/app/service/actions/file.text.ts delete mode 100644 application/client/src/app/service/actions/find.ts delete mode 100644 application/client/src/app/service/actions/folder.any.ts delete mode 100644 application/client/src/app/service/actions/folder.dlt.ts delete mode 100644 application/client/src/app/service/actions/folder.parserPlugin.ts delete mode 100644 application/client/src/app/service/actions/folder.pcap.ts delete mode 100644 application/client/src/app/service/actions/folder.pcapng.ts delete mode 100644 application/client/src/app/service/actions/folder.plugins.ts delete mode 100644 application/client/src/app/service/actions/folder.text.ts delete mode 100644 application/client/src/app/service/actions/help.ts delete mode 100644 application/client/src/app/service/actions/import.session.state.ts delete mode 100644 application/client/src/app/service/actions/index.ts delete mode 100644 application/client/src/app/service/actions/jumpto.ts delete mode 100644 application/client/src/app/service/actions/plugins_manager.ts delete mode 100644 application/client/src/app/service/actions/serial.parserPlugin.ts delete mode 100644 application/client/src/app/service/actions/serial.text.ts delete mode 100644 application/client/src/app/service/actions/settings.ts delete mode 100644 application/client/src/app/service/actions/stdout.plugin.ts delete mode 100644 application/client/src/app/service/actions/stdout.text.ts delete mode 100644 application/client/src/app/service/actions/storage.ts delete mode 100644 application/client/src/app/service/actions/tcp.dlt.ts delete mode 100644 application/client/src/app/service/actions/tcp.parserPlugin.ts delete mode 100644 application/client/src/app/service/actions/theme.dark.ts delete mode 100644 application/client/src/app/service/actions/theme.light.ts delete mode 100644 application/client/src/app/service/actions/udp.dlt.ts delete mode 100644 application/client/src/app/service/actions/udp.parserPlugin.ts delete mode 100644 application/client/src/app/service/actions/updates.ts delete mode 100644 application/client/src/app/service/api.ts delete mode 100644 application/client/src/app/service/api/transport/electron.ts delete mode 100644 application/client/src/app/service/bridge.ts delete mode 100644 application/client/src/app/service/changelogs.ts delete mode 100644 application/client/src/app/service/cli.ts delete mode 100644 application/client/src/app/service/cli/index.ts delete mode 100644 application/client/src/app/service/cli/multi_files.ts delete mode 100644 application/client/src/app/service/cli/observe.ts delete mode 100644 application/client/src/app/service/cli/search.ts delete mode 100644 application/client/src/app/service/env.ts delete mode 100644 application/client/src/app/service/favorites.ts delete mode 100644 application/client/src/app/service/history.ts delete mode 100644 application/client/src/app/service/history/collection.bookmarks.ts delete mode 100644 application/client/src/app/service/history/collection.charts.ts delete mode 100644 application/client/src/app/service/history/collection.disabled.ts delete mode 100644 application/client/src/app/service/history/collection.filters.ts delete mode 100644 application/client/src/app/service/history/collection.ts delete mode 100644 application/client/src/app/service/history/collections.ts delete mode 100644 application/client/src/app/service/history/definition.concat.ts delete mode 100644 application/client/src/app/service/history/definition.file.ts delete mode 100644 application/client/src/app/service/history/definition.stream.ts delete mode 100644 application/client/src/app/service/history/definition.ts delete mode 100644 application/client/src/app/service/history/definitions.ts delete mode 100644 application/client/src/app/service/history/provider.ts delete mode 100644 application/client/src/app/service/history/session.ts delete mode 100644 application/client/src/app/service/history/storage.collections.ts delete mode 100644 application/client/src/app/service/history/storage.definitions.ts delete mode 100644 application/client/src/app/service/history/suitable.ts delete mode 100644 application/client/src/app/service/hotkeys.ts delete mode 100644 application/client/src/app/service/hotkeys/emitter.ts delete mode 100644 application/client/src/app/service/hotkeys/listener.ts delete mode 100644 application/client/src/app/service/ilc.ts delete mode 100644 application/client/src/app/service/ilc/declarations/backend/job.ts delete mode 100644 application/client/src/app/service/ilc/declarations/backend/state.ts delete mode 100644 application/client/src/app/service/ilc/declarations/contextmenu.ts delete mode 100644 application/client/src/app/service/ilc/declarations/hotkey.ts delete mode 100644 application/client/src/app/service/ilc/declarations/index.ts delete mode 100644 application/client/src/app/service/ilc/declarations/popup.ts delete mode 100644 application/client/src/app/service/ilc/declarations/sidebar.ts delete mode 100644 application/client/src/app/service/ilc/declarations/toolbar.ts delete mode 100644 application/client/src/app/service/ilc/declarations/ui/index.ts delete mode 100644 application/client/src/app/service/ilc/declarations/ui/rank.ts delete mode 100644 application/client/src/app/service/ilc/events.channel.ts delete mode 100644 application/client/src/app/service/ilc/events.emitter.ts delete mode 100644 application/client/src/app/service/ilc/events.ts delete mode 100644 application/client/src/app/service/ilc/services.ts delete mode 100644 application/client/src/app/service/jobs.ts delete mode 100644 application/client/src/app/service/jobs/job.ts delete mode 100644 application/client/src/app/service/plugins.ts delete mode 100644 application/client/src/app/service/recent.ts delete mode 100644 application/client/src/app/service/recent/action.ts delete mode 100644 application/client/src/app/service/recent/compatibility.ts delete mode 100644 application/client/src/app/service/recent/stat.ts delete mode 100644 application/client/src/app/service/session.ts delete mode 100644 application/client/src/app/service/session/base.ts delete mode 100644 application/client/src/app/service/session/dependencies/attachments.ts delete mode 100644 application/client/src/app/service/session/dependencies/bookmark/bookmark.ts delete mode 100644 application/client/src/app/service/session/dependencies/bookmarks.ts delete mode 100644 application/client/src/app/service/session/dependencies/charts/cursor.ts delete mode 100644 application/client/src/app/service/session/dependencies/charts/index.ts delete mode 100644 application/client/src/app/service/session/dependencies/cli.ts delete mode 100644 application/client/src/app/service/session/dependencies/comments/comment.ts delete mode 100644 application/client/src/app/service/session/dependencies/comments/index.ts delete mode 100644 application/client/src/app/service/session/dependencies/cursor.ts delete mode 100644 application/client/src/app/service/session/dependencies/exporter.ts delete mode 100644 application/client/src/app/service/session/dependencies/indexed.ts delete mode 100644 application/client/src/app/service/session/dependencies/info.ts delete mode 100644 application/client/src/app/service/session/dependencies/observing/implementations/files.ts delete mode 100644 application/client/src/app/service/session/dependencies/observing/implementations/index.ts delete mode 100644 application/client/src/app/service/session/dependencies/observing/implementations/processes.ts delete mode 100644 application/client/src/app/service/session/dependencies/observing/implementations/serial.ts delete mode 100644 application/client/src/app/service/session/dependencies/observing/implementations/tcp.ts delete mode 100644 application/client/src/app/service/session/dependencies/observing/implementations/udp.ts delete mode 100644 application/client/src/app/service/session/dependencies/observing/operation.ts delete mode 100644 application/client/src/app/service/session/dependencies/observing/provider.ts delete mode 100644 application/client/src/app/service/session/dependencies/observing/providers.ts delete mode 100644 application/client/src/app/service/session/dependencies/observing/sde.ts delete mode 100644 application/client/src/app/service/session/dependencies/observing/source.ts delete mode 100644 application/client/src/app/service/session/dependencies/rank.ts delete mode 100644 application/client/src/app/service/session/dependencies/search.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/charts/request.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/charts/store.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/charts/store.update.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/disabled/converting.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/disabled/request.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/disabled/store.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/filters/request.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/filters/store.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/filters/store.update.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/highlights.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/highlights/modifier.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/highlights/modifiers/active.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/highlights/modifiers/asci.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/highlights/modifiers/charts.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/highlights/modifiers/comments.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/highlights/modifiers/filtres.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/highlights/modifiers/index.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/highlights/modifiers/nested.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/highlights/processor.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/highlights/tools.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/state.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/store.ts delete mode 100644 application/client/src/app/service/session/dependencies/search/store.update.ts delete mode 100644 application/client/src/app/service/session/dependencies/stream.ts delete mode 100644 application/client/src/app/service/session/dependencies/teamwork.ts delete mode 100644 application/client/src/app/service/session/session.ts delete mode 100644 application/client/src/app/service/session/tab.ts delete mode 100644 application/client/src/app/service/session/unbound.ts delete mode 100644 application/client/src/app/service/settings.ts delete mode 100644 application/client/src/app/service/state.ts delete mode 100644 application/client/src/app/service/sys.ts delete mode 100644 application/client/src/app/ui/elements/autocomplete/component.ts delete mode 100644 application/client/src/app/ui/elements/autocomplete/error.ts delete mode 100644 application/client/src/app/ui/elements/autocomplete/input.ts delete mode 100644 application/client/src/app/ui/elements/autocomplete/module.ts delete mode 100644 application/client/src/app/ui/elements/autocomplete/styles.less delete mode 100644 application/client/src/app/ui/elements/autocomplete/template.html delete mode 100644 application/client/src/app/ui/elements/color.selector/component.ts delete mode 100644 application/client/src/app/ui/elements/color.selector/module.ts delete mode 100644 application/client/src/app/ui/elements/color.selector/styles.less delete mode 100644 application/client/src/app/ui/elements/color.selector/template.html delete mode 100644 application/client/src/app/ui/elements/containers/dynamic/component.ts delete mode 100644 application/client/src/app/ui/elements/containers/frame/component.ts delete mode 100644 application/client/src/app/ui/elements/containers/frame/styles.less delete mode 100644 application/client/src/app/ui/elements/containers/frame/template.html delete mode 100644 application/client/src/app/ui/elements/containers/module.ts delete mode 100644 application/client/src/app/ui/elements/editable/component.ts delete mode 100644 application/client/src/app/ui/elements/editable/module.ts delete mode 100644 application/client/src/app/ui/elements/editable/styles.less delete mode 100644 application/client/src/app/ui/elements/editable/template.html delete mode 100644 application/client/src/app/ui/elements/filter.hidden/component.ts delete mode 100644 application/client/src/app/ui/elements/filter.hidden/module.ts delete mode 100644 application/client/src/app/ui/elements/filter.hidden/styles.less delete mode 100644 application/client/src/app/ui/elements/filter.hidden/template.html delete mode 100644 application/client/src/app/ui/elements/filter/component.ts delete mode 100644 application/client/src/app/ui/elements/filter/filter.ts delete mode 100644 application/client/src/app/ui/elements/filter/input.ts delete mode 100644 application/client/src/app/ui/elements/filter/module.ts delete mode 100644 application/client/src/app/ui/elements/filter/styles.less delete mode 100644 application/client/src/app/ui/elements/filter/template.html delete mode 100644 application/client/src/app/ui/elements/folderinput/component.ts delete mode 100644 application/client/src/app/ui/elements/folderinput/error.ts delete mode 100644 application/client/src/app/ui/elements/folderinput/folder.ts delete mode 100644 application/client/src/app/ui/elements/folderinput/folders.ts delete mode 100644 application/client/src/app/ui/elements/folderinput/input.ts delete mode 100644 application/client/src/app/ui/elements/folderinput/module.ts delete mode 100644 application/client/src/app/ui/elements/folderinput/styles.less delete mode 100644 application/client/src/app/ui/elements/folderinput/template.html delete mode 100644 application/client/src/app/ui/elements/locks.history/component.ts delete mode 100644 application/client/src/app/ui/elements/locks.history/entry/component.ts delete mode 100644 application/client/src/app/ui/elements/locks.history/entry/styles.less delete mode 100644 application/client/src/app/ui/elements/locks.history/entry/template.html delete mode 100644 application/client/src/app/ui/elements/locks.history/module.ts delete mode 100644 application/client/src/app/ui/elements/locks.history/styles.less delete mode 100644 application/client/src/app/ui/elements/locks.history/template.html delete mode 100644 application/client/src/app/ui/elements/menu.attachsource/component.ts delete mode 100644 application/client/src/app/ui/elements/menu.attachsource/module.ts delete mode 100644 application/client/src/app/ui/elements/menu.attachsource/styles.less delete mode 100644 application/client/src/app/ui/elements/menu.attachsource/template.html delete mode 100644 application/client/src/app/ui/elements/module.ts delete mode 100644 application/client/src/app/ui/elements/navigator/component.ts delete mode 100644 application/client/src/app/ui/elements/navigator/module.ts delete mode 100644 application/client/src/app/ui/elements/navigator/providers/entity.ts delete mode 100644 application/client/src/app/ui/elements/navigator/providers/entries.ts delete mode 100644 application/client/src/app/ui/elements/navigator/providers/provider.files.ts delete mode 100644 application/client/src/app/ui/elements/navigator/providers/provider.recent.ts delete mode 100644 application/client/src/app/ui/elements/navigator/providers/provider.ts delete mode 100644 application/client/src/app/ui/elements/navigator/providers/providers.ts delete mode 100644 application/client/src/app/ui/elements/navigator/state.ts delete mode 100644 application/client/src/app/ui/elements/navigator/styles.less delete mode 100644 application/client/src/app/ui/elements/navigator/template.html delete mode 100644 application/client/src/app/ui/elements/pairs/component.ts delete mode 100644 application/client/src/app/ui/elements/pairs/module.ts delete mode 100644 application/client/src/app/ui/elements/pairs/pair.ts delete mode 100644 application/client/src/app/ui/elements/pairs/state.ts delete mode 100644 application/client/src/app/ui/elements/pairs/styles.less delete mode 100644 application/client/src/app/ui/elements/pairs/template.html delete mode 100644 application/client/src/app/ui/elements/recent/action.ts delete mode 100644 application/client/src/app/ui/elements/recent/component.ts delete mode 100644 application/client/src/app/ui/elements/recent/icon/component.ts delete mode 100644 application/client/src/app/ui/elements/recent/icon/styles.less delete mode 100644 application/client/src/app/ui/elements/recent/icon/template.html delete mode 100644 application/client/src/app/ui/elements/recent/module.ts delete mode 100644 application/client/src/app/ui/elements/recent/nature/component.ts delete mode 100644 application/client/src/app/ui/elements/recent/nature/concat/component.ts delete mode 100644 application/client/src/app/ui/elements/recent/nature/concat/styles.less delete mode 100644 application/client/src/app/ui/elements/recent/nature/concat/template.html delete mode 100644 application/client/src/app/ui/elements/recent/nature/file/component.ts delete mode 100644 application/client/src/app/ui/elements/recent/nature/file/styles.less delete mode 100644 application/client/src/app/ui/elements/recent/nature/file/template.html delete mode 100644 application/client/src/app/ui/elements/recent/nature/module.ts delete mode 100644 application/client/src/app/ui/elements/recent/nature/process/component.ts delete mode 100644 application/client/src/app/ui/elements/recent/nature/process/styles.less delete mode 100644 application/client/src/app/ui/elements/recent/nature/process/template.html delete mode 100644 application/client/src/app/ui/elements/recent/nature/serial/component.ts delete mode 100644 application/client/src/app/ui/elements/recent/nature/serial/styles.less delete mode 100644 application/client/src/app/ui/elements/recent/nature/serial/template.html delete mode 100644 application/client/src/app/ui/elements/recent/nature/styles.less delete mode 100644 application/client/src/app/ui/elements/recent/nature/tcp/component.ts delete mode 100644 application/client/src/app/ui/elements/recent/nature/tcp/styles.less delete mode 100644 application/client/src/app/ui/elements/recent/nature/tcp/template.html delete mode 100644 application/client/src/app/ui/elements/recent/nature/template.html delete mode 100644 application/client/src/app/ui/elements/recent/nature/udp/component.ts delete mode 100644 application/client/src/app/ui/elements/recent/nature/udp/styles.less delete mode 100644 application/client/src/app/ui/elements/recent/nature/udp/template.html delete mode 100644 application/client/src/app/ui/elements/recent/parser/component.ts delete mode 100644 application/client/src/app/ui/elements/recent/parser/dlt/component.ts delete mode 100644 application/client/src/app/ui/elements/recent/parser/dlt/styles.less delete mode 100644 application/client/src/app/ui/elements/recent/parser/dlt/template.html delete mode 100644 application/client/src/app/ui/elements/recent/parser/module.ts delete mode 100644 application/client/src/app/ui/elements/recent/parser/someip/component.ts delete mode 100644 application/client/src/app/ui/elements/recent/parser/someip/styles.less delete mode 100644 application/client/src/app/ui/elements/recent/parser/someip/template.html delete mode 100644 application/client/src/app/ui/elements/recent/parser/styles.less delete mode 100644 application/client/src/app/ui/elements/recent/parser/template.html delete mode 100644 application/client/src/app/ui/elements/recent/state.ts delete mode 100644 application/client/src/app/ui/elements/recent/styles.less delete mode 100644 application/client/src/app/ui/elements/recent/template.html delete mode 100644 application/client/src/app/ui/elements/scrollarea/component.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/controllers/frame.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/controllers/holder.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/controllers/keyboard.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/controllers/range.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/controllers/selection.node.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/controllers/selection.nodeinfo.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/controllers/selection.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/controllers/service.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/module.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/columns/cell.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/columns/component.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/columns/styles.less delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/columns/template.html delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/component.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/module.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/separator/component.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/separator/styles.less delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/separator/template.html delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/standard/component.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/standard/styles.less delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/standard/template.html delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/styles.less delete mode 100644 application/client/src/app/ui/elements/scrollarea/row/template.html delete mode 100644 application/client/src/app/ui/elements/scrollarea/styles.less delete mode 100644 application/client/src/app/ui/elements/scrollarea/template.html delete mode 100644 application/client/src/app/ui/elements/scrollarea/vertical/component.ts delete mode 100644 application/client/src/app/ui/elements/scrollarea/vertical/styles.less delete mode 100644 application/client/src/app/ui/elements/scrollarea/vertical/template.html delete mode 100644 application/client/src/app/ui/elements/tabs/component.ts delete mode 100644 application/client/src/app/ui/elements/tabs/content/component.ts delete mode 100644 application/client/src/app/ui/elements/tabs/content/styles.less delete mode 100644 application/client/src/app/ui/elements/tabs/content/template.html delete mode 100644 application/client/src/app/ui/elements/tabs/controller.histroy.ts delete mode 100644 application/client/src/app/ui/elements/tabs/list/component.ts delete mode 100644 application/client/src/app/ui/elements/tabs/list/styles.less delete mode 100644 application/client/src/app/ui/elements/tabs/list/template.html delete mode 100644 application/client/src/app/ui/elements/tabs/module.ts delete mode 100644 application/client/src/app/ui/elements/tabs/options.ts delete mode 100644 application/client/src/app/ui/elements/tabs/service.ts delete mode 100644 application/client/src/app/ui/elements/tabs/styles.less delete mode 100644 application/client/src/app/ui/elements/tabs/template.html delete mode 100644 application/client/src/app/ui/elements/teamwork/component.ts delete mode 100644 application/client/src/app/ui/elements/teamwork/module.ts delete mode 100644 application/client/src/app/ui/elements/teamwork/styles.less delete mode 100644 application/client/src/app/ui/elements/teamwork/template.html delete mode 100644 application/client/src/app/ui/elements/timezones/component.ts delete mode 100644 application/client/src/app/ui/elements/timezones/module.ts delete mode 100644 application/client/src/app/ui/elements/timezones/state.ts delete mode 100644 application/client/src/app/ui/elements/timezones/styles.less delete mode 100644 application/client/src/app/ui/elements/timezones/template.html delete mode 100644 application/client/src/app/ui/elements/timezones/timezone.ts delete mode 100644 application/client/src/app/ui/elements/tooltip/component.ts delete mode 100644 application/client/src/app/ui/elements/tooltip/styles.less delete mode 100644 application/client/src/app/ui/elements/tooltip/template.html delete mode 100644 application/client/src/app/ui/elements/tree/component.ts delete mode 100644 application/client/src/app/ui/elements/tree/entity.ts delete mode 100644 application/client/src/app/ui/elements/tree/module.ts delete mode 100644 application/client/src/app/ui/elements/tree/scheme.ts delete mode 100644 application/client/src/app/ui/elements/tree/state.ts delete mode 100644 application/client/src/app/ui/elements/tree/styles.less delete mode 100644 application/client/src/app/ui/elements/tree/template.html delete mode 100644 application/client/src/app/ui/env/directives/contextmenu.trigger.ts delete mode 100644 application/client/src/app/ui/env/directives/dragdrop.file.ts delete mode 100644 application/client/src/app/ui/env/directives/dragging.ts delete mode 100644 application/client/src/app/ui/env/directives/input.ts delete mode 100644 application/client/src/app/ui/env/directives/material.dragdrop.ts delete mode 100644 application/client/src/app/ui/env/directives/module.ts delete mode 100644 application/client/src/app/ui/env/directives/resize.observer.ts delete mode 100644 application/client/src/app/ui/env/directives/resizer.ts delete mode 100644 application/client/src/app/ui/env/dom.ts delete mode 100644 application/client/src/app/ui/env/entities/filter.ts delete mode 100644 application/client/src/app/ui/env/entities/range.limited.ts delete mode 100644 application/client/src/app/ui/env/entities/value.limited.ts delete mode 100644 application/client/src/app/ui/env/extentions/changes.ts delete mode 100644 application/client/src/app/ui/env/globals.ts delete mode 100644 application/client/src/app/ui/env/lock.token.ts delete mode 100644 application/client/src/app/ui/layout/component.ts delete mode 100644 application/client/src/app/ui/layout/contextmenu/component.ts delete mode 100644 application/client/src/app/ui/layout/contextmenu/styles.less delete mode 100644 application/client/src/app/ui/layout/contextmenu/template.html delete mode 100644 application/client/src/app/ui/layout/focus/component.ts delete mode 100644 application/client/src/app/ui/layout/focus/styles.less delete mode 100644 application/client/src/app/ui/layout/focus/template.html delete mode 100644 application/client/src/app/ui/layout/module.ts delete mode 100644 application/client/src/app/ui/layout/popups/component.ts delete mode 100644 application/client/src/app/ui/layout/popups/popup/component.ts delete mode 100644 application/client/src/app/ui/layout/popups/popup/styles.less delete mode 100644 application/client/src/app/ui/layout/popups/popup/template.html delete mode 100644 application/client/src/app/ui/layout/popups/styles.less delete mode 100644 application/client/src/app/ui/layout/popups/template.html delete mode 100644 application/client/src/app/ui/layout/sidebar/caption/component.ts delete mode 100644 application/client/src/app/ui/layout/sidebar/caption/styles.less delete mode 100644 application/client/src/app/ui/layout/sidebar/caption/template.html delete mode 100644 application/client/src/app/ui/layout/sidebar/component.ts delete mode 100644 application/client/src/app/ui/layout/sidebar/controls/component.ts delete mode 100644 application/client/src/app/ui/layout/sidebar/controls/styles.less delete mode 100644 application/client/src/app/ui/layout/sidebar/controls/template.html delete mode 100644 application/client/src/app/ui/layout/sidebar/styles.less delete mode 100644 application/client/src/app/ui/layout/sidebar/template.html delete mode 100644 application/client/src/app/ui/layout/snackbar/component.ts delete mode 100644 application/client/src/app/ui/layout/snackbar/message/component.ts delete mode 100644 application/client/src/app/ui/layout/snackbar/message/styles.less delete mode 100644 application/client/src/app/ui/layout/snackbar/message/template.html delete mode 100644 application/client/src/app/ui/layout/snackbar/styles.less delete mode 100644 application/client/src/app/ui/layout/snackbar/template.html delete mode 100644 application/client/src/app/ui/layout/state.ts delete mode 100644 application/client/src/app/ui/layout/statusbar/component.ts delete mode 100644 application/client/src/app/ui/layout/statusbar/styles.less delete mode 100644 application/client/src/app/ui/layout/statusbar/template.html delete mode 100644 application/client/src/app/ui/layout/styles.less delete mode 100644 application/client/src/app/ui/layout/template.html delete mode 100644 application/client/src/app/ui/layout/toolbar/component.ts delete mode 100644 application/client/src/app/ui/layout/toolbar/controls/component.ts delete mode 100644 application/client/src/app/ui/layout/toolbar/controls/styles.less delete mode 100644 application/client/src/app/ui/layout/toolbar/controls/template.html delete mode 100644 application/client/src/app/ui/layout/toolbar/styles.less delete mode 100644 application/client/src/app/ui/layout/toolbar/template.html delete mode 100644 application/client/src/app/ui/layout/workspace/component.ts delete mode 100644 application/client/src/app/ui/layout/workspace/controls/component.ts delete mode 100644 application/client/src/app/ui/layout/workspace/controls/styles.less delete mode 100644 application/client/src/app/ui/layout/workspace/controls/template.html delete mode 100644 application/client/src/app/ui/layout/workspace/no-tabs-content/action/component.ts delete mode 100644 application/client/src/app/ui/layout/workspace/no-tabs-content/action/styles.less delete mode 100644 application/client/src/app/ui/layout/workspace/no-tabs-content/action/template.html delete mode 100644 application/client/src/app/ui/layout/workspace/no-tabs-content/component.ts delete mode 100644 application/client/src/app/ui/layout/workspace/no-tabs-content/module.ts delete mode 100644 application/client/src/app/ui/layout/workspace/no-tabs-content/styles.less delete mode 100644 application/client/src/app/ui/layout/workspace/no-tabs-content/template.html delete mode 100644 application/client/src/app/ui/layout/workspace/styles.less delete mode 100644 application/client/src/app/ui/layout/workspace/template.html delete mode 100644 application/client/src/app/ui/service/contextmenu.ts delete mode 100644 application/client/src/app/ui/service/dropfiles.ts delete mode 100644 application/client/src/app/ui/service/filters.ts delete mode 100644 application/client/src/app/ui/service/layout.ts delete mode 100644 application/client/src/app/ui/service/listener.ts delete mode 100644 application/client/src/app/ui/service/listener/handler.ts delete mode 100644 application/client/src/app/ui/service/listener/options.ts delete mode 100644 application/client/src/app/ui/service/listener/target.ts delete mode 100644 application/client/src/app/ui/service/lockers.ts delete mode 100644 application/client/src/app/ui/service/lokers/locker.ts delete mode 100644 application/client/src/app/ui/service/notification/index.ts delete mode 100644 application/client/src/app/ui/service/notification/notification.ts delete mode 100644 application/client/src/app/ui/service/notifications.ts delete mode 100644 application/client/src/app/ui/service/popup.ts delete mode 100644 application/client/src/app/ui/service/popup/popup.ts delete mode 100644 application/client/src/app/ui/service/sidebar.ts delete mode 100644 application/client/src/app/ui/service/sidebar/register.ts delete mode 100644 application/client/src/app/ui/service/sidebar/tabs.ts delete mode 100644 application/client/src/app/ui/service/styles.ts delete mode 100644 application/client/src/app/ui/service/toolbar.ts delete mode 100644 application/client/src/app/ui/service/toolbar/register.ts delete mode 100644 application/client/src/app/ui/service/toolbar/tabs.ts delete mode 100644 application/client/src/app/ui/styles/borders.less delete mode 100644 application/client/src/app/ui/styles/buttons.less delete mode 100644 application/client/src/app/ui/styles/codicons/codicon.less delete mode 100644 application/client/src/app/ui/styles/codicons/codicon.ttf delete mode 100644 application/client/src/app/ui/styles/colors.less delete mode 100644 application/client/src/app/ui/styles/colors.ts delete mode 100644 application/client/src/app/ui/styles/containers.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/LICENSE.txt delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_animated.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_bordered-pulled.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_core.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_fixed-width.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_icons.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_larger.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_list.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_mixins.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_rotated-flipped.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_screen-reader.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_shims.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_stacked.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/_variables.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/brands.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/fontawesome.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/regular.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/solid.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/less/v4-shims.less delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-brands-400.eot delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-brands-400.svg delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-brands-400.ttf delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-brands-400.woff delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-brands-400.woff2 delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.eot delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.svg delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.ttf delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.woff delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.woff2 delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.eot delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.svg delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.ttf delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.woff delete mode 100644 application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts.less delete mode 100644 application/client/src/app/ui/styles/fonts/Menlo-Regular-Logviewer.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-Black.woff delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-Black.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-BlackItalic.woff delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-BlackItalic.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-Bold.woff delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-Bold.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-BoldItalic.woff delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-BoldItalic.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-ExtraLight.woff delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-ExtraLight.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-ExtraLightItalic.woff delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-ExtraLightItalic.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-Italic.woff delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-Italic.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-Light.woff delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-Light.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-LightItalic.woff delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-LightItalic.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-Regular.woff delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-Regular.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-SemiBold.woff delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-SemiBold.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-SemiBoldItalic.woff delete mode 100644 application/client/src/app/ui/styles/fonts/SourceSansPro-SemiBoldItalic.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/materialicons.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_light_cyrillic.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_light_cyrillic_ext.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_light_greek.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_light_greek_ext.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_light_latin.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_light_latin_ext.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_light_vietnamese.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_medium_cyrillic.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_medium_cyrillic_ext.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_medium_greek.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_medium_greek_ext.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_medium_latin.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_medium_latin_ext.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_medium_vietnamese.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_regular_cyrillic.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_regular_cyrillic_ext.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_regular_greek.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_regular_greek_ext.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_regular_latin.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_regular_latin_ext.woff2 delete mode 100644 application/client/src/app/ui/styles/fonts/roboto_regular_vietnamese.woff2 delete mode 100644 application/client/src/app/ui/styles/global.less delete mode 100644 application/client/src/app/ui/styles/markdown.less delete mode 100644 application/client/src/app/ui/styles/material.fonts.scss delete mode 100644 application/client/src/app/ui/styles/material.less delete mode 100644 application/client/src/app/ui/styles/meterial.theme.scss delete mode 100644 application/client/src/app/ui/styles/reset.less delete mode 100644 application/client/src/app/ui/styles/rows.less delete mode 100644 application/client/src/app/ui/styles/scheme.less delete mode 100644 application/client/src/app/ui/styles/scheme.scss delete mode 100644 application/client/src/app/ui/styles/scrollbars.less delete mode 100644 application/client/src/app/ui/styles/sizes.ts delete mode 100644 application/client/src/app/ui/styles/support.less delete mode 100644 application/client/src/app/ui/styles/text.less delete mode 100644 application/client/src/app/ui/styles/variables.less delete mode 100644 application/client/src/app/ui/tabs/changelogs/component.ts delete mode 100644 application/client/src/app/ui/tabs/changelogs/module.ts delete mode 100644 application/client/src/app/ui/tabs/changelogs/styles.less delete mode 100644 application/client/src/app/ui/tabs/changelogs/template.html delete mode 100644 application/client/src/app/ui/tabs/help/component.ts delete mode 100644 application/client/src/app/ui/tabs/help/module.ts delete mode 100644 application/client/src/app/ui/tabs/help/styles.less delete mode 100644 application/client/src/app/ui/tabs/help/template.html delete mode 100644 application/client/src/app/ui/tabs/module.ts delete mode 100644 application/client/src/app/ui/tabs/multiplefiles/component.ts delete mode 100644 application/client/src/app/ui/tabs/multiplefiles/file.holder.ts delete mode 100644 application/client/src/app/ui/tabs/multiplefiles/module.ts delete mode 100644 application/client/src/app/ui/tabs/multiplefiles/state.ts delete mode 100644 application/client/src/app/ui/tabs/multiplefiles/structure/component.ts delete mode 100644 application/client/src/app/ui/tabs/multiplefiles/structure/styles.less delete mode 100644 application/client/src/app/ui/tabs/multiplefiles/structure/template.html delete mode 100644 application/client/src/app/ui/tabs/multiplefiles/styles.less delete mode 100644 application/client/src/app/ui/tabs/multiplefiles/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/action.ts delete mode 100644 application/client/src/app/ui/tabs/observe/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/entry/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/entry/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/entry/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/bool/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/bool/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/bool/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/dirs/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/dirs/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/dirs/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/dropdown/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/dropdown/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/dropdown/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/files/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/files/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/files/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/float/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/float/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/float/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/integer/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/integer/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/integer/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/string/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/string/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/renders/string/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/state.ts delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/config-schema/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/error/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/error/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/error/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/error/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/concat/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/concat/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/concat/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/concat/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/file/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/file/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/file/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/file/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/process/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/process/error.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/serial/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/serial/error.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/serial/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/tcp/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/tcp/error.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/error.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/multicast/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/multicast/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/multicast/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/state.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/process.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/serial.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/tcp.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/udp.ts delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/dlt/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/dlt/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/dlt/state.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/section.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/statentity.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/dlt/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/dlt/summary.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/dlt/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/someip/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/someip/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/someip/state.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/someip/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/someip/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/extra/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/dlt/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/dlt/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/dlt/state.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/dlt/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/dlt/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/plugin/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/plugin/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/plugin/state.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/plugin/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/plugin/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/someip/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/someip/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/someip/state.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/someip/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/someip/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/text/component.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/text/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/text/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/general/text/template.html delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/module.ts delete mode 100644 application/client/src/app/ui/tabs/observe/parsers/state.ts delete mode 100644 application/client/src/app/ui/tabs/observe/state.ts delete mode 100644 application/client/src/app/ui/tabs/observe/styles.less delete mode 100644 application/client/src/app/ui/tabs/observe/template.html delete mode 100644 application/client/src/app/ui/tabs/plugins/component.ts delete mode 100644 application/client/src/app/ui/tabs/plugins/desc.ts delete mode 100644 application/client/src/app/ui/tabs/plugins/details/component.ts delete mode 100644 application/client/src/app/ui/tabs/plugins/details/styles.less delete mode 100644 application/client/src/app/ui/tabs/plugins/details/template.html delete mode 100644 application/client/src/app/ui/tabs/plugins/list/component.ts delete mode 100644 application/client/src/app/ui/tabs/plugins/list/styles.less delete mode 100644 application/client/src/app/ui/tabs/plugins/list/template.html delete mode 100644 application/client/src/app/ui/tabs/plugins/module.ts delete mode 100644 application/client/src/app/ui/tabs/plugins/plugin/component.ts delete mode 100644 application/client/src/app/ui/tabs/plugins/plugin/styles.less delete mode 100644 application/client/src/app/ui/tabs/plugins/plugin/template.html delete mode 100644 application/client/src/app/ui/tabs/plugins/provider.ts delete mode 100644 application/client/src/app/ui/tabs/plugins/styles.less delete mode 100644 application/client/src/app/ui/tabs/plugins/template.html delete mode 100644 application/client/src/app/ui/tabs/settings/component.ts delete mode 100644 application/client/src/app/ui/tabs/settings/entry/component.ts delete mode 100644 application/client/src/app/ui/tabs/settings/entry/styles.less delete mode 100644 application/client/src/app/ui/tabs/settings/entry/template.html delete mode 100644 application/client/src/app/ui/tabs/settings/module.ts delete mode 100644 application/client/src/app/ui/tabs/settings/node.ts delete mode 100644 application/client/src/app/ui/tabs/settings/node/component.ts delete mode 100644 application/client/src/app/ui/tabs/settings/node/styles.less delete mode 100644 application/client/src/app/ui/tabs/settings/node/template.html delete mode 100644 application/client/src/app/ui/tabs/settings/renders/bool/component.ts delete mode 100644 application/client/src/app/ui/tabs/settings/renders/bool/styles.less delete mode 100644 application/client/src/app/ui/tabs/settings/renders/bool/template.html delete mode 100644 application/client/src/app/ui/tabs/settings/renders/color/component.ts delete mode 100644 application/client/src/app/ui/tabs/settings/renders/color/styles.less delete mode 100644 application/client/src/app/ui/tabs/settings/renders/color/template.html delete mode 100644 application/client/src/app/ui/tabs/settings/renders/string/component.ts delete mode 100644 application/client/src/app/ui/tabs/settings/renders/string/error.ts delete mode 100644 application/client/src/app/ui/tabs/settings/renders/string/styles.less delete mode 100644 application/client/src/app/ui/tabs/settings/renders/string/template.html delete mode 100644 application/client/src/app/ui/tabs/settings/renders/validator.ts delete mode 100644 application/client/src/app/ui/tabs/settings/state.ts delete mode 100644 application/client/src/app/ui/tabs/settings/styles.less delete mode 100644 application/client/src/app/ui/tabs/settings/template.html delete mode 100644 application/client/src/app/ui/views/dialogs/about/component.ts delete mode 100644 application/client/src/app/ui/views/dialogs/about/module.ts delete mode 100644 application/client/src/app/ui/views/dialogs/about/styles.less delete mode 100644 application/client/src/app/ui/views/dialogs/about/template.html delete mode 100644 application/client/src/app/ui/views/dialogs/colors/component.ts delete mode 100644 application/client/src/app/ui/views/dialogs/colors/module.ts delete mode 100644 application/client/src/app/ui/views/dialogs/colors/styles.less delete mode 100644 application/client/src/app/ui/views/dialogs/colors/template.html delete mode 100644 application/client/src/app/ui/views/dialogs/columnsselector/component.ts delete mode 100644 application/client/src/app/ui/views/dialogs/columnsselector/module.ts delete mode 100644 application/client/src/app/ui/views/dialogs/columnsselector/styles.less delete mode 100644 application/client/src/app/ui/views/dialogs/columnsselector/template.html delete mode 100644 application/client/src/app/ui/views/dialogs/comment/component.ts delete mode 100644 application/client/src/app/ui/views/dialogs/comment/module.ts delete mode 100644 application/client/src/app/ui/views/dialogs/comment/styles.less delete mode 100644 application/client/src/app/ui/views/dialogs/comment/template.html delete mode 100644 application/client/src/app/ui/views/dialogs/hotkeys/component.ts delete mode 100644 application/client/src/app/ui/views/dialogs/hotkeys/module.ts delete mode 100644 application/client/src/app/ui/views/dialogs/hotkeys/styles.less delete mode 100644 application/client/src/app/ui/views/dialogs/hotkeys/template.html delete mode 100644 application/client/src/app/ui/views/dialogs/jumpto/component.ts delete mode 100644 application/client/src/app/ui/views/dialogs/jumpto/module.ts delete mode 100644 application/client/src/app/ui/views/dialogs/jumpto/styles.less delete mode 100644 application/client/src/app/ui/views/dialogs/jumpto/template.html delete mode 100644 application/client/src/app/ui/views/dialogs/locker/component.ts delete mode 100644 application/client/src/app/ui/views/dialogs/locker/module.ts delete mode 100644 application/client/src/app/ui/views/dialogs/locker/styles.less delete mode 100644 application/client/src/app/ui/views/dialogs/locker/template.html delete mode 100644 application/client/src/app/ui/views/dialogs/module.ts delete mode 100644 application/client/src/app/ui/views/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/attachment/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/attachment/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/attachment/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/attachment/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/attachment/wrapper.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/audio/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/audio/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/audio/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/image/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/image/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/image/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/text/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/text/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/text/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/unknown/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/unknown/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/unknown/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/video/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/video/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/preview/video/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/attachments/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/comments/comment/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/comments/comment/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/comments/comment/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/comments/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/comments/editor/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/comments/editor/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/comments/editor/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/comments/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/comments/reply/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/comments/reply/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/comments/reply/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/comments/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/comments/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/common/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/common/title/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/common/title/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/common/title/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/element.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/file/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/file/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/file/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/process/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/process/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/process/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/serial/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/serial/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/serial/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/signature/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/signature/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/signature/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/tcp/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/tcp/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/tcp/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/udp/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/udp/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/element/udp/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/file/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/file/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/file/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/file/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/process/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/process/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/process/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/process/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/serial/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/serial/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/serial/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/serial/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/tcp/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/tcp/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/tcp/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/tcp/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/udp/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/udp/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/udp/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/lists/udp/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/observe/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/states/files.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/states/process.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/states/serial.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/states/state.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/states/tcp.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/states/udp.ts delete mode 100644 application/client/src/app/ui/views/sidebar/observe/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/observe/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/search/base/entity.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/base/list.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/bin/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/bin/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/search/bin/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/chart/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/chart/state.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/chart/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/chart/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/details/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/details/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/details/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/list/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/list/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/list/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/placeholder/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/placeholder/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/placeholder/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/search/charts/provider.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/disabled/entity/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/disabled/entity/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/search/disabled/entity/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/search/disabled/list/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/disabled/list/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/search/disabled/list/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/search/disabled/provider.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/details/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/details/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/details/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/filter/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/filter/state.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/filter/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/filter/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/list/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/list/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/list/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/placeholder/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/placeholder/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/placeholder/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/search/filters/provider.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/providers/definitions/entity.data.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/providers/definitions/entity.state.edit.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/providers/definitions/entity.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/providers/definitions/events.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/providers/definitions/keyboard.listener.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/providers/definitions/provider.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/providers/providers.ts delete mode 100644 application/client/src/app/ui/views/sidebar/search/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/search/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/teamwork/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/teamwork/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/teamwork/repository/component.ts delete mode 100644 application/client/src/app/ui/views/sidebar/teamwork/repository/module.ts delete mode 100644 application/client/src/app/ui/views/sidebar/teamwork/repository/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/teamwork/repository/template.html delete mode 100644 application/client/src/app/ui/views/sidebar/teamwork/repository/wrapper.ts delete mode 100644 application/client/src/app/ui/views/sidebar/teamwork/styles.less delete mode 100644 application/client/src/app/ui/views/sidebar/teamwork/template.html delete mode 100644 application/client/src/app/ui/views/statusbar/info/component.ts delete mode 100644 application/client/src/app/ui/views/statusbar/info/module.ts delete mode 100644 application/client/src/app/ui/views/statusbar/info/styles.less delete mode 100644 application/client/src/app/ui/views/statusbar/info/template.html delete mode 100644 application/client/src/app/ui/views/statusbar/jobs/component.ts delete mode 100644 application/client/src/app/ui/views/statusbar/jobs/module.ts delete mode 100644 application/client/src/app/ui/views/statusbar/jobs/styles.less delete mode 100644 application/client/src/app/ui/views/statusbar/jobs/template.html delete mode 100644 application/client/src/app/ui/views/statusbar/session/component.ts delete mode 100644 application/client/src/app/ui/views/statusbar/session/module.ts delete mode 100644 application/client/src/app/ui/views/statusbar/session/state.ts delete mode 100644 application/client/src/app/ui/views/statusbar/session/styles.less delete mode 100644 application/client/src/app/ui/views/statusbar/session/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/chart/base/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/cursor.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/cursor/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/cursor/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/chart/cursor/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/chart/module.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/output/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/output/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/chart/output/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/chart/render/chart.coors.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/render/chart.label.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/render/chart.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/render/filters.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/render/render.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/service.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/state.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/chart/summary/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/chart/summary/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/chart/summary/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/chart/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/details/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/details/module.ts delete mode 100644 application/client/src/app/ui/views/toolbar/details/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/details/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/history/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/history/module.ts delete mode 100644 application/client/src/app/ui/views/toolbar/history/preset/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/history/preset/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/history/preset/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/history/preview/chart/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/history/preview/chart/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/history/preview/chart/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/history/preview/filter/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/history/preview/filter/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/history/preview/filter/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/history/state.ts delete mode 100644 application/client/src/app/ui/views/toolbar/history/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/history/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/module.ts delete mode 100644 application/client/src/app/ui/views/toolbar/search/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/search/input/active.ts delete mode 100644 application/client/src/app/ui/views/toolbar/search/input/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/search/input/error.ts delete mode 100644 application/client/src/app/ui/views/toolbar/search/input/input.ts delete mode 100644 application/client/src/app/ui/views/toolbar/search/input/progress.ts delete mode 100644 application/client/src/app/ui/views/toolbar/search/input/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/search/input/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/search/module.ts delete mode 100644 application/client/src/app/ui/views/toolbar/search/nested/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/search/nested/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/search/nested/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/search/results/backing.ts delete mode 100644 application/client/src/app/ui/views/toolbar/search/results/component.ts delete mode 100644 application/client/src/app/ui/views/toolbar/search/results/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/search/results/template.html delete mode 100644 application/client/src/app/ui/views/toolbar/search/styles.less delete mode 100644 application/client/src/app/ui/views/toolbar/search/template.html delete mode 100644 application/client/src/app/ui/views/workspace/backing.ts delete mode 100644 application/client/src/app/ui/views/workspace/component.ts delete mode 100644 application/client/src/app/ui/views/workspace/headers/component.ts delete mode 100644 application/client/src/app/ui/views/workspace/headers/menu/component.ts delete mode 100644 application/client/src/app/ui/views/workspace/headers/menu/styles.less delete mode 100644 application/client/src/app/ui/views/workspace/headers/menu/template.html delete mode 100644 application/client/src/app/ui/views/workspace/headers/styles.less delete mode 100644 application/client/src/app/ui/views/workspace/headers/template.html delete mode 100644 application/client/src/app/ui/views/workspace/map/component.ts delete mode 100644 application/client/src/app/ui/views/workspace/map/state.ts delete mode 100644 application/client/src/app/ui/views/workspace/map/styles.less delete mode 100644 application/client/src/app/ui/views/workspace/map/template.html delete mode 100644 application/client/src/app/ui/views/workspace/module.ts delete mode 100644 application/client/src/app/ui/views/workspace/sde/component.ts delete mode 100644 application/client/src/app/ui/views/workspace/sde/state.ts delete mode 100644 application/client/src/app/ui/views/workspace/sde/styles.less delete mode 100644 application/client/src/app/ui/views/workspace/sde/template.html delete mode 100644 application/client/src/app/ui/views/workspace/styles.less delete mode 100644 application/client/src/app/ui/views/workspace/template.html delete mode 100644 application/client/src/app/ui/views/workspace/title/component.ts delete mode 100644 application/client/src/app/ui/views/workspace/title/state.ts delete mode 100644 application/client/src/app/ui/views/workspace/title/styles.less delete mode 100644 application/client/src/app/ui/views/workspace/title/template.html delete mode 100644 application/client/src/assets/.gitkeep delete mode 100644 application/client/src/assets/about.gif delete mode 100644 application/client/src/assets/documentation/about.md delete mode 100644 application/client/src/assets/documentation/charts/charts_dynamic.gif delete mode 100644 application/client/src/assets/documentation/charts/charts_filters.gif delete mode 100644 application/client/src/assets/documentation/charts/create.md delete mode 100644 application/client/src/assets/documentation/charts/dynamic.md delete mode 100644 application/client/src/assets/documentation/charts/readme.md delete mode 100644 application/client/src/assets/documentation/features.md delete mode 100644 application/client/src/assets/documentation/navigation/favorites.md delete mode 100644 application/client/src/assets/documentation/navigation/readme.md delete mode 100644 application/client/src/assets/documentation/navigation/recent_actions_favorities.gif delete mode 100644 application/client/src/assets/documentation/navigation/recents.md delete mode 100644 application/client/src/assets/documentation/readme.md delete mode 100644 application/client/src/assets/documentation/search/active.md delete mode 100644 application/client/src/assets/documentation/search/breadcrumbs.gif delete mode 100644 application/client/src/assets/documentation/search/breadcrumbs.md delete mode 100644 application/client/src/assets/documentation/search/create.md delete mode 100644 application/client/src/assets/documentation/search/filters_create.gif delete mode 100644 application/client/src/assets/documentation/search/filters_enable_disable.gif delete mode 100644 application/client/src/assets/documentation/search/filters_show_matches.gif delete mode 100644 application/client/src/assets/documentation/search/importing.gif delete mode 100644 application/client/src/assets/documentation/search/importing.md delete mode 100644 application/client/src/assets/documentation/search/manipulation.md delete mode 100644 application/client/src/assets/documentation/search/readme.md delete mode 100644 application/client/src/assets/documentation/teamwork/add_new_repository.md delete mode 100644 application/client/src/assets/documentation/teamwork/readme.md delete mode 100644 application/client/src/assets/documentation/teamwork/sharing.md delete mode 100644 application/client/src/environments/environment.prod.ts delete mode 100644 application/client/src/environments/environment.ts delete mode 100644 application/client/src/index.html delete mode 100644 application/client/src/main.ts delete mode 100644 application/client/src/polyfills.ts delete mode 100644 application/client/src/test.ts delete mode 100644 application/client/tsconfig.app.json delete mode 100644 application/client/tsconfig.json delete mode 100644 application/client/tsconfig.spec.json delete mode 100644 application/client/yarn.lock delete mode 100644 application/holder/.eslintrc.json delete mode 100644 application/holder/.yarnrc.yml delete mode 100644 application/holder/electron.config.darwin.arm64.json delete mode 100644 application/holder/electron.config.darwin.x86.json delete mode 100644 application/holder/electron.config.linux.json delete mode 100644 application/holder/electron.config.win.json delete mode 100644 application/holder/eslint.config.mjs delete mode 100644 application/holder/package.json delete mode 100644 application/holder/src/app.ts delete mode 100644 application/holder/src/controller/settings.ts delete mode 100644 application/holder/src/env/fs/accessor.ts delete mode 100644 application/holder/src/env/fs/index.ts delete mode 100644 application/holder/src/env/fs/stream.ts delete mode 100644 application/holder/src/env/logs/filestore.ts delete mode 100644 application/holder/src/env/logs/index.ts delete mode 100644 application/holder/src/env/os/index.ts delete mode 100644 application/holder/src/env/os/platform.ts delete mode 100644 application/holder/src/loaders/aliases.ts delete mode 100644 application/holder/src/loaders/cli.ts delete mode 100644 application/holder/src/loaders/controllers.ts delete mode 100644 application/holder/src/loaders/envvars.ts delete mode 100644 application/holder/src/loaders/exitcases/index.ts delete mode 100644 application/holder/src/loaders/exitcases/restart.ts delete mode 100644 application/holder/src/loaders/exitcases/update.ts delete mode 100644 application/holder/src/loaders/init.ts delete mode 100644 application/holder/src/loaders/logger.ts delete mode 100644 application/holder/src/loaders/services.ts delete mode 100644 application/holder/src/loaders/system.ts delete mode 100644 application/holder/src/modules/github.ts delete mode 100644 application/holder/src/modules/index.ts delete mode 100644 application/holder/src/modules/module.ts delete mode 100644 application/holder/src/modules/net.ts delete mode 100644 application/holder/src/modules/version.ts delete mode 100644 application/holder/src/preload/preload.ts delete mode 100644 application/holder/src/register/global.ts delete mode 100644 application/holder/src/register/services.ts delete mode 100644 application/holder/src/service/actions/about.ts delete mode 100644 application/holder/src/service/actions/export.session.state.ts delete mode 100644 application/holder/src/service/actions/find.ts delete mode 100644 application/holder/src/service/actions/help.ts delete mode 100644 application/holder/src/service/actions/import.session.state.ts delete mode 100644 application/holder/src/service/actions/index.ts delete mode 100644 application/holder/src/service/actions/jumpto.ts delete mode 100644 application/holder/src/service/actions/open.file.ts delete mode 100644 application/holder/src/service/actions/open.folder.ts delete mode 100644 application/holder/src/service/actions/plugins_manager.ts delete mode 100644 application/holder/src/service/actions/settings.ts delete mode 100644 application/holder/src/service/actions/stream.ts delete mode 100644 application/holder/src/service/actions/theme.dark.ts delete mode 100644 application/holder/src/service/actions/theme.light.ts delete mode 100644 application/holder/src/service/actions/updates.ts delete mode 100644 application/holder/src/service/bridge.ts delete mode 100644 application/holder/src/service/bridge/actions/browserurl.ts delete mode 100644 application/holder/src/service/bridge/actions/index.ts delete mode 100644 application/holder/src/service/bridge/app/alpha_release.ts delete mode 100644 application/holder/src/service/bridge/app/changelogs.ts delete mode 100644 application/holder/src/service/bridge/app/index.ts delete mode 100644 application/holder/src/service/bridge/app/version.ts delete mode 100644 application/holder/src/service/bridge/file/copy.ts delete mode 100644 application/holder/src/service/bridge/file/copyfile.ts delete mode 100644 application/holder/src/service/bridge/file/exists.ts delete mode 100644 application/holder/src/service/bridge/file/exportsession.ts delete mode 100644 application/holder/src/service/bridge/file/file.ts delete mode 100644 application/holder/src/service/bridge/file/index.ts delete mode 100644 application/holder/src/service/bridge/file/name.ts delete mode 100644 application/holder/src/service/bridge/file/read.ts delete mode 100644 application/holder/src/service/bridge/file/save.ts delete mode 100644 application/holder/src/service/bridge/file/select.ts delete mode 100644 application/holder/src/service/bridge/file/write.ts delete mode 100644 application/holder/src/service/bridge/folder/choose.ts delete mode 100644 application/holder/src/service/bridge/folder/delimiter.ts delete mode 100644 application/holder/src/service/bridge/folder/index.ts delete mode 100644 application/holder/src/service/bridge/folder/select.ts delete mode 100644 application/holder/src/service/bridge/folder/shell_open.ts delete mode 100644 application/holder/src/service/bridge/index.ts delete mode 100644 application/holder/src/service/bridge/os/entity.ts delete mode 100644 application/holder/src/service/bridge/os/homedir.ts delete mode 100644 application/holder/src/service/bridge/os/index.ts delete mode 100644 application/holder/src/service/cli.ts delete mode 100644 application/holder/src/service/cli/action.ts delete mode 100644 application/holder/src/service/cli/index.ts delete mode 100644 application/holder/src/service/cli/open.ts delete mode 100644 application/holder/src/service/cli/parser.ts delete mode 100644 application/holder/src/service/cli/search.ts delete mode 100644 application/holder/src/service/cli/stream.ts delete mode 100644 application/holder/src/service/electron.ts delete mode 100644 application/holder/src/service/electron/dialogs.ts delete mode 100644 application/holder/src/service/electron/handles/clipboard.ts delete mode 100644 application/holder/src/service/electron/handles/index.ts delete mode 100644 application/holder/src/service/electron/protocol.ts delete mode 100644 application/holder/src/service/electron/transport.ts delete mode 100644 application/holder/src/service/electron/window.ts delete mode 100644 application/holder/src/service/electron/window/settings.ts delete mode 100644 application/holder/src/service/env.ts delete mode 100644 application/holder/src/service/env/storage.ts delete mode 100644 application/holder/src/service/github.ts delete mode 100644 application/holder/src/service/github/request.ts delete mode 100644 application/holder/src/service/github/requests/createcommit.ts delete mode 100644 application/holder/src/service/github/requests/createtree.ts delete mode 100644 application/holder/src/service/github/requests/getbranchsha.ts delete mode 100644 application/holder/src/service/github/requests/getcommit.ts delete mode 100644 application/holder/src/service/github/requests/getcommitbyfile.ts delete mode 100644 application/holder/src/service/github/requests/getfilecontent.ts delete mode 100644 application/holder/src/service/github/requests/getusername.ts delete mode 100644 application/holder/src/service/github/requests/index.ts delete mode 100644 application/holder/src/service/github/requests/updateref.ts delete mode 100644 application/holder/src/service/github/tools.ts delete mode 100644 application/holder/src/service/hotkeys.ts delete mode 100644 application/holder/src/service/jobs.ts delete mode 100644 application/holder/src/service/jobs/aliases.ts delete mode 100644 application/holder/src/service/jobs/job.ts delete mode 100644 application/holder/src/service/menu.ts delete mode 100644 application/holder/src/service/notifications.ts delete mode 100644 application/holder/src/service/paths.ts delete mode 100644 application/holder/src/service/production.ts delete mode 100644 application/holder/src/service/sessions.ts delete mode 100644 application/holder/src/service/sessions/active.ts delete mode 100644 application/holder/src/service/sessions/holder.ts delete mode 100644 application/holder/src/service/sessions/requests/index.ts delete mode 100644 application/holder/src/service/sessions/requests/observe/abort.ts delete mode 100644 application/holder/src/service/sessions/requests/observe/index.ts delete mode 100644 application/holder/src/service/sessions/requests/observe/list.ts delete mode 100644 application/holder/src/service/sessions/requests/observe/sde.ts delete mode 100644 application/holder/src/service/sessions/requests/observe/sources.ts delete mode 100644 application/holder/src/service/sessions/requests/observe/start.ts delete mode 100644 application/holder/src/service/sessions/requests/search/drop.ts delete mode 100644 application/holder/src/service/sessions/requests/search/index.ts delete mode 100644 application/holder/src/service/sessions/requests/search/map.ts delete mode 100644 application/holder/src/service/sessions/requests/search/nearest.ts delete mode 100644 application/holder/src/service/sessions/requests/search/next_nested.ts delete mode 100644 application/holder/src/service/sessions/requests/search/search.ts delete mode 100644 application/holder/src/service/sessions/requests/session/create.ts delete mode 100644 application/holder/src/service/sessions/requests/session/destroy.ts delete mode 100644 application/holder/src/service/sessions/requests/session/export.raw.awailable.ts delete mode 100644 application/holder/src/service/sessions/requests/session/export.raw.ts delete mode 100644 application/holder/src/service/sessions/requests/session/export.ts delete mode 100644 application/holder/src/service/sessions/requests/session/index.ts delete mode 100644 application/holder/src/service/sessions/requests/stream/add_bookmark.ts delete mode 100644 application/holder/src/service/sessions/requests/stream/chunk.ts delete mode 100644 application/holder/src/service/sessions/requests/stream/expand_indexing_map.ts delete mode 100644 application/holder/src/service/sessions/requests/stream/index.ts delete mode 100644 application/holder/src/service/sessions/requests/stream/indexed.ts delete mode 100644 application/holder/src/service/sessions/requests/stream/indexed_len.ts delete mode 100644 application/holder/src/service/sessions/requests/stream/indexes_around.ts delete mode 100644 application/holder/src/service/sessions/requests/stream/indexes_as_ranges.ts delete mode 100644 application/holder/src/service/sessions/requests/stream/ranges.ts delete mode 100644 application/holder/src/service/sessions/requests/stream/remove_bookmark.ts delete mode 100644 application/holder/src/service/sessions/requests/stream/set_bookmarks.ts delete mode 100644 application/holder/src/service/sessions/requests/stream/set_indexing_mode.ts delete mode 100644 application/holder/src/service/sessions/requests/values/extract.ts delete mode 100644 application/holder/src/service/sessions/requests/values/frame.ts delete mode 100644 application/holder/src/service/sessions/requests/values/index.ts delete mode 100644 application/holder/src/service/settings.ts delete mode 100644 application/holder/src/service/settings/colors.ts delete mode 100644 application/holder/src/service/settings/index.ts delete mode 100644 application/holder/src/service/settings/network.ts delete mode 100644 application/holder/src/service/settings/requests/entries.ts delete mode 100644 application/holder/src/service/settings/requests/get.ts delete mode 100644 application/holder/src/service/settings/requests/index.ts delete mode 100644 application/holder/src/service/settings/requests/set.ts delete mode 100644 application/holder/src/service/settings/requests/validate.ts delete mode 100644 application/holder/src/service/settings/updater.ts delete mode 100644 application/holder/src/service/storage.ts delete mode 100644 application/holder/src/service/storage/entries.ts delete mode 100644 application/holder/src/service/unbound.ts delete mode 100644 application/holder/src/service/unbound/dlt/index.ts delete mode 100644 application/holder/src/service/unbound/dlt/stat.ts delete mode 100644 application/holder/src/service/unbound/file/checksum.ts delete mode 100644 application/holder/src/service/unbound/file/index.ts delete mode 100644 application/holder/src/service/unbound/file/isbinary.ts delete mode 100644 application/holder/src/service/unbound/index.ts delete mode 100644 application/holder/src/service/unbound/os/index.ts delete mode 100644 application/holder/src/service/unbound/os/list.ts delete mode 100644 application/holder/src/service/unbound/os/shells.ts delete mode 100644 application/holder/src/service/unbound/plugins/add_plugin.ts delete mode 100644 application/holder/src/service/unbound/plugins/index.ts delete mode 100644 application/holder/src/service/unbound/plugins/installed_plugin_info.ts delete mode 100644 application/holder/src/service/unbound/plugins/invalid_plugin_info.ts delete mode 100644 application/holder/src/service/unbound/plugins/list_installed.ts delete mode 100644 application/holder/src/service/unbound/plugins/list_installed_paths.ts delete mode 100644 application/holder/src/service/unbound/plugins/list_invalid.ts delete mode 100644 application/holder/src/service/unbound/plugins/list_invalid_paths.ts delete mode 100644 application/holder/src/service/unbound/plugins/reload.ts delete mode 100644 application/holder/src/service/unbound/plugins/remove_plugin.ts delete mode 100644 application/holder/src/service/unbound/plugins/rundata.ts delete mode 100644 application/holder/src/service/unbound/serial/index.ts delete mode 100644 application/holder/src/service/unbound/serial/ports.ts delete mode 100644 application/holder/src/service/unbound/someip/index.ts delete mode 100644 application/holder/src/service/unbound/someip/statistic.ts delete mode 100644 application/holder/src/service/updater.ts delete mode 100644 application/holder/src/service/updater/alpha.ts delete mode 100644 application/holder/src/service/updater/metadata.ts delete mode 100644 application/holder/src/service/updater/releasefile.ts delete mode 100644 application/holder/src/service/updater/version.ts delete mode 100644 application/holder/tsconfig.json delete mode 100644 application/holder/yarn.lock delete mode 100644 application/platform/.eslintrc.json delete mode 100644 application/platform/.yarnrc.yml delete mode 100644 application/platform/entity/controller.ts delete mode 100644 application/platform/entity/index.ts delete mode 100644 application/platform/entity/logger.ts delete mode 100644 application/platform/entity/service.ts delete mode 100644 application/platform/env/decorators.ts delete mode 100644 application/platform/env/filters.ts delete mode 100644 application/platform/env/globals.ts delete mode 100644 application/platform/env/hash.ts delete mode 100644 application/platform/env/index.ts delete mode 100644 application/platform/env/ipaddr.ts delete mode 100644 application/platform/env/lock.token.ts delete mode 100644 application/platform/env/normalized.ts delete mode 100644 application/platform/env/num.ts delete mode 100644 application/platform/env/obj.ts delete mode 100644 application/platform/env/observer.ts delete mode 100644 application/platform/env/promise.ts delete mode 100644 application/platform/env/queue.ts delete mode 100644 application/platform/env/regex.ts delete mode 100644 application/platform/env/runner.ts delete mode 100644 application/platform/env/scope.ts delete mode 100644 application/platform/env/sequence.ts delete mode 100644 application/platform/env/str.ts delete mode 100644 application/platform/env/subscription.ts delete mode 100644 application/platform/env/togglers.ts delete mode 100644 application/platform/eslint.config.mjs delete mode 100644 application/platform/ipc/event/cli/done.ts delete mode 100644 application/platform/ipc/event/cli/index.ts delete mode 100644 application/platform/ipc/event/declarations.ts delete mode 100644 application/platform/ipc/event/github/conflict.ts delete mode 100644 application/platform/ipc/event/github/fileupdated.ts delete mode 100644 application/platform/ipc/event/github/index.ts delete mode 100644 application/platform/ipc/event/hotkey/emit.ts delete mode 100644 application/platform/ipc/event/hotkey/index.ts delete mode 100644 application/platform/ipc/event/index.ts delete mode 100644 application/platform/ipc/event/logs/index.ts delete mode 100644 application/platform/ipc/event/logs/write.ts delete mode 100644 application/platform/ipc/event/notification/index.ts delete mode 100644 application/platform/ipc/event/notification/pop.ts delete mode 100644 application/platform/ipc/event/observe/finished.ts delete mode 100644 application/platform/ipc/event/observe/index.ts delete mode 100644 application/platform/ipc/event/observe/started.ts delete mode 100644 application/platform/ipc/event/search/index.ts delete mode 100644 application/platform/ipc/event/search/mapupdated.ts delete mode 100644 application/platform/ipc/event/search/updated.ts delete mode 100644 application/platform/ipc/event/state/backend.ts delete mode 100644 application/platform/ipc/event/state/client.ts delete mode 100644 application/platform/ipc/event/state/index.ts delete mode 100644 application/platform/ipc/event/state/job.ts delete mode 100644 application/platform/ipc/event/stream/attachment.ts delete mode 100644 application/platform/ipc/event/stream/index.ts delete mode 100644 application/platform/ipc/event/stream/indexed_map_updated.ts delete mode 100644 application/platform/ipc/event/stream/updated.ts delete mode 100644 application/platform/ipc/event/values/index.ts delete mode 100644 application/platform/ipc/event/values/updated.ts delete mode 100644 application/platform/ipc/index.ts delete mode 100644 application/platform/ipc/request/action/call.ts delete mode 100644 application/platform/ipc/request/action/index.ts delete mode 100644 application/platform/ipc/request/actions/about.ts delete mode 100644 application/platform/ipc/request/actions/export.session.state.ts delete mode 100644 application/platform/ipc/request/actions/find.ts delete mode 100644 application/platform/ipc/request/actions/help.ts delete mode 100644 application/platform/ipc/request/actions/import.session.state.ts delete mode 100644 application/platform/ipc/request/actions/index.ts delete mode 100644 application/platform/ipc/request/actions/jumpto.ts delete mode 100644 application/platform/ipc/request/actions/open.browserurl.ts delete mode 100644 application/platform/ipc/request/actions/open.file.ts delete mode 100644 application/platform/ipc/request/actions/open.folder.ts delete mode 100644 application/platform/ipc/request/actions/plugins_manager.ts delete mode 100644 application/platform/ipc/request/actions/settings.ts delete mode 100644 application/platform/ipc/request/actions/stream.ts delete mode 100644 application/platform/ipc/request/actions/theme.dark.ts delete mode 100644 application/platform/ipc/request/actions/theme.light.ts delete mode 100644 application/platform/ipc/request/actions/updates.ts delete mode 100644 application/platform/ipc/request/app/alpha_release.ts delete mode 100644 application/platform/ipc/request/app/changelogs.ts delete mode 100644 application/platform/ipc/request/app/index.ts delete mode 100644 application/platform/ipc/request/app/version.ts delete mode 100644 application/platform/ipc/request/cli/getcommand.ts delete mode 100644 application/platform/ipc/request/cli/index.ts delete mode 100644 application/platform/ipc/request/cli/multi_files.ts delete mode 100644 application/platform/ipc/request/cli/observe.ts delete mode 100644 application/platform/ipc/request/cli/search.ts delete mode 100644 application/platform/ipc/request/cwd/get.ts delete mode 100644 application/platform/ipc/request/cwd/index.ts delete mode 100644 application/platform/ipc/request/cwd/set.ts delete mode 100644 application/platform/ipc/request/declarations.ts delete mode 100644 application/platform/ipc/request/dlt/index.ts delete mode 100644 application/platform/ipc/request/dlt/stat.ts delete mode 100644 application/platform/ipc/request/env/get.ts delete mode 100644 application/platform/ipc/request/env/index.ts delete mode 100644 application/platform/ipc/request/file/checksum.ts delete mode 100644 application/platform/ipc/request/file/copy.ts delete mode 100644 application/platform/ipc/request/file/copyfile.ts delete mode 100644 application/platform/ipc/request/file/exists.ts delete mode 100644 application/platform/ipc/request/file/exportsession.ts delete mode 100644 application/platform/ipc/request/file/file.ts delete mode 100644 application/platform/ipc/request/file/index.ts delete mode 100644 application/platform/ipc/request/file/isbinary.ts delete mode 100644 application/platform/ipc/request/file/name.ts delete mode 100644 application/platform/ipc/request/file/read.ts delete mode 100644 application/platform/ipc/request/file/save.ts delete mode 100644 application/platform/ipc/request/file/select.ts delete mode 100644 application/platform/ipc/request/file/write.ts delete mode 100644 application/platform/ipc/request/folder/choose.ts delete mode 100644 application/platform/ipc/request/folder/delimiter.ts delete mode 100644 application/platform/ipc/request/folder/index.ts delete mode 100644 application/platform/ipc/request/folder/select.ts delete mode 100644 application/platform/ipc/request/folder/shell_open.ts delete mode 100644 application/platform/ipc/request/github/addrepo.ts delete mode 100644 application/platform/ipc/request/github/checkupdates.ts delete mode 100644 application/platform/ipc/request/github/getactive.ts delete mode 100644 application/platform/ipc/request/github/getfilemeta.ts delete mode 100644 application/platform/ipc/request/github/getrepos.ts delete mode 100644 application/platform/ipc/request/github/getusername.ts delete mode 100644 application/platform/ipc/request/github/index.ts delete mode 100644 application/platform/ipc/request/github/removerepo.ts delete mode 100644 application/platform/ipc/request/github/setactive.ts delete mode 100644 application/platform/ipc/request/github/setfilemeta.ts delete mode 100644 application/platform/ipc/request/github/updaterepo.ts delete mode 100644 application/platform/ipc/request/hotkey/index.ts delete mode 100644 application/platform/ipc/request/hotkey/off.ts delete mode 100644 application/platform/ipc/request/hotkey/on.ts delete mode 100644 application/platform/ipc/request/index.ts delete mode 100644 application/platform/ipc/request/observe/abort.ts delete mode 100644 application/platform/ipc/request/observe/index.ts delete mode 100644 application/platform/ipc/request/observe/list.ts delete mode 100644 application/platform/ipc/request/observe/sde.ts delete mode 100644 application/platform/ipc/request/observe/sources.ts delete mode 100644 application/platform/ipc/request/observe/start.ts delete mode 100644 application/platform/ipc/request/os/entity.ts delete mode 100644 application/platform/ipc/request/os/homedir.ts delete mode 100644 application/platform/ipc/request/os/index.ts delete mode 100644 application/platform/ipc/request/os/list.ts delete mode 100644 application/platform/ipc/request/os/shells.ts delete mode 100644 application/platform/ipc/request/plugins/add_plugin.ts delete mode 100644 application/platform/ipc/request/plugins/index.ts delete mode 100644 application/platform/ipc/request/plugins/installed_plugin_info.ts delete mode 100644 application/platform/ipc/request/plugins/invalid_plugin_info.ts delete mode 100644 application/platform/ipc/request/plugins/list_installed.ts delete mode 100644 application/platform/ipc/request/plugins/list_installed_paths.ts delete mode 100644 application/platform/ipc/request/plugins/list_invalid.ts delete mode 100644 application/platform/ipc/request/plugins/list_invalid_paths.ts delete mode 100644 application/platform/ipc/request/plugins/reload.ts delete mode 100644 application/platform/ipc/request/plugins/remove_plugin.ts delete mode 100644 application/platform/ipc/request/plugins/rundata.ts delete mode 100644 application/platform/ipc/request/search/drop.ts delete mode 100644 application/platform/ipc/request/search/index.ts delete mode 100644 application/platform/ipc/request/search/map.ts delete mode 100644 application/platform/ipc/request/search/nearest.ts delete mode 100644 application/platform/ipc/request/search/next_nested.ts delete mode 100644 application/platform/ipc/request/search/search.ts delete mode 100644 application/platform/ipc/request/serial/index.ts delete mode 100644 application/platform/ipc/request/serial/ports.ts delete mode 100644 application/platform/ipc/request/session/create.ts delete mode 100644 application/platform/ipc/request/session/destroy.ts delete mode 100644 application/platform/ipc/request/session/export.raw.available.ts delete mode 100644 application/platform/ipc/request/session/export.raw.ts delete mode 100644 application/platform/ipc/request/session/export.ts delete mode 100644 application/platform/ipc/request/session/index.ts delete mode 100644 application/platform/ipc/request/settings/entries.ts delete mode 100644 application/platform/ipc/request/settings/get.ts delete mode 100644 application/platform/ipc/request/settings/index.ts delete mode 100644 application/platform/ipc/request/settings/set.ts delete mode 100644 application/platform/ipc/request/settings/validate.ts delete mode 100644 application/platform/ipc/request/someip/index.ts delete mode 100644 application/platform/ipc/request/someip/statistic.ts delete mode 100644 application/platform/ipc/request/storage/delete.ts delete mode 100644 application/platform/ipc/request/storage/entries.delete.ts delete mode 100644 application/platform/ipc/request/storage/entries.get.ts delete mode 100644 application/platform/ipc/request/storage/entries.set.ts delete mode 100644 application/platform/ipc/request/storage/index.ts delete mode 100644 application/platform/ipc/request/storage/read.ts delete mode 100644 application/platform/ipc/request/storage/write.ts delete mode 100644 application/platform/ipc/request/stream/add_bookmark.ts delete mode 100644 application/platform/ipc/request/stream/chunk.ts delete mode 100644 application/platform/ipc/request/stream/expand.ts delete mode 100644 application/platform/ipc/request/stream/index.ts delete mode 100644 application/platform/ipc/request/stream/indexed.ts delete mode 100644 application/platform/ipc/request/stream/indexed_len.ts delete mode 100644 application/platform/ipc/request/stream/indexes_around.ts delete mode 100644 application/platform/ipc/request/stream/indexes_as_ranges.ts delete mode 100644 application/platform/ipc/request/stream/mode.ts delete mode 100644 application/platform/ipc/request/stream/ranges.ts delete mode 100644 application/platform/ipc/request/stream/remove_bookmark.ts delete mode 100644 application/platform/ipc/request/stream/set_bookmarks.ts delete mode 100644 application/platform/ipc/request/system/check_updates.ts delete mode 100644 application/platform/ipc/request/system/exit.ts delete mode 100644 application/platform/ipc/request/system/index.ts delete mode 100644 application/platform/ipc/request/system/shutdown.ts delete mode 100644 application/platform/ipc/request/values/extract.ts delete mode 100644 application/platform/ipc/request/values/frame.ts delete mode 100644 application/platform/ipc/request/values/index.ts delete mode 100644 application/platform/ipc/setup/channels.ts delete mode 100644 application/platform/ipc/transport/errors/index.ts delete mode 100644 application/platform/ipc/transport/errors/native.ts delete mode 100644 application/platform/ipc/transport/index.ts delete mode 100644 application/platform/lib.ts delete mode 100644 application/platform/log/defaults.ts delete mode 100644 application/platform/log/index.ts delete mode 100644 application/platform/log/levels.ts delete mode 100644 application/platform/log/logger.ts delete mode 100644 application/platform/log/state.ts delete mode 100644 application/platform/log/utils.ts delete mode 100644 application/platform/modules/index.ts delete mode 100644 application/platform/modules/system.ts delete mode 100644 application/platform/package.json delete mode 100644 application/platform/tsconfig.json delete mode 100644 application/platform/types/bindings/attachment.ts delete mode 100644 application/platform/types/bindings/callback.ts delete mode 100644 application/platform/types/bindings/command.ts delete mode 100644 application/platform/types/bindings/dlt.ts delete mode 100644 application/platform/types/bindings/error.ts delete mode 100644 application/platform/types/bindings/index.ts delete mode 100644 application/platform/types/bindings/lf_transition.ts delete mode 100644 application/platform/types/bindings/miscellaneous.ts delete mode 100644 application/platform/types/bindings/observe.ts delete mode 100644 application/platform/types/bindings/operations.ts delete mode 100644 application/platform/types/bindings/plugins.ts delete mode 100644 application/platform/types/bindings/progress.ts delete mode 100644 application/platform/types/bookmark.ts delete mode 100644 application/platform/types/chart.ts delete mode 100644 application/platform/types/comment.ts delete mode 100644 application/platform/types/content.ts delete mode 100644 application/platform/types/env/types.ts delete mode 100644 application/platform/types/exporting.ts delete mode 100644 application/platform/types/files.ts delete mode 100644 application/platform/types/filter.ts delete mode 100644 application/platform/types/github/bookmarks.ts delete mode 100644 application/platform/types/github/chart.ts delete mode 100644 application/platform/types/github/comment.ts delete mode 100644 application/platform/types/github/filemetadata.ts delete mode 100644 application/platform/types/github/filter.ts delete mode 100644 application/platform/types/github/index.ts delete mode 100644 application/platform/types/hotkeys/map.ts delete mode 100644 application/platform/types/index.ts delete mode 100644 application/platform/types/io/read.ts delete mode 100644 application/platform/types/io/write.ts delete mode 100644 application/platform/types/life/destroyable.ts delete mode 100644 application/platform/types/net.ts delete mode 100644 application/platform/types/notification/index.ts delete mode 100644 application/platform/types/observe/compatibility.ts delete mode 100644 application/platform/types/observe/configuration.ts delete mode 100644 application/platform/types/observe/description.ts delete mode 100644 application/platform/types/observe/factory.ts delete mode 100644 application/platform/types/observe/index.ts delete mode 100644 application/platform/types/observe/origin/concat.ts delete mode 100644 application/platform/types/observe/origin/file.ts delete mode 100644 application/platform/types/observe/origin/index.ts delete mode 100644 application/platform/types/observe/origin/plugin.ts delete mode 100644 application/platform/types/observe/origin/stream.ts delete mode 100644 application/platform/types/observe/origin/stream/index.ts delete mode 100644 application/platform/types/observe/origin/stream/process/index.ts delete mode 100644 application/platform/types/observe/origin/stream/serial/index.ts delete mode 100644 application/platform/types/observe/origin/stream/tcp/index.ts delete mode 100644 application/platform/types/observe/origin/stream/udp/index.ts delete mode 100644 application/platform/types/observe/parser/dlt/index.ts delete mode 100644 application/platform/types/observe/parser/index.ts delete mode 100644 application/platform/types/observe/parser/plugin/index.ts delete mode 100644 application/platform/types/observe/parser/someip/index.ts delete mode 100644 application/platform/types/observe/parser/text/index.ts delete mode 100644 application/platform/types/observe/sde.ts delete mode 100644 application/platform/types/observe/types/file/index.ts delete mode 100644 application/platform/types/observe/types/index.ts delete mode 100644 application/platform/types/observe/types/plugin/index.ts delete mode 100644 application/platform/types/observe/types/sourcelink.ts delete mode 100644 application/platform/types/range.ts delete mode 100644 application/platform/types/sde/index.ts delete mode 100644 application/platform/types/settings/entry.description.ts delete mode 100644 application/platform/types/settings/entry.ts delete mode 100644 application/platform/types/storage/entry.ts delete mode 100644 application/platform/types/storage/index.ts delete mode 100644 application/platform/types/storage/json.ts delete mode 100644 application/platform/types/storage/storage.record.ts delete mode 100644 application/platform/types/storage/storage.record.validators.ts delete mode 100644 application/platform/types/storage/storage.ts delete mode 100644 application/platform/types/unity/mutable.ts delete mode 100644 application/platform/yarn.lock delete mode 100644 cli/development-cli/.dockerignore delete mode 100644 cli/development-cli/.gitignore delete mode 100644 cli/development-cli/CHANGELOG.md delete mode 100644 cli/development-cli/Cargo.lock delete mode 100644 cli/development-cli/Cargo.toml delete mode 100644 cli/development-cli/README.md delete mode 100644 cli/development-cli/config/bench_core.toml delete mode 100644 cli/development-cli/config/codesign_macos.toml delete mode 100644 cli/development-cli/config/min_versions.toml delete mode 100644 cli/development-cli/integration_tests/.gitignore delete mode 100644 cli/development-cli/integration_tests/bench.py delete mode 100644 cli/development-cli/integration_tests/build.py delete mode 100644 cli/development-cli/integration_tests/clean.py delete mode 100644 cli/development-cli/integration_tests/environment.py delete mode 100644 cli/development-cli/integration_tests/lint.py delete mode 100644 cli/development-cli/integration_tests/print_dot.py delete mode 100644 cli/development-cli/integration_tests/release.py delete mode 100644 cli/development-cli/integration_tests/run_all.py delete mode 100644 cli/development-cli/integration_tests/shell_compl.py delete mode 100644 cli/development-cli/integration_tests/test_cmd.py delete mode 100644 cli/development-cli/integration_tests/user_config.py delete mode 100644 cli/development-cli/integration_tests/utls.py delete mode 100644 cli/development-cli/src/benchmark/core.rs delete mode 100644 cli/development-cli/src/benchmark/mod.rs delete mode 100644 cli/development-cli/src/build_state_records.rs delete mode 100644 cli/development-cli/src/chipmunk_runner.rs delete mode 100644 cli/development-cli/src/cli_args.rs delete mode 100644 cli/development-cli/src/dev_environment/min_versions.rs delete mode 100644 cli/development-cli/src/dev_environment/mod.rs delete mode 100644 cli/development-cli/src/dev_tools.rs delete mode 100644 cli/development-cli/src/fstools.rs delete mode 100644 cli/development-cli/src/job_type.rs delete mode 100644 cli/development-cli/src/jobs_runner/additional_features.rs delete mode 100644 cli/development-cli/src/jobs_runner/job_definition.rs delete mode 100644 cli/development-cli/src/jobs_runner/jobs_resolver.rs delete mode 100644 cli/development-cli/src/jobs_runner/jobs_state.rs delete mode 100644 cli/development-cli/src/jobs_runner/mod.rs delete mode 100644 cli/development-cli/src/location.rs delete mode 100644 cli/development-cli/src/log_print.rs delete mode 100644 cli/development-cli/src/main.rs delete mode 100644 cli/development-cli/src/print_dot.rs delete mode 100644 cli/development-cli/src/release/bundle.rs delete mode 100644 cli/development-cli/src/release/codesign/macos.rs delete mode 100644 cli/development-cli/src/release/codesign/mod.rs delete mode 100644 cli/development-cli/src/release/compress.rs delete mode 100644 cli/development-cli/src/release/env_utls.rs delete mode 100644 cli/development-cli/src/release/metadata.rs delete mode 100644 cli/development-cli/src/release/mod.rs delete mode 100644 cli/development-cli/src/release/paths.rs delete mode 100644 cli/development-cli/src/shell.rs delete mode 100644 cli/development-cli/src/spawner.rs delete mode 100644 cli/development-cli/src/target/app.rs delete mode 100644 cli/development-cli/src/target/binding.rs delete mode 100644 cli/development-cli/src/target/client.rs delete mode 100644 cli/development-cli/src/target/mod.rs delete mode 100644 cli/development-cli/src/target/protocol.rs delete mode 100644 cli/development-cli/src/target/target_kind.rs delete mode 100644 cli/development-cli/src/target/updater.rs delete mode 100644 cli/development-cli/src/target/wasm.rs delete mode 100644 cli/development-cli/src/target/wrapper.rs delete mode 100644 cli/development-cli/src/tracker.rs delete mode 100644 cli/development-cli/src/user_config.rs delete mode 100644 cli/development-cli/src/version.rs create mode 100644 crates/dir_checksum/.gitignore create mode 100644 crates/dir_checksum/Cargo.lock rename {cli/development-cli => crates}/dir_checksum/Cargo.toml (79%) rename {cli/development-cli => crates}/dir_checksum/src/file_hash_digest.rs (100%) rename {cli/development-cli => crates}/dir_checksum/src/hash_digest.rs (100%) rename {cli/development-cli => crates}/dir_checksum/src/hash_error.rs (100%) rename {cli/development-cli => crates}/dir_checksum/src/input.rs (100%) rename {cli/development-cli => crates}/dir_checksum/src/lib.rs (100%) rename {cli/development-cli => crates}/dir_checksum/tests/integration_tests.rs (100%) delete mode 100644 docker/ubuntu-20.04/Dockerfile delete mode 100755 docker/ubuntu-20.04/build.sh delete mode 100755 docker/ubuntu-20.04/run.sh delete mode 100644 scripts/README.md delete mode 100644 scripts/benchmarks/process.rb delete mode 100755 scripts/benchmarks/setup_dependencies.sh delete mode 100755 scripts/benchmarks/setup_dev_tools.sh delete mode 100644 scripts/build_times.md delete mode 100644 scripts/elements/bindings.rb delete mode 100644 scripts/elements/client.rb delete mode 100644 scripts/elements/electron.rb delete mode 100644 scripts/elements/indexer.rb delete mode 100644 scripts/elements/matcher.rb delete mode 100644 scripts/elements/platform.rb delete mode 100644 scripts/elements/protocol.rb delete mode 100644 scripts/elements/release.rb delete mode 100644 scripts/elements/updater.rb delete mode 100644 scripts/elements/wasm.rb delete mode 100644 scripts/env/env.rb delete mode 100644 scripts/env/paths.rb delete mode 100644 scripts/images/tasks_1.png delete mode 100644 scripts/images/tasks_2.png delete mode 100644 scripts/images/tasks_3.png delete mode 100755 scripts/os/ubuntu_enabler.sh delete mode 100644 scripts/tools/change_checker.rb delete mode 100644 scripts/tools/compressor.rb delete mode 100644 scripts/tools/mod.rb delete mode 100644 scripts/tools/os.rb delete mode 100644 scripts/tools/reporter.rb delete mode 100644 scripts/tools/shell.rb delete mode 100644 scripts/tools/spec/change_checker_spec.rb diff --git a/application/apps/indexer/Cargo.lock b/application/apps/indexer/Cargo.lock index 9bfb7c03b5..af9ed3095f 100644 --- a/application/apps/indexer/Cargo.lock +++ b/application/apps/indexer/Cargo.lock @@ -2,16 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - [[package]] name = "ab_glyph" version = "0.2.32" @@ -85,7 +75,7 @@ checksum = "90e549dd7c6562b6a2ea807b44726e6241707db054a817dc4c7e2b8d3b39bfac" dependencies = [ "accesskit", "accesskit_atspi_common", - "async-channel 2.5.0", + "async-channel", "async-executor", "async-task", "atspi", @@ -161,15 +151,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aligned" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" -dependencies = [ - "as-slice", -] - [[package]] name = "allocator-api2" version = "0.2.21" @@ -391,15 +372,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" -[[package]] -name = "as-slice" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" -dependencies = [ - "stable_deref_trait", -] - [[package]] name = "ash" version = "0.38.0+1.3.281" @@ -415,23 +387,12 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener 5.4.1", + "event-listener", "event-listener-strategy", "futures-core", "pin-project-lite", ] -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - [[package]] name = "async-channel" version = "2.5.0" @@ -458,21 +419,6 @@ dependencies = [ "slab", ] -[[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite", - "once_cell", -] - [[package]] name = "async-io" version = "2.6.0" @@ -497,7 +443,7 @@ version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ - "event-listener 5.4.1", + "event-listener", "event-listener-strategy", "pin-project-lite", ] @@ -508,14 +454,14 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ - "async-channel 2.5.0", + "async-channel", "async-io", "async-lock", "async-signal", "async-task", "blocking", "cfg-if", - "event-listener 5.4.1", + "event-listener", "futures-lite", "rustix 1.1.4", ] @@ -528,7 +474,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -549,33 +495,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "async-std" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" -dependencies = [ - "async-channel 1.9.0", - "async-global-executor", - "async-io", - "async-lock", - "async-process", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - [[package]] name = "async-task" version = "4.7.1" @@ -590,7 +509,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -750,7 +669,7 @@ version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "async-channel 2.5.0", + "async-channel", "async-task", "futures-io", "futures-lite", @@ -809,7 +728,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1107,7 +1026,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1495,41 +1414,12 @@ dependencies = [ "typenum", ] -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ctor" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" -dependencies = [ - "quote", - "syn 2.0.117", -] - [[package]] name = "cursor-icon" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" -[[package]] -name = "cvt" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ae9bf77fbf2d39ef573205d554d87e86c12f1994e9ea335b0651b9b278bcf1" -dependencies = [ - "cfg-if", -] - [[package]] name = "darling" version = "0.20.11" @@ -1551,7 +1441,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.117", + "syn", ] [[package]] @@ -1562,7 +1452,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1592,7 +1482,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -1602,7 +1492,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.117", + "syn", ] [[package]] @@ -1701,7 +1591,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2033,7 +1923,7 @@ checksum = "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2053,7 +1943,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2074,7 +1964,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2085,7 +1975,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2179,12 +2069,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - [[package]] name = "event-listener" version = "5.4.1" @@ -2202,19 +2086,10 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.1", + "event-listener", "pin-project-lite", ] -[[package]] -name = "extend" -version = "0.1.0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "fallible-iterator" version = "0.3.0" @@ -2244,7 +2119,7 @@ checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2299,20 +2174,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "fluvio-future" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb6426efa0dc4cc12226634b5b2657237b67028837e79ef4ad4706c4f211bd9" -dependencies = [ - "anyhow", - "async-std", - "cfg-if", - "thiserror 2.0.18", - "tracing", - "tracing-subscriber", -] - [[package]] name = "fnv" version = "1.0.7" @@ -2368,7 +2229,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2403,20 +2264,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "fs_at" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14af6c9694ea25db25baa2a1788703b9e7c6648dcaeeebeb98f7561b5384c036" -dependencies = [ - "aligned", - "cfg-if", - "cvt", - "libc", - "nix 0.29.0", - "windows-sys 0.52.0", -] - [[package]] name = "futures" version = "0.3.32" @@ -2486,7 +2333,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -2596,17 +2443,6 @@ dependencies = [ "wasip3", ] -[[package]] -name = "ghost" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1323e4e10ffd5d48a21ea37f8d4e3b15dd841121d1301a86122fa0984bedf0a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "gif" version = "0.14.1" @@ -2652,18 +2488,6 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - [[package]] name = "glow" version = "0.17.0" @@ -3231,28 +3055,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "inventory" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb5160c60ba1e809707918ee329adb99d222888155835c6feedba19f6c3fd4" -dependencies = [ - "ctor 0.1.26", - "ghost", - "inventory-impl", -] - -[[package]] -name = "inventory-impl" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e41b53715c6f0c4be49510bb82dee2c1e51c8586d885abe65396e82ed518548" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "io-extras" version = "0.18.4" @@ -3377,7 +3179,7 @@ checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -3407,7 +3209,7 @@ dependencies = [ "quote", "rustc_version", "simd_cesu8", - "syn 2.0.117", + "syn", ] [[package]] @@ -3435,7 +3237,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -3486,15 +3288,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - [[package]] name = "lazy_static" version = "1.5.0" @@ -3611,9 +3404,6 @@ name = "log" version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -dependencies = [ - "value-bag", -] [[package]] name = "mach2" @@ -3624,15 +3414,6 @@ dependencies = [ "libc", ] -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - [[package]] name = "maybe-owned" version = "0.3.4" @@ -3857,49 +3638,6 @@ dependencies = [ "libc", ] -[[package]] -name = "nj-core" -version = "6.1.0" -source = "git+https://github.com/infinyon/node-bindgen.git?branch=master#1c6f19b658b0acaf71a25f5f2e4d8b4d970363ad" -dependencies = [ - "async-trait", - "ctor 0.2.9", - "fluvio-future", - "futures-lite", - "inventory", - "libc", - "nj-sys", - "num-bigint", - "pin-utils", - "tracing", -] - -[[package]] -name = "nj-derive" -version = "3.4.3" -source = "git+https://github.com/infinyon/node-bindgen.git?branch=master#1c6f19b658b0acaf71a25f5f2e4d8b4d970363ad" -dependencies = [ - "Inflector", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "nj-sys" -version = "4.0.0" -source = "git+https://github.com/infinyon/node-bindgen.git?branch=master#1c6f19b658b0acaf71a25f5f2e4d8b4d970363ad" - -[[package]] -name = "node-bindgen" -version = "6.1.0" -source = "git+https://github.com/infinyon/node-bindgen.git?branch=master#1c6f19b658b0acaf71a25f5f2e4d8b4d970363ad" -dependencies = [ - "nj-core", - "nj-derive", - "nj-sys", -] - [[package]] name = "nohash-hasher" version = "0.2.0" @@ -3916,24 +3654,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "normpath" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf23ab2b905654b4cb177e30b629937b3868311d4e1cba859f899c041046e69b" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "nucleo-matcher" version = "0.3.1" @@ -3944,25 +3664,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -3992,7 +3693,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -4367,7 +4068,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -4491,12 +4192,6 @@ dependencies = [ "thiserror 2.0.18", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "pcap-parser" version = "0.16.0" @@ -4597,7 +4292,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "unicase", ] @@ -4611,7 +4306,7 @@ dependencies = [ "phf_shared 0.13.1", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -4659,7 +4354,7 @@ checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -4668,12 +4363,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "piper" version = "0.2.5" @@ -4849,7 +4538,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.117", + "syn", ] [[package]] @@ -5249,20 +4938,6 @@ version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" -[[package]] -name = "remove_dir_all" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cc0b475acf76adf36f08ca49429b12aad9f678cb56143d5b3cb49b9a1dd08" -dependencies = [ - "cfg-if", - "cvt", - "fs_at", - "libc", - "normpath", - "windows-sys 0.59.0", -] - [[package]] name = "renderdoc-sys" version = "1.1.0" @@ -5602,7 +5277,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5626,7 +5301,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5674,6 +5349,7 @@ dependencies = [ name = "session" version = "4.0.0-alpha.1" dependencies = [ + "bincode", "blake3", "dirs", "dlt-core", @@ -5715,15 +5391,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - [[package]] name = "shell-tools" version = "0.1.0" @@ -6020,17 +5687,10 @@ name = "stypes" version = "4.0.0-alpha.1" dependencies = [ "anyhow", - "bincode", "dlt-core", - "extend", - "node-bindgen", - "paste", - "proptest", - "remove_dir_all", "serde", "thiserror 2.0.18", "tokio", - "ts-rs", "uuid", "walkdir", ] @@ -6041,17 +5701,6 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.117" @@ -6080,7 +5729,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -6188,7 +5837,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -6199,16 +5848,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if", + "syn", ] [[package]] @@ -6295,7 +5935,7 @@ checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -6496,7 +6136,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -6506,36 +6146,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex-automata", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", ] [[package]] @@ -6546,7 +6156,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -6555,30 +6165,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "ts-rs" -version = "10.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e640d9b0964e9d39df633548591090ab92f7a4567bc31d3891af23471a3365c6" -dependencies = [ - "lazy_static", - "thiserror 2.0.18", - "ts-rs-macros", - "uuid", -] - -[[package]] -name = "ts-rs-macros" -version = "10.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e9d8656589772eeec2cf7a8264d9cda40fb28b9bc53118ceb9e8c07f8f38730" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", - "termcolor", -] - [[package]] name = "ttf-parser" version = "0.25.1" @@ -6710,18 +6296,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b59fc5417e036e53226bbebd90196825d358624fd5577432c4e486c95b1b096" -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "value-bag" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" - [[package]] name = "vcpkg" version = "0.2.15" @@ -6875,7 +6449,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "wasm-bindgen-shared", ] @@ -7072,7 +6646,7 @@ dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "wasmtime-component-util", "wasmtime-wit-bindgen", "wit-parser 0.229.0", @@ -7199,7 +6773,7 @@ checksum = "d0963c1438357a3d8c0efe152b4ef5259846c1cf8b864340270744fe5b3bae5e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -7694,7 +7268,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "witx", ] @@ -7706,7 +7280,7 @@ checksum = "d873bb5b59ca703b5e41562e96a4796d1af61bf4cf80bf8a7abda755a380ec1c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "wiggle-generate", ] @@ -7813,7 +7387,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -7824,7 +7398,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -8082,7 +7656,7 @@ dependencies = [ "heck", "indexmap", "prettyplease", - "syn 2.0.117", + "syn", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -8098,7 +7672,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -8264,7 +7838,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "synstructure", ] @@ -8284,7 +7858,7 @@ dependencies = [ "async-trait", "blocking", "enumflags2", - "event-listener 5.4.1", + "event-listener", "futures-core", "futures-lite", "hex", @@ -8321,7 +7895,7 @@ checksum = "10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "zbus-lockstep", "zbus_xml", "zvariant", @@ -8336,7 +7910,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "zbus_names", "zvariant", "zvariant_utils", @@ -8382,7 +7956,7 @@ checksum = "3545ea9e86d12ab9bba9fcd99b54c1556fd3199007def5a03c375623d05fac1c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -8402,7 +7976,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "synstructure", ] @@ -8442,7 +8016,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -8517,7 +8091,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "zvariant_utils", ] @@ -8530,6 +8104,6 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.117", + "syn", "winnow 0.7.15", ] diff --git a/application/apps/indexer/addons/shell-tools/Cargo.toml b/application/apps/indexer/addons/shell-tools/Cargo.toml index 2b6be34dcb..a342aaba2a 100644 --- a/application/apps/indexer/addons/shell-tools/Cargo.toml +++ b/application/apps/indexer/addons/shell-tools/Cargo.toml @@ -6,7 +6,7 @@ edition = "2024" [dependencies] which.workspace = true log.workspace = true -stypes = { path = "../../stypes", features=["rustcore"] } +stypes = { path = "../../stypes" } [lints] workspace = true diff --git a/application/apps/indexer/gui/application/Cargo.toml b/application/apps/indexer/gui/application/Cargo.toml index 17a072ac64..689c01ee72 100644 --- a/application/apps/indexer/gui/application/Cargo.toml +++ b/application/apps/indexer/gui/application/Cargo.toml @@ -14,7 +14,7 @@ path = "src/main.rs" [dependencies] # *** Internal *** -stypes = { workspace = true, features=["rustcore"] } +stypes.workspace = true merging.workspace = true processor.workspace = true sources.workspace = true diff --git a/application/holder/resources/icons/ico/icon.ico b/application/apps/indexer/gui/application/data/icons/ico/icon.ico similarity index 100% rename from application/holder/resources/icons/ico/icon.ico rename to application/apps/indexer/gui/application/data/icons/ico/icon.ico diff --git a/application/holder/resources/icons/png/128.png b/application/apps/indexer/gui/application/data/icons/png/128.png similarity index 100% rename from application/holder/resources/icons/png/128.png rename to application/apps/indexer/gui/application/data/icons/png/128.png diff --git a/application/holder/resources/icons/png/16.png b/application/apps/indexer/gui/application/data/icons/png/16.png similarity index 100% rename from application/holder/resources/icons/png/16.png rename to application/apps/indexer/gui/application/data/icons/png/16.png diff --git a/application/holder/resources/icons/png/24.png b/application/apps/indexer/gui/application/data/icons/png/24.png similarity index 100% rename from application/holder/resources/icons/png/24.png rename to application/apps/indexer/gui/application/data/icons/png/24.png diff --git a/application/holder/resources/icons/png/256.png b/application/apps/indexer/gui/application/data/icons/png/256.png similarity index 100% rename from application/holder/resources/icons/png/256.png rename to application/apps/indexer/gui/application/data/icons/png/256.png diff --git a/application/holder/resources/icons/png/32.png b/application/apps/indexer/gui/application/data/icons/png/32.png similarity index 100% rename from application/holder/resources/icons/png/32.png rename to application/apps/indexer/gui/application/data/icons/png/32.png diff --git a/application/holder/resources/icons/png/512.png b/application/apps/indexer/gui/application/data/icons/png/512.png similarity index 100% rename from application/holder/resources/icons/png/512.png rename to application/apps/indexer/gui/application/data/icons/png/512.png diff --git a/application/holder/resources/icons/png/64.png b/application/apps/indexer/gui/application/data/icons/png/64.png similarity index 100% rename from application/holder/resources/icons/png/64.png rename to application/apps/indexer/gui/application/data/icons/png/64.png diff --git a/application/holder/resources/icons/png/icon.png b/application/apps/indexer/gui/application/data/icons/png/icon.png similarity index 100% rename from application/holder/resources/icons/png/icon.png rename to application/apps/indexer/gui/application/data/icons/png/icon.png diff --git a/application/holder/resources/linux/chipmunk.desktop b/application/apps/indexer/gui/application/data/linux/chipmunk.desktop similarity index 100% rename from application/holder/resources/linux/chipmunk.desktop rename to application/apps/indexer/gui/application/data/linux/chipmunk.desktop diff --git a/application/holder/resources/linux/chipmunk.png b/application/apps/indexer/gui/application/data/linux/chipmunk.png similarity index 100% rename from application/holder/resources/linux/chipmunk.png rename to application/apps/indexer/gui/application/data/linux/chipmunk.png diff --git a/application/holder/resources/mac/chipmunk.icns b/application/apps/indexer/gui/application/data/mac/chipmunk.icns similarity index 100% rename from application/holder/resources/mac/chipmunk.icns rename to application/apps/indexer/gui/application/data/mac/chipmunk.icns diff --git a/application/holder/resources/mac/entitlements.mac.plist b/application/apps/indexer/gui/application/data/mac/entitlements.mac.plist similarity index 100% rename from application/holder/resources/mac/entitlements.mac.plist rename to application/apps/indexer/gui/application/data/mac/entitlements.mac.plist diff --git a/application/holder/resources/win/chipmunk.ico b/application/apps/indexer/gui/application/data/win/chipmunk.ico similarity index 100% rename from application/holder/resources/win/chipmunk.ico rename to application/apps/indexer/gui/application/data/win/chipmunk.ico diff --git a/application/apps/indexer/gui/application/src/common/app_info.rs b/application/apps/indexer/gui/application/src/common/app_info.rs index fc11d761c9..c69b70d989 100644 --- a/application/apps/indexer/gui/application/src/common/app_info.rs +++ b/application/apps/indexer/gui/application/src/common/app_info.rs @@ -22,7 +22,7 @@ pub fn current_version() -> &'static Version { pub fn icon() -> egui::IconData { let icon_bytes = include_bytes!(concat!( env!("CARGO_MANIFEST_DIR"), - "/../../../../holder/resources/icons/png/icon.png" + "/data/icons/png/icon.png" )); match eframe::icon_data::from_png_bytes(icon_bytes) { diff --git a/application/apps/indexer/plugins_host/Cargo.toml b/application/apps/indexer/plugins_host/Cargo.toml index 9f4a72e28c..c911d1a174 100644 --- a/application/apps/indexer/plugins_host/Cargo.toml +++ b/application/apps/indexer/plugins_host/Cargo.toml @@ -23,8 +23,7 @@ wasmtime-wasi = "33.0" parsers.workspace = true stypes.workspace = true -# TODO : Introduce shared crates and move dir_checksum to it. -dir_checksum = { path = "../../../../cli/development-cli/dir_checksum" } +dir_checksum = { path = "../../../../crates/dir_checksum" } [dev-dependencies] criterion = { workspace = true, features = ["async_tokio"] } diff --git a/application/apps/indexer/processor/Cargo.toml b/application/apps/indexer/processor/Cargo.toml index 804f37ddd2..1e5fd050df 100644 --- a/application/apps/indexer/processor/Cargo.toml +++ b/application/apps/indexer/processor/Cargo.toml @@ -26,7 +26,7 @@ serde_json.workspace = true text_grep.workspace = true thiserror.workspace = true tokio-util.workspace = true -stypes = { workspace = true, features=["rustcore"] } +stypes.workspace = true [dev-dependencies] criterion = { workspace = true, features = ["async_tokio"] } diff --git a/application/apps/indexer/session/Cargo.toml b/application/apps/indexer/session/Cargo.toml index 5e5b7c2f2b..4288e76f36 100644 --- a/application/apps/indexer/session/Cargo.toml +++ b/application/apps/indexer/session/Cargo.toml @@ -22,8 +22,9 @@ mime_guess = "2.0" parsers.workspace = true processor.workspace = true rustc-hash = "2.1" -stypes = { workspace = true, features=["rustcore"] } +stypes.workspace = true serde = { workspace = true , features = ["derive"] } +bincode = "1.3" serde_json.workspace = true serialport.workspace = true sources.workspace = true diff --git a/application/apps/indexer/session/src/operations.rs b/application/apps/indexer/session/src/operations.rs index 4f9193b741..1d12cce707 100644 --- a/application/apps/indexer/session/src/operations.rs +++ b/application/apps/indexer/session/src/operations.rs @@ -227,7 +227,7 @@ impl OperationAPI { let event = match result { Ok(result) => { if let Some(result) = result.as_ref() { - match stypes::serialize(result) { + match bincode::serialize(result) { Ok(bytes) => stypes::CallbackEvent::OperationDone(stypes::OperationDone { uuid: self.operation_id, result: Some(bytes), diff --git a/application/apps/indexer/sources/Cargo.toml b/application/apps/indexer/sources/Cargo.toml index f8a87616da..ba87ed77e0 100644 --- a/application/apps/indexer/sources/Cargo.toml +++ b/application/apps/indexer/sources/Cargo.toml @@ -21,7 +21,7 @@ tokio-stream.workspace = true tokio-util = { workspace = true , features = ["full"] } serde = { workspace = true, features = ["derive"] } uuid = { workspace = true , features = ["serde", "v4"] } -stypes = { workspace = true, features=["rustcore"] } +stypes.workspace = true socket2 = "0.5.8" [target.'cfg(windows)'.dependencies] diff --git a/application/apps/indexer/stypes/Cargo.toml b/application/apps/indexer/stypes/Cargo.toml index b2ee9d74ba..ce66c348bd 100644 --- a/application/apps/indexer/stypes/Cargo.toml +++ b/application/apps/indexer/stypes/Cargo.toml @@ -5,41 +5,13 @@ version.workspace = true edition.workspace = true [lints] -workspace = true - -[features] -test_and_gen = [] -rustcore = [ - "dep:tokio", - "dep:walkdir", - "dlt-core/fibex", - "dlt-core/statistics", - "dlt-core/serialization", - "dep:anyhow", -] -nodejs = [ - "dep:node-bindgen" -] +workspace = true [dependencies] -serde = { workspace = true , features = ["derive"] } -dlt-core = { workspace = true, features = ["fibex", "serialization"] } -bincode = "1.3" -extend = { path = "../tools/extend"} -uuid = { workspace = true, features = ["serde"] } -tokio = { workspace = true, optional = true } -node-bindgen = { git = "https://github.com/infinyon/node-bindgen.git", branch="master", optional = true} -thiserror.workspace = true -walkdir = { workspace = true, optional = true } -anyhow = { workspace = true, optional = true } - -[dev-dependencies] -tokio = { workspace = true } -walkdir = { workspace = true } -node-bindgen = { git = "https://github.com/infinyon/node-bindgen.git", branch="master" } -proptest = { workspace = true } -paste = "1.0" +serde = { workspace = true, features = ["derive"] } +dlt-core = { workspace = true, features = ["fibex", "statistics", "serialization"] } uuid = { workspace = true, features = ["serde", "v4"] } -remove_dir_all = "1.0" -ts-rs = { version = "10.1", features = ["uuid-impl"] } - +tokio.workspace = true +thiserror.workspace = true +walkdir.workspace = true +anyhow.workspace = true diff --git a/application/apps/indexer/stypes/bindings/attachment.ts b/application/apps/indexer/stypes/bindings/attachment.ts deleted file mode 100644 index 44e19feb97..0000000000 --- a/application/apps/indexer/stypes/bindings/attachment.ts +++ /dev/null @@ -1,42 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Describes the content of attached data found in the `payload` of a `dlt` message. - */ -export type AttachmentInfo = { -/** - * A unique identifier for the attachment. - */ -uuid: string, -/** - * The full path to the file. Note that `chipmunk` serializes the file name to ensure proper - * saving to disk, so the actual file name may differ from the value in the `name` field. - */ -filepath: string, -/** - * The name of the application, usually corresponding to the file name. - */ -name: string, -/** - * The file extension, if available. - */ -ext: string | null, -/** - * The size of the file in bytes. - */ -size: number, -/** - * The `mime` type of the file, if it could be determined. - */ -mime: string | null, -/** - * The log entry numbers containing the application data. Note that the application - * data may be contained in a single log entry or split into parts distributed - * across sequential log entries. - */ -messages: number[], }; - -/** - * A list of attachments. - */ -export type AttachmentList = Array; diff --git a/application/apps/indexer/stypes/bindings/callback.ts b/application/apps/indexer/stypes/bindings/callback.ts deleted file mode 100644 index 96d5e7d479..0000000000 --- a/application/apps/indexer/stypes/bindings/callback.ts +++ /dev/null @@ -1,61 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { AttachmentInfo } from "./attachment"; -import type { FilterMatchList } from "./miscellaneous"; -import type { NativeError } from "./error"; -import type { Progress } from "./progress"; - -/** - * Represents events sent to the client. - */ -export type CallbackEvent = { "StreamUpdated": number } | "FileRead" | { "SearchUpdated": { -/** - * The number of logs with matches. Can be `0` if the search is reset on the client side. - */ -found: number, -/** - * A map of search conditions and their global match counts within the session. - * - `String`: The search condition. - * - `u64`: The count of matches. - */ -stat: Map, } } | { "IndexedMapUpdated": { -/** - * The number of log entries from search results available for reading. - */ -len: number, } } | { "SearchMapUpdated": FilterMatchList | null } | { "SearchValuesUpdated": Map } | { "AttachmentsUpdated": { -/** - * The size of the attachment in bytes. - */ -len: number, -/** - * The description of the attachment. - */ -attachment: AttachmentInfo, } } | { "Progress": { -/** - * The unique identifier of the operation. - */ -uuid: string, -/** - * Information about the progress. - */ -progress: Progress, } } | { "SessionError": NativeError } | { "OperationError": { -/** - * The unique identifier of the operation that caused the error. - */ -uuid: string, -/** - * The error details. - */ -error: NativeError, } } | { "OperationStarted": string } | { "OperationProcessing": string } | { "OperationDone": OperationDone } | "SessionDestroyed"; - -/** - * Contains the results of an operation. - */ -export type OperationDone = { -/** - * The unique identifier of the operation. - */ -uuid: string, -/** - * The results of the operation, if available. - */ -result: Array | null, }; diff --git a/application/apps/indexer/stypes/bindings/command.ts b/application/apps/indexer/stypes/bindings/command.ts deleted file mode 100644 index 5a3c88e73c..0000000000 --- a/application/apps/indexer/stypes/bindings/command.ts +++ /dev/null @@ -1,159 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Represents the result of a command execution. - * At the core level, this type is used for all commands invoked within an `UnboundSession`. - * It is only used to indicate the successful completion or interruption of a command. - */ -export type CommandOutcomeBool = { "Finished": boolean } | "Cancelled"; - -/** - * Represents the result of a command execution. - * At the core level, this type is used for all commands invoked within an `UnboundSession`. - * It is only used to indicate the successful completion or interruption of a command. - */ -export type CommandOutcomeDltStatisticInfoResult = { "Finished": DltStatisticInfo } | "Cancelled"; - -/** - * Represents the result of a command execution. - * At the core level, this type is used for all commands invoked within an `UnboundSession`. - * It is only used to indicate the successful completion or interruption of a command. - */ -export type CommandOutcomeFoldersScanningResult = { "Finished": FoldersScanningResult } | "Cancelled"; - -/** - * Represents the result of a command execution. - * At the core level, this type is used for all commands invoked within an `UnboundSession`. - * It is only used to indicate the successful completion or interruption of a command. - */ -export type CommandOutcomeOptionalString = { "Finished": string | null } | "Cancelled"; - -/** - * Represents the result of a command execution. - * At the core level, this type is used for all commands invoked within an `UnboundSession`. - * It is only used to indicate the successful completion or interruption of a command. - */ -export type CommandOutcomeProfilesResult = { "Finished": ProfileList } | "Cancelled"; - -/** - * Represents the result of a command execution. - * At the core level, this type is used for all commands invoked within an `UnboundSession`. - * It is only used to indicate the successful completion or interruption of a command. - */ -export type CommandOutcomeSerialPortsList = { "Finished": SerialPortsList } | "Cancelled"; - -/** - * Represents the result of a command execution. - * At the core level, this type is used for all commands invoked within an `UnboundSession`. - * It is only used to indicate the successful completion or interruption of a command. - */ -export type CommandOutcomeString = { "Finished": string } | "Cancelled"; - -/** - * Represents the result of a command execution. - * At the core level, this type is used for all commands invoked within an `UnboundSession`. - * It is only used to indicate the successful completion or interruption of a command. - */ -export type CommandOutcomeVoid = "Finished" | "Cancelled"; - -/** - * Represents the result of a command execution. - * At the core level, this type is used for all commands invoked within an `UnboundSession`. - * It is only used to indicate the successful completion or interruption of a command. - */ -export type CommandOutcomei64 = { "Finished": number } | "Cancelled"; - -export type DltLevelDistribution = { non_log: number, log_fatal: number, log_error: number, log_warning: number, log_info: number, log_debug: number, log_verbose: number, log_invalid: number, }; - -export type DltStatisticInfo = { app_ids: Array<[string, DltLevelDistribution]>, context_ids: Array<[string, DltLevelDistribution]>, ecu_ids: Array<[string, DltLevelDistribution]>, contained_non_verbose: boolean, }; - -/** - * Represents a folder entity in the file system. - */ -export type FolderEntity = { -/** - * The name of the entity (file or folder). - */ -name: string, -/** - * The full path of the entity. - */ -fullname: string, -/** - * The type of the entity (e.g., file, directory, symbolic link). - */ -kind: FolderEntityType, -/** - * Optional detailed information about the entity. - */ -details: FolderEntityDetails | null, }; - -/** - * Contains detailed information about a folder entity. - */ -export type FolderEntityDetails = { -/** - * The name of the file or folder. - */ -filename: string, -/** - * The full path to the file or folder. - */ -full: string, -/** - * The directory path containing the file or folder. - */ -path: string, -/** - * The base name of the file or folder. - */ -basename: string, -/** - * The file extension, if applicable. - */ -ext: string, }; - -/** - * Represents the type of a folder entity in the file system. - */ -export type FolderEntityType = "BlockDevice" | "CharacterDevice" | "Directory" | "FIFO" | "File" | "Socket" | "SymbolicLink"; - -/** - * Represents the result of scanning a folder. - */ -export type FoldersScanningResult = { -/** - * A list of folder entities found during the scan. - */ -list: Array, -/** - * Indicates whether the maximum length of results was reached. - */ -max_len_reached: boolean, }; - -/** - * Represents a list of serial ports. - * - * This structure contains a vector of strings, where each string represents the name - * or identifier of a serial port available on the system. - */ -export type ProfileList = Array; - -/** - * Represents a list of serial ports. - * - * This structure contains a vector of strings, where each string represents the name - * or identifier of a serial port available on the system. - */ -export type SerialPortsList = Array; - -export type ShellProfile = { shell: ShellType, -/** - * Path to executable file of shell - */ -path: string, }; - -/** - * Represents most well known shells that are not used by default on OS. - */ -export type ShellType = "Bash" | "Zsh" | "Fish" | "NuShell" | "Elvish" | "Pwsh"; diff --git a/application/apps/indexer/stypes/bindings/dlt.ts b/application/apps/indexer/stypes/bindings/dlt.ts deleted file mode 100644 index 4db3b1d986..0000000000 --- a/application/apps/indexer/stypes/bindings/dlt.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * ATTENTION: - * THIS FILE IS MANUALLY CREATED BECAUSE `ts_rs` CANNOT BE APPLIED - * TO FOREIGN TYPES (`DltFilterConfig` comes from the `dlt-core` crate). - * DO NOT REMOVE THIS FILE. - */ -export interface DltFilterConfig { - /// only select log entries with level MIN_LEVEL and more severe - /// - /// ``` text - /// 1 => FATAL - /// 2 => ERROR - /// 3 => WARN - /// 4 => INFO - /// 5 => DEBUG - /// 6 => VERBOSE - /// ``` min_log_level?: number, - /// what app ids should be allowed. - app_ids?: string[]; - /// what ecu ids should be allowed - ecu_ids?: string[]; - /// what context ids should be allowed - context_ids?: string[]; - /// how many app ids exist in total - app_id_count: number; - /// how many context ids exist in total - context_id_count: number; -} diff --git a/application/apps/indexer/stypes/bindings/error.ts b/application/apps/indexer/stypes/bindings/error.ts deleted file mode 100644 index 2d678c253d..0000000000 --- a/application/apps/indexer/stypes/bindings/error.ts +++ /dev/null @@ -1,33 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Describes the type and details of an error. - */ -export type ComputationError = "DestinationPath" | "SessionCreatingFail" | { "Communication": string } | { "OperationNotSupported": string } | { "IoOperation": string } | "InvalidData" | { "InvalidArgs": string } | { "Process": string } | { "Protocol": string } | { "SearchError": string } | "MultipleInitCall" | "SessionUnavailable" | { "NativeError": NativeError } | { "Grabbing": string } | { "Sde": string } | { "Decoding": string } | { "Encoding": string }; - -/** - * Describes the details of an error. - */ -export type NativeError = { -/** - * The severity level of the error. - */ -severity: Severity, -/** - * The type or source of the error. - */ -kind: NativeErrorKind, -/** - * A detailed message describing the error. - */ -message: string | null, }; - -/** - * Defines the source or type of an error. - */ -export type NativeErrorKind = "FileNotFound" | "UnsupportedFileType" | "ComputationFailed" | "Configuration" | "Interrupted" | "OperationSearch" | "NotYetImplemented" | "ChannelError" | "Io" | "Grabber" | "Plugins"; - -/** - * Indicates the severity level of an error. - */ -export type Severity = "WARNING" | "ERROR"; diff --git a/application/apps/indexer/stypes/bindings/index.ts b/application/apps/indexer/stypes/bindings/index.ts deleted file mode 100644 index 2541212052..0000000000 --- a/application/apps/indexer/stypes/bindings/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * ATTENTION: - * THIS FILE IS MANUALLY CREATED TO MANAGE TYPE EXPORTS. - * DO NOT DELETE. ADD EXPORT STATEMENTS FOR ANY NEW TYPES. - */ -export * from './attachment'; -export * from './callback'; -export * from './command'; -export * from './error'; -export * from './lf_transition'; -export * from './miscellaneous'; -export * from './observe'; -export * from './progress'; -export * from './dlt'; -export * from './operations'; -export * from './plugins'; diff --git a/application/apps/indexer/stypes/bindings/lf_transition.ts b/application/apps/indexer/stypes/bindings/lf_transition.ts deleted file mode 100644 index de4a4003ee..0000000000 --- a/application/apps/indexer/stypes/bindings/lf_transition.ts +++ /dev/null @@ -1,23 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Ticks } from "./progress"; - -/** - * Describes the progress of an operation. - */ -export type LifecycleTransition = { "Started": { -/** - * The unique identifier of the operation. - */ -uuid: string, -/** - * A user-friendly name of the operation for display purposes. - */ -alias: string, } } | { "Ticks": { -/** - * The unique identifier of the operation. - */ -uuid: string, -/** - * The progress data associated with the operation. - */ -ticks: Ticks, } } | { "Stopped": string }; diff --git a/application/apps/indexer/stypes/bindings/miscellaneous.ts b/application/apps/indexer/stypes/bindings/miscellaneous.ts deleted file mode 100644 index 59ab592e7d..0000000000 --- a/application/apps/indexer/stypes/bindings/miscellaneous.ts +++ /dev/null @@ -1,105 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Data about indices (log entry numbers). Used to provide information about - * the nearest search results relative to a specific log entry number. - */ -export type AroundIndexes = [number | undefined | null, number | undefined | null]; - -/** - * Describes a match for a search condition. - */ -export type FilterMatch = { -/** - * The index (number) of the matching log entry. - */ -index: number, -/** - * The identifiers of the filters (search conditions) that matched - * the specified log entry. - */ -filters: Array, }; - -/** - * A list of matches for a search condition. - */ -export type FilterMatchList = Array; - -/** - * Information about a log entry. - */ -export type GrabbedElement = { -/** - * The unique identifier of the source. - */ -source_id: number, -/** - * The textual content of the log entry. - */ -content: string, -/** - * The position of the log entry in the overall stream. - */ -pos: number, -/** - * The nature of the log entry, represented as a bitmask. Possible values include: - * - `SEARCH`: Nature = Nature(1) - * - `BOOKMARK`: Nature = Nature(1 << 1) - * - `EXPANDED`: Nature = Nature(1 << 5) - * - `BREADCRUMB`: Nature = Nature(1 << 6) - * - `BREADCRUMB_SEPARATOR`: Nature = Nature(1 << 7) - */ -nature: number, }; - -/** - * A list of log entries. - */ -export type GrabbedElementList = Array; - -export type MapKeyValue = { [key in string]?: string }; - -/** - * Representation of ranges. We cannot use std ranges as soon as no way - * to derive Serialize, Deserialize - */ -export type Range = { start: number, end: number, }; - -/** - * A list of ranges to read. - */ -export type Ranges = Array; - -/** - * A request to a stream that supports feedback, such as a terminal command - * that accepts input through `stdin`. - */ -export type SdeRequest = { "WriteText": string } | { "WriteBytes": Array }; - -/** - * The response from a source to a sent `SdeRequest`. Note that sending data - * with `SdeRequest` does not guarantee a response, as the behavior depends - * on the source. - */ -export type SdeResponse = { -/** - * The number of bytes received. - */ -bytes: number, }; - -/** - * Describes a data source. - */ -export type SourceDefinition = { -/** - * The unique identifier of the source. - */ -id: number, -/** - * The user-friendly name of the source for display purposes. - */ -alias: string, }; - -/** - * A list of data sources. - */ -export type Sources = Array; diff --git a/application/apps/indexer/stypes/bindings/observe.ts b/application/apps/indexer/stypes/bindings/observe.ts deleted file mode 100644 index 4abee2409e..0000000000 --- a/application/apps/indexer/stypes/bindings/observe.ts +++ /dev/null @@ -1,185 +0,0 @@ -/** - * ATTENTION: - * REFERENCE TO `DltFilterConfig` HAS BEEN ADDED MANUALLY - * BECAUSE THIS TYPE IS NOT GENERATED BY `ts_rs`. - */ -import { DltFilterConfig } from './dlt'; -import type { PluginParserSettings } from './plugins'; - -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { ShellProfile } from './command'; - -/** - * Settings for the DLT parser. - */ -export type DltParserSettings = { - /** - * Configuration for filtering DLT messages. - */ - filter_config: DltFilterConfig; - /** - * Paths to FIBEX files for additional interpretation of `payload` content. - */ - fibex_file_paths: Array | null; - /** - * Indicates whether the source contains a `StorageHeader`. Set to `true` if applicable. - */ - with_storage_header: boolean; - /** - * Timezone for timestamp adjustment. If specified, timestamps are converted to this timezone. - */ - tz: string | null; -}; - -/** - * Supported file formats for observation. - */ -export type FileFormat = 'PcapNG' | 'PcapLegacy' | 'Text' | 'Binary'; - -/** - * Multicast configuration information. - * - `multiaddr`: A valid multicast address. - * - `interface`: The address of the local interface used to join the multicast group. - * If set to `INADDR_ANY`, the system selects an appropriate interface. - */ -export type MulticastInfo = { multiaddr: string; interface: string | null }; - -/** - * Options for observing data within a session. - */ -export type ObserveOptions = { - /** - * The description of the data source. - */ - origin: ObserveOrigin; - /** - * The parser configuration to be applied. - */ - parser: ParserType; -}; - -/** - * Describes the source of data for observation. - */ -export type ObserveOrigin = - | { File: [string, FileFormat, string] } - | { Concat: Array<[string, FileFormat, string]> } - | { Stream: [string, Transport] }; - -/** - * Specifies the parser to be used for processing session data. - */ -export type ParserType = - | { Dlt: DltParserSettings } - | { SomeIp: SomeIpParserSettings } - | { Text: null } - | { Plugin: PluginParserSettings }; - -/** - * Configuration for executing terminal commands. - */ -export type ProcessTransportConfig = { - /** - * The working directory for the command. - */ - cwd: string; - /** - * The command to execute. - */ - command: string; - /** - * Optional shell infos if user selected one other than the default shells - */ - shell: ShellProfile | null; -}; - -/** - * Configuration for serial port connections. - */ -export type SerialTransportConfig = { - /** - * The path to the serial port. - */ - path: string; - /** - * The baud rate for the connection. - */ - baud_rate: number; - /** - * The number of data bits per frame. - */ - data_bits: number; - /** - * The flow control setting. - */ - flow_control: number; - /** - * The parity setting. - */ - parity: number; - /** - * The number of stop bits. - */ - stop_bits: number; - /** - * The delay in sending data, in milliseconds. - */ - send_data_delay: number; - /** - * Whether the connection is exclusive. - */ - exclusive: boolean; -}; - -/** - * Settings for the SomeIp parser. - */ -export type SomeIpParserSettings = { - /** - * Paths to FIBEX files for additional interpretation of `payload` content. - */ - fibex_file_paths: Array | null; -}; - -/** - * Configuration for TCP connections. - */ -export type TCPTransportConfig = { - /** - * The address to bind the TCP connection to. - */ - bind_addr: string; -}; - -/** - * Describes the transport source for a session. - */ -export type Transport = - | { Process: ProcessTransportConfig } - | { TCP: TCPTransportConfig } - | { UDP: UDPTransportConfig } - | { Serial: SerialTransportConfig }; - -/** - * Configuration for UDP connections. - */ -export type UDPTransportConfig = { - /** - * The address to bind the UDP connection to. - */ - bind_addr: string; - /** - * A list of multicast configurations. - */ - multicast: Array; -}; - -/** - * Configuration for UDP connections. - */ -export type UdpConnectionInfo = { - /** - * A list of multicast addresses to listen on. - */ - multicast_addr: Array; -}; diff --git a/application/apps/indexer/stypes/bindings/operations.ts b/application/apps/indexer/stypes/bindings/operations.ts deleted file mode 100644 index 5989527ca1..0000000000 --- a/application/apps/indexer/stypes/bindings/operations.ts +++ /dev/null @@ -1,48 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Used to delivery results of extracting values. That's used in the scope - * of chart feature - */ -export type ExtractedMatchValue = { -/** - * The index of log entry (row number) - */ -index: number, -/** - * List of matches: - * `usize` - index of filter - * `Vec` - list of extracted values - */ -values: Array<[number, Array]>, }; - -export type NearestPosition = { index: number, position: number, }; - -/** - *(row_number, min_value_in_range, max_value_in_range, value) - * value - can be last value in range or some kind of average - */ -export type Point = { row: number, min: number, max: number, y_value: number, }; - -export type ResultBool = boolean; - -/** - * The list of `ExtractedMatchValue` - */ -export type ResultExtractedMatchValues = Array; - -export type ResultNearestPosition = NearestPosition | null; - -/** - * Scaled chart data - */ -export type ResultScaledDistribution = Array>; - -export type ResultSearchValues = Map; - -/** - * Used only for debug session lifecycle - */ -export type ResultSleep = { sleep_well: boolean, }; - -export type ResultU64 = number; diff --git a/application/apps/indexer/stypes/bindings/plugins.ts b/application/apps/indexer/stypes/bindings/plugins.ts deleted file mode 100644 index fdd9107ec8..0000000000 --- a/application/apps/indexer/stypes/bindings/plugins.ts +++ /dev/null @@ -1,241 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Represents the infos of a column that will be used in the render options. - */ -export type ColumnInfo = { - /** - * Header title to be rendered on the top of the column in log view. - */ - caption: string; - /** - * Description to be shown as tooltip for the column. - */ - description: string; - /** - * Width of column (-1) for unlimited. - */ - width: number; -}; - -/** - * Represents the options needs to render columns information if they exist. - */ -export type ColumnsRenderOptions = { - /** - * List of columns infos providing the needed information for each column in log view. - * - * Note: The count of this list must match the count of the column of each log message. - */ - columns: Array; - /** - * Minimum column width. - */ - min_width: number; - /** - * Maximum column width. - */ - max_width: number; -}; - -/** - * Represents the informations of an invalid plugin. - */ -export type InvalidPluginEntity = { - /** - * Directory path of the plugin. Qualify as ID for the plugin. - */ - dir_path: string; - /** - * Represents the plugin type. - */ - plugin_type: PluginType; -}; - -/** - * Represents a list of [`InvalidPluginEntity`]. - */ -export type InvalidPluginsList = Array; - -/** - * Provides additional information to be rendered in the log view. - */ -export type ParserRenderOptions = { - /** - * Rendering information for the column if log messages have multiple columns. - * - * # Note: - * The count of the provided columns must match the count of the columns of each log message as well. - */ - columns_options: ColumnsRenderOptions | null; -}; - -/** - * General settings for all byte-sources as plugins - */ -export type PluginByteSourceGeneralSettings = { placeholder: string }; - -/** - * Settings for the Plugin Byte-Sources. - */ -export type PluginByteSourceSettings = { - plugin_path: string; - general_settings: PluginByteSourceGeneralSettings; - plugin_configs: Array; -}; - -/** - * Represents a configuration item, which includes an identifier and its corresponding value. - */ -export type PluginConfigItem = { id: string; value: PluginConfigValue }; - -/** - * Represents the schema for a configuration item. - */ -export type PluginConfigSchemaItem = { - id: string; - title: string; - description: string | null; - input_type: PluginConfigSchemaType; -}; - -/** - * Defines the possible input types for configuration schemas. - */ -export type PluginConfigSchemaType = - | { Boolean: boolean } - | { Integer: number } - | { Float: number } - | { Text: string } - | 'Directories' - | { Files: Array } - | { Dropdown: [Array, string] }; - -/** - * Represents the value of a configuration item. - */ -export type PluginConfigValue = - | { Boolean: boolean } - | { Integer: number } - | { Float: number } - | { Text: string } - | { Directories: Array } - | { Files: Array } - | { Dropdown: string }; - -/** - * Represents an installed plugin entity informations and configurations. - */ -export type PluginEntity = { - /** - * Directory path of the plugin. Qualify as ID for the plugin. - */ - dir_path: string; - /** - * Represents the plugin type. - */ - plugin_type: PluginType; - /** - * Include various information about the plugin. - */ - info: PluginInfo; - /** - * Provides Plugins Metadata from separate source than the plugin binary. - * Currently they are saved inside plugin `*.toml` file. - */ - metadata: PluginMetadata; - /** - * Path of the readme file for the plugin to be rendered on the front-end - */ - readme_path: string | null; -}; - -/** - * Contains the infos and options for a valid plugin. - */ -export type PluginInfo = { - wasm_file_path: string; - api_version: SemanticVersion; - plugin_version: SemanticVersion; - config_schemas: Array; - render_options: RenderOptions; -}; - -/** - * Represents different levels of logging severity for a plugin. - */ -export type PluginLogLevel = 'Err' | 'Warn' | 'Debug' | 'Info'; - -/** - * Represents a log message generated by a plugin. - */ -export type PluginLogMessage = { - /** - * The severity level of the log message. - */ - level: PluginLogLevel; - /** - * The timestamp of when the log message was generated, represented as a Unix timestamp. - */ - timestamp: bigint; - /** - * The actual content of the log message. - */ - msg: string; -}; - -/** - * Represents the plugins metadata like title, description... - */ -export type PluginMetadata = { title: string; description: string | null }; - -/** - * General settings for all parsers as plugins - */ -export type PluginParserGeneralSettings = { placeholder: string }; - -/** - * Settings for the Plugins parser. - */ -export type PluginParserSettings = { - plugin_path: string; - general_settings: PluginParserGeneralSettings; - plugin_configs: Array; -}; - -/** - * Maintains the state of a plugin, including its log messages. - * Represented as a struct (but not just a vector) to reserve - * a space for a future fields. - */ -export type PluginRunData = { - /** - * A collection of log messages associated with the plugin. - */ - logs: Array; -}; - -/** - * Represents plugins main types - */ -export type PluginType = 'Parser' | 'ByteSource'; - -/** - * Represents a list of [`PluginEntity`]. - */ -export type PluginsList = Array; - -/** - * Represents a list of [`InvalidPluginEntity`]. - */ -export type PluginsPathsList = Array; - -/** - * Represents the render options (columns headers, etc.) for the plugins. - */ -export type RenderOptions = { Parser: ParserRenderOptions } | 'ByteSource'; - -/** - * Represents the semantic version used in the plugins system. - */ -export type SemanticVersion = { major: number; minor: number; patch: number }; diff --git a/application/apps/indexer/stypes/bindings/progress.ts b/application/apps/indexer/stypes/bindings/progress.ts deleted file mode 100644 index e02a8793ee..0000000000 --- a/application/apps/indexer/stypes/bindings/progress.ts +++ /dev/null @@ -1,43 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Severity } from "./error"; - -/** - * Represents a notification about an event (including potential errors) - * related to processing a specific log entry, if such data is available. - */ -export type Notification = { -/** - * The severity level of the event. - */ -severity: Severity, -/** - * The content or message describing the event. - */ -content: string, -/** - * The log entry number that triggered the event, if applicable. - */ -line: number | null, }; - -/** - * Describes the progress of an operation. - */ -export type Progress = { "Ticks": Ticks } | { "Notification": Notification } | "Stopped"; - -/** - * Provides detailed information about the progress of an operation. - */ -export type Ticks = { -/** - * The current progress count, typically representing `n` out of `100%`. - */ -count: number, -/** - * The name of the current progress stage, for user display purposes. - */ -state: string | null, -/** - * The total progress counter. Usually `100`, but for file operations, - * it might represent the file size, where `count` indicates the number of bytes read. - */ -total: number | null | undefined, }; diff --git a/application/apps/indexer/stypes/generate.sh b/application/apps/indexer/stypes/generate.sh deleted file mode 100755 index 40b453ce51..0000000000 --- a/application/apps/indexer/stypes/generate.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -echo " -This script generates TypeScript types from Rust types by executing special unit tests. -After running these tests, the types will be generated, and existing types will be overwritten -in the 'bindings' directory. -Please copy only the newly generated types to the 'application/platform/types' directory. - -Notes: -* The generated files in 'bindings' are not part of the communication protocol; only the types in - 'platform' are part of the protocol. -* Please commit only the new changes and exclude the overwritten versions of existing types. -" -read -p "Do you want to continue? (y/N): " response - -response=${response,,} -if [[ "$response" != "y" ]]; then - echo "Operation aborted." - exit 1 -fi - -echo "Generating types" -cargo test --release --features "test_and_gen" -- --nocapture diff --git a/application/apps/indexer/stypes/src/attachment/mod.rs b/application/apps/indexer/stypes/src/attachment/mod.rs index eea6c8d4b2..8cbb09d1e6 100644 --- a/application/apps/indexer/stypes/src/attachment/mod.rs +++ b/application/apps/indexer/stypes/src/attachment/mod.rs @@ -1,20 +1,9 @@ -#[cfg(feature = "rustcore")] mod converting; -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; use crate::*; /// Describes the content of attached data found in the `payload` of a `dlt` message. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "attachment.ts") -)] pub struct AttachmentInfo { /// A unique identifier for the attachment. pub uuid: Uuid, @@ -26,23 +15,15 @@ pub struct AttachmentInfo { /// The file extension, if available. pub ext: Option, /// The size of the file in bytes. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] pub size: usize, /// The `mime` type of the file, if it could be determined. pub mime: Option, /// The log entry numbers containing the application data. Note that the application /// data may be contained in a single log entry or split into parts distributed /// across sequential log entries. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number[]"))] pub messages: Vec, } /// A list of attachments. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "attachment.ts") -)] pub struct AttachmentList(pub Vec); diff --git a/application/apps/indexer/stypes/src/attachment/nodejs.rs b/application/apps/indexer/stypes/src/attachment/nodejs.rs deleted file mode 100644 index 798b648753..0000000000 --- a/application/apps/indexer/stypes/src/attachment/nodejs.rs +++ /dev/null @@ -1,4 +0,0 @@ -use crate::*; - -try_into_js!(AttachmentInfo); -try_into_js!(AttachmentList); diff --git a/application/apps/indexer/stypes/src/attachment/proptest.rs b/application/apps/indexer/stypes/src/attachment/proptest.rs deleted file mode 100644 index b22b071d65..0000000000 --- a/application/apps/indexer/stypes/src/attachment/proptest.rs +++ /dev/null @@ -1,65 +0,0 @@ -use crate::*; -use std::path::PathBuf; -use uuid::Uuid; - -/// Implements the `Arbitrary` trait for `AttachmentInfo` to generate random instances -/// for property-based testing using the `proptest` framework. -/// -/// # Details -/// - This implementation generates random values for all fields of `AttachmentInfo`, -/// including: -/// - A randomly generated `Uuid`. -/// - A random `PathBuf` for the file path. -/// - A random `String` for the file name. -/// - An optional random file extension (`Option`). -/// - A random file size (`u32`, converted to `usize`). -/// - An optional random MIME type (`Option`). -/// - A vector of random log entry indices (`Vec`, converted to `Vec`). -impl Arbitrary for AttachmentInfo { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - Just(Uuid::new_v4()), - any::(), - any::(), - any::>(), - any::(), - any::>(), - prop::collection::vec(any::(), 0..10), - ) - .prop_map( - |(uuid, filepath, name, ext, size, mime, messages)| AttachmentInfo { - uuid, - filepath, - name, - ext, - size: size as usize, - mime, - messages: messages.into_iter().map(|p| p as usize).collect(), - }, - ) - .boxed() - } -} - -/// Implements the `Arbitrary` trait for `AttachmentList` to generate random instances -/// for property-based testing using the `proptest` framework. -/// -/// # Details -/// - This implementation generates a vector of random `AttachmentInfo` objects with -/// up to 10 elements, which is then wrapped into an `AttachmentList`. -impl Arbitrary for AttachmentList { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(any::(), 0..10) - .prop_map(AttachmentList) - .boxed() - } -} - -test_msg!(AttachmentInfo, TESTS_USECASE_COUNT); -test_msg!(AttachmentList, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/callback/mod.rs b/application/apps/indexer/stypes/src/callback/mod.rs index 849408ab09..28122b9f8e 100644 --- a/application/apps/indexer/stypes/src/callback/mod.rs +++ b/application/apps/indexer/stypes/src/callback/mod.rs @@ -1,22 +1,10 @@ -#[cfg(feature = "rustcore")] mod extending; -#[cfg(feature = "rustcore")] mod formating; -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; use crate::*; /// Contains the results of an operation. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "callback.ts") -)] pub struct OperationDone { /// The unique identifier of the operation. pub uuid: Uuid, @@ -26,17 +14,10 @@ pub struct OperationDone { /// Represents events sent to the client. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "callback.ts") -)] pub enum CallbackEvent { /// Triggered when the content of the current session is updated. /// - `u64`: The current number of log entries in the stream. /// This can be triggered with `0` when the session is created. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] StreamUpdated(u64), /// Triggered when a file is opened within the session. @@ -48,12 +29,10 @@ pub enum CallbackEvent { /// Triggered when search results are updated. SearchUpdated { /// The number of logs with matches. Can be `0` if the search is reset on the client side. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] found: u64, /// A map of search conditions and their global match counts within the session. /// - `String`: The search condition. /// - `u64`: The count of matches. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "Map"))] stat: HashMap, }, @@ -61,7 +40,6 @@ pub enum CallbackEvent { /// the number of log entries from search results that are available for reading. IndexedMapUpdated { /// The number of log entries from search results available for reading. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] len: u64, }, @@ -73,16 +51,11 @@ pub enum CallbackEvent { /// Triggered when the "value map" is updated. The "value map" is used to build charts /// from search results. Always triggered immediately after `SearchUpdated`. /// - `Option>`: The value map. - #[cfg_attr( - all(test, feature = "test_and_gen"), - ts(type = "Map") - )] SearchValuesUpdated(Option>), /// Triggered whenever a new attachment is detected in the logs. AttachmentsUpdated { /// The size of the attachment in bytes. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] len: u64, /// The description of the attachment. attachment: AttachmentInfo, diff --git a/application/apps/indexer/stypes/src/callback/nodejs.rs b/application/apps/indexer/stypes/src/callback/nodejs.rs deleted file mode 100644 index dc1a1fadc0..0000000000 --- a/application/apps/indexer/stypes/src/callback/nodejs.rs +++ /dev/null @@ -1,4 +0,0 @@ -use crate::*; - -try_into_js!(OperationDone); -try_into_js!(CallbackEvent); diff --git a/application/apps/indexer/stypes/src/callback/proptest.rs b/application/apps/indexer/stypes/src/callback/proptest.rs deleted file mode 100644 index 6d8d70b8c5..0000000000 --- a/application/apps/indexer/stypes/src/callback/proptest.rs +++ /dev/null @@ -1,85 +0,0 @@ -use crate::*; -use uuid::Uuid; - -impl Arbitrary for OperationDone { - /// Implements the `Arbitrary` trait for `OperationDone` to generate random instances - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// - Randomly generates a `Uuid` for the `uuid` field. - /// - Optionally generates a random `String` for the `result` field. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (Just(Uuid::new_v4()), any::>>()) - .prop_map(|(uuid, result)| OperationDone { uuid, result }) - .boxed() - } -} - -impl Arbitrary for CallbackEvent { - /// Implements the `Arbitrary` trait for `CallbackEvent` to generate random instances - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// This implementation supports the generation of all variants of `CallbackEvent`, - /// including: - /// - `StreamUpdated` with a random `u64` value. - /// - `FileRead` as a predefined constant. - /// - `SearchUpdated` with random values for `found` and a map of search conditions. - /// - `IndexedMapUpdated` with a random `u64` length. - /// - `SearchMapUpdated` with an optional `FilterMatchList`. - /// - `SearchValuesUpdated` with a map of random values, converting `f32` to `f64`. - /// - `AttachmentsUpdated` with random attachment information. - /// - `Progress` with a random `Uuid` and `Progress` instance. - /// - `SessionError` with a random `NativeError`. - /// - `OperationError` with random `Uuid` and `NativeError`. - /// - `OperationStarted` with a random `Uuid`. - /// - `OperationProcessing` with a random `Uuid`. - /// - `OperationDone` with a random `OperationDone` instance. - /// - `SessionDestroyed` as a predefined constant. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(|n| CallbackEvent::StreamUpdated(n as u64)), - Just(CallbackEvent::FileRead), - (any::(), any::>(),).prop_map(|(found, stat)| { - CallbackEvent::SearchUpdated { - found: found as u64, - stat: stat.into_iter().map(|(k, v)| (k, v as u64)).collect(), - } - }), - any::().prop_map(|len| CallbackEvent::IndexedMapUpdated { len: len as u64 }), - any::>().prop_map(CallbackEvent::SearchMapUpdated), - any::>>().prop_map(|ev| { - CallbackEvent::SearchValuesUpdated(ev.map(|ev| { - ev.into_iter() - .map(|(k, (l, r))| (k, (l as f64, r as f64))) - .collect() - })) - }), - (any::(), any::(),).prop_map(|(len, attachment)| { - CallbackEvent::AttachmentsUpdated { - len: len as u64, - attachment, - } - }), - (Just(Uuid::new_v4()), any::(),) - .prop_map(|(uuid, progress)| CallbackEvent::Progress { uuid, progress }), - any::().prop_map(CallbackEvent::SessionError), - (Just(Uuid::new_v4()), any::(),) - .prop_map(|(uuid, error)| CallbackEvent::OperationError { uuid, error }), - Just(Uuid::new_v4()).prop_map(CallbackEvent::OperationStarted), - Just(Uuid::new_v4()).prop_map(CallbackEvent::OperationProcessing), - any::().prop_map(CallbackEvent::OperationDone), - Just(CallbackEvent::SessionDestroyed), - ] - .boxed() - } -} - -test_msg!(OperationDone, TESTS_USECASE_COUNT); -test_msg!(CallbackEvent, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/command/dltstat/mod.rs b/application/apps/indexer/stypes/src/command/dltstat/mod.rs index 2caf117dc8..6e693d8941 100644 --- a/application/apps/indexer/stypes/src/command/dltstat/mod.rs +++ b/application/apps/indexer/stypes/src/command/dltstat/mod.rs @@ -1,19 +1,8 @@ -#[cfg(feature = "rustcore")] mod converting; -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; use crate::*; #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] pub struct DltLevelDistribution { pub non_log: usize, pub log_fatal: usize, @@ -26,12 +15,6 @@ pub struct DltLevelDistribution { } #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] pub struct DltStatisticInfo { pub app_ids: Vec<(String, DltLevelDistribution)>, pub context_ids: Vec<(String, DltLevelDistribution)>, diff --git a/application/apps/indexer/stypes/src/command/dltstat/nodejs.rs b/application/apps/indexer/stypes/src/command/dltstat/nodejs.rs deleted file mode 100644 index e3ee5c08ed..0000000000 --- a/application/apps/indexer/stypes/src/command/dltstat/nodejs.rs +++ /dev/null @@ -1,4 +0,0 @@ -use crate::*; - -try_into_js!(DltLevelDistribution); -try_into_js!(DltStatisticInfo); diff --git a/application/apps/indexer/stypes/src/command/dltstat/proptest.rs b/application/apps/indexer/stypes/src/command/dltstat/proptest.rs deleted file mode 100644 index 00d2f3f47a..0000000000 --- a/application/apps/indexer/stypes/src/command/dltstat/proptest.rs +++ /dev/null @@ -1,67 +0,0 @@ -use crate::*; - -impl Arbitrary for DltLevelDistribution { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::(), - any::(), - any::(), - any::(), - any::(), - any::(), - any::(), - any::(), - ) - .prop_map( - |( - non_log, - log_fatal, - log_error, - log_warning, - log_info, - log_debug, - log_verbose, - log_invalid, - )| DltLevelDistribution { - non_log: non_log as usize, - log_fatal: log_fatal as usize, - log_error: log_error as usize, - log_warning: log_warning as usize, - log_info: log_info as usize, - log_debug: log_debug as usize, - log_verbose: log_verbose as usize, - log_invalid: log_invalid as usize, - }, - ) - .boxed() - } -} - -impl Arbitrary for DltStatisticInfo { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - prop::collection::vec(any::<(String, DltLevelDistribution)>(), 0..10), - prop::collection::vec(any::<(String, DltLevelDistribution)>(), 0..10), - prop::collection::vec(any::<(String, DltLevelDistribution)>(), 0..10), - any::(), - ) - .prop_map( - |(app_ids, context_ids, ecu_ids, contained_non_verbose)| DltStatisticInfo { - contained_non_verbose, - context_ids, - app_ids, - ecu_ids, - }, - ) - .boxed() - } -} - -test_msg!(DltLevelDistribution, TESTS_USECASE_COUNT); -test_msg!(DltStatisticInfo, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/command/folders/mod.rs b/application/apps/indexer/stypes/src/command/folders/mod.rs index 175f3d3c2c..50c2b27dfd 100644 --- a/application/apps/indexer/stypes/src/command/folders/mod.rs +++ b/application/apps/indexer/stypes/src/command/folders/mod.rs @@ -1,21 +1,10 @@ -#[cfg(feature = "rustcore")] mod extending; -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; use crate::*; /// Represents the type of a folder entity in the file system. #[allow(clippy::upper_case_acronyms)] #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] pub enum FolderEntityType { /// A block device (e.g., a disk or partition). BlockDevice, @@ -35,12 +24,6 @@ pub enum FolderEntityType { /// Contains detailed information about a folder entity. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] pub struct FolderEntityDetails { /// The name of the file or folder. filename: String, @@ -56,12 +39,6 @@ pub struct FolderEntityDetails { /// Represents the result of scanning a folder. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] pub struct FoldersScanningResult { /// A list of folder entities found during the scan. pub list: Vec, @@ -71,12 +48,6 @@ pub struct FoldersScanningResult { /// Represents a folder entity in the file system. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] pub struct FolderEntity { /// The name of the entity (file or folder). name: String, diff --git a/application/apps/indexer/stypes/src/command/folders/nodejs.rs b/application/apps/indexer/stypes/src/command/folders/nodejs.rs deleted file mode 100644 index d001336a20..0000000000 --- a/application/apps/indexer/stypes/src/command/folders/nodejs.rs +++ /dev/null @@ -1,6 +0,0 @@ -use crate::*; - -try_into_js!(FolderEntityType); -try_into_js!(FolderEntityDetails); -try_into_js!(FoldersScanningResult); -try_into_js!(FolderEntity); diff --git a/application/apps/indexer/stypes/src/command/folders/proptest.rs b/application/apps/indexer/stypes/src/command/folders/proptest.rs deleted file mode 100644 index 1b29abf005..0000000000 --- a/application/apps/indexer/stypes/src/command/folders/proptest.rs +++ /dev/null @@ -1,124 +0,0 @@ -use crate::*; - -impl Arbitrary for FolderEntityType { - /// Implements the `Arbitrary` trait for `FolderEntityType` to generate random variants - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// This implementation generates random variants of `FolderEntityType`, including: - /// - `BlockDevice` - /// - `CharacterDevice` - /// - `Directory` - /// - `FIFO` - /// - `File` - /// - `Socket` - /// - `SymbolicLink` - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - Just(FolderEntityType::BlockDevice), - Just(FolderEntityType::CharacterDevice), - Just(FolderEntityType::Directory), - Just(FolderEntityType::FIFO), - Just(FolderEntityType::File), - Just(FolderEntityType::Socket), - Just(FolderEntityType::SymbolicLink), - ] - .boxed() - } -} - -impl Arbitrary for FolderEntityDetails { - /// Implements the `Arbitrary` trait for `FolderEntityDetails` to generate random instances - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// Generates random values for all fields: - /// - `filename`: A random `String`. - /// - `full`: A random `String`. - /// - `path`: A random `String`. - /// - `basename`: A random `String`. - /// - `ext`: A random `String`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::(), - any::(), - any::(), - any::(), - any::(), - ) - .prop_map( - |(filename, full, path, basename, ext)| FolderEntityDetails { - filename, - full, - path, - basename, - ext, - }, - ) - .boxed() - } -} - -impl Arbitrary for FolderEntity { - /// Implements the `Arbitrary` trait for `FolderEntity` to generate random instances - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// Generates random values for all fields: - /// - `name`: A random `String`. - /// - `fullname`: A random `String`. - /// - `kind`: A random `FolderEntityType`. - /// - `details`: An optional random `FolderEntityDetails`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::(), - any::(), - any::(), - any::>(), - ) - .prop_map(|(name, fullname, kind, details)| FolderEntity { - name, - fullname, - kind, - details, - }) - .boxed() - } -} - -impl Arbitrary for FoldersScanningResult { - /// Implements the `Arbitrary` trait for `FoldersScanningResult` to generate random instances - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// - Generates a random list of up to 10 `FolderEntity` instances. - /// - Generates a random `bool` to indicate whether the maximum length was reached. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - prop::collection::vec(any::(), 0..10), - any::(), - ) - .prop_map(|(list, max_len_reached)| FoldersScanningResult { - list, - max_len_reached, - }) - .boxed() - } -} - -test_msg!(FolderEntityType, TESTS_USECASE_COUNT); -test_msg!(FolderEntityDetails, TESTS_USECASE_COUNT); -test_msg!(FoldersScanningResult, TESTS_USECASE_COUNT); -test_msg!(FolderEntity, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/command/mod.rs b/application/apps/indexer/stypes/src/command/mod.rs index 8ebea6102d..eb058a5993 100644 --- a/application/apps/indexer/stypes/src/command/mod.rs +++ b/application/apps/indexer/stypes/src/command/mod.rs @@ -1,11 +1,4 @@ -#[cfg(feature = "rustcore")] mod extending; -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; -#[cfg(test)] -mod ts; mod dltstat; mod folders; @@ -24,7 +17,6 @@ use crate::*; /// It is only used to indicate the successful completion or interruption of a command. #[derive(Clone, Serialize, Deserialize, Debug)] #[serde(bound(deserialize = "T: DeserializeOwned"))] -#[extend::encode_decode] pub enum CommandOutcome { /// Indicates that the command was successfully completed. Finished(T), diff --git a/application/apps/indexer/stypes/src/command/nodejs.rs b/application/apps/indexer/stypes/src/command/nodejs.rs deleted file mode 100644 index a56f0b30e4..0000000000 --- a/application/apps/indexer/stypes/src/command/nodejs.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::*; - -try_into_js!(CommandOutcome); -try_into_js!(CommandOutcome); -try_into_js!(CommandOutcome); -try_into_js!(CommandOutcome); -try_into_js!(CommandOutcome); -try_into_js!(CommandOutcome<()>); -try_into_js!(CommandOutcome); -try_into_js!(CommandOutcome>); -try_into_js!(CommandOutcome); -try_into_js!(CommandOutcome); -try_into_js!(CommandOutcome); -try_into_js!(CommandOutcome); -try_into_js!(CommandOutcome); -try_into_js!(CommandOutcome>); -try_into_js!(CommandOutcome>); -try_into_js!(CommandOutcome>); diff --git a/application/apps/indexer/stypes/src/command/profiles/converting.rs b/application/apps/indexer/stypes/src/command/profiles/converting.rs deleted file mode 100644 index 43f35105a3..0000000000 --- a/application/apps/indexer/stypes/src/command/profiles/converting.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::*; - -/// Converts a `envvars::Profile` into an `Profile`. -impl From for Profile { - fn from(pro: envvars::Profile) -> Self { - Profile { - name: pro.name, - path: pro.path, - envvars: pro.envvars, - symlink: pro.symlink, - } - } -} diff --git a/application/apps/indexer/stypes/src/command/profiles/mod.rs b/application/apps/indexer/stypes/src/command/profiles/mod.rs index cdd75a3f0c..4eb77f0b84 100644 --- a/application/apps/indexer/stypes/src/command/profiles/mod.rs +++ b/application/apps/indexer/stypes/src/command/profiles/mod.rs @@ -1,20 +1,9 @@ -#[cfg(feature = "rustcore")] mod extending; -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; use crate::*; /// Represents most well known shells that are not used by default on OS. #[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] pub enum ShellType { Bash, Zsh, @@ -26,12 +15,6 @@ pub enum ShellType { } #[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] pub struct ShellProfile { pub shell: ShellType, /// Path to executable file of shell @@ -43,10 +26,4 @@ pub struct ShellProfile { /// This structure contains a vector of strings, where each string represents the name /// or identifier of a serial port available on the system. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] pub struct ProfileList(pub Vec); diff --git a/application/apps/indexer/stypes/src/command/profiles/nodejs.rs b/application/apps/indexer/stypes/src/command/profiles/nodejs.rs deleted file mode 100644 index e1e00f92e5..0000000000 --- a/application/apps/indexer/stypes/src/command/profiles/nodejs.rs +++ /dev/null @@ -1,5 +0,0 @@ -use crate::*; - -try_into_js!(ShellType); -try_into_js!(ShellProfile); -try_into_js!(ProfileList); diff --git a/application/apps/indexer/stypes/src/command/profiles/proptest.rs b/application/apps/indexer/stypes/src/command/profiles/proptest.rs deleted file mode 100644 index b7642073d3..0000000000 --- a/application/apps/indexer/stypes/src/command/profiles/proptest.rs +++ /dev/null @@ -1,54 +0,0 @@ -use crate::*; - -impl Arbitrary for ShellType { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - // Reminder to add new fields here. - match Self::Bash { - ShellType::Bash => {} - ShellType::Zsh => {} - ShellType::Fish => {} - ShellType::NuShell => {} - ShellType::Elvish => {} - ShellType::Pwsh => {} - }; - - prop_oneof![ - Just(Self::Bash), - Just(Self::Zsh), - Just(Self::Fish), - Just(Self::NuShell), - Just(Self::Elvish), - Just(Self::Pwsh) - ] - .boxed() - } -} - -impl Arbitrary for ShellProfile { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), any::()) - .prop_map(|(shell, path)| ShellProfile { shell, path }) - .boxed() - } -} - -impl Arbitrary for ProfileList { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(ShellProfile::arbitrary(), 0..10) - .prop_map(ProfileList) - .boxed() - } -} - -test_msg!(ShellType, TESTS_USECASE_COUNT); -test_msg!(ShellProfile, TESTS_USECASE_COUNT); -test_msg!(ProfileList, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/command/proptest.rs b/application/apps/indexer/stypes/src/command/proptest.rs deleted file mode 100644 index c636c4450a..0000000000 --- a/application/apps/indexer/stypes/src/command/proptest.rs +++ /dev/null @@ -1,195 +0,0 @@ -use crate::*; - -impl Arbitrary for CommandOutcome { - /// Implements the `Arbitrary` trait for `CommandOutcome` to generate random instances - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// - Generates either: - /// - `CommandOutcome::Finished` with a random `String`. - /// - `CommandOutcome::Cancelled`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(CommandOutcome::Finished), - Just(CommandOutcome::Cancelled), - ] - .boxed() - } -} - -impl Arbitrary for CommandOutcome { - /// Implements the `Arbitrary` trait for `CommandOutcome` to generate random instances. - /// - /// # Details - /// - Generates either: - /// - `CommandOutcome::Finished` with a random `FoldersScanningResult`. - /// - `CommandOutcome::Cancelled`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(CommandOutcome::Finished), - Just(CommandOutcome::Cancelled), - ] - .boxed() - } -} - -impl Arbitrary for CommandOutcome { - /// Implements the `Arbitrary` trait for `CommandOutcome` to generate random instances. - /// - /// # Details - /// - Generates either: - /// - `CommandOutcome::Finished` with a random `SerialPortsList`. - /// - `CommandOutcome::Cancelled`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(CommandOutcome::Finished), - Just(CommandOutcome::Cancelled), - ] - .boxed() - } -} - -impl Arbitrary for CommandOutcome { - /// Implements the `Arbitrary` trait for `CommandOutcome` to generate random instances. - /// - /// # Details - /// - Generates either: - /// - `CommandOutcome::Finished` with a random `ProfileList`. - /// - `CommandOutcome::Cancelled`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(CommandOutcome::Finished), - Just(CommandOutcome::Cancelled), - ] - .boxed() - } -} - -impl Arbitrary for CommandOutcome { - /// Implements the `Arbitrary` trait for `CommandOutcome` to generate random instances. - /// - /// # Details - /// - Generates either: - /// - `CommandOutcome::Finished` with a random `DltStatisticInfo`. - /// - `CommandOutcome::Cancelled`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(CommandOutcome::Finished), - Just(CommandOutcome::Cancelled), - ] - .boxed() - } -} -impl Arbitrary for CommandOutcome<()> { - /// Implements the `Arbitrary` trait for `CommandOutcome<()>` to generate random instances. - /// - /// # Details - /// - Generates either: - /// - `CommandOutcome::Finished` with `()`. - /// - `CommandOutcome::Cancelled`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - Just(()).prop_map(CommandOutcome::Finished), - Just(CommandOutcome::Cancelled), - ] - .boxed() - } -} - -impl Arbitrary for CommandOutcome { - /// Implements the `Arbitrary` trait for `CommandOutcome` to generate random instances. - /// - /// # Details - /// - Generates either: - /// - `CommandOutcome::Finished` with a random `i64` value converted from `i32`. - /// - `CommandOutcome::Cancelled`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(|v| CommandOutcome::Finished(v as i64)), - Just(CommandOutcome::Cancelled), - ] - .boxed() - } -} - -impl Arbitrary for CommandOutcome> { - /// Implements the `Arbitrary` trait for `CommandOutcome>` to generate random instances. - /// - /// # Details - /// - Generates either: - /// - `CommandOutcome::Finished` with a random `Option`. - /// - `CommandOutcome::Cancelled`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::>().prop_map(CommandOutcome::Finished), - Just(CommandOutcome::Cancelled), - ] - .boxed() - } -} - -impl Arbitrary for CommandOutcome { - /// Implements the `Arbitrary` trait for `CommandOutcome` to generate random instances. - /// - /// # Details - /// - Generates either: - /// - `CommandOutcome::Finished` with a random `bool`. - /// - `CommandOutcome::Cancelled`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(CommandOutcome::Finished), - Just(CommandOutcome::Cancelled), - ] - .boxed() - } -} - -impl Arbitrary for CommandOutcome { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(CommandOutcome::Finished), - Just(CommandOutcome::Cancelled), - ] - .boxed() - } -} - -test_msg!(CommandOutcome<()>, TESTS_USECASE_COUNT); -test_msg!(CommandOutcome, TESTS_USECASE_COUNT); -test_msg!(CommandOutcome>, TESTS_USECASE_COUNT); -test_msg!(CommandOutcome, TESTS_USECASE_COUNT); -test_msg!(CommandOutcome, TESTS_USECASE_COUNT); -test_msg!(CommandOutcome, TESTS_USECASE_COUNT); -test_msg!(CommandOutcome, TESTS_USECASE_COUNT); -test_msg!(CommandOutcome, TESTS_USECASE_COUNT); -test_msg!(CommandOutcome, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/command/serial/mod.rs b/application/apps/indexer/stypes/src/command/serial/mod.rs index 69f3755b58..1e98012697 100644 --- a/application/apps/indexer/stypes/src/command/serial/mod.rs +++ b/application/apps/indexer/stypes/src/command/serial/mod.rs @@ -1,6 +1,3 @@ -#[cfg(test)] -mod proptest; - use crate::*; /// Represents a list of serial ports. @@ -8,10 +5,4 @@ use crate::*; /// This structure contains a vector of strings, where each string represents the name /// or identifier of a serial port available on the system. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] pub struct SerialPortsList(pub Vec); diff --git a/application/apps/indexer/stypes/src/command/serial/proptest.rs b/application/apps/indexer/stypes/src/command/serial/proptest.rs deleted file mode 100644 index 8183b7a917..0000000000 --- a/application/apps/indexer/stypes/src/command/serial/proptest.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::*; - -impl Arbitrary for SerialPortsList { - /// Implements the `Arbitrary` trait for `SerialPortsList` to generate random instances - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// - Generates a vector of up to 10 random `String` values, where each string represents - /// the name or identifier of a serial port. - /// - Wraps the generated vector into a `SerialPortsList`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(any::(), 0..10) - .prop_map(SerialPortsList) - .boxed() - } -} - -test_msg!(SerialPortsList, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/command/ts.rs b/application/apps/indexer/stypes/src/command/ts.rs deleted file mode 100644 index cb57492931..0000000000 --- a/application/apps/indexer/stypes/src/command/ts.rs +++ /dev/null @@ -1,146 +0,0 @@ -use crate::*; - -/// Represents the result of a command execution. -/// At the core level, this type is used for all commands invoked within an `UnboundSession`. -/// It is only used to indicate the successful completion or interruption of a command. -#[derive(Clone, Serialize, Deserialize, Debug)] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] -pub enum CommandOutcomeDltStatisticInfoResult { - /// Indicates that the command was successfully completed. - Finished(DltStatisticInfo), - /// Indicates that the command execution was interrupted. - Cancelled, -} - -/// Represents the result of a command execution. -/// At the core level, this type is used for all commands invoked within an `UnboundSession`. -/// It is only used to indicate the successful completion or interruption of a command. -#[derive(Clone, Serialize, Deserialize, Debug)] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] -pub enum CommandOutcomeProfilesResult { - /// Indicates that the command was successfully completed. - Finished(ProfileList), - /// Indicates that the command execution was interrupted. - Cancelled, -} - -/// Represents the result of a command execution. -/// At the core level, this type is used for all commands invoked within an `UnboundSession`. -/// It is only used to indicate the successful completion or interruption of a command. -#[derive(Clone, Serialize, Deserialize, Debug)] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] -pub enum CommandOutcomeFoldersScanningResult { - /// Indicates that the command was successfully completed. - Finished(FoldersScanningResult), - /// Indicates that the command execution was interrupted. - Cancelled, -} - -/// Represents the result of a command execution. -/// At the core level, this type is used for all commands invoked within an `UnboundSession`. -/// It is only used to indicate the successful completion or interruption of a command. -#[derive(Clone, Serialize, Deserialize, Debug)] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] -pub enum CommandOutcomeSerialPortsList { - /// Indicates that the command was successfully completed. - Finished(SerialPortsList), - /// Indicates that the command execution was interrupted. - Cancelled, -} - -/// Represents the result of a command execution. -/// At the core level, this type is used for all commands invoked within an `UnboundSession`. -/// It is only used to indicate the successful completion or interruption of a command. -#[derive(Clone, Serialize, Deserialize, Debug)] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] -pub enum CommandOutcomeVoid { - /// Indicates that the command was successfully completed. - Finished, - /// Indicates that the command execution was interrupted. - Cancelled, -} - -/// Represents the result of a command execution. -/// At the core level, this type is used for all commands invoked within an `UnboundSession`. -/// It is only used to indicate the successful completion or interruption of a command. -#[derive(Clone, Serialize, Deserialize, Debug)] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] -pub enum CommandOutcomei64 { - /// Indicates that the command was successfully completed. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] - Finished(i64), - /// Indicates that the command execution was interrupted. - Cancelled, -} - -/// Represents the result of a command execution. -/// At the core level, this type is used for all commands invoked within an `UnboundSession`. -/// It is only used to indicate the successful completion or interruption of a command. -#[derive(Clone, Serialize, Deserialize, Debug)] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] -pub enum CommandOutcomeOptionalString { - /// Indicates that the command was successfully completed. - Finished(Option), - /// Indicates that the command execution was interrupted. - Cancelled, -} - -/// Represents the result of a command execution. -/// At the core level, this type is used for all commands invoked within an `UnboundSession`. -/// It is only used to indicate the successful completion or interruption of a command. -#[derive(Clone, Serialize, Deserialize, Debug)] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] -pub enum CommandOutcomeString { - /// Indicates that the command was successfully completed. - Finished(String), - /// Indicates that the command execution was interrupted. - Cancelled, -} - -/// Represents the result of a command execution. -/// At the core level, this type is used for all commands invoked within an `UnboundSession`. -/// It is only used to indicate the successful completion or interruption of a command. -#[derive(Clone, Serialize, Deserialize, Debug)] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "command.ts") -)] -pub enum CommandOutcomeBool { - /// Indicates that the command was successfully completed. - Finished(bool), - /// Indicates that the command execution was interrupted. - Cancelled, -} diff --git a/application/apps/indexer/stypes/src/error/mod.rs b/application/apps/indexer/stypes/src/error/mod.rs index 8a2eaa255a..9751d4a17e 100644 --- a/application/apps/indexer/stypes/src/error/mod.rs +++ b/application/apps/indexer/stypes/src/error/mod.rs @@ -1,12 +1,6 @@ -#[cfg(feature = "rustcore")] mod converting; -#[cfg(feature = "rustcore")] mod extending; mod formating; -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; use crate::*; use thiserror::Error; @@ -14,12 +8,6 @@ use thiserror::Error; /// Indicates the severity level of an error. #[allow(clippy::upper_case_acronyms)] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "error.ts") -)] pub enum Severity { /// Warning level, indicates a recoverable issue. WARNING, @@ -29,12 +17,6 @@ pub enum Severity { /// Defines the source or type of an error. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "error.ts") -)] pub enum NativeErrorKind { /// The file was not found. FileNotFound, @@ -63,12 +45,6 @@ pub enum NativeErrorKind { /// Describes the details of an error. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "error.ts") -)] pub struct NativeError { /// The severity level of the error. pub severity: Severity, @@ -80,12 +56,6 @@ pub struct NativeError { /// Describes the type and details of an error. #[derive(Error, Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "error.ts") -)] pub enum ComputationError { /// The destination path must be defined to stream from `MessageProducer`. #[error("Destination path should be defined to stream from MessageProducer")] diff --git a/application/apps/indexer/stypes/src/error/nodejs.rs b/application/apps/indexer/stypes/src/error/nodejs.rs deleted file mode 100644 index 75dd572ab8..0000000000 --- a/application/apps/indexer/stypes/src/error/nodejs.rs +++ /dev/null @@ -1,6 +0,0 @@ -use crate::*; - -try_into_js!(Severity); -try_into_js!(NativeErrorKind); -try_into_js!(NativeError); -try_into_js!(ComputationError); diff --git a/application/apps/indexer/stypes/src/error/proptest.rs b/application/apps/indexer/stypes/src/error/proptest.rs deleted file mode 100644 index aef7315841..0000000000 --- a/application/apps/indexer/stypes/src/error/proptest.rs +++ /dev/null @@ -1,128 +0,0 @@ -use crate::*; -// Arbitrary implementations for Severity, NativeErrorKind, NativeError, and ComputationError. - -impl Arbitrary for Severity { - /// Implements the `Arbitrary` trait for `Severity` to generate random values - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// - Generates random variants of `Severity`: - /// - `Severity::WARNING` - /// - `Severity::ERROR` - type Parameters = (); - - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![Just(Severity::WARNING), Just(Severity::ERROR)].boxed() - } -} - -impl Arbitrary for NativeErrorKind { - /// Implements the `Arbitrary` trait for `NativeErrorKind` to generate random values - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// - Generates random variants of `NativeErrorKind`, including: - /// - `FileNotFound` - /// - `UnsupportedFileType` - /// - `ComputationFailed` - /// - `Configuration` - /// - `Interrupted` - /// - `OperationSearch` - /// - `NotYetImplemented` - /// - `ChannelError` - /// - `Io` - /// - `Grabber` - /// - `Plugins` - type Parameters = (); - - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - Just(NativeErrorKind::FileNotFound), - Just(NativeErrorKind::UnsupportedFileType), - Just(NativeErrorKind::ComputationFailed), - Just(NativeErrorKind::Configuration), - Just(NativeErrorKind::Interrupted), - Just(NativeErrorKind::OperationSearch), - Just(NativeErrorKind::NotYetImplemented), - Just(NativeErrorKind::ChannelError), - Just(NativeErrorKind::Io), - Just(NativeErrorKind::Grabber), - Just(NativeErrorKind::Plugins) - ] - .boxed() - } -} - -impl Arbitrary for NativeError { - /// Implements the `Arbitrary` trait for `NativeError` to generate random values - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// - Generates: - /// - A random `Severity` value. - /// - A random `NativeErrorKind` value. - /// - An optional random `String` for the message. - type Parameters = (); - - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - Severity::arbitrary().boxed(), - NativeErrorKind::arbitrary().boxed(), - prop::option::of(any::()), - ) - .prop_map(|(severity, kind, message)| NativeError { - severity, - kind, - message, - }) - .boxed() - } -} - -impl Arbitrary for ComputationError { - /// Implements the `Arbitrary` trait for `ComputationError` to generate random values - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// - Generates random variants of `ComputationError`, including: - /// - Fixed errors such as `DestinationPath`, `SessionCreatingFail`, etc. - /// - Errors with random `String` values for fields like `Communication`, `IoOperation`, etc. - /// - Nested errors, such as `NativeError`. - type Parameters = (); - - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - Just(ComputationError::DestinationPath), - Just(ComputationError::SessionCreatingFail), - any::().prop_map(ComputationError::Communication), - any::().prop_map(ComputationError::OperationNotSupported), - any::().prop_map(ComputationError::IoOperation), - Just(ComputationError::InvalidData), - any::().prop_map(ComputationError::InvalidArgs), - any::().prop_map(ComputationError::Process), - any::().prop_map(ComputationError::Protocol), - any::().prop_map(ComputationError::SearchError), - Just(ComputationError::MultipleInitCall), - Just(ComputationError::SessionUnavailable), - NativeError::arbitrary().prop_map(ComputationError::NativeError), - any::().prop_map(ComputationError::Grabbing), - any::().prop_map(ComputationError::Sde), - any::().prop_map(ComputationError::Decoding), - any::().prop_map(ComputationError::Encoding), - ] - .boxed() - } -} - -test_msg!(Severity, TESTS_USECASE_COUNT); -test_msg!(NativeErrorKind, TESTS_USECASE_COUNT); -test_msg!(NativeError, TESTS_USECASE_COUNT); -test_msg!(ComputationError, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/lf_transition/mod.rs b/application/apps/indexer/stypes/src/lf_transition/mod.rs index 4b76047ce3..8d198d895d 100644 --- a/application/apps/indexer/stypes/src/lf_transition/mod.rs +++ b/application/apps/indexer/stypes/src/lf_transition/mod.rs @@ -1,20 +1,9 @@ -#[cfg(feature = "rustcore")] mod extending; -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; use crate::*; /// Describes the progress of an operation. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "lf_transition.ts") -)] pub enum LifecycleTransition { /// The operation has started. Started { diff --git a/application/apps/indexer/stypes/src/lf_transition/nodejs.rs b/application/apps/indexer/stypes/src/lf_transition/nodejs.rs deleted file mode 100644 index f837b321e8..0000000000 --- a/application/apps/indexer/stypes/src/lf_transition/nodejs.rs +++ /dev/null @@ -1,3 +0,0 @@ -use crate::*; - -try_into_js!(LifecycleTransition); diff --git a/application/apps/indexer/stypes/src/lf_transition/proptest.rs b/application/apps/indexer/stypes/src/lf_transition/proptest.rs deleted file mode 100644 index e58797c3c0..0000000000 --- a/application/apps/indexer/stypes/src/lf_transition/proptest.rs +++ /dev/null @@ -1,28 +0,0 @@ -use crate::*; -use uuid::Uuid; - -impl Arbitrary for LifecycleTransition { - /// Implements the `Arbitrary` trait for `LifecycleTransition` to generate random values - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// - Randomly generates one of the `LifecycleTransition` variants: - /// - `Started`: Generates a random `Uuid` and a random alias (`String`). - /// - `Ticks`: Generates a random `Uuid` and a random `Ticks` value. - /// - `Stopped`: Generates a random `Uuid`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - (Just(Uuid::new_v4()), any::()) - .prop_map(|(uuid, alias)| LifecycleTransition::Started { uuid, alias }), - (Just(Uuid::new_v4()), any::()) - .prop_map(|(uuid, ticks)| LifecycleTransition::Ticks { uuid, ticks }), - Just(Uuid::new_v4()).prop_map(LifecycleTransition::Stopped), - ] - .boxed() - } -} - -test_msg!(LifecycleTransition, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/lib.rs b/application/apps/indexer/stypes/src/lib.rs index eec6a7fd06..fc2c4f1498 100644 --- a/application/apps/indexer/stypes/src/lib.rs +++ b/application/apps/indexer/stypes/src/lib.rs @@ -1,96 +1,4 @@ -/// The `stypes` crate provides data types used at the `rustcore` level and passed to clients. -/// While the `stypes` crate does not impose restrictions on the client type, some features are -/// specifically defined to support certain types of clients. This does not mean that `stypes` cannot -/// be used with other client types. -/// -/// ## Features -/// - `nodejs`: Includes the implementation of the `TryIntoJs` trait, required for transferring data -/// into the Node.js context when using the `node_bindgen` crate. -/// - `rustcore`: Includes additional utilities and extensions for using `stypes` within the -/// `indexer` crate group. -/// -/// ## Proptest Integration -/// The crate includes tests based on `proptest`. These tests not only validate the crate itself -/// but also generate binary files containing variations of each message in a predefined directory. -/// These files can later be used to test encoding/decoding on the client side. -/// -/// The `test_msg` macro is used to generate tests for specific data types. For example: -/// -/// ```ignore -/// test_msg!(ObserveOptions, 100); -/// ``` -/// -/// The above code generates 100 variations of `ObserveOptions`. During tests, the generated data -/// is saved to files in the specified path. To set the output path, use the `CHIPMUNK_PROTOCOL_TEST_OUTPUT` -/// environment variable: -/// -/// ```ignore -/// export CHIPMUNK_PROTOCOL_TEST_OUTPUT="/tmp/test_data" -/// cargo test --release -- --nocapture -/// ``` -/// -/// If `CHIPMUNK_PROTOCOL_TEST_OUTPUT` is not set, the default path `$TMP/stypes_test` will be used. -/// It is recommended to run tests with the `--release` flag to speed up random variation generation, -/// as the process is significantly slower in debug mode. -/// -/// Each data type will have its own directory, and each variation will be stored in files with -/// sequential names (`1.bin`, `2.bin`, etc.). -/// -/// ## WARNING -/// When tests are run, the folder specified in `CHIPMUNK_PROTOCOL_TEST_OUTPUT` is completely deleted. -/// Be extremely cautious when setting the value of this environment variable. -/// -/// ## Limitations -/// The current version of `stypes` uses `bincode` for encoding and decoding types. `bincode` requires -/// both serialization and deserialization implementations. However, using custom `serde` attributes -/// may lead to protocol instability, especially during decoding. For instance, the attribute -/// `#[serde(tag = "type", content = "value")]` makes decoding messages with these settings impossible. -/// Unfortunately, `bincode` does not raise compile-time or serialization-time errors, but only fails -/// during decoding. Therefore, it is strongly recommended to test encoding/decoding when using additional -/// attributes on types. -/// -/// ## Implementation of `encode` and `decode` Methods -/// The `encode` and `decode` methods are added to each declared data type using the `encode_decode` -/// macro from the `extend` crate. This macro implements encoding and decoding for the data type -/// using `bincode`. -/// -/// For example, the following code: -/// -/// ```ignore -/// #[derive(Debug, Serialize, Deserialize, Clone)] -/// #[extend::encode_decode] -/// pub struct Notification { -/// pub severity: Severity, -/// pub content: String, -/// pub line: Option, -/// } -/// ``` -/// -/// Is transformed into: -/// -/// ```ignore -/// #[derive(Debug, Serialize, Deserialize, Clone)] -/// pub struct Notification { -/// pub severity: Severity, -/// pub content: String, -/// pub line: Option, -/// } -/// -/// impl Notification { -/// pub fn encode(&self) -> Result, String> { -/// bincode::serialize(self).map_err(|e| e.to_string()) -/// } -/// -/// pub fn decode(buf: &[u8]) -> Result { -/// bincode::deserialize(buf).map_err(|e| e.to_string()) -/// } -/// } -/// ``` -#[cfg(test)] -mod tests; - -#[cfg(feature = "nodejs")] -mod nodejs; +//! Shared Rust data types used by the indexer core and native UI. mod attachment; mod callback; @@ -116,22 +24,4 @@ pub use progress::*; pub(crate) use serde::{Deserialize, Serialize, de::DeserializeOwned}; pub(crate) use std::{collections::HashMap, path::PathBuf}; -#[cfg(all(test, feature = "test_and_gen"))] -pub(crate) use ts_rs::TS; pub(crate) use uuid::Uuid; - -#[cfg(feature = "nodejs")] -pub(crate) use node_bindgen::{ - core::{NjError, TryIntoJs, safebuffer::SafeArrayBuffer, val::JsEnv}, - sys::napi_value, -}; - -#[cfg(test)] -pub(crate) use proptest::prelude::*; -#[cfg(all(test, feature = "test_and_gen"))] -pub(crate) use tests::*; - -#[cfg(feature = "rustcore")] -pub fn serialize(v: &T) -> Result, bincode::Error> { - bincode::serialize(v) -} diff --git a/application/apps/indexer/stypes/src/miscellaneous/mod.rs b/application/apps/indexer/stypes/src/miscellaneous/mod.rs index df677ac90a..0fddeff26f 100644 --- a/application/apps/indexer/stypes/src/miscellaneous/mod.rs +++ b/application/apps/indexer/stypes/src/miscellaneous/mod.rs @@ -1,57 +1,25 @@ -#[cfg(feature = "rustcore")] mod converting; -#[cfg(feature = "rustcore")] mod extending; -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; use crate::*; #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "miscellaneous.ts") -)] pub struct MapKeyValue(pub HashMap); /// Representation of ranges. We cannot use std ranges as soon as no way /// to derive Serialize, Deserialize #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "miscellaneous.ts") -)] pub struct Range { - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] pub start: u64, - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] pub end: u64, } /// A list of ranges to read. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "miscellaneous.ts") -)] pub struct Ranges(pub Vec); /// Describes a data source. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "miscellaneous.ts") -)] pub struct SourceDefinition { /// The unique identifier of the source. pub id: u16, @@ -61,23 +29,11 @@ pub struct SourceDefinition { /// A list of data sources. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "miscellaneous.ts") -)] pub struct Sources(pub Vec); /// A request to a stream that supports feedback, such as a terminal command /// that accepts input through `stdin`. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "miscellaneous.ts") -)] pub enum SdeRequest { /// Sends a text string. WriteText(String), @@ -89,33 +45,19 @@ pub enum SdeRequest { /// with `SdeRequest` does not guarantee a response, as the behavior depends /// on the source. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "miscellaneous.ts") -)] pub struct SdeResponse { /// The number of bytes received. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] pub bytes: usize, } /// Information about a log entry. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "miscellaneous.ts") -)] pub struct GrabbedElement { /// The unique identifier of the source. pub source_id: u16, /// The textual content of the log entry. pub content: String, /// The position of the log entry in the overall stream. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] pub pos: usize, /// The nature of the log entry, represented as a bitmask. Possible values include: /// - `SEARCH`: Nature = Nature(1) @@ -128,40 +70,17 @@ pub struct GrabbedElement { /// A list of log entries. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "miscellaneous.ts") -)] pub struct GrabbedElementList(pub Vec); /// Data about indices (log entry numbers). Used to provide information about /// the nearest search results relative to a specific log entry number. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "miscellaneous.ts") -)] -#[cfg_attr( - all(test, feature = "test_and_gen"), - ts(type = "[number | undefined | null, number | undefined | null]") -)] pub struct AroundIndexes(pub (Option, Option)); /// Describes a match for a search condition. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "miscellaneous.ts") -)] pub struct FilterMatch { /// The index (number) of the matching log entry. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] pub index: u64, /// The identifiers of the filters (search conditions) that matched /// the specified log entry. @@ -170,10 +89,4 @@ pub struct FilterMatch { /// A list of matches for a search condition. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "miscellaneous.ts") -)] pub struct FilterMatchList(pub Vec); diff --git a/application/apps/indexer/stypes/src/miscellaneous/nodejs.rs b/application/apps/indexer/stypes/src/miscellaneous/nodejs.rs deleted file mode 100644 index e11995a2ef..0000000000 --- a/application/apps/indexer/stypes/src/miscellaneous/nodejs.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::*; - -try_into_js!(GrabbedElement); -try_into_js!(GrabbedElementList); -try_into_js!(Ranges); -try_into_js!(SourceDefinition); -try_into_js!(Sources); -try_into_js!(SdeRequest); -try_into_js!(SdeResponse); -try_into_js!(AroundIndexes); -try_into_js!(FilterMatch); -try_into_js!(FilterMatchList); diff --git a/application/apps/indexer/stypes/src/miscellaneous/proptest.rs b/application/apps/indexer/stypes/src/miscellaneous/proptest.rs deleted file mode 100644 index e9b901fc1a..0000000000 --- a/application/apps/indexer/stypes/src/miscellaneous/proptest.rs +++ /dev/null @@ -1,202 +0,0 @@ -use crate::*; - -impl Arbitrary for Range { - /// Implements the `Arbitrary` trait for `Ranges` to generate random values for - /// property-based testing using the `proptest` framework. - /// - /// # Details - /// - Generates a vector of random `RangeInclusive` instances, with up to 10 ranges. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), any::()) - .prop_map(|(start, end)| Range { - start: start as u64, - end: end as u64, - }) - .boxed() - } -} - -impl Arbitrary for Ranges { - /// Implements the `Arbitrary` trait for `Ranges` to generate random values for - /// property-based testing using the `proptest` framework. - /// - /// # Details - /// - Generates a vector of random `RangeInclusive` instances, with up to 10 ranges. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(Range::arbitrary(), 0..10) - .prop_map(Ranges) - .boxed() - } -} - -impl Arbitrary for SourceDefinition { - /// Implements the `Arbitrary` trait for `SourceDefinition` to generate random instances. - /// - /// # Details - /// - Generates random `id` (`u16`) and `alias` (`String`) values. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), any::()) - .prop_map(|(id, alias)| SourceDefinition { id, alias }) - .boxed() - } -} - -impl Arbitrary for Sources { - /// Implements the `Arbitrary` trait for `Sources` to generate random instances. - /// - /// # Details - /// - Generates a vector of up to 10 random `SourceDefinition` instances. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(any::(), 0..10) - .prop_map(Sources) - .boxed() - } -} - -impl Arbitrary for SdeRequest { - /// Implements the `Arbitrary` trait for `SdeRequest` to generate random instances. - /// - /// # Details - /// - Generates either: - /// - `WriteText` with a random `String`. - /// - `WriteBytes` with a random vector of `u8` values (up to 100 bytes). - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(SdeRequest::WriteText), - prop::collection::vec(any::(), 0..100).prop_map(SdeRequest::WriteBytes), - ] - .boxed() - } -} - -impl Arbitrary for SdeResponse { - /// Implements the `Arbitrary` trait for `SdeResponse` to generate random instances. - /// - /// # Details - /// - Generates a random `u32` for the `bytes` field. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - any::() - .prop_map(|n| n as usize) - .prop_map(|bytes| SdeResponse { bytes }) - .boxed() - } -} - -impl Arbitrary for GrabbedElement { - /// Implements the `Arbitrary` trait for `GrabbedElement` to generate random instances. - /// - /// # Details - /// - Generates: - /// - A random `source_id` (`u16`). - /// - A random `content` (`String`). - /// - A random `pos` (`usize`). - /// - A random `nature` (`u8`). - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), any::(), any::(), any::()) - .prop_map(|(source_id, content, pos, nature)| GrabbedElement { - source_id, - content, - pos: pos as usize, - nature, - }) - .boxed() - } -} - -impl Arbitrary for GrabbedElementList { - /// Implements the `Arbitrary` trait for `GrabbedElementList` to generate random instances. - /// - /// # Details - /// - Generates a vector of up to 10 random `GrabbedElement` instances. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(any::(), 0..10) - .prop_map(GrabbedElementList) - .boxed() - } -} - -impl Arbitrary for AroundIndexes { - /// Implements the `Arbitrary` trait for `AroundIndexes` to generate random instances. - /// - /// # Details - /// - Generates a tuple of two optional `u32` values, mapped to `u64`. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::>(), any::>()) - .prop_map(|(start, end)| { - AroundIndexes((start.map(|n| n as u64), end.map(|n| n as u64))) - }) - .boxed() - } -} - -impl Arbitrary for FilterMatch { - /// Implements the `Arbitrary` trait for `FilterMatch` to generate random instances. - /// - /// # Details - /// - Generates: - /// - A random `index` (`u64`). - /// - A random vector of `u8` filter IDs (up to 10 filters). - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), prop::collection::vec(any::(), 0..10)) - .prop_map(|(index, filters)| FilterMatch { - index: index as u64, - filters, - }) - .boxed() - } -} - -impl Arbitrary for FilterMatchList { - /// Implements the `Arbitrary` trait for `FilterMatchList` to generate random instances. - /// - /// # Details - /// - Generates a vector of up to 10 random `FilterMatch` instances. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(any::(), 0..10) - .prop_map(FilterMatchList) - .boxed() - } -} - -test_msg!(SourceDefinition, TESTS_USECASE_COUNT); -test_msg!(Sources, TESTS_USECASE_COUNT); -test_msg!(SdeRequest, TESTS_USECASE_COUNT); -test_msg!(SdeResponse, TESTS_USECASE_COUNT); -test_msg!(GrabbedElement, TESTS_USECASE_COUNT); -test_msg!(GrabbedElementList, TESTS_USECASE_COUNT); -test_msg!(AroundIndexes, TESTS_USECASE_COUNT); -test_msg!(FilterMatch, TESTS_USECASE_COUNT); -test_msg!(FilterMatchList, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/nodejs.rs b/application/apps/indexer/stypes/src/nodejs.rs deleted file mode 100644 index 40161b76f9..0000000000 --- a/application/apps/indexer/stypes/src/nodejs.rs +++ /dev/null @@ -1,25 +0,0 @@ -/// This macro is used with the `feature=nodejs`. It allows adding an implementation of the `TryIntoJs` trait, -/// enabling seamless data conversion for use in a Node.js context when using the `node_bindgen` crate. -/// -/// It's important to note that data can still be passed without implementing this trait; however, its use -/// significantly simplifies the code and improves readability by allowing explicit type annotations in function outputs. -/// -/// Example code from a trait using `node_bindgen`: -/// ```ignore -/// // OutputType implements TryIntoJs -/// pub fn public_api_call() -> Result { ... } -/// -/// // OutputType doesn't implement TryIntoJs -/// pub fn public_api_call() -> Result { ... } -/// ``` -#[macro_export] -macro_rules! try_into_js { - ($($t:tt)+) => { - impl TryIntoJs for $($t)+ { - fn try_to_js(self, js_env: &JsEnv) -> Result { - SafeArrayBuffer::new(self.encode().map_err(NjError::Other)?) - .try_to_js(js_env) - } - } - }; -} diff --git a/application/apps/indexer/stypes/src/observe/mod.rs b/application/apps/indexer/stypes/src/observe/mod.rs index cec8d79c39..8c820ea8be 100644 --- a/application/apps/indexer/stypes/src/observe/mod.rs +++ b/application/apps/indexer/stypes/src/observe/mod.rs @@ -1,11 +1,5 @@ -#[cfg(feature = "rustcore")] mod extending; -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; -#[cfg(feature = "rustcore")] pub use extending::*; use crate::*; @@ -16,12 +10,6 @@ use dlt_core::filtering::DltFilterConfig; /// - `interface`: The address of the local interface used to join the multicast group. /// If set to `INADDR_ANY`, the system selects an appropriate interface. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub struct MulticastInfo { pub multiaddr: String, pub interface: Option, @@ -29,12 +17,6 @@ pub struct MulticastInfo { /// Configuration for UDP connections. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub struct UdpConnectionInfo { /// A list of multicast addresses to listen on. pub multicast_addr: Vec, @@ -43,12 +25,6 @@ pub struct UdpConnectionInfo { /// Specifies the parser to be used for processing session data. #[allow(clippy::large_enum_variant)] #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub enum ParserType { /// DLT parser for files (including PCAP files) or streams (TCP/UDP). Dlt(DltParserSettings), @@ -62,15 +38,8 @@ pub enum ParserType { /// Settings for the DLT parser. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub struct DltParserSettings { /// Configuration for filtering DLT messages. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "DltFilterConfig"))] pub filter_config: Option, /// Paths to FIBEX files for additional interpretation of `payload` content. pub fibex_file_paths: Option>, @@ -85,12 +54,6 @@ pub struct DltParserSettings { /// Settings for the SomeIp parser. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub struct SomeIpParserSettings { /// Paths to FIBEX files for additional interpretation of `payload` content. pub fibex_file_paths: Option>, @@ -98,12 +61,6 @@ pub struct SomeIpParserSettings { /// Describes the transport source for a session. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub enum Transport { /// Terminal command execution. Process(ProcessTransportConfig), @@ -117,12 +74,6 @@ pub enum Transport { /// Configuration for executing terminal commands. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub struct ProcessTransportConfig { /// The working directory for the command. pub cwd: PathBuf, @@ -134,12 +85,6 @@ pub struct ProcessTransportConfig { /// Configuration for serial port connections. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub struct SerialTransportConfig { /// The path to the serial port. pub path: String, @@ -161,12 +106,6 @@ pub struct SerialTransportConfig { /// Configuration for TCP connections. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub struct TCPTransportConfig { /// The address to bind the TCP connection to. pub bind_addr: String, @@ -174,12 +113,6 @@ pub struct TCPTransportConfig { /// Configuration for UDP connections. #[derive(Clone, Debug, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub struct UDPTransportConfig { /// The address to bind the UDP connection to. pub bind_addr: String, @@ -189,12 +122,6 @@ pub struct UDPTransportConfig { /// Supported file formats for observation. #[derive(Debug, Serialize, Deserialize, Clone, Copy, Eq, PartialEq, Hash)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub enum FileFormat { PcapNG, PcapLegacy, @@ -207,12 +134,6 @@ pub enum FileFormat { /// Describes the source of data for observation. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub enum ObserveOrigin { /// The source is a single file. File(String, FileFormat, PathBuf), @@ -224,12 +145,6 @@ pub enum ObserveOrigin { /// Options for observing data within a session. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "observe.ts") -)] pub struct ObserveOptions { /// The description of the data source. pub origin: ObserveOrigin, diff --git a/application/apps/indexer/stypes/src/observe/nodejs.rs b/application/apps/indexer/stypes/src/observe/nodejs.rs deleted file mode 100644 index b79f2bd9d4..0000000000 --- a/application/apps/indexer/stypes/src/observe/nodejs.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::*; - -try_into_js!(MulticastInfo); -try_into_js!(ParserType); -try_into_js!(DltParserSettings); -try_into_js!(SomeIpParserSettings); -try_into_js!(Transport); -try_into_js!(ProcessTransportConfig); -try_into_js!(SerialTransportConfig); -try_into_js!(TCPTransportConfig); -try_into_js!(UDPTransportConfig); -try_into_js!(FileFormat); -try_into_js!(ObserveOrigin); -try_into_js!(ObserveOptions); diff --git a/application/apps/indexer/stypes/src/observe/proptest.rs b/application/apps/indexer/stypes/src/observe/proptest.rs deleted file mode 100644 index cdaff3fa20..0000000000 --- a/application/apps/indexer/stypes/src/observe/proptest.rs +++ /dev/null @@ -1,284 +0,0 @@ -use crate::*; -use dlt_core::filtering::DltFilterConfig; - -impl Arbitrary for MulticastInfo { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), any::>()) - .prop_map(|(multiaddr, interface)| MulticastInfo { - multiaddr, - interface, - }) - .boxed() - } -} - -impl Arbitrary for UdpConnectionInfo { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(any::(), 0..10) - .prop_map(|multicast_addr| UdpConnectionInfo { multicast_addr }) - .boxed() - } -} - -impl Arbitrary for ParserType { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(ParserType::Dlt), - any::().prop_map(ParserType::SomeIp), - Just(ParserType::Text(())), - any::().prop_map(ParserType::Plugin) - ] - .boxed() - } -} - -#[derive(Debug)] -struct DltFilterConfigWrapper(pub DltFilterConfig); - -impl Arbitrary for DltFilterConfigWrapper { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::>(), - any::>>(), - any::>>(), - any::>>(), - any::(), - any::(), - ) - .prop_map( - |(min_log_level, app_ids, ecu_ids, context_ids, app_id_count, context_id_count)| { - DltFilterConfigWrapper(DltFilterConfig { - min_log_level, - app_ids, - ecu_ids, - context_ids, - app_id_count: app_id_count as i64, - context_id_count: context_id_count as i64, - }) - }, - ) - .boxed() - } -} - -impl Arbitrary for DltParserSettings { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::>().prop_map(|wrp| wrp.map(|wrp| wrp.0)), - any::>>(), - any::(), - any::>(), - Just(None), // fibex_metadata is skipped - ) - .prop_map( - |(filter_config, fibex_file_paths, with_storage_header, tz, fibex_metadata)| { - DltParserSettings { - filter_config, - fibex_file_paths, - with_storage_header, - tz, - fibex_metadata, - } - }, - ) - .boxed() - } -} - -impl Arbitrary for SomeIpParserSettings { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - any::>>() - .prop_map(|fibex_file_paths| SomeIpParserSettings { fibex_file_paths }) - .boxed() - } -} - -impl Arbitrary for Transport { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(Transport::Process), - any::().prop_map(Transport::TCP), - any::().prop_map(Transport::UDP), - any::().prop_map(Transport::Serial), - ] - .boxed() - } -} - -impl Arbitrary for ProcessTransportConfig { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::(), - any::(), - any::>(), - ) - .prop_map(|(cwd, command, shell)| ProcessTransportConfig { - cwd, - command, - shell, - }) - .boxed() - } -} - -impl Arbitrary for SerialTransportConfig { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::(), - any::(), - any::(), - any::(), - any::(), - any::(), - any::(), - any::(), - ) - .prop_map( - |( - path, - baud_rate, - data_bits, - flow_control, - parity, - stop_bits, - send_data_delay, - exclusive, - )| { - SerialTransportConfig { - path, - baud_rate, - data_bits, - flow_control, - parity, - stop_bits, - send_data_delay, - exclusive, - } - }, - ) - .boxed() - } -} - -impl Arbitrary for TCPTransportConfig { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - any::() - .prop_map(|bind_addr| TCPTransportConfig { bind_addr }) - .boxed() - } -} - -impl Arbitrary for UDPTransportConfig { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::(), - prop::collection::vec(any::(), 0..10), - ) - .prop_map(|(bind_addr, multicast)| UDPTransportConfig { - bind_addr, - multicast, - }) - .boxed() - } -} - -impl Arbitrary for FileFormat { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - // Reminder to extend tests here when new items are added. - match FileFormat::Text { - FileFormat::PcapNG => {} - FileFormat::PcapLegacy => {} - FileFormat::Text => {} - FileFormat::Binary => {} - }; - - prop_oneof![ - Just(FileFormat::PcapNG), - Just(FileFormat::PcapLegacy), - Just(FileFormat::Text), - Just(FileFormat::Binary), - ] - .boxed() - } -} - -impl Arbitrary for ObserveOrigin { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - (any::(), any::(), any::(),) - .prop_map(|(filename, format, path)| ObserveOrigin::File(filename, format, path)), - prop::collection::vec( - (any::(), any::(), any::(),), - 0..10, - ) - .prop_map(ObserveOrigin::Concat), - (any::(), any::(),) - .prop_map(|(stream, transport)| ObserveOrigin::Stream(stream, transport)), - ] - .boxed() - } -} - -impl Arbitrary for ObserveOptions { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), any::()) - .prop_map(|(origin, parser)| ObserveOptions { origin, parser }) - .boxed() - } -} - -test_msg!(ObserveOptions, TESTS_USECASE_COUNT); -test_msg!(ObserveOrigin, TESTS_USECASE_COUNT); -test_msg!(FileFormat, TESTS_USECASE_COUNT); -test_msg!(UDPTransportConfig, TESTS_USECASE_COUNT); -test_msg!(TCPTransportConfig, TESTS_USECASE_COUNT); -test_msg!(SerialTransportConfig, TESTS_USECASE_COUNT); -test_msg!(ProcessTransportConfig, TESTS_USECASE_COUNT); -test_msg!(Transport, TESTS_USECASE_COUNT); -test_msg!(SomeIpParserSettings, TESTS_USECASE_COUNT); -test_msg!(DltParserSettings, TESTS_USECASE_COUNT); -test_msg!(ParserType, TESTS_USECASE_COUNT); -test_msg!(UdpConnectionInfo, TESTS_USECASE_COUNT); -test_msg!(MulticastInfo, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/operations/mod.rs b/application/apps/indexer/stypes/src/operations/mod.rs index 03c8e26b89..22d00e4b6e 100644 --- a/application/apps/indexer/stypes/src/operations/mod.rs +++ b/application/apps/indexer/stypes/src/operations/mod.rs @@ -1,44 +1,18 @@ -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; - use crate::*; #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "operations.ts") -)] pub struct NearestPosition { - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] - pub index: u64, // Position in search results - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] + pub index: u64, // Position in search results pub position: u64, // Position in original stream/file } #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "operations.ts") -)] pub struct ResultNearestPosition(pub Option); ///(row_number, min_value_in_range, max_value_in_range, value) /// value - can be last value in range or some kind of average #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "operations.ts") -)] pub struct Point { - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] pub row: u64, pub min: f64, pub max: f64, @@ -46,37 +20,17 @@ pub struct Point { } #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "operations.ts") -)] -#[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "Map"))] pub struct ResultSearchValues(pub HashMap>); /// Scaled chart data #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "operations.ts") -)] pub struct ResultScaledDistribution(pub Vec>); /// Used to delivery results of extracting values. That's used in the scope /// of chart feature #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "operations.ts") -)] pub struct ExtractedMatchValue { /// The index of log entry (row number) - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] pub index: u64, /// List of matches: /// `usize` - index of filter @@ -86,41 +40,16 @@ pub struct ExtractedMatchValue { /// The list of `ExtractedMatchValue` #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "operations.ts") -)] pub struct ResultExtractedMatchValues(pub Vec); #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "operations.ts") -)] -#[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] pub struct ResultU64(pub u64); #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "operations.ts") -)] pub struct ResultBool(pub bool); /// Used only for debug session lifecycle #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "operations.ts") -)] pub struct ResultSleep { pub sleep_well: bool, } diff --git a/application/apps/indexer/stypes/src/operations/nodejs.rs b/application/apps/indexer/stypes/src/operations/nodejs.rs deleted file mode 100644 index eb6e60c052..0000000000 --- a/application/apps/indexer/stypes/src/operations/nodejs.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::*; - -try_into_js!(NearestPosition); -try_into_js!(ResultNearestPosition); -try_into_js!(Point); -try_into_js!(ResultSearchValues); -try_into_js!(ResultScaledDistribution); -try_into_js!(ExtractedMatchValue); -try_into_js!(ResultExtractedMatchValues); -try_into_js!(ResultU64); -try_into_js!(ResultBool); -try_into_js!(ResultSleep); diff --git a/application/apps/indexer/stypes/src/operations/proptest.rs b/application/apps/indexer/stypes/src/operations/proptest.rs deleted file mode 100644 index a5c50a681c..0000000000 --- a/application/apps/indexer/stypes/src/operations/proptest.rs +++ /dev/null @@ -1,166 +0,0 @@ -use crate::*; - -impl Arbitrary for NearestPosition { - /// Implements the `Arbitrary` trait for `ExtractedMatchValue` to generate random values for - /// property-based testing using the `proptest` framework. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::().prop_map(|n| n as u64), - any::().prop_map(|n| n as u64), - ) - .prop_map(|(index, position)| NearestPosition { index, position }) - .boxed() - } -} - -impl Arbitrary for ResultNearestPosition { - /// Implements the `Arbitrary` trait for `ExtractedMatchValue` to generate random values for - /// property-based testing using the `proptest` framework. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::option::of(NearestPosition::arbitrary()) - .prop_map(ResultNearestPosition) - .boxed() - } -} - -impl Arbitrary for Point { - /// Implements the `Arbitrary` trait for `ExtractedMatchValue` to generate random values for - /// property-based testing using the `proptest` framework. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::().prop_map(|n| n as u64), - any::().prop_map(|n| n as f64), - any::().prop_map(|n| n as f64), - any::().prop_map(|n| n as f64), - ) - .prop_map(|(row, min, max, y_value)| Point { - row, - min, - max, - y_value, - }) - .boxed() - } -} - -impl Arbitrary for ResultSearchValues { - /// Implements the `Arbitrary` trait for `ExtractedMatchValue` to generate random values for - /// property-based testing using the `proptest` framework. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - any::>>() - .prop_map(ResultSearchValues) - .boxed() - } -} - -impl Arbitrary for ResultScaledDistribution { - /// Implements the `Arbitrary` trait for `ExtractedMatchValue` to generate random values for - /// property-based testing using the `proptest` framework. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec( - prop::collection::vec((any::(), any::()), 0..10), - 0..10, - ) - .prop_map(ResultScaledDistribution) - .boxed() - } -} - -impl Arbitrary for ExtractedMatchValue { - /// Implements the `Arbitrary` trait for `ExtractedMatchValue` to generate random values for - /// property-based testing using the `proptest` framework. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::().prop_map(|n| n as u64), - prop::collection::vec( - ( - any::().prop_map(|n| n as usize), - prop::collection::vec(any::(), 0..10), - ), - 0..10, - ), - ) - .prop_map(|(index, values)| ExtractedMatchValue { index, values }) - .boxed() - } -} - -impl Arbitrary for ResultExtractedMatchValues { - /// Implements the `Arbitrary` trait for `ResultExtractedMatchValues` to generate random values for - /// property-based testing using the `proptest` framework. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(ExtractedMatchValue::arbitrary(), 0..10) - .prop_map(ResultExtractedMatchValues) - .boxed() - } -} - -impl Arbitrary for ResultU64 { - /// Implements the `Arbitrary` trait for `ResultU64` to generate random values for - /// property-based testing using the `proptest` framework. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - any::() - .prop_map(|n| n as u64) - .prop_map(ResultU64) - .boxed() - } -} - -impl Arbitrary for ResultBool { - /// Implements the `Arbitrary` trait for `ResultBool` to generate random values for - /// property-based testing using the `proptest` framework. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - any::().prop_map(ResultBool).boxed() - } -} - -impl Arbitrary for ResultSleep { - /// Implements the `Arbitrary` trait for `ResultBool` to generate random values for - /// property-based testing using the `proptest` framework. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - any::() - .prop_map(|sleep_well| ResultSleep { sleep_well }) - .boxed() - } -} - -test_msg!(NearestPosition, TESTS_USECASE_COUNT); -test_msg!(ResultNearestPosition, TESTS_USECASE_COUNT); -test_msg!(Point, TESTS_USECASE_COUNT); -test_msg!(ResultSearchValues, TESTS_USECASE_COUNT); -test_msg!(ResultScaledDistribution, TESTS_USECASE_COUNT); -test_msg!(ExtractedMatchValue, TESTS_USECASE_COUNT); -test_msg!(ResultExtractedMatchValues, TESTS_USECASE_COUNT); -test_msg!(ResultU64, TESTS_USECASE_COUNT); -test_msg!(ResultBool, TESTS_USECASE_COUNT); -test_msg!(ResultSleep, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/plugins/mod.rs b/application/apps/indexer/stypes/src/plugins/mod.rs index f3aa9f73f1..43e415a4cd 100644 --- a/application/apps/indexer/stypes/src/plugins/mod.rs +++ b/application/apps/indexer/stypes/src/plugins/mod.rs @@ -1,25 +1,12 @@ -#[cfg(feature = "rustcore")] mod converting; -#[cfg(feature = "rustcore")] mod extending; -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; -#[cfg(feature = "rustcore")] pub use extending::*; use crate::*; /// Settings for the Plugins parser. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginParserSettings { pub plugin_path: PathBuf, // General setting doesn't exist in front-end since it doesn't have real fields yet. @@ -31,24 +18,12 @@ pub struct PluginParserSettings { //TODO: This struct is a place holder currently and doesn't provide any value yet. /// General settings for all parsers as plugins #[derive(Debug, Serialize, Deserialize, Clone, Default)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginParserGeneralSettings { pub placeholder: String, } /// Settings for the Plugin Byte-Sources. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginByteSourceSettings { pub plugin_path: PathBuf, pub general_settings: PluginByteSourceGeneralSettings, @@ -58,24 +33,12 @@ pub struct PluginByteSourceSettings { //TODO: This struct is a place holder currently and doesn't provide any value yet. /// General settings for all byte-sources as plugins #[derive(Debug, Serialize, Deserialize, Clone, Default)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginByteSourceGeneralSettings { pub placeholder: String, } /// Represents a configuration item, which includes an identifier and its corresponding value. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginConfigItem { pub id: String, pub value: PluginConfigValue, @@ -83,12 +46,6 @@ pub struct PluginConfigItem { /// Represents the value of a configuration item. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub enum PluginConfigValue { Boolean(bool), Integer(i32), @@ -104,12 +61,6 @@ pub enum PluginConfigValue { /// Defines the possible input types for configuration schemas. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub enum PluginConfigSchemaType { /// Represents boolean type with the default value. Boolean(bool), @@ -129,12 +80,6 @@ pub enum PluginConfigSchemaType { /// Represents the schema for a configuration item. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginConfigSchemaItem { pub id: String, pub title: String, @@ -144,12 +89,6 @@ pub struct PluginConfigSchemaItem { /// Represents an installed plugin entity informations and configurations. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginEntity { /// Directory path of the plugin. Qualify as ID for the plugin. pub dir_path: PathBuf, @@ -166,12 +105,6 @@ pub struct PluginEntity { /// Represents different levels of logging severity for a plugin. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub enum PluginLogLevel { /// Represents an error message. Err, @@ -185,12 +118,6 @@ pub enum PluginLogLevel { /// Represents a log message generated by a plugin. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginLogMessage { /// The severity level of the log message. pub level: PluginLogLevel, @@ -204,12 +131,6 @@ pub struct PluginLogMessage { /// Represented as a struct (but not just a vector) to reserve /// a space for a future fields. #[derive(Debug, Clone, Serialize, Deserialize, Default)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginRunData { /// A collection of log messages associated with the plugin. pub logs: Vec, @@ -217,12 +138,6 @@ pub struct PluginRunData { /// Represents the informations of an invalid plugin. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct InvalidPluginEntity { /// Directory path of the plugin. Qualify as ID for the plugin. pub dir_path: PathBuf, @@ -232,12 +147,6 @@ pub struct InvalidPluginEntity { /// Represents the plugins metadata like title, description... #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginMetadata { pub title: String, pub description: Option, @@ -245,12 +154,6 @@ pub struct PluginMetadata { /// Represents plugins main types #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub enum PluginType { Parser, ByteSource, @@ -258,12 +161,6 @@ pub enum PluginType { /// Contains the infos and options for a valid plugin. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginInfo { pub wasm_file_path: PathBuf, pub api_version: SemanticVersion, @@ -274,12 +171,6 @@ pub struct PluginInfo { /// Represents the semantic version used in the plugins system. #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct SemanticVersion { pub major: u16, pub minor: u16, @@ -288,12 +179,6 @@ pub struct SemanticVersion { /// Represents the render options (columns headers, etc.) for the plugins. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub enum RenderOptions { Parser(Box), ByteSource, @@ -301,12 +186,6 @@ pub enum RenderOptions { /// Provides additional information to be rendered in the log view. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct ParserRenderOptions { /// Rendering information for the column if log messages have multiple columns. /// @@ -317,12 +196,6 @@ pub struct ParserRenderOptions { /// Represents the options needs to render columns information if they exist. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct ColumnsRenderOptions { /// List of columns infos providing the needed information for each column in log view. /// @@ -336,12 +209,6 @@ pub struct ColumnsRenderOptions { /// Represents the infos of a column that will be used in the render options. #[derive(Debug, Clone, Serialize, Deserialize)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct ColumnInfo { /// Header title to be rendered on the top of the column in log view. pub caption: String, @@ -353,30 +220,12 @@ pub struct ColumnInfo { /// Represents a list of [`PluginEntity`]. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginsList(pub Vec); /// Represents a list of [`InvalidPluginEntity`]. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct InvalidPluginsList(pub Vec); /// Represents a list of [`InvalidPluginEntity`]. #[derive(Clone, Serialize, Deserialize, Debug)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "plugins.ts") -)] pub struct PluginsPathsList(pub Vec); diff --git a/application/apps/indexer/stypes/src/plugins/nodejs.rs b/application/apps/indexer/stypes/src/plugins/nodejs.rs deleted file mode 100644 index 575b3c23b4..0000000000 --- a/application/apps/indexer/stypes/src/plugins/nodejs.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::*; - -try_into_js!(PluginParserSettings); -try_into_js!(PluginParserGeneralSettings); -try_into_js!(PluginByteSourceSettings); -try_into_js!(PluginByteSourceGeneralSettings); -try_into_js!(PluginConfigItem); -try_into_js!(PluginConfigValue); -try_into_js!(PluginConfigSchemaType); -try_into_js!(PluginConfigSchemaItem); -try_into_js!(PluginEntity); -try_into_js!(PluginMetadata); -try_into_js!(PluginType); -try_into_js!(PluginInfo); -try_into_js!(InvalidPluginEntity); -try_into_js!(SemanticVersion); -try_into_js!(RenderOptions); -try_into_js!(ParserRenderOptions); -try_into_js!(PluginsList); -try_into_js!(InvalidPluginsList); -try_into_js!(PluginsPathsList); diff --git a/application/apps/indexer/stypes/src/plugins/proptest.rs b/application/apps/indexer/stypes/src/plugins/proptest.rs deleted file mode 100644 index 939d9adf64..0000000000 --- a/application/apps/indexer/stypes/src/plugins/proptest.rs +++ /dev/null @@ -1,432 +0,0 @@ -use crate::*; - -impl Arbitrary for PluginParserSettings { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::(), - any::(), - prop::collection::vec(any::(), 0..10), - ) - .prop_map( - |(plugin_path, general_settings, plugin_configs)| PluginParserSettings { - plugin_path, - general_settings, - plugin_configs, - }, - ) - .boxed() - } -} - -impl Arbitrary for PluginParserGeneralSettings { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - any::() - .prop_map(|placeholder| PluginParserGeneralSettings { placeholder }) - .boxed() - } -} - -impl Arbitrary for PluginByteSourceSettings { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::(), - any::(), - prop::collection::vec(any::(), 0..10), - ) - .prop_map( - |(plugin_path, general_settings, plugin_configs)| PluginByteSourceSettings { - plugin_path, - general_settings, - plugin_configs, - }, - ) - .boxed() - } -} - -impl Arbitrary for PluginByteSourceGeneralSettings { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - any::() - .prop_map(|placeholder| PluginByteSourceGeneralSettings { placeholder }) - .boxed() - } -} - -impl Arbitrary for PluginConfigItem { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), any::()) - .prop_map(|(id, value)| PluginConfigItem { id, value }) - .boxed() - } -} - -impl Arbitrary for PluginConfigValue { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - // Reminder to add new items to proptests here. - match PluginConfigValue::Boolean(true) { - PluginConfigValue::Boolean(_) => (), - PluginConfigValue::Integer(_) => (), - PluginConfigValue::Float(_) => (), - PluginConfigValue::Text(_) => (), - PluginConfigValue::Directories(_) => (), - PluginConfigValue::Files(_) => (), - PluginConfigValue::Dropdown(_) => (), - }; - - prop_oneof![ - any::().prop_map(PluginConfigValue::Boolean), - any::().prop_map(PluginConfigValue::Integer), - any::().prop_map(PluginConfigValue::Float), - any::().prop_map(PluginConfigValue::Text), - prop::collection::vec(any::(), 0..10).prop_map(PluginConfigValue::Directories), - prop::collection::vec(any::(), 0..10).prop_map(PluginConfigValue::Files), - any::().prop_map(PluginConfigValue::Dropdown), - ] - .boxed() - } -} - -impl Arbitrary for PluginConfigSchemaType { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - use PluginConfigSchemaType as T; - // Reminder to add new items to proptests here. - match T::Boolean(true) { - T::Boolean(_) => (), - T::Integer(_) => (), - T::Float(_) => (), - T::Text(_) => (), - T::Directories => (), - T::Files(_) => (), - T::Dropdown(_) => (), - }; - - prop_oneof![ - any::().prop_map(T::Boolean), - any::().prop_map(T::Integer), - any::().prop_map(T::Float), - any::().prop_map(T::Text), - Just(T::Directories), - prop::collection::vec(any::(), 0..10).prop_map(T::Files), - ( - prop::collection::vec(any::(), 0..10), - any::() - ) - .prop_map(T::Dropdown), - ] - .boxed() - } -} - -impl Arbitrary for PluginConfigSchemaItem { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::(), - any::(), - prop::option::of(any::()), - any::(), - ) - .prop_map( - |(id, title, description, input_type)| PluginConfigSchemaItem { - id, - title, - description, - input_type, - }, - ) - .boxed() - } -} - -impl Arbitrary for PluginEntity { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::(), - any::(), - any::(), - any::(), - prop::option::of(any::()), - ) - .prop_map( - |(dir_path, plugin_type, info, metadata, readme_path)| Self { - dir_path, - plugin_type, - info, - metadata, - readme_path, - }, - ) - .boxed() - } -} - -impl Arbitrary for PluginMetadata { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), prop::option::of(any::())) - .prop_map(|(title, description)| Self { title, description }) - .boxed() - } -} - -impl Arbitrary for PluginType { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - // Reminder to add new fields here. - match Self::ByteSource { - PluginType::Parser => (), - PluginType::ByteSource => (), - }; - - prop_oneof![Just(Self::Parser), Just(Self::ByteSource)].boxed() - } -} - -impl Arbitrary for PluginInfo { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - any::(), - any::(), - any::(), - prop::collection::vec(any::(), 0..10), - any::(), - ) - .prop_map( - |(wasm_file_path, api_version, plugin_version, config_schemas, render_options)| { - Self { - wasm_file_path, - api_version, - plugin_version, - config_schemas, - render_options, - } - }, - ) - .boxed() - } -} - -impl Arbitrary for InvalidPluginEntity { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), any::()) - .prop_map(|(dir_path, plugin_type)| Self { - dir_path, - plugin_type, - }) - .boxed() - } -} - -impl Arbitrary for SemanticVersion { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - prop::num::u16::ANY, - prop::num::u16::ANY, - prop::num::u16::ANY, - ) - .prop_map(|(major, minor, patch)| Self { - major, - minor, - patch, - }) - .boxed() - } -} - -impl Arbitrary for RenderOptions { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - // Reminder to update here on newly added items. - match Self::ByteSource { - RenderOptions::Parser(_) => (), - RenderOptions::ByteSource => (), - }; - - prop_oneof![ - any::>().prop_map(Self::Parser), - Just(Self::ByteSource), - ] - .boxed() - } -} - -impl Arbitrary for ParserRenderOptions { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::option::of(any::()) - .prop_map(|columns_options| Self { columns_options }) - .boxed() - } -} - -impl Arbitrary for ColumnsRenderOptions { - type Parameters = (); - type Strategy = BoxedStrategy; - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - ( - prop::collection::vec(any::(), 0..10), - any::(), - any::(), - ) - .prop_map(|(columns, min_width, max_width)| Self { - columns, - min_width, - max_width, - }) - .boxed() - } -} - -impl Arbitrary for ColumnInfo { - type Parameters = (); - type Strategy = BoxedStrategy; - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), any::(), any::()) - .prop_map(|(caption, description, width)| Self { - caption, - description, - width, - }) - .boxed() - } -} - -impl Arbitrary for PluginsList { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(any::(), 0..7) - .prop_map(Self) - .boxed() - } -} - -impl Arbitrary for InvalidPluginsList { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(any::(), 0..7) - .prop_map(Self) - .boxed() - } -} - -impl Arbitrary for PluginLogLevel { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - Just(PluginLogLevel::Debug), - Just(PluginLogLevel::Err), - Just(PluginLogLevel::Warn), - Just(PluginLogLevel::Info) - ] - .boxed() - } -} - -impl Arbitrary for PluginLogMessage { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), any::(), any::()) - .prop_map(|(level, msg, timestamp)| Self { - level, - msg, - timestamp: timestamp as u64, - }) - .boxed() - } -} - -impl Arbitrary for PluginRunData { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(any::(), 0..7) - .prop_map(|logs| Self { logs }) - .boxed() - } -} - -impl Arbitrary for PluginsPathsList { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop::collection::vec(any::(), 0..7) - .prop_map(Self) - .boxed() - } -} - -test_msg!(PluginParserSettings, TESTS_USECASE_COUNT); -test_msg!(PluginParserGeneralSettings, TESTS_USECASE_COUNT); -test_msg!(PluginByteSourceSettings, TESTS_USECASE_COUNT); -test_msg!(PluginByteSourceGeneralSettings, TESTS_USECASE_COUNT); -test_msg!(PluginConfigItem, TESTS_USECASE_COUNT); -test_msg!(PluginConfigValue, TESTS_USECASE_COUNT); -test_msg!(PluginConfigSchemaType, TESTS_USECASE_COUNT); -test_msg!(PluginConfigSchemaItem, TESTS_USECASE_COUNT); -test_msg!(PluginEntity, TESTS_USECASE_COUNT); -test_msg!(PluginMetadata, TESTS_USECASE_COUNT); -test_msg!(PluginType, TESTS_USECASE_COUNT); -test_msg!(PluginInfo, TESTS_USECASE_COUNT); -test_msg!(InvalidPluginEntity, TESTS_USECASE_COUNT); -test_msg!(SemanticVersion, TESTS_USECASE_COUNT); -test_msg!(RenderOptions, TESTS_USECASE_COUNT); -test_msg!(ParserRenderOptions, TESTS_USECASE_COUNT); -test_msg!(ColumnsRenderOptions, TESTS_USECASE_COUNT); -test_msg!(ColumnInfo, TESTS_USECASE_COUNT); -test_msg!(PluginsList, TESTS_USECASE_COUNT); -test_msg!(InvalidPluginsList, TESTS_USECASE_COUNT); -test_msg!(PluginsPathsList, TESTS_USECASE_COUNT); -test_msg!(PluginLogMessage, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/progress/mod.rs b/application/apps/indexer/stypes/src/progress/mod.rs index 6cbda01d3c..87dcf8608c 100644 --- a/application/apps/indexer/stypes/src/progress/mod.rs +++ b/application/apps/indexer/stypes/src/progress/mod.rs @@ -1,21 +1,10 @@ -#[cfg(feature = "rustcore")] mod extending; -#[cfg(feature = "nodejs")] -mod nodejs; -#[cfg(test)] -mod proptest; use crate::*; /// Represents a notification about an event (including potential errors) /// related to processing a specific log entry, if such data is available. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "progress.ts") -)] pub struct Notification { /// The severity level of the event. pub severity: Severity, @@ -27,12 +16,6 @@ pub struct Notification { /// Describes the progress of an operation. #[derive(Debug, Serialize, Deserialize, Clone)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "progress.ts") -)] pub enum Progress { /// Represents the current progress status. Ticks(Ticks), @@ -44,23 +27,12 @@ pub enum Progress { /// Provides detailed information about the progress of an operation. #[derive(Debug, Serialize, Deserialize, Clone, Default)] -#[extend::encode_decode] -#[cfg_attr( - all(test, feature = "test_and_gen"), - derive(TS), - ts(export, export_to = "progress.ts") -)] pub struct Ticks { /// The current progress count, typically representing `n` out of `100%`. - #[cfg_attr(all(test, feature = "test_and_gen"), ts(type = "number"))] pub count: u64, /// The name of the current progress stage, for user display purposes. pub state: Option, /// The total progress counter. Usually `100`, but for file operations, /// it might represent the file size, where `count` indicates the number of bytes read. - #[cfg_attr( - all(test, feature = "test_and_gen"), - ts(type = "number | null | undefined") - )] pub total: Option, } diff --git a/application/apps/indexer/stypes/src/progress/nodejs.rs b/application/apps/indexer/stypes/src/progress/nodejs.rs deleted file mode 100644 index 29a053090a..0000000000 --- a/application/apps/indexer/stypes/src/progress/nodejs.rs +++ /dev/null @@ -1,5 +0,0 @@ -use crate::*; - -try_into_js!(Notification); -try_into_js!(Progress); -try_into_js!(Ticks); diff --git a/application/apps/indexer/stypes/src/progress/proptest.rs b/application/apps/indexer/stypes/src/progress/proptest.rs deleted file mode 100644 index 65600daa67..0000000000 --- a/application/apps/indexer/stypes/src/progress/proptest.rs +++ /dev/null @@ -1,71 +0,0 @@ -use crate::*; - -impl Arbitrary for Notification { - /// Implements the `Arbitrary` trait for `Notification` to generate random instances - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// - Generates: - /// - `severity`: A random `Severity` value. - /// - `content`: A random `String`. - /// - `line`: An optional random `usize` value. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), any::(), any::>()) - .prop_map(|(severity, content, line)| Notification { - severity, - content, - line: line.map(|n| n as usize), - }) - .boxed() - } -} - -impl Arbitrary for Ticks { - /// Implements the `Arbitrary` trait for `Ticks` to generate random instances - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// - Generates: - /// - `count`: A random `u64` value. - /// - `state`: An optional random `String`. - /// - `total`: An optional random `u64` value. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - (any::(), any::>(), any::>()) - .prop_map(|(count, state, total)| Ticks { - count: count as u64, - state, - total: total.map(|n| n as u64), - }) - .boxed() - } -} - -impl Arbitrary for Progress { - /// Implements the `Arbitrary` trait for `Progress` to generate random instances - /// for property-based testing using the `proptest` framework. - /// - /// # Details - /// - Randomly generates one of the following variants: - /// - `Ticks` with a random `Ticks` value. - /// - `Notification` with a random `Notification` value. - /// - `Stopped` as a constant value. - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(Progress::Ticks), - any::().prop_map(Progress::Notification), - Just(Progress::Stopped), - ] - .boxed() - } -} - -test_msg!(Progress, TESTS_USECASE_COUNT); diff --git a/application/apps/indexer/stypes/src/tests.rs b/application/apps/indexer/stypes/src/tests.rs deleted file mode 100644 index abba1c9947..0000000000 --- a/application/apps/indexer/stypes/src/tests.rs +++ /dev/null @@ -1,231 +0,0 @@ -#[cfg(feature = "test_and_gen")] -use std::path::PathBuf; -/// The number of test cases to generate for use in test scenarios. -#[cfg(feature = "test_and_gen")] -pub const TESTS_USECASE_COUNT: usize = 100; - -/// The name of the environment variable that specifies the path for storing test data. -/// If this variable is not set, the default path will be used. -#[cfg(feature = "test_and_gen")] -pub const OUTPUT_PATH_ENVVAR: &str = "CHIPMUNK_PROTOCOL_TEST_OUTPUT"; - -/// This function returns the path for writing test data (for testing in a different context). -/// The function checks the value of the `CHIPMUNK_PROTOCOL_TEST_OUTPUT` environment variable. -/// If the variable is defined, its value will be used as the path for writing test data. -#[cfg(feature = "test_and_gen")] -pub fn get_output_path() -> Result { - std::env::var(OUTPUT_PATH_ENVVAR) - .map_err(|err| err.to_string()) - .and_then(|s| { - if s.is_empty() { - Err(String::from("No valid path")) - } else { - Ok(s) - } - }) - .map(PathBuf::from) -} - -/// The `test_msg` macro creates a `proptest` for the specified data type. The macro also supports -/// generic types. For example: -/// ```ignore -/// test_msg!(Progress, 10); -/// test_msg!(CommandOutcome<()>, 10); -/// test_msg!(CommandOutcome, 10); -/// test_msg!(CommandOutcome>, 10); -/// ``` -/// The second numeric argument specifies the number of variants to generate for each type. -/// During testing, a separate directory is created for each type. For each variant of the type, -/// a file with a sequential name (e.g., `1.bin`, `2.bin`, ...) will be created. -/// -/// **WARNING**: When running tests, the folder specified in the `CHIPMUNK_PROTOCOL_TEST_OUTPUT` -/// environment variable will be completely deleted. Be extremely cautious when setting the value -/// of the `CHIPMUNK_PROTOCOL_TEST_OUTPUT` environment variable. -#[macro_export] -macro_rules! test_msg { - ($type:ident, $exp_count:expr) => { - paste::item! { - - #[cfg(feature = "test_and_gen")] - proptest! { - #![proptest_config(ProptestConfig { - max_shrink_iters: 50, - ..ProptestConfig::with_cases(500) - })] - - #[allow(non_snake_case)] - #[test] - #[ignore] - fn [< write_test_data_for_ $type >](cases in proptest::collection::vec($type::arbitrary(), $exp_count)) { - let Ok(output_path) = get_output_path() else { - return Ok(()); - }; - use std::fs::{File, create_dir_all}; - use std::io::{Write}; - use remove_dir_all::remove_dir_all; - - let dest = output_path.join(stringify!($type)); - if dest.exists() { - remove_dir_all(&dest).expect("Folder for tests has been cleaned"); - } - if !dest.exists() { - create_dir_all(&dest).expect("Folder for tests has been created"); - } - for (n, case) in cases.into_iter().enumerate() { - let bytes = case.encode(); - assert!(bytes.is_ok()); - let bytes = bytes.unwrap(); - let mut file = File::create(dest.join(format!("{n}.raw")))?; - assert!(file.write_all(&bytes).is_ok()); - assert!(file.flush().is_ok()); - let msg = $type::decode(&bytes); - if let Err(err) = &msg { - eprintln!("Decoding error: {err:?}"); - } - assert!(msg.is_ok()); - } - - } - - } - } - }; - - ($type:ident<()>, $exp_count:expr) => { - paste::item! { - - #[cfg(feature = "test_and_gen")] - proptest! { - #![proptest_config(ProptestConfig { - max_shrink_iters: 50, - ..ProptestConfig::with_cases(500) - })] - - #[allow(non_snake_case)] - #[test] - #[ignore] - fn [< write_test_data_for_ $type Void >](cases in proptest::collection::vec($type::<()>::arbitrary(), $exp_count)) { - let Ok(output_path) = get_output_path() else { - return Ok(()); - }; - use std::fs::{File, create_dir_all}; - use std::io::{Write}; - use remove_dir_all::remove_dir_all; - - let dest = output_path.join(format!("{}_Void",stringify!($type))); - if dest.exists() { - remove_dir_all(&dest).expect("Folder for tests has been cleaned"); - } - if !dest.exists() { - create_dir_all(&dest).expect("Folder for tests has been created"); - } - for (n, case) in cases.into_iter().enumerate() { - let bytes = case.encode(); - assert!(bytes.is_ok()); - let bytes = bytes.unwrap(); - let mut file = File::create(dest.join(format!("{n}.raw")))?; - assert!(file.write_all(&bytes).is_ok()); - assert!(file.flush().is_ok()); - let msg = $type::<()>::decode(&bytes); - if let Err(err) = &msg { - eprintln!("Decoding error: {err:?}"); - } - assert!(msg.is_ok()); - } - - } - - } - } - }; - - ($type:ident<$generic:ident>, $exp_count:expr) => { - paste::item! { - - #[cfg(feature = "test_and_gen")] - proptest! { - #![proptest_config(ProptestConfig { - max_shrink_iters: 50, - ..ProptestConfig::with_cases(500) - })] - - #[allow(non_snake_case)] - #[test] - #[ignore] - fn [< write_test_data_for_ $type $generic >](cases in proptest::collection::vec($type::<$generic>::arbitrary(), $exp_count)) { - let Ok(output_path) = get_output_path() else { - return Ok(()); - }; - use std::fs::{File, create_dir_all}; - use std::io::{Write}; - use remove_dir_all::remove_dir_all; - - let dest = output_path.join(format!("{}_{}",stringify!($type), stringify!($generic))); - if dest.exists() { - remove_dir_all(&dest).expect("Folder for tests has been cleaned"); - } - if !dest.exists() { - create_dir_all(&dest).expect("Folder for tests has been created"); - } - for (n, case) in cases.into_iter().enumerate() { - let bytes = case.encode(); - assert!(bytes.is_ok()); - let bytes = bytes.unwrap(); - let mut file = File::create(dest.join(format!("{n}.raw")))?; - assert!(file.write_all(&bytes).is_ok()); - assert!(file.flush().is_ok()); - let msg = $type::<$generic>::decode(&bytes); - if let Err(err) = &msg { - eprintln!("Decoding error: {err:?}"); - } - } - } - } - } - }; - - ($type:ident<$generic:ident<$nested:ident>>, $exp_count:expr) => { - paste::item! { - - #[cfg(feature = "test_and_gen")] - proptest! { - #![proptest_config(ProptestConfig { - max_shrink_iters: 50, - ..ProptestConfig::with_cases(500) - })] - - #[allow(non_snake_case)] - #[test] - #[ignore] - fn [< write_test_data_for_ $type $generic $nested>](cases in proptest::collection::vec($type::<$generic<$nested>>::arbitrary(), $exp_count)) { - let Ok(output_path) = get_output_path() else { - return Ok(()); - }; - use std::fs::{File, create_dir_all}; - use std::io::{Write}; - use remove_dir_all::remove_dir_all; - - let dest = output_path.join(format!("{}_{}_{}",stringify!($type), stringify!($generic), stringify!($nested))); - if dest.exists() { - remove_dir_all(&dest).expect("Folder for tests has been cleaned"); - } - if !dest.exists() { - create_dir_all(&dest).expect("Folder for tests has been created"); - } - for (n, case) in cases.into_iter().enumerate() { - let bytes = case.encode(); - assert!(bytes.is_ok()); - let bytes = bytes.unwrap(); - let mut file = File::create(dest.join(format!("{n}.raw")))?; - assert!(file.write_all(&bytes).is_ok()); - assert!(file.flush().is_ok()); - let msg = $type::<$generic<$nested>>::decode(&bytes); - if let Err(err) = &msg { - eprintln!("Decoding error: {err:?}"); - } - } - } - } - } - }; -} diff --git a/application/apps/indexer/tools/extend/.gitignore b/application/apps/indexer/tools/extend/.gitignore deleted file mode 100644 index 03314f77b5..0000000000 --- a/application/apps/indexer/tools/extend/.gitignore +++ /dev/null @@ -1 +0,0 @@ -Cargo.lock diff --git a/application/apps/indexer/tools/extend/Cargo.toml b/application/apps/indexer/tools/extend/Cargo.toml deleted file mode 100644 index 3ce3a25807..0000000000 --- a/application/apps/indexer/tools/extend/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "extend" -version = "0.1.0" -edition = "2018" - -[lib] -proc-macro = true - -[lints] -workspace = true - -[dependencies] -proc-macro2 = "1.0" -quote = "1.0" -syn = { version="2.0", features=["full","fold"] } diff --git a/application/apps/indexer/tools/extend/src/lib.rs b/application/apps/indexer/tools/extend/src/lib.rs deleted file mode 100644 index 4e87171ad7..0000000000 --- a/application/apps/indexer/tools/extend/src/lib.rs +++ /dev/null @@ -1,75 +0,0 @@ -/// The `extend` crate is designed to simplify the generation of `encode` and `decode` methods -/// for every public type in the `stypes` crate. -/// -/// For example, the following code: -/// -/// ```ignore -/// #[derive(Debug, Serialize, Deserialize, Clone)] -/// #[extend::encode_decode] -/// pub struct Notification { -/// pub severity: Severity, -/// pub content: String, -/// pub line: Option, -/// } -/// ``` -/// -/// Is transformed into: -/// -/// ```ignore -/// #[derive(Debug, Serialize, Deserialize, Clone)] -/// pub struct Notification { -/// pub severity: Severity, -/// pub content: String, -/// pub line: Option, -/// } -/// -/// impl Notification { -/// pub fn encode(&self) -> Result, String> { -/// bincode::serialize(self).map_err(|e| e.to_string()) -/// } -/// -/// pub fn decode(buf: &[u8]) -> Result { -/// bincode::deserialize(buf).map_err(|e| e.to_string()) -/// } -/// } -/// ``` -use proc_macro::TokenStream; -use quote::quote; -use syn::{parse_macro_input, Item}; - -#[proc_macro_attribute] -pub fn encode_decode(_: TokenStream, input: TokenStream) -> TokenStream { - let item = parse_macro_input!(input as syn::Item); - - let item_clone = item.clone(); - - let (entity_name, generics) = match &item { - Item::Struct(s) => (&s.ident, &s.generics), - Item::Enum(e) => (&e.ident, &e.generics), - _ => { - return syn::Error::new_spanned( - &item, - "encode_decode can be applied only to structs and enums", - ) - .to_compile_error() - .into(); - } - }; - - let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); - - TokenStream::from(quote! { - - #item_clone - - impl #impl_generics #entity_name #ty_generics #where_clause { - pub fn encode(&self) -> Result, String> { - bincode::serialize(self).map_err(|e| e.to_string()) - } - - pub fn decode(buf: &[u8]) -> Result { - bincode::deserialize(buf).map_err(|e| e.to_string()) - } - } - }) -} diff --git a/application/apps/protocol/.gitignore b/application/apps/protocol/.gitignore deleted file mode 100644 index 5c01e4e0c4..0000000000 --- a/application/apps/protocol/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -./target -!./pkg -!*.js -Cargo.lock diff --git a/application/apps/protocol/Cargo.toml b/application/apps/protocol/Cargo.toml deleted file mode 100644 index ee1919cddc..0000000000 --- a/application/apps/protocol/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "protocol" -version = "0.1.0" -edition = "2024" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -serde-wasm-bindgen = "0.6" -wasm-bindgen = "0.2" -serde = { version = "1.0", features = ["derive"] } -thiserror = "2.0" -wasm-bindgen-test = "0.3" -stypes = { path = "../indexer/stypes"} -paste = "1.0" - diff --git a/application/apps/protocol/src/err.rs b/application/apps/protocol/src/err.rs deleted file mode 100644 index 7eb8ed8aab..0000000000 --- a/application/apps/protocol/src/err.rs +++ /dev/null @@ -1,34 +0,0 @@ -use thiserror::Error; -use wasm_bindgen::JsValue; - -#[derive(Error, Debug)] -pub enum E { - #[error("Missed field {0}")] - MissedField(String), - #[error("Invalid value of: {0}")] - InvalidValue(String), - #[error("Codec decode error: {0}")] - CodecDecodeError(String), - #[error("Codec encode error: {0}")] - CodecEncodeError(String), - #[error("Decode error: {0}")] - DecodeError(String), - #[error("Encode error: {0}")] - EncodeError(String), - #[error("Binding error: {0}")] - Binding(serde_wasm_bindgen::Error), - #[error("Not yet implemented feature")] - NotImplemented, -} - -impl From for E { - fn from(err: serde_wasm_bindgen::Error) -> Self { - Self::Binding(err) - } -} - -impl From for JsValue { - fn from(val: E) -> Self { - JsValue::from_str(&val.to_string()) - } -} diff --git a/application/apps/protocol/src/generate.rs b/application/apps/protocol/src/generate.rs deleted file mode 100644 index 40d8536720..0000000000 --- a/application/apps/protocol/src/generate.rs +++ /dev/null @@ -1,106 +0,0 @@ -#[macro_export] -macro_rules! gen_encode_decode_fns { - // All regular use cases: gen_encode_decode_fns!(ObserveOptions); - ($type:ident) => { - paste::item! { - #[wasm_bindgen] - #[allow(non_snake_case)] - pub fn [](buf: &[u8]) -> Result { - let serializer = Serializer::new() - .serialize_missing_as_null(true) - .serialize_maps_as_objects(false) - .serialize_large_number_types_as_bigints(false); - $type::decode(buf) - .map_err(E::CodecDecodeError)? - .serialize(&serializer) - .map_err(|e| E::DecodeError(e.to_string())) - } - - #[wasm_bindgen] - #[allow(non_snake_case)] - pub fn [](val: JsValue) -> Result, E> { - from_value::<$type>(val)? - .encode() - .map_err(E::DecodeError) - } - } - }; - - // Subtype returns void: gen_encode_decode_fns!(CommandOutcome<()>); - ($type:ident<()>) => { - paste::item! { - #[wasm_bindgen] - #[allow(non_snake_case)] - pub fn [](buf: &[u8]) -> Result { - let serializer = Serializer::new() - .serialize_missing_as_null(true) - .serialize_maps_as_objects(false) - .serialize_large_number_types_as_bigints(false); - $type::<()>::decode(buf) - .map_err(E::CodecDecodeError)? - .serialize(&serializer) - .map_err(|e| E::DecodeError(e.to_string())) - } - - #[wasm_bindgen] - #[allow(non_snake_case)] - pub fn [](val: JsValue) -> Result, E> { - from_value::<$type::<()>>(val)? - .encode() - .map_err(E::DecodeError) - } - } - }; - - // With subtypes: gen_encode_decode_fns!(CommandOutcome); - ($type:ident<$generic:ident>) => { - paste::item! { - #[wasm_bindgen] - #[allow(non_snake_case)] - pub fn [](buf: &[u8]) -> Result { - let serializer = Serializer::new() - .serialize_missing_as_null(true) - .serialize_maps_as_objects(false) - .serialize_large_number_types_as_bigints(false); - $type::<$generic>::decode(buf) - .map_err(E::CodecDecodeError)? - .serialize(&serializer) - .map_err(|e| E::DecodeError(e.to_string())) - } - - #[wasm_bindgen] - #[allow(non_snake_case)] - pub fn [](val: JsValue) -> Result, E> { - from_value::<$type::<$generic>>(val)? - .encode() - .map_err(E::DecodeError) - } - } - }; - - // With nested subtypes: gen_encode_decode_fns!(CommandOutcome>); - ($type:ident<$generic:ident<$nested:ident>>) => { - paste::item! { - #[wasm_bindgen] - #[allow(non_snake_case)] - pub fn [](buf: &[u8]) -> Result { - let serializer = Serializer::new() - .serialize_missing_as_null(true) - .serialize_maps_as_objects(false) - .serialize_large_number_types_as_bigints(false); - $type::<$generic<$nested>>::decode(buf) - .map_err(E::CodecDecodeError)? - .serialize(&serializer) - .map_err(|e| E::DecodeError(e.to_string())) - } - - #[wasm_bindgen] - #[allow(non_snake_case)] - pub fn [](val: JsValue) -> Result, E> { - from_value::<$type::<$generic<$nested>>>(val)? - .encode() - .map_err(E::DecodeError) - } - } - }; -} diff --git a/application/apps/protocol/src/lib.rs b/application/apps/protocol/src/lib.rs deleted file mode 100644 index 4239bd50aa..0000000000 --- a/application/apps/protocol/src/lib.rs +++ /dev/null @@ -1,208 +0,0 @@ -/// The `protocol` crate is a WebAssembly-wrapped version of the `stypes` crate, designed for encoding -/// and decoding message types used both on the Rust side and the Node.js side (including client-side code). -/// -/// Code generation for `wasm_bindgen` is handled by the `gen_encode_decode_fns` macro, which sets up -/// the necessary encode/decode functions. For example: -/// -/// ``` -/// gen_encode_decode_fns!(ObserveOptions); -/// ``` -/// -/// This will generate: -/// -/// ```ignore -/// #[wasm_bindgen] -/// #[allow(non_snake_case)] -/// pub fn decodeObserveOptions(buf: &[u8]) -> Result { -/// let serializer = Serializer::new() -/// .serialize_missing_as_null(true) -/// .serialize_maps_as_objects(false) -/// .serialize_large_number_types_as_bigints(false); -/// -/// ObserveOptions::decode(buf) -/// .map_err(E::CodecDecodeError)? -/// .serialize(&serializer) -/// .map_err(|e| E::DecodeError(e.to_string())) -/// } -/// -/// #[wasm_bindgen] -/// #[allow(non_snake_case)] -/// pub fn encodeObserveOptions(val: JsValue) -> Result, E> { -/// from_value::(val)? -/// .encode() -/// .map_err(E::DecodeError) -/// } -/// ``` -/// -/// As a result, on the Node.js side you can directly decode and encode `ObserveOptions`: -/// -/// ```ignore -/// import * as protocol from "protocol"; -/// -/// // Decoding -/// const bytes: Uint8Array = get_bytes(); -/// const msg = protocol.decodeObserveOptions(bytes); -/// -/// // Encoding -/// const obj: ObserveOptions = ...; -/// cosnt bytes = protocol.encodeObserveOptions(obj); -/// ``` -/// -/// It's important to note that `wasm_bindgen` does not generate type definitions (`.d.ts` files), -/// so the decoding function will return `any`, and the encoding function will accept `any`. -/// Ensuring that the correct types are passed is therefore beyond the scope of this crate. -/// While supplying an invalid byte sequence (one that doesn't match the expected data type) -/// will cause an error to be thrown, it is theoretically possible (though unlikely) -/// that an incorrect byte sequence could decode into a valid but unexpected type. -/// Therefore, when using this crate, ensure that the expected data type aligns with the chosen -/// decode function. -/// -/// ## Adding New Types -/// To add new types, follow the steps below. -/// -/// ### Updating `stypes` -/// - Add your new type to the `stypes` crate. -/// - **Important:** Ensure that `proptest` tests are implemented in `stypes` for the new type. -/// This is a mandatory requirement when introducing any new type. -/// - If the type is directly used in `rs-bindings`, add an implementation of the trait `TryIntoJs`. This can -/// be easily done by using the macro `try_into_js`. -/// - Add TypeScript definitions. This step can also be done mostly automatically by adding -/// `#[cfg_attr(test, derive(TS), ts(export, export_to = "module_name.ts"))]` above the -/// definition of your type. Make sure you are using the correct `module_name`. The TypeScript type -/// definition will be placed into `application/apps/indexer/stypes/bindings/module_name.ts`. -/// Writing of types happens by executing tests (`cargo test`). -/// As soon as a new TypeScript definition has been created, you have to manually copy it into -/// `application/platform/types/bindings`. -/// **Important:** Do not remove `application/apps/indexer/stypes/bindings/index.ts`. This file -/// isn't generated and is created manually. If you are introducing a new -/// module along with your type, please add a reference to it in the `index.ts` file. -/// -/// ### Updating `protocol` -/// Once the type is added to `stypes`, simply reference it in `protocol`: -/// ```ignore -/// gen_encode_decode_fns!(MyRecentlyAddedType); -/// ``` -/// -/// ### Updating test in `ts-bindings` -/// As soon as type was added, you have to update map in `application/apps/rustcore/ts-bindings/spec/session.protocol.spec.ts`. -/// Add name of your type and link it to related decode function -/// -/// ``` -/// const MAP: { [key: string]: (buf: Uint8Array) => any } = { -/// AroundIndexes: protocol.decodeAroundIndexes, -/// ... -/// AttachmentList: protocol.decodeAttachmentList, -/// } -/// ``` -/// -/// ### Verification -/// To verify your changes, run the `test.sh` script. This test uses `proptest` in `stypes` to -/// randomly generate values for all types, then serialize them as bytes to temporary files. Next, -/// it uses `proptest` within `ts-bindings` to decode all these messages. -/// -/// - If the process fails, `test.sh` will report an error. -/// - If it succeeds, you can consider the new type successfully integrated. -mod err; -mod generate; - -pub(crate) use err::*; -pub(crate) use serde::Serialize; -pub(crate) use serde_wasm_bindgen::{Serializer, from_value}; -pub(crate) use stypes::*; -pub(crate) use wasm_bindgen::prelude::*; - -gen_encode_decode_fns!(ObserveOptions); -gen_encode_decode_fns!(MulticastInfo); -gen_encode_decode_fns!(UdpConnectionInfo); -gen_encode_decode_fns!(ParserType); -gen_encode_decode_fns!(DltParserSettings); -gen_encode_decode_fns!(SomeIpParserSettings); -gen_encode_decode_fns!(Transport); -gen_encode_decode_fns!(ProcessTransportConfig); -gen_encode_decode_fns!(SerialTransportConfig); -gen_encode_decode_fns!(TCPTransportConfig); -gen_encode_decode_fns!(UDPTransportConfig); -gen_encode_decode_fns!(FileFormat); -gen_encode_decode_fns!(ObserveOrigin); -gen_encode_decode_fns!(FoldersScanningResult); -gen_encode_decode_fns!(DltStatisticInfo); -gen_encode_decode_fns!(ShellType); -gen_encode_decode_fns!(ShellProfile); -gen_encode_decode_fns!(ProfileList); -gen_encode_decode_fns!(PluginParserSettings); -gen_encode_decode_fns!(PluginParserGeneralSettings); -gen_encode_decode_fns!(PluginByteSourceSettings); -gen_encode_decode_fns!(PluginByteSourceGeneralSettings); -gen_encode_decode_fns!(PluginConfigItem); -gen_encode_decode_fns!(PluginConfigValue); -gen_encode_decode_fns!(PluginConfigSchemaType); -gen_encode_decode_fns!(PluginConfigSchemaItem); -gen_encode_decode_fns!(PluginEntity); -gen_encode_decode_fns!(PluginLogLevel); -gen_encode_decode_fns!(PluginLogMessage); -gen_encode_decode_fns!(PluginRunData); -gen_encode_decode_fns!(PluginMetadata); -gen_encode_decode_fns!(PluginType); -gen_encode_decode_fns!(PluginInfo); -gen_encode_decode_fns!(InvalidPluginEntity); -gen_encode_decode_fns!(SemanticVersion); -gen_encode_decode_fns!(RenderOptions); -gen_encode_decode_fns!(ParserRenderOptions); -gen_encode_decode_fns!(ColumnsRenderOptions); -gen_encode_decode_fns!(ColumnInfo); -gen_encode_decode_fns!(PluginsList); -gen_encode_decode_fns!(InvalidPluginsList); -gen_encode_decode_fns!(PluginsPathsList); -gen_encode_decode_fns!(CommandOutcome); -gen_encode_decode_fns!(CommandOutcome); -gen_encode_decode_fns!(CommandOutcome); -gen_encode_decode_fns!(CommandOutcome>); -gen_encode_decode_fns!(CommandOutcome>); -gen_encode_decode_fns!(CommandOutcome>); -gen_encode_decode_fns!(CommandOutcome); -gen_encode_decode_fns!(CommandOutcome); -gen_encode_decode_fns!(CommandOutcome); -gen_encode_decode_fns!(CommandOutcome); -gen_encode_decode_fns!(CommandOutcome); -gen_encode_decode_fns!(CommandOutcome<()>); -gen_encode_decode_fns!(CommandOutcome); -gen_encode_decode_fns!(CommandOutcome>); -gen_encode_decode_fns!(CommandOutcome); -gen_encode_decode_fns!(CommandOutcome); -gen_encode_decode_fns!(ComputationError); -gen_encode_decode_fns!(CallbackEvent); -gen_encode_decode_fns!(NativeError); -gen_encode_decode_fns!(NativeErrorKind); -gen_encode_decode_fns!(Severity); -gen_encode_decode_fns!(OperationDone); -gen_encode_decode_fns!(LifecycleTransition); -gen_encode_decode_fns!(AttachmentInfo); -gen_encode_decode_fns!(AttachmentList); -gen_encode_decode_fns!(Notification); -gen_encode_decode_fns!(Progress); -gen_encode_decode_fns!(Ticks); -gen_encode_decode_fns!(Ranges); -gen_encode_decode_fns!(SourceDefinition); -gen_encode_decode_fns!(Sources); -gen_encode_decode_fns!(SdeRequest); -gen_encode_decode_fns!(SdeResponse); -gen_encode_decode_fns!(GrabbedElement); -gen_encode_decode_fns!(GrabbedElementList); -gen_encode_decode_fns!(AroundIndexes); -gen_encode_decode_fns!(FilterMatch); -gen_encode_decode_fns!(FilterMatchList); -gen_encode_decode_fns!(FolderEntity); -gen_encode_decode_fns!(FolderEntityDetails); -gen_encode_decode_fns!(FolderEntityType); -gen_encode_decode_fns!(SerialPortsList); -gen_encode_decode_fns!(ExtractedMatchValue); -gen_encode_decode_fns!(ResultExtractedMatchValues); -gen_encode_decode_fns!(ResultU64); -gen_encode_decode_fns!(ResultBool); -gen_encode_decode_fns!(ResultSleep); -gen_encode_decode_fns!(NearestPosition); -gen_encode_decode_fns!(ResultNearestPosition); -gen_encode_decode_fns!(Point); -gen_encode_decode_fns!(ResultSearchValues); -gen_encode_decode_fns!(ResultScaledDistribution); -gen_encode_decode_fns!(DltLevelDistribution); diff --git a/application/apps/protocol/test.sh b/application/apps/protocol/test.sh deleted file mode 100755 index 4abf1550f0..0000000000 --- a/application/apps/protocol/test.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -reset -echo " -====== WARNING =============================================================== -This script performs an operation to DELETE ALL the contents of -the folder specified in the environment variable CHIPMUNK_PROTOCOL_TEST_OUTPUT. -Before proceeding, make sure that the CHIPMUNK_PROTOCOL_TEST_OUTPUT variable -contains the correct path. If the CHIPMUNK_PROTOCOL_TEST_OUTPUT variable is -not defined, test data will be written to /\$TMP/stypes_tests. -====== WARNING =============================================================== -" -read -p "Do you want to continue? (y/N): " response - -response=${response,,} -if [[ "$response" != "y" ]]; then - echo "Operation aborted." - exit 1 -fi - -echo "Build wasm module" -cargo clean -wasm-pack build --target nodejs - -echo "Create test use-cases & Run Proptests" -cd ../indexer/stypes -export CHIPMUNK_PROTOCOL_TEST_OUTPUT="/tmp/stypes_test/" -cargo test --release --features "test_and_gen" -- --nocapture --ignored - -echo "Run tests" -export JASMIN_TEST_BLOCKS_LOGS=on -cd ../../rustcore/ts-bindings -rm -rf ./node_modules -rm -rf ./spec/build -cargo chipmunk test wrapper -u print -s spec/build/spec/session.protocol.spec.js diff --git a/application/apps/rustcore/rs-bindings/Cargo.lock b/application/apps/rustcore/rs-bindings/Cargo.lock deleted file mode 100644 index ae75cb162b..0000000000 --- a/application/apps/rustcore/rs-bindings/Cargo.lock +++ /dev/null @@ -1,4585 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "ambient-authority" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - -[[package]] -name = "arbitrary" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "pin-project-lite", - "slab", -] - -[[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel 2.3.1", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite", - "once_cell", -] - -[[package]] -name = "async-io" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" -dependencies = [ - "async-lock", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix 1.0.7", - "slab", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener 5.4.0", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-process" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" -dependencies = [ - "async-channel 2.3.1", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener 5.4.0", - "futures-lite", - "rustix 1.0.7", - "tracing", -] - -[[package]] -name = "async-signal" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix 1.0.7", - "signal-hook-registry", - "slab", - "windows-sys 0.59.0", -] - -[[package]] -name = "async-std" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24" -dependencies = [ - "async-channel 1.9.0", - "async-global-executor", - "async-io", - "async-lock", - "async-process", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets", -] - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" - -[[package]] -name = "blake3" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", - "rayon-core", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blocking" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" -dependencies = [ - "async-channel 2.3.1", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - -[[package]] -name = "bstr" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" -dependencies = [ - "memchr", - "regex-automata 0.4.9", - "serde", -] - -[[package]] -name = "bufread" -version = "4.0.0-alpha.1" - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" -dependencies = [ - "allocator-api2", -] - -[[package]] -name = "bytecount" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "cap-fs-ext" -version = "3.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e41cc18551193fe8fa6f15c1e3c799bc5ec9e2cfbfaa8ed46f37013e3e6c173c" -dependencies = [ - "cap-primitives", - "cap-std", - "io-lifetimes", - "windows-sys 0.59.0", -] - -[[package]] -name = "cap-net-ext" -version = "3.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f83833816c66c986e913b22ac887cec216ea09301802054316fc5301809702c" -dependencies = [ - "cap-primitives", - "cap-std", - "rustix 1.0.7", - "smallvec", -] - -[[package]] -name = "cap-primitives" -version = "3.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a1e394ed14f39f8bc26f59d4c0c010dbe7f0a1b9bafff451b1f98b67c8af62a" -dependencies = [ - "ambient-authority", - "fs-set-times", - "io-extras", - "io-lifetimes", - "ipnet", - "maybe-owned", - "rustix 1.0.7", - "rustix-linux-procfs", - "windows-sys 0.59.0", - "winx", -] - -[[package]] -name = "cap-rand" -version = "3.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0acb89ccf798a28683f00089d0630dfaceec087234eae0d308c05ddeaa941b40" -dependencies = [ - "ambient-authority", - "rand 0.8.5", -] - -[[package]] -name = "cap-std" -version = "3.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c0355ca583dd58f176c3c12489d684163861ede3c9efa6fd8bba314c984189" -dependencies = [ - "cap-primitives", - "io-extras", - "io-lifetimes", - "rustix 1.0.7", -] - -[[package]] -name = "cap-time-ext" -version = "3.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "491af520b8770085daa0466978c75db90368c71896523f2464214e38359b1a5b" -dependencies = [ - "ambient-authority", - "cap-primitives", - "iana-time-zone", - "once_cell", - "rustix 1.0.7", - "winx", -] - -[[package]] -name = "cc" -version = "1.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chrono" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-link", -] - -[[package]] -name = "chrono-tz" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efdce149c370f133a071ca8ef6ea340b7b88748ab0810097a9e2976eaa34b4f3" -dependencies = [ - "chrono", - "chrono-tz-build", - "phf", -] - -[[package]] -name = "chrono-tz-build" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f10f8c9340e31fc120ff885fcdb54a0b48e474bbd77cab557f0c30a3e569402" -dependencies = [ - "parse-zoneinfo", - "phf_codegen", -] - -[[package]] -name = "circular" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fc239e0f6cb375d2402d48afb92f76f5404fd1df208a41930ec81eda078bea" - -[[package]] -name = "cobs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpp_demangle" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "cranelift-assembler-x64" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ff8e35182c7372df00447cb90a04e584e032c42b9b9b6e8c50ddaaf0d7900d5" -dependencies = [ - "cranelift-assembler-x64-meta", -] - -[[package]] -name = "cranelift-assembler-x64-meta" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14220f9c2698015c3b94dc6b84ae045c1c45509ddc406e43c6139252757fdb7a" -dependencies = [ - "cranelift-srcgen", -] - -[[package]] -name = "cranelift-bforest" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d372ef2777ceefd75829e1390211ac240e9196bc60699218f7ea2419038288ee" -dependencies = [ - "cranelift-entity", -] - -[[package]] -name = "cranelift-bitset" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56323783e423818fa89ce8078e90a3913d2a6e0810399bfce8ebd7ee87baa81f" -dependencies = [ - "serde", - "serde_derive", -] - -[[package]] -name = "cranelift-codegen" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74ffb780aab6186c6e9ba26519654b1ac55a09c0a866f6088a4efbbd84da68ed" -dependencies = [ - "bumpalo", - "cranelift-assembler-x64", - "cranelift-bforest", - "cranelift-bitset", - "cranelift-codegen-meta", - "cranelift-codegen-shared", - "cranelift-control", - "cranelift-entity", - "cranelift-isle", - "gimli", - "hashbrown", - "log", - "pulley-interpreter", - "regalloc2", - "rustc-hash", - "serde", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-codegen-meta" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c23ef13814d3b39c869650d5961128cbbecad83fbdff4e6836a03ecf6862d7ed" -dependencies = [ - "cranelift-assembler-x64-meta", - "cranelift-codegen-shared", - "cranelift-srcgen", - "pulley-interpreter", -] - -[[package]] -name = "cranelift-codegen-shared" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f623300657679f847803ce80811454bfff89cea4f6bf684be5c468d4a73631" - -[[package]] -name = "cranelift-control" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f4168af69989aa6b91fab46799ed4df6096f3209f4a6c8fb4358f49c60188f" -dependencies = [ - "arbitrary", -] - -[[package]] -name = "cranelift-entity" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6fa9bae1c8de26d71ac2162f069447610fd91e7780cb480ee0d76ac81eabb8" -dependencies = [ - "cranelift-bitset", - "serde", - "serde_derive", -] - -[[package]] -name = "cranelift-frontend" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8219205608aa0b0e6769b580284a7e055c7e0c323c1041cde7ca078add3e412" -dependencies = [ - "cranelift-codegen", - "log", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "cranelift-isle" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "588d0c5964f10860b04043e55aab26d7f7a206b0fd4f10c5260e8aa5773832bd" - -[[package]] -name = "cranelift-native" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ed3c94cb97b14f92b6a94a1d45ef8c851f6a2ad9114e5d91d233f7da638fed" -dependencies = [ - "cranelift-codegen", - "libc", - "target-lexicon", -] - -[[package]] -name = "cranelift-srcgen" -version = "0.120.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85256fac1519a7d25a040c1d850fba67478f3f021ad5fdf738ba4425ee862dbf" - -[[package]] -name = "crc32fast" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ctor" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" -dependencies = [ - "quote", - "syn 2.0.101", -] - -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.101", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "debugid" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" -dependencies = [ - "uuid", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn 2.0.101", -] - -[[package]] -name = "destructure_traitobject" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dir_checksum" -version = "0.1.0" -dependencies = [ - "blake3", - "ignore", - "log", - "memmap2", - "rayon", - "thiserror 2.0.12", -] - -[[package]] -name = "directories-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users 0.5.0", - "windows-sys 0.59.0", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users 0.4.6", - "winapi", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "dlt-core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3360c83b1e02a2543d44fa9ba640f0199c43bcde51abd7fa113f1a25d11f17a1" -dependencies = [ - "byteorder", - "bytes", - "futures", - "log", - "memchr", - "nom", - "quick-xml 0.29.0", - "rustc-hash", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - -[[package]] -name = "embedded-io" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "encoding_rs_io" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cc3c5651fb62ab8aa3103998dade57efdd028544bd300516baa31840c252a83" -dependencies = [ - "encoding_rs", -] - -[[package]] -name = "env_home" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe" - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "etherparse" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d8a704b617484e9d867a0423cd45f7577f008c4068e2e33378f8d3860a6d73" -dependencies = [ - "arrayvec", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "5.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener 5.4.0", - "pin-project-lite", -] - -[[package]] -name = "extend" -version = "0.1.0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fd-lock" -version = "4.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce92ff622d6dadf7349484f42c93271a0d49b7cc4d466a936405bacbe10aa78" -dependencies = [ - "cfg-if", - "rustix 1.0.7", - "windows-sys 0.59.0", -] - -[[package]] -name = "file-tools" -version = "4.0.0-alpha.1" -dependencies = [ - "anyhow", -] - -[[package]] -name = "fluvio-future" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb6426efa0dc4cc12226634b5b2657237b67028837e79ef4ad4706c4f211bd9" -dependencies = [ - "anyhow", - "async-std", - "cfg-if", - "thiserror 2.0.12", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs-set-times" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a" -dependencies = [ - "io-lifetimes", - "rustix 1.0.7", - "windows-sys 0.59.0", -] - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-lite" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "fxprof-processed-profile" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd" -dependencies = [ - "bitflags 2.9.1", - "debugid", - "fxhash", - "serde", - "serde_json", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", -] - -[[package]] -name = "ghost" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8661f18e73000bcea2f0d68262eb8ac1b1e951e10eb936d3f95b36201c136d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" -dependencies = [ - "fallible-iterator", - "indexmap", - "stable_deref_trait", -] - -[[package]] -name = "globset" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "grep-matcher" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47a3141a10a43acfedc7c98a60a834d7ba00dfe7bec9071cbfc19b55b292ac02" -dependencies = [ - "memchr", -] - -[[package]] -name = "grep-regex" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edd147c7e3296e7a26bd3a81345ce849557d5a8e48ed88f736074e760f91f7e" -dependencies = [ - "bstr", - "grep-matcher", - "log", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "grep-searcher" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b6c14b3fc2e0a107d6604d3231dec0509e691e62447104bc385a46a7892cda" -dependencies = [ - "bstr", - "encoding_rs", - "encoding_rs_io", - "grep-matcher", - "log", - "memchr", - "memmap2", -] - -[[package]] -name = "hashbrown" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" -dependencies = [ - "foldhash", - "serde", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" - -[[package]] -name = "http_req" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92208b0986f414edaca8ede2c6962c979309346a9e8e19d07d0a7879aae1549e" -dependencies = [ - "native-tls", - "unicase", -] - -[[package]] -name = "humantime" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" - -[[package]] -name = "iana-time-zone" -version = "0.1.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" - -[[package]] -name = "icu_properties" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "potential_utf", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" - -[[package]] -name = "icu_provider" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" -dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "id-arena" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "ignore" -version = "0.4.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" -dependencies = [ - "crossbeam-deque", - "globset", - "log", - "memchr", - "regex-automata 0.4.9", - "same-file", - "walkdir", - "winapi-util", -] - -[[package]] -name = "indexer_base" -version = "4.0.0-alpha.1" -dependencies = [ - "log", - "serde", - "thiserror 2.0.12", -] - -[[package]] -name = "indexmap" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" -dependencies = [ - "equivalent", - "hashbrown", - "serde", -] - -[[package]] -name = "inventory" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb5160c60ba1e809707918ee329adb99d222888155835c6feedba19f6c3fd4" -dependencies = [ - "ctor 0.1.26", - "ghost", - "inventory-impl", -] - -[[package]] -name = "inventory-impl" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e41b53715c6f0c4be49510bb82dee2c1e51c8586d885abe65396e82ed518548" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "io-extras" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2285ddfe3054097ef4b2fe909ef8c3bcd1ea52a8f0d274416caebeef39f04a65" -dependencies = [ - "io-lifetimes", - "windows-sys 0.59.0", -] - -[[package]] -name = "io-kit-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" -dependencies = [ - "core-foundation-sys", - "mach2", -] - -[[package]] -name = "io-lifetimes" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983" - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "ittapi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b996fe614c41395cdaedf3cf408a9534851090959d90d54a535f675550b64b1" -dependencies = [ - "anyhow", - "ittapi-sys", - "log", -] - -[[package]] -name = "ittapi-sys" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f5385394064fa2c886205dba02598013ce83d3e92d33dbdc0c52fe0e7bf4fc" -dependencies = [ - "cc", -] - -[[package]] -name = "jobserver" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" -dependencies = [ - "getrandom 0.3.3", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "leb128" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" - -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - -[[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - -[[package]] -name = "libm" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" - -[[package]] -name = "libmimalloc-sys" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec9d6fac27761dabcd4ee73571cdb06b7022dc99089acbe5435691edffaac0f4" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.9.1", - "libc", -] - -[[package]] -name = "libudev" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b324152da65df7bb95acfcaab55e3097ceaab02fb19b228a9eb74d55f135e0" -dependencies = [ - "libc", - "libudev-sys", -] - -[[package]] -name = "libudev-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "litemap" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" - -[[package]] -name = "lock_api" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" -dependencies = [ - "serde", - "value-bag", -] - -[[package]] -name = "log-mdc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" - -[[package]] -name = "log4rs" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0816135ae15bd0391cf284eab37e6e3ee0a6ee63d2ceeb659862bd8d0a984ca6" -dependencies = [ - "anyhow", - "arc-swap", - "chrono", - "derivative", - "fnv", - "humantime", - "libc", - "log", - "log-mdc", - "once_cell", - "parking_lot", - "rand 0.8.5", - "serde", - "serde-value", - "serde_json", - "serde_yaml", - "thiserror 1.0.69", - "thread-id", - "typemap-ors", - "winapi", -] - -[[package]] -name = "mach2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" -dependencies = [ - "libc", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "maybe-owned" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "memfd" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" -dependencies = [ - "rustix 0.38.44", -] - -[[package]] -name = "memmap2" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", -] - -[[package]] -name = "merging" -version = "4.0.0-alpha.1" -dependencies = [ - "log", - "serde", - "serde_json", - "thiserror 2.0.12", -] - -[[package]] -name = "mimalloc" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995942f432bbb4822a7e9c3faa87a695185b0d09273ba85f097b54f4e458f2af" -dependencies = [ - "libmimalloc-sys", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" -dependencies = [ - "libc", - "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.59.0", -] - -[[package]] -name = "mio-serial" -version = "5.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "029e1f407e261176a983a6599c084efd322d9301028055c87174beac71397ba3" -dependencies = [ - "log", - "mio", - "nix 0.29.0", - "serialport", - "winapi", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nix" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", -] - -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "cfg_aliases", - "libc", -] - -[[package]] -name = "nj-build" -version = "0.3.0" -source = "git+https://github.com/infinyon/node-bindgen.git?branch=master#1c6f19b658b0acaf71a25f5f2e4d8b4d970363ad" -dependencies = [ - "cc", - "http_req", -] - -[[package]] -name = "nj-core" -version = "6.1.0" -source = "git+https://github.com/infinyon/node-bindgen.git?branch=master#1c6f19b658b0acaf71a25f5f2e4d8b4d970363ad" -dependencies = [ - "async-trait", - "ctor 0.2.9", - "fluvio-future", - "futures-lite", - "inventory", - "libc", - "nj-sys", - "num-bigint", - "pin-utils", - "serde_json", - "tracing", -] - -[[package]] -name = "nj-derive" -version = "3.4.3" -source = "git+https://github.com/infinyon/node-bindgen.git?branch=master#1c6f19b658b0acaf71a25f5f2e4d8b4d970363ad" -dependencies = [ - "Inflector", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "nj-sys" -version = "4.0.0" -source = "git+https://github.com/infinyon/node-bindgen.git?branch=master#1c6f19b658b0acaf71a25f5f2e4d8b4d970363ad" - -[[package]] -name = "node-bindgen" -version = "6.1.0" -source = "git+https://github.com/infinyon/node-bindgen.git?branch=master#1c6f19b658b0acaf71a25f5f2e4d8b4d970363ad" -dependencies = [ - "nj-build", - "nj-core", - "nj-derive", - "nj-sys", -] - -[[package]] -name = "node-bindings" -version = "0.1.0" -dependencies = [ - "anyhow", - "crossbeam-channel", - "dirs", - "indexer_base", - "log", - "log4rs", - "merging", - "mimalloc", - "node-bindgen", - "processor", - "serde", - "serde_json", - "session", - "sources", - "stypes", - "thiserror 2.0.12", - "tikv-jemallocator", - "tokio", - "tokio-util", - "uuid", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "crc32fast", - "hashbrown", - "indexmap", - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "openssl" -version = "0.10.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-float" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "parse-zoneinfo" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24" -dependencies = [ - "regex", -] - -[[package]] -name = "parsers" -version = "4.0.0-alpha.1" -dependencies = [ - "byteorder", - "chrono", - "chrono-tz", - "dlt-core", - "lazy_static", - "log", - "memchr", - "rand 0.9.1", - "regex", - "serde", - "someip-messages", - "someip-payload", - "someip-tools", - "thiserror 2.0.12", -] - -[[package]] -name = "pcap-parser" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f8d57cc6bdf76d7abd6d3cc1113278047dab29c2ff6d97190e8d1c29d4efdac" -dependencies = [ - "circular", - "nom", - "rusticata-macros", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" -dependencies = [ - "phf_shared", - "rand 0.8.5", -] - -[[package]] -name = "phf_shared" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "piper" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plugins_host" -version = "4.0.0-alpha.1" -dependencies = [ - "anyhow", - "blake3", - "dir_checksum", - "dirs", - "log", - "parsers", - "rand 0.9.1", - "serde", - "serde_json", - "stypes", - "thiserror 2.0.12", - "tokio", - "toml", - "wasmtime", - "wasmtime-wasi", -] - -[[package]] -name = "polling" -version = "3.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.0.7", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "postcard" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170a2601f67cc9dba8edd8c4870b15f71a6a2dc196daec8c83f72b59dff628a8" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "serde", -] - -[[package]] -name = "potential_utf" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" -dependencies = [ - "zerovec", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "processor" -version = "4.0.0-alpha.1" -dependencies = [ - "bincode", - "bufread", - "bytecount", - "futures", - "grep-regex", - "grep-searcher", - "indexer_base", - "itertools", - "lazy_static", - "log", - "parsers", - "regex", - "serde", - "serde_json", - "sources", - "stypes", - "text_grep", - "thiserror 2.0.12", - "tokio-util", -] - -[[package]] -name = "psm" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f" -dependencies = [ - "cc", -] - -[[package]] -name = "pulley-interpreter" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb99cb5a3ada8e95a246d09f5fdb609f021bf740efd3ca9bddf458e3293a6a0" -dependencies = [ - "cranelift-bitset", - "log", - "wasmtime-math", -] - -[[package]] -name = "quick-xml" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11bafc859c6815fbaffbbbf4229ecb767ac913fecb27f9ad4343662e9ef099ea" -dependencies = [ - "memchr", -] - -[[package]] -name = "quick-xml" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51" -dependencies = [ - "memchr", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.3", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "redox_users" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" -dependencies = [ - "getrandom 0.2.16", - "libredox", - "thiserror 2.0.12", -] - -[[package]] -name = "regalloc2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5216b1837de2149f8bc8e6d5f88a9326b63b8c836ed58ce4a0a29ec736a59734" -dependencies = [ - "allocator-api2", - "bumpalo", - "hashbrown", - "log", - "rustc-hash", - "smallvec", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix-linux-procfs" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056" -dependencies = [ - "once_cell", - "rustix 1.0.7", -] - -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.9.1", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-value" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" -dependencies = [ - "ordered-float", - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "serde_json" -version = "1.0.140" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" -dependencies = [ - "indexmap", - "itoa", - "ryu", - "serde", - "unsafe-libyaml", -] - -[[package]] -name = "serialport" -version = "4.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21f60a586160667241d7702c420fc223939fb3c0bb8d3fac84f78768e8970dee" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "core-foundation 0.10.0", - "core-foundation-sys", - "io-kit-sys", - "libudev", - "mach2", - "nix 0.26.4", - "quote", - "scopeguard", - "unescaper", - "windows-sys 0.52.0", -] - -[[package]] -name = "session" -version = "4.0.0-alpha.1" -dependencies = [ - "blake3", - "dirs", - "dlt-core", - "file-tools", - "futures", - "indexer_base", - "lazy_static", - "log", - "merging", - "mime_guess", - "parsers", - "plugins_host", - "processor", - "rustc-hash", - "serde", - "serde_json", - "serialport", - "shell-tools", - "sources", - "stypes", - "thiserror 2.0.12", - "tokio", - "tokio-stream", - "tokio-util", - "uuid", - "walkdir", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shell-tools" -version = "0.1.0" -dependencies = [ - "log", - "stypes", - "which", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" -dependencies = [ - "libc", -] - -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "someip-messages" -version = "0.3.1" -source = "git+https://github.com/esrlabs/someip#59b27a6689d72948c4569bc6037c2387c1a661ed" -dependencies = [ - "byteorder", - "derive_builder", - "thiserror 1.0.69", -] - -[[package]] -name = "someip-payload" -version = "0.1.5" -source = "git+https://github.com/esrlabs/someip-payload?rev=b9aa52c96fcbdb0e5aa1ee5258299f0ff7e3a094#b9aa52c96fcbdb0e5aa1ee5258299f0ff7e3a094" -dependencies = [ - "byteorder", - "log", - "quick-xml 0.23.1", - "regex", - "thiserror 1.0.69", - "ux", - "voca_rs", -] - -[[package]] -name = "someip-tools" -version = "4.0.0-alpha.1" -dependencies = [ - "nom", - "thiserror 2.0.12", -] - -[[package]] -name = "sources" -version = "4.0.0-alpha.1" -dependencies = [ - "bufread", - "bytes", - "etherparse", - "futures", - "log", - "pcap-parser", - "serde", - "shell-tools", - "socket2", - "stypes", - "thiserror 2.0.12", - "tokio", - "tokio-serial", - "tokio-stream", - "tokio-util", - "uuid", -] - -[[package]] -name = "sptr" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" - -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "stfu8" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51f1e89f093f99e7432c491c382b88a6860a5adbe6bf02574bf0a08efff1978" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "stypes" -version = "4.0.0-alpha.1" -dependencies = [ - "anyhow", - "bincode", - "dlt-core", - "extend", - "node-bindgen", - "serde", - "thiserror 2.0.12", - "tokio", - "uuid", - "walkdir", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "system-interface" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4592f674ce18521c2a81483873a49596655b179f71c5e05d10c1fe66c78745" -dependencies = [ - "bitflags 2.9.1", - "cap-fs-ext", - "cap-std", - "fd-lock", - "io-lifetimes", - "rustix 0.38.44", - "windows-sys 0.59.0", - "winx", -] - -[[package]] -name = "target-lexicon" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" - -[[package]] -name = "tempfile" -version = "3.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" -dependencies = [ - "fastrand", - "getrandom 0.3.3", - "once_cell", - "rustix 1.0.7", - "windows-sys 0.59.0", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "text_grep" -version = "4.0.0-alpha.1" -dependencies = [ - "bufread", - "grep-regex", - "grep-searcher", - "regex", - "thiserror 2.0.12", - "tokio", - "tokio-util", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl 2.0.12", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "thread-id" -version = "4.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe8f25bbdd100db7e1d34acf7fd2dc59c4bf8f7483f505eaa7d4f12f76cc0ea" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "tikv-jemalloc-sys" -version = "0.6.0+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c60906412afa9c2b5b5a48ca6a5abe5736aec9eb48ad05037a677e52e4e2d" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "tikv-jemallocator" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cec5ff18518d81584f477e9bfdf957f5bb0979b0bac3af4ca30b5b3ae2d2865" -dependencies = [ - "libc", - "tikv-jemalloc-sys", -] - -[[package]] -name = "tinystr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tokio" -version = "1.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", -] - -[[package]] -name = "tokio-macros" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "tokio-serial" -version = "5.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa1d5427f11ba7c5e6384521cfd76f2d64572ff29f3f4f7aa0f496282923fdc8" -dependencies = [ - "cfg-if", - "futures", - "log", - "mio-serial", - "serialport", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "futures-util", - "hashbrown", - "pin-project-lite", - "slab", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_write" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "tracing-core" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "trait-variant" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "typemap-ors" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68c24b707f02dd18f1e4ccceb9d49f2058c2fb86384ef9972592904d7a28867" -dependencies = [ - "unsafe-any-ors", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "unescaper" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c01d12e3a56a4432a8b436f293c25f4808bdf9e9f9f98f9260bba1f1bc5a1f26" -dependencies = [ - "thiserror 2.0.12", -] - -[[package]] -name = "unicase" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-width" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "unsafe-any-ors" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a303d30665362d9680d7d91d78b23f5f899504d4f08b3c4cf08d055d87c0ad" -dependencies = [ - "destructure_traitobject", -] - -[[package]] -name = "unsafe-libyaml" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" - -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" -dependencies = [ - "getrandom 0.3.3", - "js-sys", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "ux" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b59fc5417e036e53226bbebd90196825d358624fd5577432c4e486c95b1b096" - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "value-bag" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "voca_rs" -version = "1.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e44efbf25e32768d5ecd22244feacc3d3b3eca72d318f5ef0a4764c2c158e18" -dependencies = [ - "regex", - "stfu8", - "unicode-segmentation", -] - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-encoder" -version = "0.229.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ba1d491ecacb085a2552025c10a675a6fddcbd03b1fc9b36c536010ce265d2" -dependencies = [ - "leb128fmt", - "wasmparser 0.229.0", -] - -[[package]] -name = "wasm-encoder" -version = "0.233.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9679ae3cf7cfa2ca3a327f7fab97f27f3294d402fd1a76ca8ab514e17973e4d3" -dependencies = [ - "leb128fmt", - "wasmparser 0.233.0", -] - -[[package]] -name = "wasmparser" -version = "0.229.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3b1f053f5d41aa55640a1fa9b6d1b8a9e4418d118ce308d20e24ff3575a8c" -dependencies = [ - "bitflags 2.9.1", - "hashbrown", - "indexmap", - "semver", - "serde", -] - -[[package]] -name = "wasmparser" -version = "0.233.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b51cb03afce7964bbfce46602d6cb358726f36430b6ba084ac6020d8ce5bc102" -dependencies = [ - "bitflags 2.9.1", - "indexmap", - "semver", -] - -[[package]] -name = "wasmprinter" -version = "0.229.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25dac01892684a99b8fbfaf670eb6b56edea8a096438c75392daeb83156ae2e" -dependencies = [ - "anyhow", - "termcolor", - "wasmparser 0.229.0", -] - -[[package]] -name = "wasmtime" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15396de4fce22e431aa913a9d17325665e72a39aaa7972c8aeae7507eff6144f" -dependencies = [ - "addr2line", - "anyhow", - "async-trait", - "bitflags 2.9.1", - "bumpalo", - "cc", - "cfg-if", - "encoding_rs", - "fxprof-processed-profile", - "gimli", - "hashbrown", - "indexmap", - "ittapi", - "libc", - "log", - "mach2", - "memfd", - "object", - "once_cell", - "postcard", - "psm", - "pulley-interpreter", - "rayon", - "rustix 1.0.7", - "semver", - "serde", - "serde_derive", - "serde_json", - "smallvec", - "sptr", - "target-lexicon", - "trait-variant", - "wasm-encoder 0.229.0", - "wasmparser 0.229.0", - "wasmtime-asm-macros", - "wasmtime-cache", - "wasmtime-component-macro", - "wasmtime-component-util", - "wasmtime-cranelift", - "wasmtime-environ", - "wasmtime-fiber", - "wasmtime-jit-debug", - "wasmtime-jit-icache-coherence", - "wasmtime-math", - "wasmtime-slab", - "wasmtime-versioned-export-macros", - "wasmtime-winch", - "wat", - "windows-sys 0.59.0", -] - -[[package]] -name = "wasmtime-asm-macros" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d13b1a25d9b77ce42b4641a797e8c0bde0643b9ad5aaa36ce7e00cf373ffab" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "wasmtime-cache" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc77a5e7d358c0180745021735de789e0d8d64a9eb740d54cee525a164f0343" -dependencies = [ - "anyhow", - "base64", - "directories-next", - "log", - "postcard", - "rustix 1.0.7", - "serde", - "serde_derive", - "sha2", - "toml", - "windows-sys 0.59.0", - "zstd", -] - -[[package]] -name = "wasmtime-component-macro" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be73f1c13b25cf7c062ea2f3aba8a92abe4284a14b49e866e4962824802da5cf" -dependencies = [ - "anyhow", - "proc-macro2", - "quote", - "syn 2.0.101", - "wasmtime-component-util", - "wasmtime-wit-bindgen", - "wit-parser", -] - -[[package]] -name = "wasmtime-component-util" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cba282555a9f2443f4e40e415772ea98acabbc341e9b3b905f541ff304cbc5e" - -[[package]] -name = "wasmtime-cranelift" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c2c2e083dc4c119cca61cc42ca6b3711b75ed9823f77b684ee009c74f939d8" -dependencies = [ - "anyhow", - "cfg-if", - "cranelift-codegen", - "cranelift-control", - "cranelift-entity", - "cranelift-frontend", - "cranelift-native", - "gimli", - "itertools", - "log", - "object", - "pulley-interpreter", - "smallvec", - "target-lexicon", - "thiserror 2.0.12", - "wasmparser 0.229.0", - "wasmtime-environ", - "wasmtime-versioned-export-macros", -] - -[[package]] -name = "wasmtime-environ" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357542664493b1359727f235b615ae74f63bd46aa4d0c587b09e3b060eb0b8ef" -dependencies = [ - "anyhow", - "cpp_demangle", - "cranelift-bitset", - "cranelift-entity", - "gimli", - "indexmap", - "log", - "object", - "postcard", - "rustc-demangle", - "semver", - "serde", - "serde_derive", - "smallvec", - "target-lexicon", - "wasm-encoder 0.229.0", - "wasmparser 0.229.0", - "wasmprinter", - "wasmtime-component-util", -] - -[[package]] -name = "wasmtime-fiber" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83e697b13d6ae9eff31edac86673aabaf8dbf20267f2aa20e831dd01da480a3" -dependencies = [ - "anyhow", - "cc", - "cfg-if", - "rustix 1.0.7", - "wasmtime-asm-macros", - "wasmtime-versioned-export-macros", - "windows-sys 0.59.0", -] - -[[package]] -name = "wasmtime-jit-debug" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6748fe974240d45e6bb25ac8e9a600be36f77347253cbbb35bd2d72e01ff0ece" -dependencies = [ - "cc", - "object", - "rustix 1.0.7", - "wasmtime-versioned-export-macros", -] - -[[package]] -name = "wasmtime-jit-icache-coherence" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175e924dbc944c185808466d1e90b5a7feb610f3b9abdfe26f8ee25fd1086d1c" -dependencies = [ - "anyhow", - "cfg-if", - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "wasmtime-math" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d9448adcd9c5980c0eac1630794bd1be3cf573c28d0630f7d3184405b36bcfe" -dependencies = [ - "libm", -] - -[[package]] -name = "wasmtime-slab" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50f7c227d6a925d9dfd0fbfdbf06877cb2fe387bb3248049706b19b5f86e560" - -[[package]] -name = "wasmtime-versioned-export-macros" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55b39ffeda28be925babb2d45067d8ba2c67d2227328c5364d23b4152eba9950" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "wasmtime-wasi" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d357e5699ed32103d0dab897c3965fd66f1ba29a37072d441199e7febe6324e" -dependencies = [ - "anyhow", - "async-trait", - "bitflags 2.9.1", - "bytes", - "cap-fs-ext", - "cap-net-ext", - "cap-rand", - "cap-std", - "cap-time-ext", - "fs-set-times", - "futures", - "io-extras", - "io-lifetimes", - "rustix 1.0.7", - "system-interface", - "thiserror 2.0.12", - "tokio", - "tracing", - "url", - "wasmtime", - "wasmtime-wasi-io", - "wiggle", - "windows-sys 0.59.0", -] - -[[package]] -name = "wasmtime-wasi-io" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43418871afd46c188231e4d822d375c0660c7a1484db3f7f247e552186e971a2" -dependencies = [ - "anyhow", - "async-trait", - "bytes", - "futures", - "wasmtime", -] - -[[package]] -name = "wasmtime-winch" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f180e6a8c0724608cd2d55ceb7d03ed3a729ca78fcd34a6756f36cf9a5fd546" -dependencies = [ - "anyhow", - "cranelift-codegen", - "gimli", - "object", - "target-lexicon", - "wasmparser 0.229.0", - "wasmtime-cranelift", - "wasmtime-environ", - "winch-codegen", -] - -[[package]] -name = "wasmtime-wit-bindgen" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d793a398e2974d562e65c8d366f39a942fe1ce7970244d9d6e5f96f29b534" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "wit-parser", -] - -[[package]] -name = "wast" -version = "35.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" -dependencies = [ - "leb128", -] - -[[package]] -name = "wast" -version = "233.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eaf4099d8d0c922b83bf3c90663f5666f0769db9e525184284ebbbdb1dd2180" -dependencies = [ - "bumpalo", - "leb128fmt", - "memchr", - "unicode-width", - "wasm-encoder 0.233.0", -] - -[[package]] -name = "wat" -version = "1.233.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d9bc80f5e4b25ea086ef41b91ccd244adde45d931c384d94a8ff64ab8bd7d87" -dependencies = [ - "wast 233.0.0", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "which" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fabb953106c3c8eea8306e4393700d7657561cb43122571b172bbfb7c7ba1d" -dependencies = [ - "env_home", - "rustix 1.0.7", - "winsafe", -] - -[[package]] -name = "wiggle" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73aed697b5eb6a5726dca57f85199f73c61dee669e58faab71086eb7eda6b077" -dependencies = [ - "anyhow", - "async-trait", - "bitflags 2.9.1", - "thiserror 2.0.12", - "tracing", - "wasmtime", - "wiggle-macro", -] - -[[package]] -name = "wiggle-generate" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d477015cda1d476b7e45d50eeb93d9038df8f24827007669065292651b26d225" -dependencies = [ - "anyhow", - "heck", - "proc-macro2", - "quote", - "syn 2.0.101", - "witx", -] - -[[package]] -name = "wiggle-macro" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71ac603ee46847d2e3c142ba715d326f1045155c7758f4e8dd001d5f92810c12" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "wiggle-generate", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "winch-codegen" -version = "33.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad3072bf7c270d5e29a3d69744c81665dd3adb6e60f123925393a1c150bf9ec4" -dependencies = [ - "anyhow", - "cranelift-assembler-x64", - "cranelift-codegen", - "gimli", - "regalloc2", - "smallvec", - "target-lexicon", - "thiserror 2.0.12", - "wasmparser 0.229.0", - "wasmtime-cranelift", - "wasmtime-environ", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "winnow" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" -dependencies = [ - "memchr", -] - -[[package]] -name = "winsafe" -version = "0.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" - -[[package]] -name = "winx" -version = "0.36.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d" -dependencies = [ - "bitflags 2.9.1", - "windows-sys 0.59.0", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "wit-parser" -version = "0.229.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459c6ba62bf511d6b5f2a845a2a736822e38059c1cfa0b644b467bbbfae4efa6" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser 0.229.0", -] - -[[package]] -name = "witx" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" -dependencies = [ - "anyhow", - "log", - "thiserror 1.0.69", - "wast 35.0.2", -] - -[[package]] -name = "writeable" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" - -[[package]] -name = "yoke" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", - "synstructure", -] - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/application/apps/rustcore/rs-bindings/Cargo.toml b/application/apps/rustcore/rs-bindings/Cargo.toml deleted file mode 100644 index d50a3f3d5f..0000000000 --- a/application/apps/rustcore/rs-bindings/Cargo.toml +++ /dev/null @@ -1,50 +0,0 @@ -[package] -name = "node-bindings" -version = "0.1.0" -authors = ["Oliver Mueller "] -edition = "2024" - -[lib] -crate-type = ["cdylib"] - -[build-dependencies] -# node-bindgen = { version = "5.0", features = ["build"] } -# Added "default-features = false" becuase: https://github.com/rust-lang/rust/issues/98903 -# node-bindgen = {git = "https://github.com/DmitryAstafyev/node-bindgen.git", branch="master", default-features = false, features = ["build"] } -node-bindgen = {git = "https://github.com/infinyon/node-bindgen.git", branch="master", default-features = false, features = ["build"] } - -[dependencies] -anyhow = "1.0" -crossbeam-channel = "0.5" -dirs = "6.0" -indexer_base = { path = "../../indexer/indexer_base" } -log = "0.4" -log4rs = "1.3" -# node-bindgen = {git = "https://github.com/DmitryAstafyev/node-bindgen.git", branch="master", features = ["serde-json"] } -node-bindgen = {git = "https://github.com/infinyon/node-bindgen.git", branch="master", features = ["serde-json"] } -serde = { version = "1.0", features = ["derive"] } -thiserror = "2.0" -tokio = { version = "1.45", features = ["full"] } -tokio-util = "0.7" -uuid = { version = "1.3", features = ["serde", "v4"] } -serde_json = "1.0" - -merging = { path = "../../indexer/merging" } -processor = { path = "../../indexer/processor" } -session = { path = "../../indexer/session" } -sources = { path = "../../indexer/sources" } -stypes = { path = "../../indexer/stypes", features=["nodejs"] } - -[target.'cfg(unix)'.dependencies] -# Jemalloc combined with Node.js exceeds the default TLS memory limit on Linux. -tikv-jemallocator = { version = "0.6" , optional = true, features = ["disable_initial_exec_tls"] } - -[target.'cfg(windows)'.dependencies] -mimalloc = {version = "0.1" , optional = true } - -[features] -default = [] -# Feature to use optimized memory allocators per platform. -# Uses `jemalloc` on Unix-based targets and `mimalloc` on Windows. -# This feature won't be enabled by default since these allocators aren't well tested as the defaults. -custom-alloc = ['dep:mimalloc', 'dep:tikv-jemallocator'] diff --git a/application/apps/rustcore/rs-bindings/build.rs b/application/apps/rustcore/rs-bindings/build.rs deleted file mode 100644 index 9b831a3a56..0000000000 --- a/application/apps/rustcore/rs-bindings/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - node_bindgen::build::configure(); -} diff --git a/application/apps/rustcore/rs-bindings/log4rs.yaml b/application/apps/rustcore/rs-bindings/log4rs.yaml deleted file mode 100644 index bfd90d45b2..0000000000 --- a/application/apps/rustcore/rs-bindings/log4rs.yaml +++ /dev/null @@ -1,47 +0,0 @@ -# chipmunk_logconf_version: $LOG_CONFIG_VERSION -refresh_rate: 30 seconds - -# The "appenders" map contains the set of appenders, indexed by their names. -appenders: - stdout: - kind: console - encoder: - kind: pattern - pattern: '[{l}][{t}: {M}][{d(%H:%M:%S)}] {m}{n}' - indexer-root: - kind: file - path: $INDEXER_LOG_PATH - append: false - encoder: - kind: pattern - pattern: "[{l}] [{t}: {M}] {d}:: {m}{n}\n" - startup-appender: - kind: file - path: $LAUNCHER_LOG_PATH - append: false - encoder: - kind: pattern - pattern: "{d} [{M}] {l}:: {m}\n" - -root: - # level: off - # level: error - level: warn - # level: info - # level: debug - # level: trace - appenders: - - indexer-root - - stdout - -loggers: - launcher: - level: warn - appenders: - - startup-appender - additive: false - updater: - level: warn - appenders: - - startup-appender - additive: false diff --git a/application/apps/rustcore/rs-bindings/rustfmt.toml b/application/apps/rustcore/rs-bindings/rustfmt.toml deleted file mode 100644 index f216078d96..0000000000 --- a/application/apps/rustcore/rs-bindings/rustfmt.toml +++ /dev/null @@ -1 +0,0 @@ -edition = "2024" diff --git a/application/apps/rustcore/rs-bindings/src/js/converting/concat.rs b/application/apps/rustcore/rs-bindings/src/js/converting/concat.rs deleted file mode 100644 index 084bb20546..0000000000 --- a/application/apps/rustcore/rs-bindings/src/js/converting/concat.rs +++ /dev/null @@ -1,46 +0,0 @@ -// use merging::concatenator::ConcatenatorInput; -// use node_bindgen::{ -// core::{ -// val::{JsEnv, JsObject}, -// JSValue, NjError, -// }, -// sys::napi_value, -// }; -// use serde::Serialize; - -// #[derive(Serialize, Debug, Clone)] -// pub struct WrappedConcatenatorInput(ConcatenatorInput); - -// // impl WrappedConcatenatorInput { -// // pub fn as_concatenator_input(&self) -> ConcatenatorInput { -// // self.0.clone() -// // } -// // } - -// impl JSValue<'_> for WrappedConcatenatorInput { -// fn convert_to_rust(env: &JsEnv, n_value: napi_value) -> Result { -// if let Ok(js_obj) = env.convert_to_rust::(n_value) { -// let path: String = match js_obj.get_property("path") { -// Ok(Some(value)) => value.as_value()?, -// Ok(None) => { -// return Err(NjError::Other("[path] property is not found".to_owned())); -// } -// Err(e) => { -// return Err(e); -// } -// }; -// let tag: String = match js_obj.get_property("tag") { -// Ok(Some(value)) => value.as_value()?, -// Ok(None) => { -// return Err(NjError::Other("[tag] property is not found".to_owned())); -// } -// Err(e) => { -// return Err(e); -// } -// }; -// Ok(WrappedConcatenatorInput(ConcatenatorInput { path, tag })) -// } else { -// Err(NjError::Other("not valid format".to_owned())) -// } -// } -// } diff --git a/application/apps/rustcore/rs-bindings/src/js/converting/filter.rs b/application/apps/rustcore/rs-bindings/src/js/converting/filter.rs deleted file mode 100644 index 119b096d56..0000000000 --- a/application/apps/rustcore/rs-bindings/src/js/converting/filter.rs +++ /dev/null @@ -1,72 +0,0 @@ -use node_bindgen::{ - core::{ - JSValue, NjError, - val::{JsEnv, JsObject}, - }, - sys::napi_value, -}; -use processor::search::filter::SearchFilter; -use serde::Serialize; -#[derive(Serialize, Debug, Clone)] -pub struct WrappedSearchFilter(SearchFilter); - -impl WrappedSearchFilter { - pub fn as_filter(&self) -> SearchFilter { - self.0.clone() - } -} - -impl JSValue<'_> for WrappedSearchFilter { - fn convert_to_rust(env: &JsEnv, n_value: napi_value) -> Result { - if let Ok(js_obj) = env.convert_to_rust::(n_value) { - let value: String = match js_obj.get_property("value") { - Ok(Some(value)) => value.as_value()?, - Ok(None) => { - return Err(NjError::Other("[value] property is not found".to_owned())); - } - Err(e) => { - return Err(e); - } - }; - let is_regex: bool = match js_obj.get_property("is_regex") { - Ok(Some(value)) => value.as_value()?, - Ok(None) => { - return Err(NjError::Other( - "[is_regex] property is not found".to_owned(), - )); - } - Err(e) => { - return Err(e); - } - }; - let is_word: bool = match js_obj.get_property("is_word") { - Ok(Some(value)) => value.as_value()?, - Ok(None) => { - return Err(NjError::Other("[is_word] property is not found".to_owned())); - } - Err(e) => { - return Err(e); - } - }; - let ignore_case: bool = match js_obj.get_property("ignore_case") { - Ok(Some(value)) => value.as_value()?, - Ok(None) => { - return Err(NjError::Other( - "[ignore_case] property is not found".to_owned(), - )); - } - Err(e) => { - return Err(e); - } - }; - Ok(WrappedSearchFilter( - SearchFilter::plain(value) - .regex(is_regex) - .ignore_case(ignore_case) - .word(is_word), - )) - } else { - Err(NjError::Other("not valid format".to_owned())) - } - } -} diff --git a/application/apps/rustcore/rs-bindings/src/js/converting/mod.rs b/application/apps/rustcore/rs-bindings/src/js/converting/mod.rs deleted file mode 100644 index 902f139e24..0000000000 --- a/application/apps/rustcore/rs-bindings/src/js/converting/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -// pub mod concat; -pub mod filter; diff --git a/application/apps/rustcore/rs-bindings/src/js/jobs/mod.rs b/application/apps/rustcore/rs-bindings/src/js/jobs/mod.rs deleted file mode 100644 index de3757f58a..0000000000 --- a/application/apps/rustcore/rs-bindings/src/js/jobs/mod.rs +++ /dev/null @@ -1,351 +0,0 @@ -use crate::js::converting::filter::WrappedSearchFilter; -use log::{debug, error}; -use node_bindgen::derive::node_bindgen; - -use session::unbound::{UnboundSession, api::UnboundSessionAPI}; -use std::{convert::TryFrom, thread}; -use tokio::runtime::Runtime; -use tokio_util::sync::CancellationToken; - -struct UnboundJobs { - api: Option, - finished: CancellationToken, -} - -fn u64_from_i64(id: i64) -> Result { - u64::try_from(id) - .map_err(|_| stypes::ComputationError::InvalidArgs(String::from("ID of job is invalid"))) -} - -fn usize_from_i64(id: i64) -> Result { - usize::try_from(id).map_err(|_| { - stypes::ComputationError::InvalidArgs(String::from("Fail to conver i64 to usize")) - }) -} - -#[node_bindgen] -impl UnboundJobs { - // Self methods - #[node_bindgen(constructor)] - pub fn new() -> Self { - Self { - api: None, - finished: CancellationToken::new(), - } - } - - #[node_bindgen(mt)] - async fn init(&mut self) -> Result<(), stypes::ComputationError> { - let rt = Runtime::new().map_err(|e| { - stypes::ComputationError::Process(format!("Could not start tokio runtime: {e}")) - })?; - - let (mut session, api) = UnboundSession::new(); - self.api = Some(api); - let confirmation = self.finished.clone(); - thread::spawn(move || { - rt.block_on(async { - if let Err(err) = session.init().await { - error!("Fail to init unbound session: {err}"); - } else { - debug!("Unbound session is started"); - session.finished.cancelled().await; - confirmation.cancel(); - debug!("Unbound session is closed"); - } - }) - }); - Ok(()) - } - - #[node_bindgen] - async fn destroy(&self) -> Result<(), stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .shutdown() - .await?; - self.finished.cancelled().await; - Ok(()) - } - - /// Cancel given operation/task - #[node_bindgen] - async fn abort(&self, id: i64) -> Result<(), stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .cancel_job(&u64_from_i64(id)?) - .await - } - - // Custom methods (jobs) - #[node_bindgen] - async fn list_folder_content( - &self, - id: i64, - depth: i64, - max_len: i64, - paths: Vec, - include_files: bool, - include_folders: bool, - ) -> Result, stypes::ComputationError> - { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .list_folder_content( - u64_from_i64(id)?, - usize_from_i64(depth)?, - usize_from_i64(max_len)?, - paths, - include_files, - include_folders, - ) - .await - } - - #[node_bindgen] - async fn is_file_binary( - &self, - id: i64, - file_path: String, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .is_file_binary(u64_from_i64(id)?, file_path) - .await - } - - #[node_bindgen] - async fn get_file_checksum( - &self, - id: i64, - path: String, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_file_checksum(u64_from_i64(id)?, path) - .await - } - - #[node_bindgen] - async fn get_dlt_stats( - &self, - id: i64, - files: Vec, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_dlt_stats(u64_from_i64(id)?, files) - .await - } - - #[node_bindgen] - async fn get_someip_statistic( - &self, - id: i64, - files: Vec, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_someip_statistic(u64_from_i64(id)?, files) - .await - } - - #[node_bindgen] - async fn get_shell_profiles( - &self, - id: i64, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_shell_profiles(u64_from_i64(id)?) - .await - } - - #[node_bindgen] - async fn get_serial_ports_list( - &self, - id: i64, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_serial_ports_list(u64_from_i64(id)?) - .await - } - - #[node_bindgen] - async fn get_regex_error( - &self, - id: i64, - filter: WrappedSearchFilter, - ) -> Result>, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_regex_error(u64_from_i64(id)?, filter.as_filter()) - .await - } - - #[node_bindgen] - async fn installed_plugins_list( - &self, - id: i64, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .installed_plugins_list(u64_from_i64(id)?) - .await - } - - #[node_bindgen] - async fn invalid_plugins_list( - &self, - id: i64, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .invalid_plugins_list(u64_from_i64(id)?) - .await - } - - #[node_bindgen] - async fn installed_plugins_paths( - &self, - id: i64, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .installed_plugins_paths(u64_from_i64(id)?) - .await - } - - #[node_bindgen] - async fn invalid_plugins_paths( - &self, - id: i64, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .invalid_plugins_paths(u64_from_i64(id)?) - .await - } - - #[node_bindgen] - async fn installed_plugin_info( - &self, - id: i64, - plugin_path: String, - ) -> Result>, stypes::ComputationError> - { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .installed_plugin_info(u64_from_i64(id)?, plugin_path) - .await - } - - #[node_bindgen] - async fn invalid_plugin_info( - &self, - id: i64, - plugin_path: String, - ) -> Result>, stypes::ComputationError> - { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .invalid_plugin_info(u64_from_i64(id)?, plugin_path) - .await - } - - #[node_bindgen] - async fn get_plugin_run_data( - &self, - id: i64, - plugin_path: String, - ) -> Result>, stypes::ComputationError> - { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_plugin_run_data(u64_from_i64(id)?, plugin_path) - .await - } - - #[node_bindgen] - async fn reload_plugins( - &self, - id: i64, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .reload_plugins(u64_from_i64(id)?) - .await - } - - #[node_bindgen] - async fn add_plugin( - &self, - id: i64, - plugin_path: String, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .add_plugin(u64_from_i64(id)?, plugin_path, None) - .await - } - - #[node_bindgen] - async fn remove_plugin( - &self, - id: i64, - plugin_path: String, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .remove_plugin(u64_from_i64(id)?, plugin_path) - .await - } - - #[node_bindgen] - async fn job_cancel_test( - &self, - id: i64, - custom_arg_a: i64, - custom_arg_b: i64, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .cancel_test(u64_from_i64(id)?, custom_arg_a, custom_arg_b) - .await - } - - #[node_bindgen] - async fn sleep( - &self, - id: i64, - ms: i64, - ) -> Result, stypes::ComputationError> { - self.api - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .sleep(u64_from_i64(id)?, u64_from_i64(ms)?) - .await - } -} diff --git a/application/apps/rustcore/rs-bindings/src/js/mod.rs b/application/apps/rustcore/rs-bindings/src/js/mod.rs deleted file mode 100644 index 1be11b72fd..0000000000 --- a/application/apps/rustcore/rs-bindings/src/js/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod converting; -pub mod jobs; -pub mod session; diff --git a/application/apps/rustcore/rs-bindings/src/js/session/mod.rs b/application/apps/rustcore/rs-bindings/src/js/session/mod.rs deleted file mode 100644 index eaedeae9f7..0000000000 --- a/application/apps/rustcore/rs-bindings/src/js/session/mod.rs +++ /dev/null @@ -1,767 +0,0 @@ -pub mod progress_tracker; - -use crate::{js::converting::filter::WrappedSearchFilter, logging::targets}; -use log::{debug, error, info, warn}; -use node_bindgen::{core::buffer::JSArrayBuffer, derive::node_bindgen}; -use processor::grabber::LineRange; -use session::{operations, session::Session}; -use std::{convert::TryFrom, ops::RangeInclusive, path::PathBuf, thread}; -use stypes::GrabbedElementList; -use tokio::{runtime::Runtime, sync::oneshot}; -use uuid::Uuid; - -struct RustSession { - session: Option, - uuid: Uuid, -} - -#[node_bindgen] -impl RustSession { - #[node_bindgen(constructor)] - pub fn new(id: String) -> Self { - let uuid = match operations::uuid_from_str(&id) { - Ok(uuid) => uuid, - Err(err) => { - // TODO: Should be replaced with error - panic!("Fail to convert UUID = {id}; error:{err}"); - } - }; - Self { - session: None, - uuid, - } - } - - #[node_bindgen(mt)] - async fn init( - &mut self, - callback: F, - ) -> Result<(), stypes::ComputationError> { - let rt = Runtime::new().map_err(|e| { - stypes::ComputationError::Process(format!("Could not start tokio runtime: {e}")) - })?; - let (tx_session, rx_session) = oneshot::channel(); - let uuid = self.uuid; - thread::spawn(move || { - rt.block_on(async { - match Session::new(uuid).await { - Ok((session, mut rx_callback_events)) => { - if tx_session.send(Some(session)).is_err() { - error!("Cannot setup session instance"); - return; - } - debug!("task is started"); - while let Some(event) = rx_callback_events.recv().await { - match &event { - stypes::CallbackEvent::OperationStarted(..) => {} - stypes::CallbackEvent::OperationProcessing(..) => {} - stypes::CallbackEvent::OperationDone(..) => {} - _ => { - println!( - "****************** DEBUG AAZ: Callback evnet: {event:?}" - ); - } - } - callback(event) - } - debug!("sending SessionDestroyed event"); - callback(stypes::CallbackEvent::SessionDestroyed); - debug!("task is finished"); - } - Err(e) => { - error!("Cannot create session instance: {e}"); - if tx_session.send(None).is_err() { - error!("Cannot setup session instance"); - } - } - } - }) - }); - self.session = rx_session.await.map_err(|_| { - stypes::ComputationError::Communication(String::from( - "Fail to get session instance to setup", - )) - })?; - Ok(()) - } - - #[node_bindgen] - fn get_uuid(&self) -> Result { - Ok(self - .session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_uuid() - .to_string()) - } - - #[node_bindgen] - fn abort( - &self, - operation_id: String, - target_id: String, - ) -> Result<(), stypes::ComputationError> { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .abort( - operations::uuid_from_str(&operation_id)?, - operations::uuid_from_str(&target_id)?, - ) - } - - #[node_bindgen] - async fn stop(&self, operation_id: String) -> Result<(), stypes::ComputationError> { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .stop(operations::uuid_from_str(&operation_id)?) - .await - } - - #[node_bindgen] - async fn get_session_file(&self) -> Result { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_state() - .get_session_file() - .await - .map(|p| p.to_string_lossy().to_string()) - .map_err(|e: stypes::NativeError| { - >::into( - stypes::ComputationError::NativeError(e), - ) - }) - } - - #[node_bindgen] - async fn get_stream_len(&self) -> Result { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_stream_len() - .await - .map(|r| r as i64) - } - - #[node_bindgen] - async fn get_search_len(&self) -> Result { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_search_result_len() - .await - .map(|r| r as i64) - } - - #[node_bindgen] - async fn details(&self, _index: i64) -> Result { - todo!("nyi"); - // Log - } - - /// Exports data to the specified output path with the given parameters. This method is used to export - /// only into text format. For exporting into raw format is using method `export_raw` - /// - /// # Arguments - /// - /// * `out_path` - A `String` representing the path to the output file where data will be exported. - /// * `ranges` - A `Vec<(i64, i64)>` specifying the ranges of data to export. - /// * `columns` - A `Vec` containing the column number to be exported. - /// * `spliter` - A `String` used as the record separator in session file to split log message to columns. - /// * `delimiter` - A `String` used as the field delimiter within each record in output file. - /// * `operation_id` - A `String` representing the unique identifier for the export operation, used for tracking. - /// - /// # Returns - /// - /// * `Result<(), stypes::ComputationError>`: - /// - `Ok(())` if the export is successful. - /// - `Err(ComputationErrorWrapper)` if an error occurs during the export process. - /// - #[node_bindgen] - async fn export( - &self, - out_path: String, - ranges: Vec<(i64, i64)>, - columns: Vec, - spliter: String, - delimiter: String, - operation_id: String, - ) -> Result<(), stypes::ComputationError> { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .export( - operations::uuid_from_str(&operation_id)?, - PathBuf::from(out_path), - ranges - .iter() - .map(|(s, e)| RangeInclusive::::new(*s as u64, *e as u64)) - .collect::>>(), - columns - .into_iter() - .map(usize::try_from) - .collect::, _>>() - .map_err(|_| { - stypes::ComputationError::NativeError(stypes::NativeError { - severity: stypes::Severity::ERROR, - kind: stypes::NativeErrorKind::Io, - message: Some(String::from( - "Fail to get valid columns list. Supported type: [u8]", - )), - }) - })?, - (!spliter.is_empty()).then_some(spliter), - (!delimiter.is_empty()).then_some(delimiter), - ) - } - - #[node_bindgen] - async fn export_raw( - &self, - out_path: String, - ranges: Vec<(i64, i64)>, - operation_id: String, - ) -> Result<(), stypes::ComputationError> { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .export_raw( - operations::uuid_from_str(&operation_id)?, - PathBuf::from(out_path), - ranges - .iter() - .map(|(s, e)| RangeInclusive::::new(*s as u64, *e as u64)) - .collect::>>(), - ) - } - - #[node_bindgen] - async fn is_raw_export_available(&self) -> Result { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .is_raw_export_available() - .await - } - - #[node_bindgen] - async fn grab( - &self, - start_line_index: i64, - number_of_lines: i64, - ) -> Result { - let start = - u64::try_from(start_line_index).map_err(|_| stypes::ComputationError::InvalidData)?; - let end = u64::try_from(start_line_index + number_of_lines - 1) - .map_err(|_| stypes::ComputationError::InvalidData)?; - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .grab(LineRange::from(start..=end)) - .await - } - - #[node_bindgen] - async fn grab_indexed( - &self, - start_line_index: i64, - number_of_lines: i64, - ) -> Result { - let start = - u64::try_from(start_line_index).map_err(|_| stypes::ComputationError::InvalidData)?; - let end = u64::try_from(start_line_index + number_of_lines - 1) - .map_err(|_| stypes::ComputationError::InvalidData)?; - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .grab_indexed(RangeInclusive::::new(start, end)) - .await - } - - #[node_bindgen] - async fn set_indexing_mode(&self, mode: i32) -> Result<(), stypes::ComputationError> { - let mode = u8::try_from(mode).map_err(|_| stypes::ComputationError::InvalidData)?; - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .set_indexing_mode(mode) - .await - } - - #[node_bindgen] - async fn get_indexed_len(&self) -> Result { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_indexed_len() - .await - .map(|r| r as i64) - } - - #[node_bindgen] - async fn get_around_indexes( - &self, - position: i64, - ) -> Result { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_around_indexes(position as u64) - .await - } - - #[node_bindgen] - async fn add_bookmark(&self, row: i64) -> Result<(), stypes::ComputationError> { - let row = u64::try_from(row).map_err(|_| stypes::ComputationError::InvalidData)?; - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .add_bookmark(row) - .await - } - - #[node_bindgen] - async fn set_bookmarks(&self, rows: Vec) -> Result<(), stypes::ComputationError> { - let mut converted: Vec = vec![]; - for row in rows.iter() { - converted.push(u64::try_from(*row).map_err(|_| stypes::ComputationError::InvalidData)?); - } - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .set_bookmarks(converted) - .await - } - - #[node_bindgen] - async fn remove_bookmark(&self, row: i64) -> Result<(), stypes::ComputationError> { - let row = u64::try_from(row).map_err(|_| stypes::ComputationError::InvalidData)?; - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .remove_bookmark(row) - .await - } - - #[node_bindgen] - async fn expand_breadcrumbs( - &self, - seporator: i64, - offset: i64, - above: bool, - ) -> Result<(), stypes::ComputationError> { - let seporator = - u64::try_from(seporator).map_err(|_| stypes::ComputationError::InvalidData)?; - let offset = u64::try_from(offset).map_err(|_| stypes::ComputationError::InvalidData)?; - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .expand_breadcrumbs(seporator, offset, above) - .await - } - - #[node_bindgen] - async fn grab_search( - &self, - start_line_index: i64, - number_of_lines: i64, - ) -> Result { - let start = - u64::try_from(start_line_index).map_err(|_| stypes::ComputationError::InvalidData)?; - let end = u64::try_from(start_line_index + number_of_lines - 1) - .map_err(|_| stypes::ComputationError::InvalidData)?; - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .grab_search(LineRange::from(start..=end)) - .await - } - - #[node_bindgen] - async fn grab_ranges( - &self, - ranges: Vec<(i64, i64)>, - ) -> Result { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .grab_ranges( - ranges - .iter() - .map(|(s, e)| RangeInclusive::::new(*s as u64, *e as u64)) - .collect::>>(), - ) - .await - } - - /// "nested" search. - /// A "nested" search refers to filtering matches within the primary search results. - /// - /// # Parameters - /// - /// * `filter` - The search filter used to specify the criteria for the nested search. - /// * `from` - The starting position (within the primary search results) for the nested search. - /// * `rev` - Specifies the direction of the search: - /// * `true` - Perform the search in reverse. - /// * `false` - Perform the search in forward order. - /// - /// # Returns - /// - /// If a match is found: - /// * `Some((search_result_line_index, session_file_line_index))` - A tuple containing: - /// - The line index within the search results. - /// - The corresponding line index in the session file. - /// - /// If no match is found: - /// * `None` - /// - /// On error: - /// * `Err(stypes::ComputationError)` - Describes the error encountered during the process. - #[node_bindgen] - async fn search_nested_match( - &self, - filter: WrappedSearchFilter, - from: i64, - rev: bool, - ) -> Result, stypes::ComputationError> { - let res = self - .session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .search_nested_match( - filter.as_filter(), - u64::try_from(from).map_err(|_| stypes::ComputationError::InvalidData)?, - rev, - ) - .await?; - Ok(if let Some((pos, srch_pos)) = res { - Some(( - i64::try_from(pos).map_err(|e| { - stypes::ComputationError::SearchError(format!("fail convert index: {e}")) - })?, - i64::try_from(srch_pos).map_err(|e| { - stypes::ComputationError::SearchError(format!("fail convert index: {e}")) - })?, - )) - } else { - None - }) - } - - #[node_bindgen] - async fn observe( - &self, - options: JSArrayBuffer, - operation_id: String, - ) -> Result<(), stypes::ComputationError> { - let options = - stypes::ObserveOptions::decode(&options).map_err(stypes::ComputationError::Decoding)?; - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .observe(operations::uuid_from_str(&operation_id)?, options) - } - - #[node_bindgen] - async fn apply_search_filters( - &self, - filters: Vec, - operation_id: String, - ) -> Result<(), stypes::ComputationError> { - let session = self - .session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)?; - info!( - target: targets::SESSION, - "Search (operation: {operation_id}) will be done withing next filters: {filters:?}" - ); - session.apply_search_filters( - operations::uuid_from_str(&operation_id)?, - filters.iter().map(|f| f.as_filter()).collect(), - ) - } - - #[node_bindgen] - async fn apply_search_values_filters( - &self, - filters: Vec, - operation_id: String, - ) -> Result<(), stypes::ComputationError> { - let session = self - .session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)?; - info!( - target: targets::SESSION, - "Search values (operation: {operation_id}) will be done withing next filters: {filters:?}" - ); - session.apply_search_values_filters(operations::uuid_from_str(&operation_id)?, filters) - } - - #[node_bindgen] - async fn drop_search(&self) -> Result { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .drop_search() - .await - } - - #[node_bindgen] - async fn get_sources_definitions(&self) -> Result { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_sources() - .await - } - - #[node_bindgen] - async fn extract_matches( - &self, - filters: Vec, - operation_id: String, - ) -> Result<(), stypes::ComputationError> { - let session = self - .session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)?; - info!( - target: targets::SESSION, - "Extract (operation: {operation_id}) will be done withing next filters: {filters:?}" - ); - session.extract_matches( - operations::uuid_from_str(&operation_id)?, - filters.iter().map(|f| f.as_filter()).collect(), - ) - } - - #[node_bindgen] - async fn get_map( - &self, - operation_id: String, - dataset_len: i32, - from: Option, - to: Option, - ) -> Result<(), stypes::ComputationError> { - let session = self - .session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)?; - let mut range: Option<(u64, u64)> = None; - if let Some(from) = from - && let Some(to) = to - && from >= 0 - && to >= 0 - { - if from <= to { - range = Some((from as u64, to as u64)); - } else { - warn!( - target: targets::SESSION, - "Invalid range (operation: {operation_id}): from = {from}; to = {to}" - ); - } - } - info!( - target: targets::SESSION, - "Map requested (operation: {operation_id}). Range: {range:?}" - ); - session.get_map( - operations::uuid_from_str(&operation_id)?, - dataset_len as u16, - range, - ) - } - - #[node_bindgen] - async fn get_values( - &self, - operation_id: String, - dataset_len: i32, - from: Option, - to: Option, - ) -> Result<(), stypes::ComputationError> { - let session = self - .session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)?; - let range: Option> = if let (Some(from), Some(to)) = (from, to) { - if from < 0 || to < 0 || from > to { - return Err(stypes::ComputationError::InvalidArgs(format!( - "Invalid range:from = {from}; to = {to}" - ))); - } - Some(RangeInclusive::new(from as u64, to as u64)) - } else { - None - }; - info!( - target: targets::SESSION, - "Values requested (operation: {operation_id}). Range: {range:?}" - ); - session.get_values( - operations::uuid_from_str(&operation_id)?, - dataset_len as u16, - range, - ) - } - - #[node_bindgen] - async fn get_nearest_to( - &self, - operation_id: String, - position_in_stream: i64, - ) -> Result<(), stypes::ComputationError> { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .get_nearest_to( - operations::uuid_from_str(&operation_id)?, - position_in_stream as u64, - ) - } - - #[node_bindgen] - async fn send_into_sde( - &self, - target: String, - request: JSArrayBuffer, - ) -> Result { - let request = - stypes::SdeRequest::decode(&request).map_err(stypes::ComputationError::Decoding)?; - let session = self - .session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)?; - session - .send_into_sde(operations::uuid_from_str(&target)?, request) - .await - } - - #[node_bindgen] - async fn get_attachments(&self) -> Result { - let session = self - .session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)?; - let attachments = - session - .state - .get_attachments() - .await - .map_err(|e: stypes::NativeError| { - >::into( - stypes::ComputationError::NativeError(e), - ) - })?; - Ok(stypes::AttachmentList(attachments)) - } - - #[node_bindgen] - async fn get_indexed_ranges(&self) -> Result { - let session = self - .session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)?; - let ranges = - session - .state - .get_indexed_ranges() - .await - .map_err(|e: stypes::NativeError| { - >::into( - stypes::ComputationError::NativeError(e), - ) - })?; - Ok(ranges.into()) - } - - #[node_bindgen] - async fn set_debug(&self, debug: bool) -> Result<(), stypes::ComputationError> { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .state - .set_debug(debug) - .await - .map_err(|e: stypes::NativeError| stypes::ComputationError::NativeError(e)) - } - - #[node_bindgen] - async fn get_operations_stat(&self) -> Result { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .tracker - .get_operations_stat() - .await - .map_err(|e: stypes::NativeError| stypes::ComputationError::NativeError(e)) - } - - #[node_bindgen] - async fn sleep( - &self, - operation_id: String, - ms: i64, - ignore_cancellation: bool, - ) -> Result<(), stypes::ComputationError> { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .sleep( - operations::uuid_from_str(&operation_id)?, - ms as u64, - ignore_cancellation, - ) - } - - #[node_bindgen] - async fn trigger_state_error(&self) -> Result<(), stypes::ComputationError> { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .trigger_state_error() - .await - } - - #[node_bindgen] - async fn trigger_tracker_error(&self) -> Result<(), stypes::ComputationError> { - self.session - .as_ref() - .ok_or(stypes::ComputationError::SessionUnavailable)? - .trigger_tracker_error() - .await - } - - #[node_bindgen] - fn test_grab_els_as_json(&self) -> Result { - let mut els = Vec::new(); - for pos in 0..50 { - els.push(stypes::GrabbedElement { - source_id: 0, - nature: 0, - content: format!("{pos}Test line content:{}", " test ".repeat(pos + 1)), - pos, - }) - } - serde_json::to_string(&els).map_err(|_| stypes::ComputationError::InvalidData) - } - - #[node_bindgen] - fn test_grab_els_as_bin(&self) -> Result { - let mut els = Vec::new(); - for pos in 0..50 { - els.push(stypes::GrabbedElement { - source_id: 0, - nature: 0, - content: format!("{pos}Test line content:{}", " test ".repeat(pos + 1)), - pos, - }) - } - Ok(stypes::GrabbedElementList(els)) - } -} diff --git a/application/apps/rustcore/rs-bindings/src/js/session/progress_tracker.rs b/application/apps/rustcore/rs-bindings/src/js/session/progress_tracker.rs deleted file mode 100644 index 3fd87b7a16..0000000000 --- a/application/apps/rustcore/rs-bindings/src/js/session/progress_tracker.rs +++ /dev/null @@ -1,69 +0,0 @@ -use log::trace; -use node_bindgen::derive::node_bindgen; -use session::progress::{ProgressCommand, ProgressTrackerAPI, run_tracking}; -use std::thread; -use stypes::LifecycleTransition; -use tokio::{runtime::Runtime, sync::mpsc::UnboundedReceiver}; - -struct RustProgressTracker { - tracker_api: ProgressTrackerAPI, - rx_events: Option>, -} - -#[node_bindgen] -impl RustProgressTracker { - #[node_bindgen(constructor)] - pub fn new() -> Self { - let (tracker_api, rx_events) = ProgressTrackerAPI::new(); - Self { - tracker_api, - rx_events: Some(rx_events), - } - } - - #[node_bindgen(mt)] - async fn init( - &mut self, - callback: F, - ) -> Result<(), stypes::ComputationError> { - let rt = Runtime::new().map_err(|e| { - stypes::ComputationError::Process(format!("Could not start tokio runtime: {e}")) - })?; - if let Some(rx_events) = self.rx_events.take() { - let (result_tx, result_rx) = std::sync::mpsc::channel(); - thread::spawn(move || { - rt.block_on(async { - trace!("progress_tracker thread running"); - match run_tracking(rx_events).await { - Ok(mut rx) => { - let _ = result_tx.send(Ok(())); - while let Some(progress_report) = rx.recv().await { - callback(progress_report) - } - } - Err(e) => { - let _ = result_tx.send(Err(e)); - } - } - }) - }); - result_rx.recv().map_err(|_| { - stypes::ComputationError::Protocol("could not setup tracking".to_string()) - })? - } else { - Err(stypes::ComputationError::Protocol( - "Could not init progress_tracker".to_string(), - )) - } - } - - #[node_bindgen] - async fn stats(&self) -> Result { - self.tracker_api.content().await - } - - #[node_bindgen] - async fn destroy(&self) -> Result<(), stypes::ComputationError> { - self.tracker_api.abort().await - } -} diff --git a/application/apps/rustcore/rs-bindings/src/lib.rs b/application/apps/rustcore/rs-bindings/src/lib.rs deleted file mode 100644 index fce09fef63..0000000000 --- a/application/apps/rustcore/rs-bindings/src/lib.rs +++ /dev/null @@ -1,21 +0,0 @@ -mod js; -mod logging; - -// **************************************** -// *** Memory Allocators Configurations *** -// **************************************** - -// NOTE: In a Rust project, the memory allocator can only be set once, -// and it applies to the entire project, including all dependencies. -// We chose to configure the allocator in the highest-level library where the runtime is also set. - -// Using the mimalloc allocator resulted in an 20% performance improvement on windows -// But there are report of memory leaks and big difference in memory consumption using it. -#[cfg(all(feature = "custom-alloc", windows))] -#[global_allocator] -static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; - -// Jemalloc currently supports UNIX based operating systems only and provides better performance. -#[cfg(all(feature = "custom-alloc", unix))] -#[global_allocator] -static GLOBAL: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; diff --git a/application/apps/rustcore/rs-bindings/src/logging.rs b/application/apps/rustcore/rs-bindings/src/logging.rs deleted file mode 100644 index e3dbfa3521..0000000000 --- a/application/apps/rustcore/rs-bindings/src/logging.rs +++ /dev/null @@ -1,177 +0,0 @@ -//! Module to manage setting up and configuring logging on Chipmunk Core. - -use anyhow::{Context, Result}; -use log::LevelFilter; -use log4rs::{ - append::file::FileAppender, - config::{Appender, Config, Root}, - encode::pattern::PatternEncoder, -}; -use node_bindgen::init::node_bindgen_init_once; -use std::{ - fs::{self, File}, - io::{BufRead, BufReader}, - path::{Path, PathBuf}, -}; - -/// The current version of logging configurations file. -pub const LOG_CONFIG_VERSION: &str = "2.0"; - -/// Logging targets. -pub mod targets { - /// Target for `session` module in chipmunk core. - pub const SESSION: &str = "session"; -} - -#[node_bindgen_init_once] -fn init_module() { - if let Err(e) = init_logging() { - eprintln!("Problems setting up logging: {e}"); - } -} - -/// Initialize logging reading logging configurations from `log4rs.yaml` file or generating -/// it with the default values if needed. -pub fn init_logging() -> Result<()> { - let log_config_path = chipmunk_log_config()?; - let init_log_result = if validate_log_config_file(&log_config_path) { - // log4rs.yaml exists with matching version, try to parse it - match log4rs::init_file(&log_config_path, Default::default()) { - Ok(()) => Ok(()), - Err(e) => { - eprintln!("problems with existing log config ({e}), write fresh"); - // log4rs.yaml exists, could not parse it - initialize_from_fresh_yml() - } - } - } else { - // log4rs.yaml did not exists - initialize_from_fresh_yml() - }; - - if let Err(err) = init_log_result { - eprintln!("Error while initializing logger from new config file: {err:?}"); - setup_fallback_logging()?; - } - - Ok(()) -} - -/// Return the path of log configurations file in chipmunk home directory. -pub fn chipmunk_log_config() -> Result { - chipmunk_home_dir() - .map(|home| home.join("log4rs.yaml")) - .context("Can't get the path of logging configurations file.") -} - -/// Return the path of chipmunk home directory, creating it if doesn't exist. -/// -/// It'll return an error if the home directory can't be determined in host environment -/// or if creating chipmunk directory fails. -pub fn chipmunk_home_dir() -> Result { - let home_dir = dirs::home_dir() - .context("Determining the path of home directory failed")? - .join(".chipmunk"); - if !home_dir.exists() { - fs::create_dir(&home_dir).context("Creating Chipmunk home directory failed")?; - } - - Ok(home_dir) -} - -/// Checks if log configurations file exists and has matching version to the current one. -/// This function assumes that the first line of the config file has the pattern -/// `# chipmunk_logconf_version: $LOG_CONFIG_VERSION` and it will return false if this pattern -/// doesn't match or on IO errors. -fn validate_log_config_file(file_path: &Path) -> bool { - if !file_path.exists() { - return false; - } - - let file = match File::open(file_path) { - Ok(file) => file, - Err(err) => { - eprintln!("Error while opening logging config file: {err}"); - return false; - } - }; - - let reader = BufReader::new(file); - let first_line = match reader.lines().next() { - Some(Ok(line)) => line, - Some(Err(err)) => { - eprintln!("Error while reading logging config file: {err}"); - return false; - } - None => { - eprintln!("Error: Logging config file is empty"); - return false; - } - }; - - let version = match first_line.split(": ").nth(1) { - Some(version) => version.trim(), - None => { - eprintln!("Parsing the version of logging config file failed"); - return false; - } - }; - - if version != LOG_CONFIG_VERSION { - println!( - "Logging configuration version mismatched. Expected: {LOG_CONFIG_VERSION}, found {version}" - ); - return false; - } - - true -} - -/// Creates a new configurations yaml file then initialize the logger with it. -pub fn initialize_from_fresh_yml() -> Result<()> { - println!("Initialization of logs is started on rs-bindings layer"); - let log_config_path = chipmunk_log_config()?; - let chipmunk_home_dir = chipmunk_home_dir()?; - let indexer_log_path = chipmunk_home_dir.join("chipmunk.indexer.log"); - let launcher_log_path = chipmunk_home_dir.join("chipmunk.launcher.log"); - let log_config_content = std::include_str!("../log4rs.yaml") - .replace("$LOG_CONFIG_VERSION", LOG_CONFIG_VERSION) - .replace("$INDEXER_LOG_PATH", &indexer_log_path.to_string_lossy()) - .replace("$LAUNCHER_LOG_PATH", &launcher_log_path.to_string_lossy()); - - if log_config_path.exists() { - std::fs::remove_file(&log_config_path) - .context("Error while removing invalid log configurations file")?; - } - - std::fs::write(&log_config_path, log_config_content) - .context("Error while writing to log configurations file")?; - - log4rs::init_file(&log_config_path, Default::default())?; - println!("Initialization of logs is finished:\n{indexer_log_path:?}\n{launcher_log_path:?}"); - - Ok(()) -} - -/// Initialize Logging with the hard coded configurations without using log configurations files. -pub fn setup_fallback_logging() -> Result<()> { - println!("[setup_fallback_logging]: Initialization of logs is started on rs-bindings layer"); - let log_path = chipmunk_home_dir()?.join("chipmunk.launcher.log"); - let appender_name = "startup-appender"; - let logfile = FileAppender::builder() - .encoder(Box::new(PatternEncoder::new("{d} - {l}:: {m}\n"))) - .build(log_path)?; - - let config = Config::builder() - .appender(Appender::builder().build(appender_name, Box::new(logfile))) - .build( - Root::builder() - .appender(appender_name) - .build(LevelFilter::Warn), - ) - .expect("log4rs config could not be created"); - - log4rs::init_config(config).expect("logging could not be initialized"); - println!("[setup_fallback_logging]:Initialization of logs is finished"); - Ok(()) -} diff --git a/application/apps/rustcore/ts-bindings/.eslintrc.json b/application/apps/rustcore/ts-bindings/.eslintrc.json deleted file mode 100644 index 05c8b93c6a..0000000000 --- a/application/apps/rustcore/ts-bindings/.eslintrc.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "env": { - "browser": true, - "es2021": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended" - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "plugins": ["@typescript-eslint"], - "ignorePatterns": ["dist/**", "spec/**"], - "rules": { - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_" - } - ], - "@typescript-eslint/no-empty-interface": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-inferrable-types": "off", - "@typescript-eslint/no-this-alias": "off" - } -} diff --git a/application/apps/rustcore/ts-bindings/.yarnrc.yml b/application/apps/rustcore/ts-bindings/.yarnrc.yml deleted file mode 100644 index 3186f3f079..0000000000 --- a/application/apps/rustcore/ts-bindings/.yarnrc.yml +++ /dev/null @@ -1 +0,0 @@ -nodeLinker: node-modules diff --git a/application/apps/rustcore/ts-bindings/eslint.config.mjs b/application/apps/rustcore/ts-bindings/eslint.config.mjs deleted file mode 100644 index 9d55dfcf49..0000000000 --- a/application/apps/rustcore/ts-bindings/eslint.config.mjs +++ /dev/null @@ -1,51 +0,0 @@ -import typescriptEslint from "@typescript-eslint/eslint-plugin"; -import globals from "globals"; -import tsParser from "@typescript-eslint/parser"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import js from "@eslint/js"; -import { FlatCompat } from "@eslint/eslintrc"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const compat = new FlatCompat({ - baseDirectory: __dirname, - recommendedConfig: js.configs.recommended, - allConfig: js.configs.all -}); - -export default [{ - ignores: ["dist/**/*", "spec/**/*"], -}, ...compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended"), { - plugins: { - "@typescript-eslint": typescriptEslint, - }, - - languageOptions: { - globals: { - ...globals.browser, - }, - - parser: tsParser, - ecmaVersion: "latest", - sourceType: "module", - }, - - rules: { - "no-control-regex": "off", - - "@typescript-eslint/no-unused-vars": ["error", { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "caughtErrorsIgnorePattern": "^_" - }], - "@typescript-eslint/no-this-alias": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-empty-interface": "off", - "@typescript-eslint/no-inferrable-types": "off", - "@typescript-eslint/no-unsafe-declaration-merging": "off", - "@typescript-eslint/no-unused-expressions": "off", - "@typescript-eslint/no-empty-object-type": "off" - - }, -}]; \ No newline at end of file diff --git a/application/apps/rustcore/ts-bindings/launch.json b/application/apps/rustcore/ts-bindings/launch.json deleted file mode 100644 index 81c0359b7f..0000000000 --- a/application/apps/rustcore/ts-bindings/launch.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Jasmine Current File", - "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", - "program": "${workspaceFolder}/node_modules/.bin/jasmine", - "args": ["${file}"], - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen" - } - ] -} diff --git a/application/apps/rustcore/ts-bindings/package.json b/application/apps/rustcore/ts-bindings/package.json deleted file mode 100644 index 06a1dacfe9..0000000000 --- a/application/apps/rustcore/ts-bindings/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "rustcore", - "version": "3.9.0", - "description": "", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "scripts": { - "build": "node_modules/.bin/tsc -p tsconfig.json", - "prod": "node_modules/.bin/tsc -p tsconfig.json", - "test_cancel": "node_modules/.bin/electron node_modules/jasmine-ts/lib/index.js ./spec/session.cancel.spec.ts", - "lint": "node_modules/.bin/eslint . --max-warnings=0", - "check": "node_modules/.bin/tsc -p tsconfig.json --noemit" - }, - "author": "Dmitry Astafyev", - "contributors": [], - "license": "MIT", - "devDependencies": { - "@electron/rebuild": "^4.0.3", - "@types/jasmine": "^5.1.5", - "@types/node": "^22.10.10", - "@types/tmp": "^0.2.4", - "@types/uuid": "^10.0.0", - "@typescript-eslint/eslint-plugin": "^8.21.0", - "@typescript-eslint/parser": "^8.21.0", - "custom.stdout": "^1.0.2", - "electron": "^34.0.1", - "electron-build-env": "0.2.0", - "eslint": "^9.18.0", - "eslint-plugin-import": "^2.31.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^7.2.1", - "jasmine": "^5.5.0", - "loglevel": "^1.9.2", - "tmp": "^0.2.3", - "ts-node": "^10.4.0", - "typescript": "^5.7.3" - }, - "dependencies": { - "platform": "link:../../../platform", - "protocol": "link:../../protocol/pkg", - "tslib": "^2.8.1", - "uuid": "^11.0.5" - }, - "packageManager": "yarn@4.6.0" -} diff --git a/application/apps/rustcore/ts-bindings/spec/_session.benchmark.spec.ts b/application/apps/rustcore/ts-bindings/spec/_session.benchmark.spec.ts deleted file mode 100644 index f260d601c5..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/_session.benchmark.spec.ts +++ /dev/null @@ -1,319 +0,0 @@ -// tslint:disable - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { createSampleFile, finish, performanceReport, setMeasurement } from './common'; -import { readBenchmarkConfigurationFile } from './config_benchmarks'; -import { IndexingMode } from 'platform/types/content'; -import * as runners from './runners'; - -const config = readBenchmarkConfigurationFile().get().tests.benchmark; - -describe('Benchmark Tests', function () { - Object.keys(config).forEach((testId: string, index: number) => { - const test = config[testId]; - const testName = `${test.alias}`; - if (test.ignore) { - console.log(`Test "${testName}" has been ignored`); - return; - } - - it(testName, function () { - return runners.withSession( - { - open_as: '', - ignore: false, - alias: testName, - expectation_ms: 10000, - file: '', - }, - 1, - async (logger, done, { session, stream, events, search }) => { - const measurement = setMeasurement(); - let home_dir = (process.env as any)['SH_HOME_DIR']; - if (!home_dir || typeof home_dir !== 'string' || home_dir.trim() === '') { - throw new Error( - 'Environment variable SH_HOME_DIR is not set or is invalid.', - ); - } - - switch (testId) { - case 'test1': - stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(`${home_dir}/${test.file}`) - .get() - .sterilized(), - ) - .catch(finish.bind(null, session, done)); - break; - case 'test2': - stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .file(`${home_dir}/${test.file}`) - .asDlt({ - filter_config: undefined, - fibex_file_paths: [], - with_storage_header: true, - tz: undefined, - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, session, done)); - break; - case 'test3': - stream - .observe( - new Factory.File() - .type(Factory.FileType.PcapNG) - .file(`${home_dir}/${test.file}`) - .asDlt({ - filter_config: undefined, - fibex_file_paths: [], - with_storage_header: false, - tz: undefined, - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, session, done)); - break; - case 'test4': - const tmpobj1 = createSampleFile( - 5000, - logger, - (i: number) => `some line data: ${i}\n`, - ); - - let { - session: startupSession, - stream: startupStream, - events: startupEvents, - search: startupSearch, - } = await runners.initializeSession(testName); - - startupStream.observe( - new Factory.Stream() - .asText() - .process({ - command: `less ${tmpobj1.name}`, - cwd: process.cwd(), - shell: undefined, - }) - .get() - .sterilized(), - ); - const startupResults = measurement(); - const startupReport = performanceReport( - testName, - startupResults.ms, - test.expectation_ms, - `${home_dir}/${test.file}`, - ); - finish( - [startupSession, session], - done, - startupReport ? undefined : new Error(`${testName} is fail`), - ); - break; - case 'test5': - const tmpobj2 = createSampleFile( - 5000, - logger, - (i: number) => `some line data: ${i}\n`, - ); - - stream.observe( - new Factory.Stream() - .asText() - .process({ - command: `less ${tmpobj2.name}`, - cwd: process.cwd(), - shell: undefined, - }) - .get() - .sterilized(), - ); - const shutdownResult = measurement(); - const shutdownReport = performanceReport( - testName, - shutdownResult.ms, - test.expectation_ms, - `${home_dir}/${test.file}`, - ); - finish( - session, - done, - shutdownReport ? undefined : new Error(`${testName} is fail`), - ); - break; - case 'test6': - const multiSessions = [session]; - for (let i = 0; i < 50; i++) { - const file = createSampleFile( - 100, - logger, - (j: number) => `file ${i} line data: ${j}\n`, - ); - - let { - session: multiSession, - stream: multiSessionStream, - events: multiSessionEvents, - search: multiSessionSearch, - } = await runners.initializeSession(testName); - multiSessions.push(multiSession); - - multiSessionStream - .observe( - new Factory.Stream() - .asText() - .process({ - command: `less ${file.name}`, - cwd: process.cwd(), - shell: undefined, - }) - .get() - .sterilized(), - ) - .catch( - (err: Error) => `File ${i} failed to open: ${err.message}`, - ); - } - const testResult = measurement(); - const testReport = performanceReport( - testName, - testResult.ms, - test.expectation_ms, - `${home_dir}/${test.file}`, - ); - finish( - multiSessions, - done, - testReport ? undefined : new Error(`${testName} is fail`), - ); - break; - case 'test7': - let controlSum = 0; - let countMatches = 0; - let read: boolean = false; - stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(`${home_dir}/${test.file}`) - .get() - .sterilized(), - ) - .catch(finish.bind(null, session, done)); - const updates: number[] = []; - events.IndexedMapUpdated.subscribe((event: any) => { - event.len > 0 && updates.push(event.len); - }); - events.StreamUpdated.subscribe(async () => { - read = true; - try { - await search.search([ - { - filter: 'HTTP', - flags: { reg: true, word: true, cases: false }, - }, - ]); - let items = await stream.grabIndexed(0, countMatches); - await stream.setIndexingMode(IndexingMode.Breadcrumbs); - finish(session, done); - } catch (err) { - finish( - undefined, - done, - new Error( - `Fail to finish test due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - } - }); - break; - case 'test8': - stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(`${home_dir}/${test.file}`) - .get() - .sterilized(), - ) - .on('processing', () => { - search - .search([ - { - filter: 'http', - flags: { reg: true, word: false, cases: false }, - }, - ]) - .catch(finish.bind(null, session, done)); - }) - .catch(finish.bind(null, session, done)); - break; - case 'test9': - stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(`${home_dir}/${test.file}`) - .get() - .sterilized(), - ) - .on('processing', () => { - search - .search([ - { - filter: 'http://www.almhuette-raith.at', - flags: { reg: true, word: false, cases: false }, - }, - { - filter: 'com.apple.hiservices-xpcservice', - flags: { reg: true, word: false, cases: false }, - }, - { - filter: 'Google Chrome Helper', - flags: { reg: true, word: false, cases: false }, - }, - ]) - .catch(finish.bind(null, session, done)); - }) - .catch(finish.bind(null, session, done)); - break; - default: - throw new Error(`Unsupported format or alias: ${test.alias}`); - } - events.FileRead.subscribe(() => { - const results = measurement(); - const reportResult = performanceReport( - testName, - results.ms, - test.expectation_ms, - `${home_dir}/${test.file}`, - ); - finish( - session, - done, - reportResult ? undefined : new Error(`${testName} is fail`), - ); - }); - }, - ); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/benchmarks.json b/application/apps/rustcore/ts-bindings/spec/benchmarks.json deleted file mode 100644 index e8bbf4186b..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/benchmarks.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "log_level": 1, - "tests": { - "benchmark": { - "test1": { - "alias": "Observe - grab content (text)", - "file": "test_files/temp_readings3.txt", - "expectation_ms": 20000 - }, - "test2": { - "alias": "Observe - grab content (dlt)", - "file": "test_files/FzgProg_SP21.dlt", - "expectation_ms": 1200000 - }, - "test3": { - "alias": "Observe - grab content (pcapng)", - "file": "test_files/someip.pcapng", - "expectation_ms": 20000 - }, - "test4": { - "alias": "Stream - startup measurement", - "file": "", - "expectation_ms": 20000 - }, - "test5": { - "alias": "Stream - shutdown measurement", - "file": "", - "expectation_ms": 200000 - }, - "test6": { - "alias": "Stream - Open 50 sessions", - "file": "", - "expectation_ms": 200000 - }, - "test7": { - "alias": "Indexes - Switch to breadcrumb mode", - "file": "test_files/indexing_access_huge.log", - "expectation_ms": 300000 - }, - "test8": { - "alias": "Assign & single search", - "file": "test_files/indexing_access_huge.log", - "expectation_ms": 30000 - }, - "test9": { - "alias": "Assign & multiple search", - "file": "test_files/indexing_access_huge.log", - "expectation_ms": 100000 - } - } - } -} diff --git a/application/apps/rustcore/ts-bindings/spec/common.ts b/application/apps/rustcore/ts-bindings/spec/common.ts deleted file mode 100644 index 5f6a65d2c6..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/common.ts +++ /dev/null @@ -1,281 +0,0 @@ -// tslint:disable - -import { Jobs, Tracker, Session } from '../src/index'; -import { Logger } from './logger'; -import { error, numToLogLevel } from 'platform/log/utils'; -import { state } from 'platform/log'; - -import * as tmp from 'tmp'; -import * as fs from 'fs'; -import * as path from 'path'; - -const NS_PER_SEC = 1e9; -const NS_PER_MS = 1000000; -const MS_PER_SEC = 1000; - -// Get rid of default Jasmine timeout -jasmine.DEFAULT_TIMEOUT_INTERVAL = 900000; - -export function rootPath(): string { - const parts = path.dirname(module.filename).split(path.sep); - if (parts.length > 0 && parts[0].trim() === '') { - parts[0] = path.sep; - } - for (let i = parts.length - 1; i >= 0; i -= 1) { - const el = parts[i]; - parts.splice(i, 1); - if (el === 'application') { - break; - } - } - return path.join(...parts); -} -export function relativePath(dest: string): string { - return path.join(rootPath(), dest); -} - -export function readConfigFile(filenameEnvVar: string, defaultPaths: string[]): T | Error { - const defaults = (() => { - for (const target of defaultPaths) { - if (fs.existsSync(target)) { - return target; - } - } - return undefined; - })(); - - let filename = (process.env as any)[filenameEnvVar]; - if ((typeof filename !== 'string' || filename.trim() === '') && defaults === undefined) { - return new Error( - `To run test you should define a path to configuration file with ${filenameEnvVar}=path_to_config_json_file`, - ); - } else if (typeof filename !== 'string' || filename.trim() === '') { - filename = defaults; - } - - if (!fs.existsSync(filename)) { - return new Error(`Configuration file ${filename} doesn't exist`); - } - - const buffer = fs.readFileSync(filename); - try { - return JSON.parse(buffer.toString().replace(/\/\*.*\*\//gi, '')) as T; - } catch (err) { - return new Error( - `Fail to parse configuration file ${filename}; error: ${ - err instanceof Error ? err.message : err - }`, - ); - } -} - -export function finish( - sessions: Array | Session | Jobs | Tracker | undefined, - done: (...args: any[]) => void, - err?: Error, -): void { - if (err !== undefined) { - fail(err); - } - sessions = sessions instanceof Array ? sessions : [sessions]; - const filtered = sessions.filter((s) => s !== undefined); - if (filtered.length === 0) { - done(); - } else { - Promise.allSettled( - filtered.map((session) => - session === undefined ? Promise.resolve() : session.destroy(), - ), - ).then((results) => { - let reasons: any[] = []; - results.forEach((res) => { - if (res.status === 'rejected') { - reasons.push(res.reason); - } - }); - if (reasons.length === 0) { - const session = filtered.find((s) => s instanceof Session); - if (session !== undefined) { - checkSessionDebugger(session as Session, done); - } else { - done(); - } - } else { - fail(new Error(reasons.map((r) => error(r)).join('; '))); - } - }); - } -} - -export function checkSessionDebugger(session: Session, done: () => void) { - const stat = session.getDebugStat(); - if (stat.unsupported.length !== 0) { - fail(new Error(`Unsupported events:\n\t- ${stat.unsupported.join('\n\t- ')}`)); - } - if (stat.errors.length !== 0) { - fail(new Error(`Errors:\n\t- ${stat.errors.join('\n\t- ')}`)); - } - session.printDebugStat(true); - done(); -} - -(function () { - const loglevel: string | undefined = (process.env as any)['JASMIN_LOG_LEVEL']; - const numericLoglevel: number = loglevel === undefined ? 1 : parseInt(loglevel, 10); - if ( - isNaN(numericLoglevel) || - !isFinite(numericLoglevel) || - numericLoglevel < 0 || - numericLoglevel > 6 - ) { - return; - } - state.setLevel(numToLogLevel(numericLoglevel)); -})(); - -export function createSampleFile( - lines: number, - logger: Logger, - creator: (i: number) => string, -): tmp.FileResult { - const tmpobj = tmp.fileSync(); - var content = ''; - for (let i = 0; i < lines; i++) { - content += creator(i); - } - fs.appendFileSync(tmpobj.name, content); - const stats = fs.statSync(tmpobj.name); - logger.debug(`Created example grabber file of size: ${stats.size}`); - return tmpobj; -} - -export function appendToSampleFile( - tmpobj: tmp.FileResult, - lines: number, - logger: Logger, - creator: (i: number) => string, -): tmp.FileResult { - var content = ''; - for (let i = 0; i < lines; i++) { - content += creator(i); - } - fs.appendFileSync(tmpobj.name, content); - const stats = fs.statSync(tmpobj.name); - logger.debug(`Appened date to example file of size: ${stats.size}`); - return tmpobj; -} - -export function performanceReport( - name: string, - actual: number, - expectation: number, - filename?: string, -): boolean { - const output = console.log; - const LEN: number = 80; - const MAX = LEN + 2; - const SCALE = 10; - const format = (str: string, filler: string = ' '): string => { - return `│ ${str}${filler.repeat(MAX > str.length - 3 ? MAX - str.length - 3 : 0)}│`; - }; - const fill = (str: string, len: number, filler: string = ' '): string => { - if (len - str.length < 0) { - return str; - } - return `${filler.repeat(len - str.length)}${str}`; - }; - output(`\n┌${'─'.repeat(LEN)}┐`); - output(format(`▒▒▒ ${name} `, '▒')); - output(format(`Performance measurement: ${actual < expectation ? 'PASSED' : 'FAILED'}`)); - if (typeof filename === 'string') { - const stat = fs.statSync(filename); - output(format(`File size: ${(stat.size / 1024 / 1024).toFixed(2)}Mb`)); - } - output(`├${'─'.repeat(LEN)}┤`); - const step = Math.max(expectation, actual) / SCALE; - const scale_actual = Math.floor(actual / step); - const scale_expect = Math.floor(expectation / step); - const diff = Math.abs(expectation - actual); - const scale_diff = Math.floor(diff / step); - output( - format( - `${fill('Actual', 14)} [${fill(actual.toFixed(2), 8)}ms][${'■'.repeat( - scale_actual, - )}${'·'.repeat(SCALE - scale_actual < 0 ? 0 : SCALE - scale_actual)}]`, - ), - ); - output( - format( - `${fill('Expectation', 14)} [${fill(expectation.toFixed(2), 8)}ms][${'■'.repeat( - scale_expect, - )}${'·'.repeat(SCALE - scale_expect < 0 ? 0 : SCALE - scale_expect)}]`, - ), - ); - output( - format( - `${fill('Diff', 14)} [${fill(diff.toFixed(2), 8)}ms][${'■'.repeat( - scale_diff, - )}${'·'.repeat(SCALE - scale_diff < 0 ? 0 : SCALE - scale_diff)}]`, - ), - ); - output(`└${'─'.repeat(LEN)}┘`); - - const result = { - name, - actual, - expectation, - passed: actual <= expectation, - }; - - let performance_results_folder = (process.env as any)['PERFORMANCE_RESULTS_FOLDER']; - let performance_results = (process.env as any)['PERFORMANCE_RESULTS']; - let home_dir = (process.env as any)['SH_HOME_DIR']; - if (home_dir && performance_results_folder) { - const folderPath = path.join(home_dir, performance_results_folder); - const filePath = path.join(folderPath, performance_results); - // Ensure filePath is a real path - if (!fs.existsSync(folderPath)) { - // Create directory if it doesn't exist - fs.mkdirSync(folderPath, { recursive: true }); - output(`Created directory: ${folderPath}`); - } - - let results = []; - if (fs.existsSync(filePath)) { - let existingData = fs.readFileSync(filePath, 'utf-8'); - try { - results = JSON.parse(existingData); - } catch (error) { - output('Error parsing existing JSON data:'); - } - } - results.push(result); - const data = JSON.stringify(results, null, 2); // JSON format with indentation - fs.writeFileSync(filePath, data); - } else { - output(`Missing necessary environment variables for file path.`); - } - - return actual <= expectation; -} - -export interface ITimeMeasurement { - ns: number; - ms: number; - ms_str: string; - sec_str: string; -} -export function setMeasurement(): () => ITimeMeasurement { - const start = process.hrtime(); - return (): ITimeMeasurement => { - const end = process.hrtime(start); - const ns = end[0] * NS_PER_SEC + end[1]; - const ms = ns / NS_PER_MS; - return { - ns: ns, - ms: ms, - ms_str: ms.toFixed(2), - sec_str: (ms / MS_PER_SEC).toFixed(2), - }; - }; -} diff --git a/application/apps/rustcore/ts-bindings/spec/config.ts b/application/apps/rustcore/ts-bindings/spec/config.ts deleted file mode 100644 index 775deb23a1..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/config.ts +++ /dev/null @@ -1,115 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import { readConfigFile } from './common'; - -export interface ICancelTestSpec { - terms: string[]; - interval_ms: number; - timeout_last_search_ms: number; - filesize: number; - datasetLength: number; -} - -export interface IMapTestSpec { - filesize: number; - datasetLength: number; -} - -export interface IRegularTests { - execute_only: number[]; - list: { [key: string]: string }; - files: { [key: string]: string }; - spec?: { - cancel?: { [key: string]: ICancelTestSpec }; - map?: { [key: string]: IMapTestSpec }; - }; -} - -export interface IConfiguration { - log_level: number; - tests: { - observe: { - regular: IRegularTests; - }; - protocol: { - regular: IRegularTests; - }; - stream: { - regular: IRegularTests; - }; - indexes: { - regular: IRegularTests; - }; - jobs: { - regular: IRegularTests; - }; - concat: { - regular: IRegularTests; - }; - search: { - regular: IRegularTests; - }; - values: { - regular: IRegularTests; - }; - ranges: { - regular: IRegularTests; - }; - extract: { - regular: IRegularTests; - }; - exporting: { - regular: IRegularTests; - }; - cancel: { - regular: IRegularTests; - }; - errors: { - regular: IRegularTests; - }; - map: { - regular: IRegularTests; - }; - promises: { - regular: IRegularTests; - }; - observing: { - regular: IRegularTests; - }; - }; -} - -export function readConfigurationFile(): Config { - const config = readConfigFile('JASMIN_TEST_CONFIGURATION', [ - path.resolve(path.dirname(module.filename), 'defaults.json'), - path.resolve(path.dirname(module.filename), '../../defaults.json'), - ]); - - if (config instanceof Error) { - console.warn(`\n`); - console.warn(`=`.repeat(81)); - console.warn(`**** ERROR ${'*'.repeat(68)}`); - console.warn(`=`.repeat(81)); - console.warn(`Fail to read configuration file due error: ${config.message}`); - console.warn( - `Test will be done in the scope of tasks, which do not require configuration.`, - ); - console.warn(`=`.repeat(81)); - console.warn(`\n`); - process.exit(1); - } else { - return new Config(config); - } -} - -export class Config { - private readonly _config: IConfiguration; - - constructor(config: IConfiguration) { - this._config = config; - } - - public get(): IConfiguration { - return this._config; - } -} diff --git a/application/apps/rustcore/ts-bindings/spec/config_benchmarks.ts b/application/apps/rustcore/ts-bindings/spec/config_benchmarks.ts deleted file mode 100644 index 86299a93f4..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/config_benchmarks.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import { readConfigFile } from './common'; - -export interface IPerformanceTest { - open_as: 'text' | 'dlt' | 'pcapng' | ''; - ignore: boolean; - alias: string; - expectation_ms: number; - file: string; -} - -export interface IConfiguration { - log_level: number; - tests: { - benchmark: { [key: string]: IPerformanceTest }; - }; -} - -export function readBenchmarkConfigurationFile(): Config { - const config = readConfigFile('JASMIN_TEST_CONFIGURATION', [ - path.resolve(path.dirname(module.filename), 'benchmarks.json'), - path.resolve(path.dirname(module.filename), '../../benchmarks.json'), - ]); - - if (config instanceof Error) { - console.warn(`\n`); - console.warn(`=`.repeat(81)); - console.warn(`**** ERROR ${'*'.repeat(68)}`); - console.warn(`=`.repeat(81)); - console.warn(`Fail to read configuration file due error: ${config.message}`); - console.warn( - `Test will be done in the scope of tasks, which do not require configuration.`, - ); - console.warn(`=`.repeat(81)); - console.warn(`\n`); - process.exit(1); - } else { - return new Config(config); - } -} - -export class Config { - private readonly _config: IConfiguration; - - constructor(config: IConfiguration) { - this._config = config; - } - - public get(): IConfiguration { - return this._config; - } -} diff --git a/application/apps/rustcore/ts-bindings/spec/defaults.json b/application/apps/rustcore/ts-bindings/spec/defaults.json deleted file mode 100644 index 03f8288e96..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/defaults.json +++ /dev/null @@ -1,290 +0,0 @@ -/* NOTE: in this JSON can be used comments placed between stars */ -{ - "log_level": 1, - "tests": { - "observe": { - "regular": { - /* With numbers you can define, which tests should be executed. "execute_only": [1, 3] will run ONLY tests 1 and 3*/ - /* If "execute_only" isn't empty, all performance tests will be ignored*/ - "execute_only": [1, 4, 5, 6, 7, 8, 9, 10], - "list": { - "1": "Test 1. Observe and grab content (text)", - "2": "Test 2. Observe and grab content (pcapng)", - "3": "Test 3. Observe and grab content (dlt)", - "4": "Test 4. Observe and grab content (attachments)", - "5": "Test 5. Observe and grab content (someip from pcapng)", - "6": "Test 6. Observe and grab content (someip from pcapng with fibex)", - "7": "Test 7. Observe and grab content (someip from pcap)", - "8": "Test 8. Observe and grab content (someip from pcap with fibex)", - "9": "Test 9. Observe and grab content (someip from dlt)", - "10": "Test 10. Observe and grab content (someip from dlt with fibex)" - }, - "files": { - "attachments": "../../../../application/developing/resources/attachments.dlt", - "someip-pcapng": "../../../../application/developing/resources/someip.pcapng", - "someip-pcap": "../../../../application/developing/resources/someip.pcap", - "someip-fibex": "../../../../application/developing/resources/someip.xml", - "someip-dlt": "../../../../application/developing/resources/someip.dlt" - } - } - }, - "protocol": { - "regular": { - "execute_only": [2,3], - "list": { - "1": "Test 1. CallbackEvent", - "2": "Test 2. Check all messages", - "3": "Test 3. Comparing JSON vs Protobuf" - }, - "files": { - } - } - }, - "stream": { - "regular": { - "execute_only": [], - "list": { - "1": "Test 1. Observe and grab", - "2": "Test 2. Life cycle", - "3": "Test 3. Invalid data source", - "4": "Test 4. Updated stream", - "5": "Test 5. Updated stream search", - "6": "Test 6. Aborting stream", - "7": "Test 7. Multiple stream & SDE test" - }, - "files": {} - } - }, - "indexes": { - "regular": { - "execute_only": [], - "list": { - "1": "Test 1. Observe and grab" - }, - "files": {} - } - }, - "jobs": { - "regular": { - "execute_only": [1, 2, 3, 4, 5, 7, 8], - "list": { - "1": "Test 1. Cancelation testing", - "2": "Test 2. Wrong sequence test", - "3": "Test 3. Folder content listing", - "4": "Test 4. Get profiles", - "5": "Test 5. Get envvars", - "6": "Test 6. Get Someip statistic", - "7": "Test 7. Check if file is binary", - "8": "Test 8. Closing session with running task" - }, - "files": { - "someip-pcapng": "../../../../application/developing/resources/someip.pcapng", - "sample-txt": "../../../../application/developing/resources/sample_utf_8.txt" - } - } - }, - "concat": { - "regular": { - "execute_only": [], - "list": { - "1": "Test 1. Concat and grab content (text)", - "2": "Test 2. Concat and grab content (pcapng)", - "3": "Test 3. Concat and grab content (dlt)" - }, - "files": {} - } - }, - "ranges": { - "regular": { - "execute_only": [], - "list": { - "1": "Test 1. Assign & grab ranges" - } - } - }, - "search": { - "regular": { - "execute_only": [], - "list": { - "1": "Test 1. Assign & single search", - "2": "Test 2. Assign & multiple search", - "3": "Test 3. Assign & zero search", - "4": "Test 4. Assign & single not case sensitive search", - "5": "Test 5. Assign & single word search", - "6": "Test 6. Assign & single search with crossing terms", - "7": "Test 7. Assign & repeated search", - "8": "Test 8. Assign & search and nested search" - } - } - }, - "values": { - "regular": { - "execute_only": [], - "list": { - "1": "Test 1. Assign & single search", - "2": "Test 2. Assign & single search, getting updates" - } - } - }, - "extract": { - "regular": { - "execute_only": [], - "list": { - "1": "Test 1. Assign & extract data", - "2": "Test 2. Assign & extract multiple data" - } - } - }, - "exporting": { - "regular": { - "execute_only": [], - "list": { - "1": "Test 1. Assign & export", - "2": "Test 2. Concat & export", - "3": "Test 3. Assign & export search", - "4": "Test 4. DLT: Assign & export", - "5": "Test 5. DLT: Assign & export raw", - "6": "Test 6. DLT: Concat & export", - "7": "Test 7. DLT: Concat & export raw", - "8": "Test 8. DLT: Concat & export raw (multiple ranges)", - "9": "Test 9. DLT: Assign & export columns (from left)", - "10": "Test 10. DLT: Assign & export columns (from right)", - "11": "Test 11. DLT: Assign & export columns (single)", - "12": "Test 12. DLT: Assign & export columns (stability)" - }, - "files": { - "dlt": [ - "./application/developing/resources/attachments.dlt", - "./application/developing/resources/someip.dlt" - ] - } - } - }, - "cancel": { - "regular": { - "execute_only": [1], - "list": { - "1": "Test 1. Cancel operation before done", - "2": "Test 2. Cancel operation after done", - /* Required text file*/ - "3": "Test 3. Multiple search" - }, - "files": {}, - "spec": { - "cancel": { - /* Specification for test #3*/ - "3": { - "terms": [ - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "r", - "h", - "t" - ], - "interval_ms": 250, - "timeout_last_search_ms": 10000 - } - } - } - } - }, - "errors": { - "regular": { - "execute_only": [], - "list": { - "1": "Test 1. Error: search before observe", - "2": "Test 2. Error: Assign fake file", - "3": "Test 3. Error: Assign and grab invalid range", - "4": "Test 4. Error: Assign & single and grab invalid range", - "5": "Test 5. Error: Grab lines with negative length", - "6": "Test 6. Error: Grab lines with negative start", - "7": "Test 7. Error: Unexpected error on session state", - "8": "Test 8. Error: Unexpected error on session tracker", - "9": "Test 9. Destroy dead session", - "10": "Test 10. Search with invalid filters" - } - } - }, - "map": { - "regular": { - "execute_only": [], - "list": { - "1": "Test 1. Search map for file length < dataset length", - "2": "Test 2. Search map for 10 line file with match on first line", - "3": "Test 3. Search map for big file with multiple filters", - "4": "Test 4. Search map for file containing '>>'", - "5": "Test 5. Search map for file with ':'-match", - "6": "Test 6. Search map for file with '0.0:1'-match", - "7": "Test 7. Search map for file with 'word(0.0:1'-match" - }, - "spec": { - "map": { - "1": { - "filesize": 3000, - "datasetLength": 6000 - }, - "2": { - "filesize": 10, - "datasetLength": 10 - }, - "3": { - "filesize": 6000, - "datasetLength": 6000 - }, - "4": { - "filesize": 10, - "datasetLength": 10 - }, - "5": { - "filesize": 1000, - "datasetLength": 1000 - }, - "6": { - "filesize": 1000, - "datasetLength": 1000 - }, - "7": { - "filesize": 1000, - "datasetLength": 1000 - } - } - } - } - }, - "promises": { - "regular": { - "execute_only": [], - "list": { - "1": "Test 1. Regular", - "2": "Test 2. Cancellation", - "3": "Test 3. Cancellation delegation", - "4": "Test 4. Resolving bound", - "5": "Test 5. Rejecting bound", - "6": "Test 6. Cancel bound", - "7": "Test 7. Bound cancellation delegation", - "8": "Test 8. Events" - }, - "files": {} - } - }, - "observing": { - "regular": { - "execute_only": [], - "list": { - "1": "Test 1. Observer", - "2": "Test 2. Observe configuration (streams)", - "3": "Test 3. Observe configuration (origins)", - "4": "Test 4. Observe configuration (parsers)", - "5": "Test 5. Observe configuration updates (tracking)", - "6": "Test 6. Observe configuration (overwriting)" - }, - "files": {} - } - } - } -} diff --git a/application/apps/rustcore/ts-bindings/spec/logger.ts b/application/apps/rustcore/ts-bindings/spec/logger.ts deleted file mode 100644 index 60f6d3dc33..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/logger.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { Logger as Base, Level, state } from 'platform/log'; -import { scope } from 'platform/env/scope'; - -import * as fs from 'fs'; -import * as os from 'os'; -import * as path from 'path'; - -const LOG_FILE = 'chipmunk.indexer.log'; -const HOME = '.chipmunk'; -const FORCED_REPORT_TIMEOUT = 2 * 60 * 1000; - -const BLOCKS_LOGS = ((): boolean => { - const value = (process.env as any)['JASMIN_TEST_BLOCKS_LOGS']; - if (typeof value === 'string') { - return ['true', 'on', '1'].includes(value.toLowerCase()); - } else if (typeof value === 'number') { - return value > 0; - } else if (typeof value === 'boolean') { - return value; - } else { - return false; - } -})(); -export function getLogger(signature: string): Logger { - return new Logger(signature); -} - -const collected: string[] = []; -let inited: boolean = false; -let reported: boolean = false; -let timeout = setTimeout(() => { - Logger.report(); -}, FORCED_REPORT_TIMEOUT); - -export class Logger extends Base { - public static report() { - if (reported) { - return; - } - reported = true; - const border = '='.repeat(75); - console.log(`\n${border}\nNodeJS Level Logs\n${border}`); - collected.forEach((log) => { - console.log(log); - }); - const filename = path.join(os.homedir(), HOME, LOG_FILE); - console.log(`\n${border}\n${filename}\n${border}`); - if (!fs.statSync(filename)) { - console.log(`file isn't found`); - return; - } - try { - console.log(fs.readFileSync(filename, 'utf8')); - } catch (e) { - console.error(e); - } - } - - public override store(msg: string, _level: Level): void { - // For testing we are writing all logs. - collected.push(msg); - } -} - -export function initLogger() { - if (inited) { - return; - } - inited = true; - scope.setLogger(Logger); - state.setLevel(Level.ERROR); -} - -initLogger(); - -let failed: number = 0; -const jasmineLogger = getLogger(`Jasmine`); - -jasmine.getEnv().addReporter({ - specStarted: (result: any) => { - jasmineLogger.debug( - 'Spec started: ' + - result.description + - ' whose full description is: ' + - result.fullName, - ); - }, - specDone: function (result: any) { - if (result.status === 'passed') { - return; - } - failed += 1; - }, - suiteDone: function (_result: any) { - if (failed === 0) { - return; - } - clearTimeout(timeout); - !BLOCKS_LOGS && Logger.report(); - }, -}); diff --git a/application/apps/rustcore/ts-bindings/spec/runners.ts b/application/apps/rustcore/ts-bindings/spec/runners.ts deleted file mode 100644 index 161e9b0a66..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/runners.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { Jobs, Tracker, Session, SessionStream, ISessionEvents, SessionSearch } from '../src/index'; -import { Logger, getLogger } from './logger'; -import { error } from 'platform/log/utils'; -import { IRegularTests } from './config'; -import { IPerformanceTest } from './config_benchmarks'; -import { finish } from './common'; - -export interface SessionComponents { - session: Session; - stream: SessionStream; - events: ISessionEvents; - search: SessionSearch; -} - -export async function initializeSession(testName: string): Promise { - const session = await Session.create(); - session.debug(true, testName); - - let stream, events, search; - - stream = session.getStream(); - if (stream instanceof Error) throw stream; - - events = session.getEvents(); - if (events instanceof Error) throw events; - - search = session.getSearch(); - if (search instanceof Error) throw search; - - return { session, stream, events, search }; -} - -export type ScopeInjector = (s: T) => T; - -function validate( - config: IRegularTests | IPerformanceTest, - id: string | number, -): string | Promise { - let name: string; - let shouldExecute = true; - if ('list' in config) { - // Handling IRegularTests - name = config.list[id]; - shouldExecute = - config.execute_only.length === 0 || - config.execute_only.includes(typeof id === 'number' ? id : parseInt(id, 10)); - } else if ('alias' in config) { - // Handling IPerformanceTest - name = config.alias; - shouldExecute = !config.ignore; - } else { - // Log the type of config received - console.error('Invalid configuration passed to runner. Config:', config); - return Promise.reject(new Error('Invalid configuration passed to runner')); - } - if (!shouldExecute) { - console.log(`\nIgnored: ${name}`); - return Promise.resolve(void 0); - } else { - console.log(`\nStarted: ${name}`); - } - return name; -} - -export async function withSession( - config: IRegularTests | IPerformanceTest, - id: string | number, - test: (logger: Logger, done: () => void, components: SessionComponents) => Promise, -): Promise { - const name = validate(config, id); - if (typeof name !== 'string') { - return name; - } - const logger = getLogger(name); - return new Promise((done) => { - initializeSession(name) - .then((components) => { - const sessionRef = components.session; - try { - test(logger, done, components).catch((err: Error) => { - finish(sessionRef, done, err); - }); - } catch (err) { - finish(sessionRef, done, new Error(error(err))); - } - }) - .catch((err: Error) => { - logger.error(`Fail to init session due: ${err.message}`); - finish(undefined, done, new Error(error(err))); - }); - }); -} - -export async function noSession( - config: IRegularTests | IPerformanceTest, - id: string | number, - test: (logger: Logger, done: () => void) => Promise, -): Promise { - const name = validate(config, id); - if (typeof name !== 'string') { - return name; - } - const logger = getLogger(name); - return new Promise((done) => { - try { - test(logger, done).catch((err: Error) => { - finish(undefined, done, err); - }); - } catch (err) { - finish(undefined, done, new Error(error(err))); - } - }); -} - -export function unbound( - config: IRegularTests | IPerformanceTest, - id: string | number, - test: ( - logger: Logger, - done: () => void, - add: ScopeInjector, - ) => Promise, -): Promise { - const scope: Array = []; - const injector: ScopeInjector = (obj: Session | Tracker | Jobs) => { - scope.push(obj); - return obj; - }; - const name = validate(config, id); - if (typeof name !== 'string') { - return name; - } - const logger = getLogger(name); - return new Promise((done) => { - try { - test(logger, done, injector).catch((err: Error) => { - finish(scope, done, err); - }); - } catch (err) { - finish(scope, done, new Error(error(err))); - } - }); -} \ No newline at end of file diff --git a/application/apps/rustcore/ts-bindings/spec/session.cancel.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.cancel.spec.ts deleted file mode 100644 index 70a21d1696..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.cancel.spec.ts +++ /dev/null @@ -1,181 +0,0 @@ -// tslint:disable - -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { finish } from './common'; -import { readConfigurationFile } from './config'; - -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.cancel; - -describe('Cancel', function () { - it(config.regular.list[1], function () { - return runners.withSession(config.regular, 1, async (_logger, done, comps) => { - let sleep = comps.session - .sleep(2000, false) - .then((results) => { - finish(comps.session, done, new Error(`Operation isn't canceled`)); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }) - .canceled((reason) => { - finish(comps.session, done); - }); - setTimeout(() => { - sleep.abort(); - }, 250); - }); - }); - it(config.regular.list[2], function () { - return runners.withSession(config.regular, 2, async (_logger, done, comps) => { - let sleep = comps.session - .sleep(250, false) - .then((results) => { - finish(comps.session, done); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }) - .canceled((reason) => { - finish(comps.session, done, new Error(`Operation cannot be canceled`)); - }); - setTimeout(() => { - sleep.abort(); - }, 1000); - }); - }); - it(config.regular.list[3], function () { - return runners.withSession(config.regular, 3, async (_logger, done, comps) => { - if (config.regular.files === undefined || config.regular.files['text'] === undefined) { - return finish( - undefined, - done, - new Error(`Text file should defined in settings: cancel.regular.files`), - ); - } - if ( - config.regular.spec === undefined || - config.regular.spec.cancel === undefined || - config.regular.spec.cancel[3] === undefined - ) { - return finish( - undefined, - done, - new Error(`For test #3 required specification: cancel.regular.spec`), - ); - } - const spec = config.regular.spec.cancel[3]; - comps.stream - .observe( - new Factory.File() - .file(config.regular.files['text']) - .type(Factory.FileType.Text) - .asText() - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let canceled: number = 0; - let started: number = 0; - let processed: number = 0; - let resolved: number = 0; - const errors: Map = new Map(); - const searches = spec.terms.length; - const check_errors = (): boolean => { - if (started !== searches) { - finish( - comps.session, - done, - new Error( - `Total amount of search-requests ${searches}. Started - ${started}; Expectation: ${searches}`, - ), - ); - return false; - } - if (canceled !== searches - 1) { - finish( - comps.session, - done, - new Error( - `Total amount of search-requests ${searches}. Canceled - ${canceled}; Expectation: ${ - searches - 1 - }`, - ), - ); - return false; - } - if (errors.size !== 0) { - errors.forEach((error: Error) => { - console.log(`Error: ${error.message}`); - }); - finish(comps.session, done, new Error(`Has errors during searching`)); - return false; - } - return true; - }; - const runner = (terms: string[], index: number) => { - if (terms.length === 0) { - return; - } - let filter = terms.splice(0, 1)[0]; - started += 1; - let task = comps.search - .search([ - { - filter, - flags: { reg: true, word: false, cases: false }, - }, - ]) - .canceled(() => { - console.log( - `-> [..🗑..]\tsearch operation #${index} (${task.uuid()}) is canceled`, - ); - canceled += 1; - }) - .then(() => { - console.log( - `-> [..👝..]\tsearch operation #${index} (${task.uuid()}) is resolved`, - ); - resolved += 1; - }) - .catch((err: Error) => { - console.log( - `-> [..⚠..]\tsearch operation #${index} (${task.uuid()}) triggers error`, - ); - errors.set(index, err); - }) - .finally(() => { - processed += 1; - if (processed === searches) { - if (!check_errors()) { - // Failed - return; - } - if (resolved === 0) { - return finish( - comps.session, - done, - new Error(`At least one search should resolved`), - ); - } - finish(comps.session, done); - } - }); - setTimeout(() => { - runner(terms, index + 1); - }, spec.interval_ms); - }; - console.log(`Waiting until target file would be indexed.`); - comps.events.FileRead.subscribe(() => { - runner(spec.terms, 1); - }); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.concat.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.concat.spec.ts deleted file mode 100644 index a2a6ac2848..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.concat.spec.ts +++ /dev/null @@ -1,228 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { GrabbedElement } from 'platform/types/bindings'; -import { createSampleFile, finish } from './common'; -import { readConfigurationFile } from './config'; - -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.concat; - -describe('Concat', function () { - it(config.regular.list[1], function () { - return runners.withSession(config.regular, 1, async (logger, done, comps) => { - const tmpobj_a = createSampleFile( - 100, - logger, - (i: number) => `file a: some line data: ${i}\n`, - ); - const tmpobj_b = createSampleFile( - 100, - logger, - (i: number) => `file b: some line data: ${i}\n`, - ); - comps.stream - .observe( - new Factory.Concat() - .type(Factory.FileType.Text) - .files([tmpobj_a.name, tmpobj_b.name]) - .asText() - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let grabbing: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 120 || grabbing) { - return; - } - grabbing = true; - comps.stream - .grab(98, 4) - .then((result: GrabbedElement[]) => { - logger.debug('result of grab was: ' + JSON.stringify(result)); - expect(result.map((i) => i.content)).toEqual([ - 'file a: some line data: 98', - 'file a: some line data: 99', - 'file b: some line data: 0', - 'file b: some line data: 1', - ]); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - // it(config.regular.list[2], function () { - // return runners.withSession(config.regular, 2, async (logger, done, collector) => { - // Session.create() - // .then((session: Session) => { - // // Set provider into debug mode - // session.debug(true); - // const stream = session.getStream(); - // if (stream instanceof Error) { - // finish(session, done, stream); - // return; - // } - // const events = session.getEvents(); - // if (events instanceof Error) { - // finish(session, done, events); - // return; - // } - // stream - // .observe( - // Observe.DataSource.file(config.regular.files['pcapng']).pcapng({ - // dlt: { - // filter_config: undefined, - // fibex_file_paths: undefined, - // with_storage_header: false, - // }, - // }), - // ) - // .catch(finish.bind(null, session, done)); - // let grabbing: boolean = false; - // let received: number = 0; - // const timeout = setTimeout(() => { - // finish( - // session, - // done, - // new Error( - // `Failed because timeout. Waited for at least 100 rows. Has been gotten: ${received}`, - // ), - // ); - // }, 20000); - // events.StreamUpdated.subscribe((rows: number) => { - // received = rows; - // if (rows < 100 || grabbing) { - // return; - // } - // clearTimeout(timeout); - // grabbing = true; - // stream - // .grab(1, 10) - // .then((result: GrabbedElement[]) => { - // expect(result.length).toEqual(10); - // logger.debug('result of grab was: ' + JSON.stringify(result)); - // finish(session, done); - // }) - // .catch((err: Error) => { - // finish( - // session, - // done, - // new Error( - // `Fail to grab data due error: ${ - // err instanceof Error ? err.message : err - // }`, - // ), - // ); - // }); - // }); - // }) - // .catch((err: Error) => { - // finish( - // undefined, - // done, - // new Error( - // `Fail to create session due error: ${ - // err instanceof Error ? err.message : err - // }`, - // ), - // ); - // }); - // }); - // }); - - // it(config.regular.list[3], function () { - // return runners.withSession(config.regular, 3, async (logger, done, collector) => { - // Session.create() - // .then((session: Session) => { - // // Set provider into debug mode - // session.debug(true); - // const stream = session.getStream(); - // if (stream instanceof Error) { - // finish(session, done, stream); - // return; - // } - // const events = session.getEvents(); - // if (events instanceof Error) { - // finish(session, done, events); - // return; - // } - // stream - // .observe( - // Observe.DataSource.file(config.regular.files['dlt']).dlt({ - // filter_config: undefined, - // fibex_file_paths: undefined, - // with_storage_header: true, - // }), - // ) - // .catch(finish.bind(null, session, done)); - // let grabbing: boolean = false; - // let received: number = 0; - // const timeout = setTimeout(() => { - // finish( - // session, - // done, - // new Error( - // `Failed because timeout. Waited for at least 100 rows. Has been gotten: ${received}`, - // ), - // ); - // }, 20000); - // events.StreamUpdated.subscribe((rows: number) => { - // received = rows; - // if (rows < 100 || grabbing) { - // return; - // } - // clearTimeout(timeout); - // grabbing = true; - // stream - // .grab(1, 10) - // .then((result: GrabbedElement[]) => { - // expect(result.length).toEqual(10); - // logger.debug('result of grab was: ' + JSON.stringify(result)); - // finish(session, done); - // }) - // .catch((err: Error) => { - // finish( - // session, - // done, - // new Error( - // `Fail to grab data due error: ${ - // err instanceof Error ? err.message : err - // }`, - // ), - // ); - // }); - // }); - // }) - // .catch((err: Error) => { - // finish( - // undefined, - // done, - // new Error( - // `Fail to create session due error: ${ - // err instanceof Error ? err.message : err - // }`, - // ), - // ); - // }); - // }); - // }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.errors.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.errors.spec.ts deleted file mode 100644 index e73de8c107..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.errors.spec.ts +++ /dev/null @@ -1,335 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { GrabbedElement } from 'platform/types/bindings'; -import { finish, createSampleFile } from './common'; -import { readConfigurationFile } from './config'; -import { error } from 'platform/log/utils'; - -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.errors; - -describe('Errors', () => { - it(config.regular.list[1], function () { - return runners.withSession(config.regular, 1, async (logger, done, comps) => { - comps.search - .search([ - { - filter: 'match', - flags: { reg: true, word: true, cases: false }, - }, - ]) - .then((_found: number) => - finish(comps.session, done, new Error('Search should not be available')), - ) - .catch((err: Error) => { - logger.debug(`Expected error: ${err.message}`); - finish(comps.session, done); - }); - }); - }); - it(config.regular.list[2], function () { - return runners.withSession(config.regular, 2, async (logger, done, comps) => { - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Text) - .asText() - .file('/fake/path/to/fake/file') - .get() - .sterilized(), - ) - .then( - finish.bind( - null, - comps.session, - done, - new Error(`Not exist file cannot be opened`), - ), - ) - .catch((err: Error) => { - logger.debug(`Expected error: ${err.message}`); - finish(comps.session, done); - }); - }); - }); - - it(config.regular.list[3], function () { - return runners.withSession(config.regular, 3, async (logger, done, comps) => { - const tmpobj = createSampleFile(5000, logger, (i: number) => `some line data: ${i}\n`); - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Text) - .asText() - .file(tmpobj.name) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let grabbing: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows === 0 || grabbing) { - return; - } - grabbing = true; - // While we do not have operation id - comps.stream - .grab(6000, 1000) - .then((_result: GrabbedElement[]) => { - finish(comps.session, done, new Error(`grabber should not return results`)); - }) - .catch((err: Error) => { - logger.debug(`Expected error: ${err.message}`); - finish(comps.session, done); - }); - }); - }); - }); - - it(config.regular.list[4], function () { - return runners.withSession(config.regular, 4, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => - `[${i}]:: ${ - i % 100 === 0 || i <= 5 ? `some match line data\n` : `some line data\n` - }`, - ); - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Text) - .asText() - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'match', - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then((found: number) => { - comps.search - .len() - .then((len: number) => { - expect(len).toEqual(55); - comps.search - .grab(6000, 1000) - .then((result: GrabbedElement[]) => { - finish( - comps.session, - done, - new Error( - `search grabber should not return results`, - ), - ); - }) - .catch((err: Error) => { - logger.debug(`Expected error: ${err.message}`); - finish(comps.session, done); - }); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - it(config.regular.list[5], function () { - return runners.withSession(config.regular, 5, async (logger, done, comps) => { - const tmpobj = createSampleFile(5, logger, (i: number) => `some line data: ${i}\n`); - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Text) - .asText() - .file(tmpobj.name) - .get() - .sterilized(), - ) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error(`Failed to observe file: ${err.message}`), - ); - }); - let grabbing: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows === 0 || grabbing) { - return; - } - comps.stream - .grab(1, -2) - .then((_result: GrabbedElement[]) => { - finish( - comps.session, - done, - new Error('Grab from invalid range should not work'), - ); - }) - .catch((err: Error) => { - logger.debug(`Expected error: ${err.message}`); - finish(comps.session, done); - }); - }); - }); - }); - it(config.regular.list[6], function () { - return runners.withSession(config.regular, 6, async (logger, done, comps) => { - const tmpobj = createSampleFile(5, logger, (i: number) => `some line data: ${i}\n`); - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Text) - .asText() - .file(tmpobj.name) - .get() - .sterilized(), - ) - .catch((err: Error) => - finish( - comps.session, - done, - new Error(`Failed to observe file: ${err.message}`), - ), - ); - let grabbing: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows === 0 || grabbing) { - return; - } - grabbing = true; - comps.stream - .grab(-1, 2) - .then((_result: GrabbedElement[]) => - finish(comps.session, done, new Error('Grab from invalid start worked')), - ) - .catch((err: Error) => { - logger.debug(`Expected error: ${err.message}`); - finish(comps.session, done); - }); - }); - }); - }); - - it(config.regular.list[7], function () { - return runners.withSession(config.regular, 7, async (logger, done, comps) => { - comps.events.SessionDestroyed.subscribe(() => { - finish(undefined, done); - }); - comps.session - .getNativeSession() - .triggerStateError() - .catch((err: Error) => { - finish( - comps.session, - done, - new Error(`Fail to trigger state error due error: ${error(err)}`), - ); - }); - }); - }); - - it(config.regular.list[8], function () { - return runners.withSession(config.regular, 8, async (logger, done, comps) => { - comps.events.SessionDestroyed.subscribe(() => { - finish(undefined, done); - }); - comps.session - .getNativeSession() - .triggerTrackerError() - .catch((err: Error) => { - finish( - comps.session, - done, - new Error(`Fail to trigger tracker error due error: ${error(err)}`), - ); - }); - }); - }); - - it(config.regular.list[9], function () { - return runners.withSession(config.regular, 9, async (logger, done, comps) => { - comps.session - .sleep(10000, true) - .then(() => { - finish(comps.session, done, new Error(`Sleeping task should not finish.`)); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error(`Fail to start sleeping task: ${err.message}`), - ); - }); - setTimeout(() => { - comps.session - .destroy() - .then(() => { - finish(undefined, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error(`Fail to destroy session: ${err.message}`), - ); - }); - }, 500); - }); - }); - - it(config.regular.list[10], function () { - return runners.withSession(config.regular, 10, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => - `[${i}]:: ${ - i % 100 === 0 || i <= 5 ? `some match line data\n` : `some line data\n` - }`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'invalid search { condition', - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then((_) => { - finish(comps.session, done, new Error(`Search should be failed`)); - }) - .catch((_err: Error) => { - finish(comps.session, done); - }); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.exporting.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.exporting.spec.ts deleted file mode 100644 index 2ef458d57d..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.exporting.spec.ts +++ /dev/null @@ -1,1311 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { GrabbedElement } from 'platform/types/bindings'; -import { createSampleFile, finish, relativePath, rootPath } from './common'; -import { readConfigurationFile } from './config'; -import { fromIndexes } from 'platform/types/range'; -import { v4 } from 'uuid'; - -import * as os from 'os'; -import * as fs from 'fs'; -import * as path from 'path'; -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.exporting; - -describe('Exporting', function () { - it(config.regular.list[1], function () { - return runners.withSession(config.regular, 1, async (logger, done, comps) => { - let controlSum = 0; - const ranges = [ - { - start: 50, - end: 100, - }, - { - start: 200, - end: 300, - }, - ]; - const tmpobj = createSampleFile(1000, logger, (i: number) => { - ranges.forEach((r) => { - if (i >= r.start && i <= r.end) { - controlSum += i; - } - }); - return `____${i}____\n`; - }); - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Text) - .asText() - .file(tmpobj.name) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let gotten: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 500 || gotten) { - return; - } - gotten = true; - const output = path.resolve(os.tmpdir(), `${v4()}.logs`); - comps.stream - .export(output, ranges, { - columns: [], - spliter: undefined, - delimiter: undefined, - }) - .then(() => { - fs.promises - .readFile(output, { encoding: 'utf-8' }) - .then((content) => { - const rows = content - .split('\n') - .map((r) => parseInt(r.replace(/_/gi, ''), 10)); - const sum = rows.reduce((partialSum, a) => partialSum + a, 0); - expect(sum).toEqual(controlSum); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to read output file due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }) - .finally(() => { - fs.unlinkSync(output); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to export data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[2], function () { - return runners.withSession(config.regular, 2, async (logger, done, comps) => { - const ranges = [ - { - start: 50, - end: 90, - }, - { - start: 101, - end: 150, - }, - ]; - let controlSum = 0; - const tmpobj_a = createSampleFile(100, logger, (i: number) => { - if (i >= ranges[0].start && i <= ranges[0].end) { - controlSum += i; - } - return `____${i}____\n`; - }); - const tmpobj_b = createSampleFile(100, logger, (i: number) => { - if (i >= ranges[1].start - 100 && i <= ranges[1].end - 100) { - controlSum += i * 1000; - } - return `____${i * 1000}____\n`; - }); - comps.stream - .observe( - new Factory.Concat() - .type(Factory.FileType.Text) - .files([tmpobj_a.name, tmpobj_b.name]) - .asText() - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let gotten: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 199 || gotten) { - return; - } - gotten = true; - const output = path.resolve(os.tmpdir(), `${v4()}.logs`); - comps.stream - .export(output, ranges, { - columns: [], - spliter: undefined, - delimiter: undefined, - }) - .then(() => { - fs.promises - .readFile(output, { encoding: 'utf-8' }) - .then((content) => { - const rows = content - .split('\n') - .map((r) => parseInt(r.replace(/_/gi, ''), 10)); - const sum = rows.reduce((partialSum, a) => partialSum + a, 0); - expect(sum).toEqual(controlSum); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to read output file due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }) - .finally(() => { - fs.unlinkSync(output); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to export data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[3], function () { - return runners.withSession(config.regular, 3, async (logger, done, comps) => { - let controlSum = 0; - const range = { - from: 0, - to: 50, - }; - let countOfMatches = 0; - const tmpobj = createSampleFile(5000, logger, (i: number) => { - if (i % 100 === 0 || i <= 5) { - if (countOfMatches < range.to) { - controlSum += i; - } - countOfMatches += 1; - } - return `${i % 100 === 0 || i <= 5 ? `_____${i}_____\n` : `some line data\n`}`; - }); - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Text) - .asText() - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: '__\\d+__', - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then((_found) => { - const output = path.resolve(os.tmpdir(), `${v4()}.logs`); - comps.search - .grab(range.from, range.to) - .then((grabbed: GrabbedElement[]) => { - comps.stream - .export(output, fromIndexes(grabbed.map((el) => el.pos)), { - columns: [], - spliter: undefined, - delimiter: undefined, - }) - .then((_done) => { - fs.promises - .readFile(output, { encoding: 'utf-8' }) - .then((content) => { - const rows = content - .split('\n') - .map((r) => - parseInt(r.replace(/_/gi, ''), 10), - ); - expect(grabbed.length).toEqual(rows.length); - const sum = rows.reduce( - (partialSum, a) => partialSum + a, - 0, - ); - expect(sum).toEqual(controlSum); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to read output file due error: ${ - err instanceof Error - ? err.message - : err - }`, - ), - ); - }) - .finally(() => { - fs.unlinkSync(output); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to export data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - - it(config.regular.list[4], function () { - return runners.withSession(config.regular, 4, async (logger, done, comps) => { - const filename = relativePath(config.regular.files['dlt'][0]); - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .asDlt({ - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: undefined, - }) - .file(filename) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let gotten: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 9 || gotten) { - return; - } - gotten = true; - comps.stream - .grab(0, 9) - .then((grabbed) => { - const output = path.resolve(os.tmpdir(), `${v4()}.logs`); - comps.stream - .export(output, [{ start: 0, end: 8 }], { - columns: [], - spliter: undefined, - delimiter: undefined, - }) - .then(() => { - fs.promises - .readFile(output, { encoding: 'utf-8' }) - .then((content) => { - const rows = content.split('\n'); - expect(rows.length).toEqual(grabbed.length); - for (let i = 0; i < rows.length; i += 1) { - expect(rows[i]).toEqual(grabbed[i].content); - if (rows[i] !== grabbed[i].content) { - return finish( - comps.session, - done, - new Error( - `Rows are dismatch. Stream position ${grabbed[i].pos}.`, - ), - ); - } - } - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to read output file due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }) - .finally(() => { - fs.unlinkSync(output); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to export data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - undefined, - done, - new Error( - `Fail to grab due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[5], function () { - return runners.withSession(config.regular, 5, async (logger, done, comps) => { - const filename = relativePath(config.regular.files['dlt'][0]); - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .asDlt({ - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: undefined, - }) - .file(filename) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let gotten: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 9 || gotten) { - return; - } - gotten = true; - comps.stream - .grab(0, 9) - .then((grabbed) => { - const output = path.resolve(os.tmpdir(), `${v4()}.dlt`); - comps.stream - .exportRaw(output, [{ start: 0, end: 8 }]) - .then(async () => { - comps.session - .destroy() - .then(async () => { - const { session, stream, search, events } = - await runners.initializeSession(config.regular.list[5]); - stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .asDlt({ - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: undefined, - }) - .file(output) - .get() - .sterilized(), - ) - .catch(finish.bind(null, session, done)); - let gotten: boolean = false; - gotten = false; - events.StreamUpdated.subscribe((rows: number) => { - if (rows < 9 || gotten) { - return; - } - gotten = true; - stream - .grab(0, 9) - .then((rows) => { - expect(rows.length).toEqual(grabbed.length); - for (let i = 0; i < rows.length; i += 1) { - expect(rows[i].content).toEqual( - grabbed[i].content, - ); - if ( - rows[i].content !== grabbed[i].content - ) { - return finish( - session, - done, - new Error( - `Rows are dismatch. Stream position ${grabbed[i].pos}.`, - ), - ); - } - } - finish(session, done); - }) - .catch((err: Error) => { - finish( - session, - done, - new Error( - `Fail to grab due error: ${ - err instanceof Error - ? err.message - : err - }`, - ), - ); - }); - }); - }) - .catch((err: Error) => { - finish( - undefined, - done, - new Error( - `Fail to destroy session due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to export data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - undefined, - done, - new Error( - `Fail to grab due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[6], function () { - return runners.withSession(config.regular, 6, async (logger, done, comps) => { - const filename_a = relativePath(config.regular.files['dlt'][0]); - const filename_b = relativePath(config.regular.files['dlt'][1]); - comps.stream - .observe( - new Factory.Concat() - .type(Factory.FileType.Binary) - .asDlt({ - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: undefined, - }) - .files([filename_a, filename_b]) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let gotten: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 15 || gotten) { - return; - } - gotten = true; - comps.stream - .grab(0, 15) - .then((grabbed) => { - expect(grabbed[8].source_id).toEqual(0); - expect(grabbed[10].source_id).toEqual(1); - const output = path.resolve(os.tmpdir(), `${v4()}.logs`); - comps.stream - .export(output, [{ start: 0, end: 14 }], { - columns: [], - spliter: undefined, - delimiter: undefined, - }) - .then(() => { - fs.promises - .readFile(output, { encoding: 'utf-8' }) - .then((content) => { - const rows = content.split('\n'); - expect(rows.length).toEqual(grabbed.length); - for (let i = 0; i < rows.length; i += 1) { - expect(rows[i]).toEqual(grabbed[i].content); - if (rows[i] !== grabbed[i].content) { - return finish( - comps.session, - done, - new Error( - `Rows are dismatch. Stream position ${grabbed[i].pos}.`, - ), - ); - } - } - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to read output file due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }) - .finally(() => { - fs.unlinkSync(output); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to export data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - undefined, - done, - new Error( - `Fail to grab due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[7], function () { - return runners.withSession(config.regular, 7, async (logger, done, comps) => { - const filename_a = relativePath(config.regular.files['dlt'][0]); - const filename_b = relativePath(config.regular.files['dlt'][1]); - comps.stream - .observe( - new Factory.Concat() - .type(Factory.FileType.Binary) - .asDlt({ - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: undefined, - }) - .files([filename_a, filename_b]) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let gotten: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 15 || gotten) { - return; - } - gotten = true; - comps.stream - .grab(0, 15) - .then((grabbed) => { - expect(grabbed[8].source_id).toEqual(0); - expect(grabbed[10].source_id).toEqual(1); - const output = path.resolve(os.tmpdir(), `${v4()}.logs`); - comps.stream - .exportRaw(output, [{ start: 0, end: 14 }]) - .then(() => { - comps.session - .destroy() - .then(async () => { - const { session, stream, search, events } = - await runners.initializeSession(config.regular.list[7]); - if (stream instanceof Error) { - finish(session, done, stream); - return; - } - stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .asDlt({ - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: undefined, - }) - .file(output) - .get() - .sterilized(), - ) - .catch(finish.bind(null, session, done)); - if (events instanceof Error) { - finish(session, done, events); - return; - } - gotten = false; - events.StreamUpdated.subscribe((rows: number) => { - if (rows < 15 || gotten) { - return; - } - gotten = true; - stream - .grab(0, 15) - .then((rows) => { - expect(rows.length).toEqual(grabbed.length); - for (let i = 0; i < rows.length; i += 1) { - expect(rows[i].content).toEqual( - grabbed[i].content, - ); - if ( - rows[i].content !== grabbed[i].content - ) { - return finish( - session, - done, - new Error( - `Rows are dismatch. Stream position ${grabbed[i].pos}.`, - ), - ); - } - } - finish(session, done); - }) - .catch((err: Error) => { - finish( - session, - done, - new Error( - `Fail to grab due error: ${ - err instanceof Error - ? err.message - : err - }`, - ), - ); - }); - }); - }) - .catch((err: Error) => { - finish( - undefined, - done, - new Error( - `Fail to destroy session due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to export data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - undefined, - done, - new Error( - `Fail to grab due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[8], function () { - return runners.withSession(config.regular, 8, async (logger, done, comps) => { - const filename_a = relativePath(config.regular.files['dlt'][0]); - const filename_b = relativePath(config.regular.files['dlt'][1]); - comps.stream - .observe( - new Factory.Concat() - .type(Factory.FileType.Binary) - .asDlt({ - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: undefined, - }) - .files([filename_a, filename_b]) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let gotten: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 15 || gotten) { - return; - } - const ranges = [ - { - start: 0, - end: 5, - }, - { - start: 9, - end: 14, - }, - ]; - gotten = true; - Promise.all(ranges.map((r) => comps.stream.grab(r.start, r.end - r.start))) - .then((results) => { - let grabbed: GrabbedElement[] = []; - results.forEach((g) => (grabbed = grabbed.concat(g))); - grabbed.sort((a, b) => (a.pos > b.pos ? 1 : -1)); - const output = path.resolve(os.tmpdir(), `${v4()}.logs`); - comps.stream - .exportRaw( - output, - ranges.map((r) => { - return { start: r.start, end: r.end - 1 }; - }), - ) - .then(() => { - comps.session - .destroy() - .then(async () => { - const { session, stream, search, events } = - await runners.initializeSession(config.regular.list[8]); - stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .asDlt({ - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: undefined, - }) - .file(output) - .get() - .sterilized(), - ) - .catch(finish.bind(null, session, done)); - gotten = false; - events.StreamUpdated.subscribe((rows: number) => { - if (rows < 5 || gotten) { - return; - } - gotten = true; - stream - .grab(0, 10) - .then((rows) => { - expect(rows.length).toEqual(grabbed.length); - for (let i = 0; i < rows.length; i += 1) { - expect(rows[i].content).toEqual( - grabbed[i].content, - ); - if ( - rows[i].content !== grabbed[i].content - ) { - return finish( - session, - done, - new Error( - `Rows are dismatch. Stream position ${grabbed[i].pos}.`, - ), - ); - } - } - finish(session, done); - }) - .catch((err: Error) => { - finish( - session, - done, - new Error( - `Fail to grab due error: ${ - err instanceof Error - ? err.message - : err - }`, - ), - ); - }); - }); - }) - .catch((err: Error) => { - finish( - undefined, - done, - new Error( - `Fail to destroy session due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to export data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - undefined, - done, - new Error( - `Fail to grab due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[9], function () { - return runners.withSession(config.regular, 9, async (logger, done, comps) => { - const filename = relativePath(config.regular.files['dlt'][0]); - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .asDlt({ - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: undefined, - }) - .file(filename) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let gotten: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 9 || gotten) { - return; - } - gotten = true; - comps.stream - .grab(0, 9) - .then((grabbed) => { - const output = path.resolve(os.tmpdir(), `${v4()}.txt`); - comps.stream - .export(output, [{ start: 0, end: 8 }], { - columns: [0, 1], - spliter: '\u0004', - delimiter: ';', - }) - .then(async () => { - fs.promises - .readFile(output, { encoding: 'utf-8' }) - .then((content) => { - const rows = content.split('\n'); - expect(rows.length).toEqual(grabbed.length); - for (let i = 0; i < rows.length; i += 1) { - const columns = rows[i].split(';'); - const origin = grabbed[i].content.split('\u0004'); - expect(columns.length).toEqual(2); - for (let n = 0; n < columns.length; n += 1) { - expect(columns[n]).toEqual(origin[n]); - expect(columns[n].length > 0).toBe(true); - } - } - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to read output file due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }) - .finally(() => { - fs.unlinkSync(output); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to export data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - undefined, - done, - new Error( - `Fail to grab due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[10], function () { - return runners.withSession(config.regular, 10, async (logger, done, comps) => { - const filename = relativePath(config.regular.files['dlt'][0]); - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .asDlt({ - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: undefined, - }) - .file(filename) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let gotten: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 9 || gotten) { - return; - } - gotten = true; - comps.stream - .grab(0, 9) - .then((grabbed) => { - const output = path.resolve(os.tmpdir(), `${v4()}.txt`); - comps.stream - .export(output, [{ start: 0, end: 8 }], { - columns: [9, 10], - spliter: '\u0004', - delimiter: ';', - }) - .then(async () => { - fs.promises - .readFile(output, { encoding: 'utf-8' }) - .then((content) => { - const rows = content.split('\n'); - expect(rows.length).toEqual(grabbed.length); - for (let i = 0; i < rows.length; i += 1) { - const columns = rows[i].split(';'); - const origin = grabbed[i].content.split('\u0004'); - expect(columns.length).toEqual(2); - for (let n = 0; n < columns.length; n += 1) { - expect(columns[n]).toEqual(origin[9 + n]); - expect(columns[n].length > 0).toBe(true); - } - } - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to read output file due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }) - .finally(() => { - fs.unlinkSync(output); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to export data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - undefined, - done, - new Error( - `Fail to grab due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - it(config.regular.list[11], function () { - return runners.withSession(config.regular, 11, async (logger, done, comps) => { - const filename = relativePath(config.regular.files['dlt'][0]); - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .asDlt({ - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: undefined, - }) - .file(filename) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let gotten: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 9 || gotten) { - return; - } - gotten = true; - comps.stream - .grab(0, 9) - .then((grabbed) => { - const output = path.resolve(os.tmpdir(), `${v4()}.txt`); - comps.stream - .export(output, [{ start: 0, end: 8 }], { - columns: [10], - spliter: '\u0004', - delimiter: ';', - }) - .then(async () => { - fs.promises - .readFile(output, { encoding: 'utf-8' }) - .then((content) => { - const rows = content.split('\n'); - expect(rows.length).toEqual(grabbed.length); - for (let i = 0; i < rows.length; i += 1) { - const columns = rows[i].split(';'); - const origin = grabbed[i].content.split('\u0004'); - expect(columns.length).toEqual(1); - for (let n = 0; n < columns.length; n += 1) { - expect(columns[n]).toEqual(origin[10 + n]); - expect(columns[n].length > 0).toBe(true); - } - } - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to read output file due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }) - .finally(() => { - fs.unlinkSync(output); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to export data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - undefined, - done, - new Error( - `Fail to grab due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[12], function () { - return runners.withSession(config.regular, 12, async (logger, done, comps) => { - const filename = relativePath(config.regular.files['dlt'][0]); - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .asDlt({ - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: undefined, - }) - .file(filename) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let gotten: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 9 || gotten) { - return; - } - gotten = true; - const cases = [ - { - output: path.resolve(os.tmpdir(), `${v4()}.txt`), - options: { - columns: [], - spliter: '\u0004', - delimiter: ';', - }, - }, - { - output: path.resolve(os.tmpdir(), `${v4()}.txt`), - options: { - columns: [0, 1, 2], - spliter: undefined, - delimiter: ';', - }, - }, - { - output: path.resolve(os.tmpdir(), `${v4()}.txt`), - options: { - columns: [0, 1, 2], - spliter: '\u0004', - delimiter: undefined, - }, - }, - { - output: path.resolve(os.tmpdir(), `${v4()}.txt`), - options: { - columns: [0, 1, 2], - spliter: undefined, - delimiter: undefined, - }, - }, - { - output: path.resolve(os.tmpdir(), `${v4()}.txt`), - options: { - columns: [0, 0, 0, 0, 0, 1, 2, 3, 4, 1000000], - spliter: '\u0004', - delimiter: ';', - }, - }, - ]; - Promise.allSettled( - cases.map((usecase) => { - const output = usecase.output; - return comps.stream - .export(output, [{ start: 0, end: 8 }], usecase.options) - .then(async () => { - fs.promises - .readFile(output, { encoding: 'utf-8' }) - .then((content) => { - expect(content.length > 0).toBe(true); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to read output file due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }) - .finally(() => { - fs.unlinkSync(output); - }); - }); - }), - ) - .then(() => { - finish(comps.session, done); - }) - .catch((err) => { - finish(comps.session, done, err); - }); - }); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.extract.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.extract.spec.ts deleted file mode 100644 index c134bce840..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.extract.spec.ts +++ /dev/null @@ -1,148 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { createSampleFile, finish } from './common'; -import { readConfigurationFile } from './config'; - -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.extract; - -describe('Extracting', function () { - it(config.regular.list[1], function () { - return runners.withSession(config.regular, 1, async (logger, done, comps) => { - let controlSum = 0; - const tmpobj = createSampleFile(5000, logger, (i: number) => { - const value = i % 100 === 0 || i <= 5 ? i : -1; - controlSum += value !== -1 ? value : 0; - return `[${i}]:: ${ - value !== -1 ? `some CPU=${value}% line data\n` : `some line data\n` - }`; - }); - - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - const filter = 'cpu=(\\d{1,})'; - comps.search - .extract([ - { - filter, - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then((results) => { - expect(results.length).toEqual(55); - for (let pos = 0; pos <= 5; pos += 1) { - expect(results[pos].position).toEqual(pos); - } - for (let pos = 1; pos <= 49; pos += 1) { - expect(results[pos + 5].position).toEqual(pos * 100); - } - let calculated = 0; - results.forEach((res) => { - expect(res.values.length).toEqual(1); - expect(res.values[0].filter.filter).toEqual(filter); - calculated += parseInt(res.values[0].values[0], 10); - }); - expect(calculated).toEqual(controlSum); - comps.search - .len() - .then((len: number) => { - expect(len).toEqual(0); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - - it(config.regular.list[2], function () { - return runners.withSession(config.regular, 2, async (logger, done, comps) => { - let controlSumA = 0; - let controlSumB = 0; - const tmpobj = createSampleFile(5000, logger, (i: number) => { - const a = i % 100 === 0 || i <= 5 ? i : -1; - controlSumA += a !== -1 ? a : 0; - const b = a === -1 && i % 20 === 0 ? i : -1; - controlSumB += b !== -1 ? b : 0; - return `[${i}]:: ${ - a !== -1 - ? `some CPU=${a}% line data\n` - : b === -1 - ? `some line data\n` - : `some TEMP=${b}C line data\n` - }`; - }); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - const filterA = 'cpu=(\\d{1,})'; - const filterB = 'temp=(\\d{1,})'; - comps.search - .extract([ - { - filter: filterA, - flags: { reg: true, word: false, cases: false }, - }, - { - filter: filterB, - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then((results) => { - let calculatedA = 0; - let calculatedB = 0; - results.forEach((res) => { - res.values.forEach((match) => { - expect(match.values.length).toEqual(1); - if (match.filter.filter === filterA) { - calculatedA += parseInt(match.values[0], 10); - } - if (match.filter.filter === filterB) { - calculatedB += parseInt(match.values[0], 10); - } - }); - }); - expect(calculatedA).toEqual(controlSumA); - expect(calculatedB).toEqual(controlSumB); - comps.search - .len() - .then((len: number) => { - expect(len).toEqual(0); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.indexes.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.indexes.spec.ts deleted file mode 100644 index 1d2d26b63b..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.indexes.spec.ts +++ /dev/null @@ -1,259 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { createSampleFile, finish } from './common'; -import { readConfigurationFile } from './config'; -import { Nature, IndexingMode, NatureTypes } from 'platform/types/content'; - -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.indexes; - -describe('Indexes', function () { - it(config.regular.list[1], function () { - return runners.withSession(config.regular, 1, async (logger, done, comps) => { - (async () => { - let controlSum = 0; - let countMatches = 0; - const tmpobj = createSampleFile(50, logger, (i: number) => { - controlSum += i % 10 == 0 ? i : 0; - countMatches += i % 10 == 0 ? 1 : 0; - return `${i}: some line data: ${i % 10 == 0 ? `match A` : ''}\n`; - }); - let read: boolean = false; - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - const updates: number[] = []; - comps.events.IndexedMapUpdated.subscribe((event) => { - event.len > 0 && updates.push(event.len); - }); - comps.events.StreamUpdated.subscribe(async (rows: number) => { - if (rows < 50 || read) { - return; - } - read = true; - try { - await comps.search.search([ - { - filter: 'match A', - flags: { reg: true, word: true, cases: false }, - }, - ]); - let items = await comps.stream.grabIndexed(0, countMatches); - expect(items.length).toEqual(countMatches); - expect( - items - .map((item) => - parseInt( - (item.content.match(/\d*/) as unknown as string)[0], - 10, - ), - ) - .reduce((partialSum, a) => partialSum + a, 0), - ).toEqual(controlSum); - expect(items.map((i) => [i.pos, new Nature(i.nature).getTypes()])).toEqual([ - [0, [NatureTypes.Search]], - [10, [NatureTypes.Search]], - [20, [NatureTypes.Search]], - [30, [NatureTypes.Search]], - [40, [NatureTypes.Search]], - ]); - await comps.stream.setIndexingMode(IndexingMode.Breadcrumbs); - let len = await comps.stream.getIndexedLen(); - expect(len).toEqual(30); - items = await comps.stream.grabIndexed(0, len); - expect(items.length).toEqual(len); - expect(items.map((i) => [i.pos, new Nature(i.nature).getTypes()])).toEqual([ - [0, [NatureTypes.Search]], - [1, [NatureTypes.Breadcrumb]], - [2, [NatureTypes.Breadcrumb]], - [5, [NatureTypes.BreadcrumbSeporator]], - [8, [NatureTypes.Breadcrumb]], - [9, [NatureTypes.Breadcrumb]], - [10, [NatureTypes.Search]], - [11, [NatureTypes.Breadcrumb]], - [12, [NatureTypes.Breadcrumb]], - [15, [NatureTypes.BreadcrumbSeporator]], - [18, [NatureTypes.Breadcrumb]], - [19, [NatureTypes.Breadcrumb]], - [20, [NatureTypes.Search]], - [21, [NatureTypes.Breadcrumb]], - [22, [NatureTypes.Breadcrumb]], - [25, [NatureTypes.BreadcrumbSeporator]], - [28, [NatureTypes.Breadcrumb]], - [29, [NatureTypes.Breadcrumb]], - [30, [NatureTypes.Search]], - [31, [NatureTypes.Breadcrumb]], - [32, [NatureTypes.Breadcrumb]], - [35, [NatureTypes.BreadcrumbSeporator]], - [38, [NatureTypes.Breadcrumb]], - [39, [NatureTypes.Breadcrumb]], - [40, [NatureTypes.Search]], - [41, [NatureTypes.Breadcrumb]], - [42, [NatureTypes.Breadcrumb]], - [45, [NatureTypes.BreadcrumbSeporator]], - [48, [NatureTypes.Breadcrumb]], - [49, [NatureTypes.Breadcrumb]], - ]); - await comps.stream.expandBreadcrumbs(45, 2, false); - len = await comps.stream.getIndexedLen(); - expect(len).toEqual(32); - items = await comps.stream.grabIndexed(0, len); - expect(items.length).toEqual(len); - expect(items.map((i) => [i.pos, new Nature(i.nature).getTypes()])).toEqual([ - [0, [NatureTypes.Search]], - [1, [NatureTypes.Breadcrumb]], - [2, [NatureTypes.Breadcrumb]], - [5, [NatureTypes.BreadcrumbSeporator]], - [8, [NatureTypes.Breadcrumb]], - [9, [NatureTypes.Breadcrumb]], - [10, [NatureTypes.Search]], - [11, [NatureTypes.Breadcrumb]], - [12, [NatureTypes.Breadcrumb]], - [15, [NatureTypes.BreadcrumbSeporator]], - [18, [NatureTypes.Breadcrumb]], - [19, [NatureTypes.Breadcrumb]], - [20, [NatureTypes.Search]], - [21, [NatureTypes.Breadcrumb]], - [22, [NatureTypes.Breadcrumb]], - [25, [NatureTypes.BreadcrumbSeporator]], - [28, [NatureTypes.Breadcrumb]], - [29, [NatureTypes.Breadcrumb]], - [30, [NatureTypes.Search]], - [31, [NatureTypes.Breadcrumb]], - [32, [NatureTypes.Breadcrumb]], - [35, [NatureTypes.BreadcrumbSeporator]], - [38, [NatureTypes.Breadcrumb]], - [39, [NatureTypes.Breadcrumb]], - [40, [NatureTypes.Search]], - [41, [NatureTypes.Breadcrumb]], - [42, [NatureTypes.Breadcrumb]], - [44, [NatureTypes.BreadcrumbSeporator]], - [46, [NatureTypes.Breadcrumb]], - [47, [NatureTypes.Breadcrumb]], - [48, [NatureTypes.Breadcrumb]], - [49, [NatureTypes.Breadcrumb]], - ]); - await comps.stream.expandBreadcrumbs(44, 2, true); - len = await comps.stream.getIndexedLen(); - expect(len).toEqual(34); - items = await comps.stream.grabIndexed(0, len); - expect(items.length).toEqual(len); - expect(items.map((i) => [i.pos, new Nature(i.nature).getTypes()])).toEqual([ - [0, [NatureTypes.Search]], - [1, [NatureTypes.Breadcrumb]], - [2, [NatureTypes.Breadcrumb]], - [5, [NatureTypes.BreadcrumbSeporator]], - [8, [NatureTypes.Breadcrumb]], - [9, [NatureTypes.Breadcrumb]], - [10, [NatureTypes.Search]], - [11, [NatureTypes.Breadcrumb]], - [12, [NatureTypes.Breadcrumb]], - [15, [NatureTypes.BreadcrumbSeporator]], - [18, [NatureTypes.Breadcrumb]], - [19, [NatureTypes.Breadcrumb]], - [20, [NatureTypes.Search]], - [21, [NatureTypes.Breadcrumb]], - [22, [NatureTypes.Breadcrumb]], - [25, [NatureTypes.BreadcrumbSeporator]], - [28, [NatureTypes.Breadcrumb]], - [29, [NatureTypes.Breadcrumb]], - [30, [NatureTypes.Search]], - [31, [NatureTypes.Breadcrumb]], - [32, [NatureTypes.Breadcrumb]], - [35, [NatureTypes.BreadcrumbSeporator]], - [38, [NatureTypes.Breadcrumb]], - [39, [NatureTypes.Breadcrumb]], - [40, [NatureTypes.Search]], - [41, [NatureTypes.Breadcrumb]], - [42, [NatureTypes.Breadcrumb]], - [43, [NatureTypes.Breadcrumb]], - [44, [NatureTypes.Breadcrumb]], - [45, [NatureTypes.BreadcrumbSeporator]], - [46, [NatureTypes.Breadcrumb]], - [47, [NatureTypes.Breadcrumb]], - [48, [NatureTypes.Breadcrumb]], - [49, [NatureTypes.Breadcrumb]], - ]); - await comps.stream.expandBreadcrumbs(45, 1, true); - len = await comps.stream.getIndexedLen(); - expect(len).toEqual(34); - items = await comps.stream.grabIndexed(0, len); - expect(items.length).toEqual(len); - expect(items.map((i) => [i.pos, new Nature(i.nature).getTypes()])).toEqual([ - [0, [NatureTypes.Search]], - [1, [NatureTypes.Breadcrumb]], - [2, [NatureTypes.Breadcrumb]], - [5, [NatureTypes.BreadcrumbSeporator]], - [8, [NatureTypes.Breadcrumb]], - [9, [NatureTypes.Breadcrumb]], - [10, [NatureTypes.Search]], - [11, [NatureTypes.Breadcrumb]], - [12, [NatureTypes.Breadcrumb]], - [15, [NatureTypes.BreadcrumbSeporator]], - [18, [NatureTypes.Breadcrumb]], - [19, [NatureTypes.Breadcrumb]], - [20, [NatureTypes.Search]], - [21, [NatureTypes.Breadcrumb]], - [22, [NatureTypes.Breadcrumb]], - [25, [NatureTypes.BreadcrumbSeporator]], - [28, [NatureTypes.Breadcrumb]], - [29, [NatureTypes.Breadcrumb]], - [30, [NatureTypes.Search]], - [31, [NatureTypes.Breadcrumb]], - [32, [NatureTypes.Breadcrumb]], - [35, [NatureTypes.BreadcrumbSeporator]], - [38, [NatureTypes.Breadcrumb]], - [39, [NatureTypes.Breadcrumb]], - [40, [NatureTypes.Search]], - [41, [NatureTypes.Breadcrumb]], - [42, [NatureTypes.Breadcrumb]], - [43, [NatureTypes.Breadcrumb]], - [44, [NatureTypes.Breadcrumb]], - [45, [NatureTypes.Breadcrumb]], - [46, [NatureTypes.Breadcrumb]], - [47, [NatureTypes.Breadcrumb]], - [48, [NatureTypes.Breadcrumb]], - [49, [NatureTypes.Breadcrumb]], - ]); - finish(comps.session, done); - } catch (err) { - finish( - undefined, - done, - new Error( - `Fail to finish test due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - } - }); - return Promise.resolve(); - })().catch((err: Error) => { - finish( - undefined, - done, - new Error( - `Fail to finish test due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.jobs.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.jobs.spec.ts deleted file mode 100644 index 008e0b08d6..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.jobs.spec.ts +++ /dev/null @@ -1,270 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Jobs, Tracker } from '../src/index'; -import { readConfigurationFile } from './config'; -import { finish } from './common'; - -import * as runners from './runners'; -import * as os from 'os'; - -const config = readConfigurationFile().get().tests.jobs; - -describe('Jobs', function () { - it(config.regular.list[1], function () { - return runners.unbound(config.regular, 1, async (logger, done, collector) => { - const jobs = collector(await Jobs.create()) as Jobs; - const tracker = collector(await Tracker.create()) as Tracker; - const operations: Map = new Map(); - tracker.provider.getEvents().Started.subscribe((event) => { - operations.set(event.uuid, true); - }); - tracker.provider.getEvents().Stopped.subscribe((uuid) => { - operations.set(uuid, false); - }); - jobs.cancelTest(50, 50) - .then((a) => { - // Job is resolved, but not cancelled - expect(a).toBe(100); - // Try to cancel job - const job = jobs - .cancelTest(50, 50) - .then((_res) => { - expect(operations.size).toBe(2); - expect( - Array.from(operations.values()).filter( - (running) => running === false, - ).length, - ).toBe(0); - finish( - [jobs, tracker], - done, - new Error(`This job should be cancelled, but not done`), - ); - }) - .canceled(async () => { - finish([jobs, tracker], done); - }) - .catch((err: Error) => { - finish([jobs, tracker], done, err); - }); - job.abort(); - }) - .catch((err: Error) => { - finish([jobs, tracker], done, err); - }); - }); - }); - - it(config.regular.list[2], function () { - return runners.unbound(config.regular, 2, async (logger, done, collector) => { - const jobs = collector(await Jobs.create()) as Jobs; - // Run 2 jobs with same sequence. One of jobs should be failed, because of sequence - Promise.allSettled([ - jobs.cancelTest(50, 50, 0).asPromise(), - jobs.cancelTest(50, 50, 0).asPromise(), - ]) - .then((res) => { - if ( - (res[0].status === 'rejected' && res[1].status === 'rejected') || - (res[0].status !== 'rejected' && res[1].status !== 'rejected') - ) { - finish(jobs, done, new Error(`Only one task should be rejected`)); - } - expect( - res[0].status !== 'rejected' - ? res[0].value - : res[1].status !== 'rejected' - ? res[1].value - : undefined, - ).toBe(100); - finish(jobs, done); - }) - .catch((err: Error) => { - finish(jobs, done, err); - }); - }); - }); - - it(config.regular.list[3], function () { - return runners.unbound(config.regular, 3, async (logger, done, collector) => { - const jobs = collector(await Jobs.create()) as Jobs; - const path = os.homedir(); - jobs.listContent({ - depth: 1, - max: 100, - paths: [path], - include: { files: true, folders: true }, - }) - .then((ls) => { - expect(ls.list instanceof Array).toEqual(true); - const job = jobs - .listContent({ - depth: 10, - max: 100, - paths: [path], - include: { files: true, folders: true }, - }) - .then((_res) => { - finish( - jobs, - done, - new Error(`This job should be cancelled, but not done`), - ); - }) - .canceled(async () => { - finish(jobs, done); - }) - .catch((err: Error) => { - finish(jobs, done, err); - }); - job.abort(); - }) - .catch((err: Error) => { - finish(jobs, done, err); - }); - }); - }); - - it(config.regular.list[4], function () { - return runners.unbound(config.regular, 4, async (logger, done, collector) => { - const jobs = collector(await Jobs.create()) as Jobs; - const profiles = await jobs.getShellProfiles(); - expect(profiles.length > 0).toBe(true); - finish(jobs, done); - }); - }); - - it(config.regular.list[5], function () { - return runners.unbound(config.regular, 6, async (logger, done, collector) => { - const jobs = collector(await Jobs.create()) as Jobs; - const path = config.regular.files['someip-pcapng']; - // test single source - jobs.getSomeipStatistic([path]) - .then((statistic) => { - expect(statistic.services.length).toEqual(2); - { - let service = statistic.services[0]; - expect(service.item.id).toEqual(123); - expect(service.item.num).toEqual(22); - expect(service.details.length).toEqual(1); - expect(service.details[0].id).toEqual(32773); - expect(service.details[0].num).toEqual(22); - } - { - let service = statistic.services[1]; - expect(service.item.id).toEqual(65535); - expect(service.item.num).toEqual(33); - expect(service.details.length).toEqual(1); - expect(service.details[0].id).toEqual(33024); - expect(service.details[0].num).toEqual(33); - } - expect(statistic.messages.length).toEqual(1); - { - let message = statistic.messages[0]; - expect(message.item.id).toEqual(2); - expect(message.item.num).toEqual(55); - expect(message.details.length).toEqual(1); - expect(message.details[0].id).toEqual(0); - expect(message.details[0].num).toEqual(55); - } - - // test multiple sources - jobs.getSomeipStatistic([path, path]) - .then((statistic) => { - expect(statistic.services.length).toEqual(2); - { - let service = statistic.services[0]; - expect(service.item.id).toEqual(123); - expect(service.item.num).toEqual(44); - expect(service.details.length).toEqual(1); - expect(service.details[0].id).toEqual(32773); - expect(service.details[0].num).toEqual(44); - } - { - let service = statistic.services[1]; - expect(service.item.id).toEqual(65535); - expect(service.item.num).toEqual(66); - expect(service.details.length).toEqual(1); - expect(service.details[0].id).toEqual(33024); - expect(service.details[0].num).toEqual(66); - } - expect(statistic.messages.length).toEqual(1); - { - let message = statistic.messages[0]; - expect(message.item.id).toEqual(2); - expect(message.item.num).toEqual(110); - expect(message.details.length).toEqual(1); - expect(message.details[0].id).toEqual(0); - expect(message.details[0].num).toEqual(110); - } - - // test cancel job - jobs.getSomeipStatistic([path]) - .then((_) => { - finish( - jobs, - done, - new Error(`This job should be cancelled, but not done`), - ); - }) - .canceled(async () => { - finish(jobs, done); - }) - .catch((err: Error) => { - finish(jobs, done, err); - }) - .abort(); - }) - .catch((err: Error) => { - finish(jobs, done, err); - }); - }) - .catch((err: Error) => { - finish(jobs, done, err); - }); - }); - }); - - it(config.regular.list[6], function () { - return runners.unbound(config.regular, 7, async (logger, done, collector) => { - const jobs = collector(await Jobs.create()) as Jobs; - const path = config.regular.files['sample-txt']; - jobs.isFileBinary({ - filePath: path, - }) - .then((isBinary) => { - expect(typeof isBinary).toEqual('boolean'); - expect(isBinary).toEqual(false); - finish(jobs, done); - }) - .catch((err: Error) => { - finish(jobs, done, err); - }); - }); - }); - - it(config.regular.list[7], function () { - return runners.unbound(config.regular, 8, async (logger, done, collector) => { - const jobs = collector(await Jobs.create()) as Jobs; - // Run sleeping, but do not wait for it - jobs.sleep(6000).then(() => { - finish(undefined, done, new Error('Get response from destroyed session')); - }); - setTimeout(() => { - // Closing session - jobs.destroy() - .then(() => { - finish(undefined, done); - }) - .catch((err: Error) => { - finish(undefined, done, err); - }); - }, 500); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.map.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.map.spec.ts deleted file mode 100644 index 504e3b5648..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.map.spec.ts +++ /dev/null @@ -1,523 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { ISearchMap } from 'platform/types/filter'; -import { finish, createSampleFile } from './common'; -import { readConfigurationFile } from './config'; - -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.map; - -describe('Map', function () { - it(config.regular.list[1], function () { - return runners.withSession(config.regular, 1, async (logger, done, comps) => { - const index: number = 1; - if ( - config.regular.spec === undefined || - config.regular.spec.map === undefined || - config.regular.spec.map[index] === undefined - ) { - return finish( - undefined, - done, - new Error(`For test #${index} required specification: map.regular.spec`), - ); - } - const spec = config.regular.spec.map[index]; - const tmpobj = createSampleFile( - spec.filesize, - logger, - (i: number) => - `[${i}]:: some ${i % 100 === 0 || i < 5 ? 'match' : ''} line data }\n`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'match', - flags: { reg: false, word: false, cases: false }, - }, - ]) - .then((_) => { - comps.search - .getMap(spec.datasetLength) - .then((map: ISearchMap) => { - expect(map.length).toEqual(spec.filesize); - map.forEach((values: number[][], line: number) => { - if (line % 100 === 0 || line < 5) { - expect(values.length).toEqual(1); - values.forEach((matches: number[]) => { - expect(matches[0]).toEqual(0); - expect(matches[1]).toEqual(1); - }); - } else { - expect(values.length).toEqual(0); - } - }); - finish(comps.session, done); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - - it(config.regular.list[2], function () { - return runners.withSession(config.regular, 2, async (logger, done, comps) => { - const index: number = 2; - if ( - config.regular.spec === undefined || - config.regular.spec.map === undefined || - config.regular.spec.map[index] === undefined - ) { - return finish( - undefined, - done, - new Error(`For test #${index} required specification: map.regular.spec`), - ); - } - const spec = config.regular.spec.map[index]; - const tmpobj = createSampleFile( - spec.filesize, - logger, - (i: number) => - `[${i}]:: some ${i % 100 === 0 || i < 5 ? 'match' : ''} line data }\n`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'match', - flags: { reg: false, word: false, cases: false }, - }, - ]) - .then((_) => { - comps.search - .getMap(spec.datasetLength) - .then((map: ISearchMap) => { - expect(map.length).toEqual(spec.datasetLength); - map.forEach((lineData: number[][], lineNumber: number) => { - if (lineNumber % 100 === 0 || lineNumber < 5) { - expect(lineData.length).toEqual(1); - lineData.forEach((matches: number[]) => { - expect(matches[0]).toEqual(0); - expect(matches[1]).toEqual(1); - }); - } else { - expect(lineData.length).toEqual(0); - } - }); - finish(comps.session, done); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - - it(config.regular.list[3], function () { - return runners.withSession(config.regular, 3, async (logger, done, comps) => { - const index: number = 3; - if ( - config.regular.spec === undefined || - config.regular.spec.map === undefined || - config.regular.spec.map[index] === undefined - ) { - return finish( - undefined, - done, - new Error(`For test #${index} required specification: map.regular.spec`), - ); - } - const spec = config.regular.spec.map[index]; - const tmpobj = createSampleFile( - spec.filesize, - logger, - (i: number) => - `[${i}]:: some ${i % 100 === 0 ? 'match' : ''} line data ${ - i % 33 === 0 || i % 55 === 0 ? 'not' : '' - }\n`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'match', - flags: { reg: false, word: false, cases: true }, - }, - { - filter: 'not', - flags: { reg: false, word: false, cases: false }, - }, - { - filter: 'line', - flags: { reg: false, word: false, cases: true }, - }, - ]) - .then((_) => { - comps.search - .getMap(spec.datasetLength) - .then((map: ISearchMap) => { - expect(map.length).toEqual(spec.datasetLength); - map.forEach((lineData: number[][], lineNumber: number) => { - if ( - lineNumber % 100 === 0 && - (lineNumber % 33 === 0 || lineNumber % 55 === 0) - ) { - expect(lineData.length).toEqual(3); - lineData.forEach((matches: number[]) => { - if ( - matches[0] === 0 || - matches[0] === 1 || - matches[0] === 2 - ) { - expect(matches[1]).toEqual(1); - } else { - expect(matches[0]).toBeUndefined(); - expect(matches[1]).toBeUndefined(); - } - }); - } else if (lineNumber % 100 === 0) { - expect(lineData.length).toEqual(2); - lineData.forEach((matches: number[]) => { - if (matches[0] === 0) { - expect(matches[1]).toEqual(1); - } else if (matches[0] === 2) { - expect(matches[1]).toEqual(1); - } else { - expect(matches[0]).toBeUndefined(); - expect(matches[1]).toBeUndefined(); - } - }); - } else if ( - lineNumber % 33 === 0 || - lineNumber % 55 === 0 - ) { - expect(lineData.length).toEqual(2); - lineData.forEach((matches: number[]) => { - if (matches[0] === 1) { - expect(matches[1]).toEqual(1); - } else if (matches[0] === 2) { - expect(matches[1]).toEqual(1); - } else { - expect(matches[0]).toBeUndefined(); - expect(matches[1]).toBeUndefined(); - } - }); - } else { - expect(lineData.length).toEqual(1); - lineData.forEach((matches: number[]) => { - expect(matches[0]).toEqual(2); - expect(matches[1]).toEqual(1); - }); - } - }); - finish(comps.session, done); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - - it(config.regular.list[4], function () { - return runners.withSession(config.regular, 4, async (logger, done, comps) => { - const index: number = 4; - if ( - config.regular.spec === undefined || - config.regular.spec.map === undefined || - config.regular.spec.map[index] === undefined - ) { - return finish( - undefined, - done, - new Error(`For test #${index} required specification: map.regular.spec`), - ); - } - const spec = config.regular.spec.map[index]; - const tmpobj = createSampleFile( - spec.filesize, - logger, - (i: number) => - `[${i}]:: Run command ${ - i % 100 === 0 || i < 5 ? 'echo "haha">>file.txt' : '' - }\n`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'file.txt', - flags: { reg: false, word: false, cases: false }, - }, - ]) - .then((_) => { - comps.search - .getMap(spec.datasetLength) - .then((map: ISearchMap) => { - expect(map.length).toEqual(spec.datasetLength); - map.forEach((lineData: number[][], lineNumber: number) => { - if (lineNumber % 100 === 0 || lineNumber < 5) { - expect(lineData.length).toEqual(1); - lineData.forEach((matches: number[]) => { - expect(matches[0]).toEqual(0); - expect(matches[1]).toEqual(1); - }); - } else { - expect(lineData.length).toEqual(0); - } - }); - finish(comps.session, done); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - - it(config.regular.list[5], function () { - return runners.withSession(config.regular, 5, async (logger, done, comps) => { - const index: number = 5; - if ( - config.regular.spec === undefined || - config.regular.spec.map === undefined || - config.regular.spec.map[index] === undefined - ) { - return finish( - undefined, - done, - new Error(`For test #${index} required specification: map.regular.spec`), - ); - } - const spec = config.regular.spec.map[index]; - const tmpobj = createSampleFile( - spec.filesize, - logger, - (i: number) => - `[${i}]:: Random text ${i % 100 === 0 || i < 5 ? '1:1' : ''} as expected\n`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: '1:1', - flags: { reg: false, word: false, cases: false }, - }, - ]) - .then((_) => { - comps.search - .getMap(spec.datasetLength) - .then((map: ISearchMap) => { - expect(map.length).toEqual(spec.datasetLength); - map.forEach((lineData: number[][], lineNumber: number) => { - if (lineNumber % 100 === 0 || lineNumber < 5) { - expect(lineData.length).toEqual(1); - lineData.forEach((matches: number[]) => { - expect(matches[0]).toEqual(0); - expect(matches[1]).toEqual(1); - }); - } else { - expect(lineData.length).toEqual(0); - } - }); - finish(comps.session, done); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - - it(config.regular.list[6], function () { - return runners.withSession(config.regular, 6, async (logger, done, comps) => { - const index: number = 6; - if ( - config.regular.spec === undefined || - config.regular.spec.map === undefined || - config.regular.spec.map[index] === undefined - ) { - return finish( - undefined, - done, - new Error(`For test #${index} required specification: map.regular.spec`), - ); - } - const spec = config.regular.spec.map[index]; - const tmpobj = createSampleFile( - spec.filesize, - logger, - (i: number) => - `[${i}]:: Timestamp is ${ - i % 15 === 0 || i < 7 ? '00:00.0:1' + i : 'unknown' - } right now.\n`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: '0.0:1', - flags: { reg: false, word: false, cases: false }, - }, - ]) - .then((_) => { - comps.search - .getMap(spec.datasetLength) - .then((map: ISearchMap) => { - expect(map.length).toEqual(spec.datasetLength); - map.forEach((lineData: number[][], lineNumber: number) => { - if (lineNumber % 15 === 0 || lineNumber < 7) { - expect(lineData.length).toEqual(1); - lineData.forEach((matches: number[]) => { - expect(matches[0]).toEqual(0); - expect(matches[1]).toEqual(1); - }); - } else { - expect(lineData.length).toEqual(0); - } - }); - finish(comps.session, done); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - - it(config.regular.list[7], function () { - return runners.withSession(config.regular, 7, async (logger, done, comps) => { - const index: number = 7; - if ( - config.regular.spec === undefined || - config.regular.spec.map === undefined || - config.regular.spec.map[index] === undefined - ) { - return finish( - undefined, - done, - new Error(`For test #${index} required specification: map.regular.spec`), - ); - } - const spec = config.regular.spec.map[index]; - const tmpobj = createSampleFile( - spec.filesize, - logger, - (i: number) => - `[${i}]:: Timestamp in a longsword(${ - i % 3 === 0 || i > 700 ? '0.0:1' + i : 'unknown' - })\n`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'word(0.0:1', - flags: { reg: false, word: false, cases: false }, - }, - ]) - .then((_) => { - comps.search - .getMap(spec.datasetLength) - .then((map: ISearchMap) => { - expect(map.length).toEqual(spec.datasetLength); - map.forEach((lineData: number[][], lineNumber: number) => { - if (lineNumber % 3 === 0 || lineNumber > 700) { - expect(lineData.length).toEqual(1); - lineData.forEach((matches: number[]) => { - expect(matches[0]).toEqual(0); - expect(matches[1]).toEqual(1); - }); - } else { - expect(lineData.length).toEqual(0); - } - }); - finish(comps.session, done); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.observe.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.observe.spec.ts deleted file mode 100644 index 68e0a14d7e..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.observe.spec.ts +++ /dev/null @@ -1,796 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { GrabbedElement, AttachmentInfo } from 'platform/types/bindings'; -import { IAttachmentsUpdatedUpdated } from '../src/api/session.provider'; -import { createSampleFile, finish } from './common'; -import { readConfigurationFile } from './config'; - -import * as fs from 'fs'; -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.observe; - -describe('Observe', function () { - it(config.regular.list[1], function () { - return runners.withSession(config.regular, 1, async (logger, done, comps) => { - const tmpobj = createSampleFile(5000, logger, (i: number) => `some line data: ${i}\n`); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let grabbing: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - console.log(`Event came: ${rows}`); - if (rows === 0 || grabbing) { - return; - } - grabbing = true; - comps.stream - .grab(500, 7) - .then((result: GrabbedElement[]) => { - logger.debug('result of grab was: ' + JSON.stringify(result)); - expect(result.map((i) => i.content)).toEqual([ - 'some line data: 500', - 'some line data: 501', - 'some line data: 502', - 'some line data: 503', - 'some line data: 504', - 'some line data: 505', - 'some line data: 506', - ]); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[2], function () { - return runners.withSession(config.regular, 2, async (logger, done, comps) => { - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.PcapNG) - .file(config.regular.files['pcapng']) - .asDlt({ - filter_config: undefined, - fibex_file_paths: [], - with_storage_header: false, - tz: undefined, - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let grabbing: boolean = false; - let received: number = 0; - const timeout = setTimeout(() => { - finish( - comps.session, - done, - new Error( - `Failed because timeout. Waited for at least 100 rows. Has been gotten: ${received}`, - ), - ); - }, 20000); - comps.events.StreamUpdated.subscribe((rows: number) => { - received = rows; - if (rows < 100 || grabbing) { - return; - } - clearTimeout(timeout); - grabbing = true; - comps.stream - .grab(1, 10) - .then((result: GrabbedElement[]) => { - expect(result.length).toEqual(10); - logger.debug('result of grab was: ' + JSON.stringify(result)); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[3], function () { - return runners.withSession(config.regular, 3, async (logger, done, comps) => { - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .file(config.regular.files['dlt']) - .asDlt({ - filter_config: undefined, - fibex_file_paths: [], - with_storage_header: true, - tz: undefined, - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let grabbing: boolean = false; - let received: number = 0; - const timeout = setTimeout(() => { - finish( - comps.session, - done, - new Error( - `Failed because timeout. Waited for at least 100 rows. Has been gotten: ${received}`, - ), - ); - }, 20000); - comps.events.StreamUpdated.subscribe((rows: number) => { - received = rows; - if (rows < 100 || grabbing) { - return; - } - clearTimeout(timeout); - grabbing = true; - comps.stream - .grab(1, 10) - .then((result: GrabbedElement[]) => { - expect(result.length).toEqual(10); - logger.debug('result of grab was: ' + JSON.stringify(result)); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[4], function () { - return runners.withSession(config.regular, 4, async (logger, done, comps) => { - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .file(config.regular.files['attachments']) - .asDlt({ - filter_config: undefined, - fibex_file_paths: undefined, - with_storage_header: true, - tz: undefined, - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let updates: IAttachmentsUpdatedUpdated[] = []; - const timeout = setTimeout(() => { - finish( - comps.session, - done, - new Error( - `Failed because timeout. Waited for at least 3 attachments. Has been gotten: ${updates.length}`, - ), - ); - }, 20000); - comps.events.AttachmentsUpdated.subscribe((update: IAttachmentsUpdatedUpdated) => { - updates.push(update); - if (updates.length >= 3) { - clearTimeout(timeout); - expect(updates[0].len).toEqual(1); - expect(updates[1].len).toEqual(2); - expect(updates[2].len).toEqual(3); - { - let attachment: AttachmentInfo = updates[0].attachment; - expect(attachment.name).toEqual('test1.txt'); - expect(attachment.size).toEqual(5); - expect(attachment.ext).toEqual('txt'); - expect(attachment.mime).toEqual('text/plain'); - expect(attachment.messages).toEqual([0, 2, 6]); - expect(fs.readFileSync(attachment.filepath, 'utf8')).toEqual('test1'); - } - { - let attachment: AttachmentInfo = updates[1].attachment; - expect(attachment.name).toEqual('test2.txt'); - expect(attachment.size).toEqual(6); - expect(attachment.ext).toEqual('txt'); - expect(attachment.mime).toEqual('text/plain'); - expect(attachment.messages).toEqual([1, 3, 7]); - expect(fs.readFileSync(attachment.filepath, 'utf8')).toEqual('test22'); - } - { - let attachment: AttachmentInfo = updates[2].attachment; - expect(attachment.name).toEqual('test3.txt'); - expect(attachment.size).toEqual(7); - expect(attachment.ext).toEqual('txt'); - expect(attachment.mime).toEqual('text/plain'); - expect(attachment.messages).toEqual([4, 5, 8]); - expect(fs.readFileSync(attachment.filepath, 'utf8')).toEqual('test333'); - } - finish(comps.session, done); - } - }); - }); - }); - - it(config.regular.list[5], function () { - return runners.withSession(config.regular, 5, async (logger, done, comps) => { - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.PcapNG) - .file(config.regular.files['someip-pcapng']) - .asSomeip({ - fibex_file_paths: [], - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let grabbing: boolean = false; - let received: number = 0; - const timeout = setTimeout(() => { - finish( - comps.session, - done, - new Error( - `Failed because timeout. Waited for at least 55 rows. Has been gotten: ${received}`, - ), - ); - }, 20000); - comps.events.StreamUpdated.subscribe((rows: number) => { - received = rows; - if (rows < 55 || grabbing) { - return; - } - clearTimeout(timeout); - grabbing = true; - comps.stream - .grab(0, 4) - .then((result: GrabbedElement[]) => { - expect(result.length).toEqual(4); - expect(result[0].content.split('\u0004')).toEqual([ - 'SD', - /* Header */ - '65535', // Service-ID - '33024', // Method-ID - '60', // Length-Field - '0', // Client-ID - '0', // Session-ID - '1', // Interface-Version - '2', // Message-Type - '0', // Return-Type - /* Payload */ - 'Flags [C0], Offer 123 v1.0 Inst 1 Ttl 3 UDP 192.168.178.58:30000 TCP 192.168.178.58:30000', - ]); - expect(result[3].content.split('\u0004')).toEqual([ - 'RPC', - /* Header */ - '123', // Service-ID - '32773', // Method-ID - '16', // Length-Field - '1', // Client-ID - '0', // Session-ID - '1', // Interface-Version - '2', // Message-Type - '0', // Return-Type - /* Payload */ - '[00, 00, 01, 88, 01, C3, C4, 1D]', - ]); - logger.debug('result of grab was: ' + JSON.stringify(result)); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[6], function () { - return runners.withSession(config.regular, 6, async (logger, done, comps) => { - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.PcapNG) - .file(config.regular.files['someip-pcapng']) - .asSomeip({ - fibex_file_paths: [config.regular.files['someip-fibex']], - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let grabbing: boolean = false; - let received: number = 0; - const timeout = setTimeout(() => { - finish( - comps.session, - done, - new Error( - `Failed because timeout. Waited for at least 55 rows. Has been gotten: ${received}`, - ), - ); - }, 20000); - comps.events.StreamUpdated.subscribe((rows: number) => { - received = rows; - if (rows < 55 || grabbing) { - return; - } - clearTimeout(timeout); - grabbing = true; - comps.stream - .grab(0, 4) - .then((result: GrabbedElement[]) => { - expect(result.length).toEqual(4); - expect(result[0].content.split('\u0004')).toEqual([ - 'SD', - /* Header */ - '65535', // Service-ID - '33024', // Method-ID - '60', // Length-Field - '0', // Client-ID - '0', // Session-ID - '1', // Interface-Version - '2', // Message-Type - '0', // Return-Type - /* Payload */ - 'Flags [C0], Offer 123 v1.0 Inst 1 Ttl 3 UDP 192.168.178.58:30000 TCP 192.168.178.58:30000', - ]); - expect(result[3].content.split('\u0004')).toEqual([ - 'RPC', - /* Header */ - '123', // Service-ID - '32773', // Method-ID - '16', // Length-Field - '1', // Client-ID - '0', // Session-ID - '1', // Interface-Version - '2', // Message-Type - '0', // Return-Type - /* Payload */ - 'TestService::timeEvent {\u0006\ttimestamp (INT64) : 1683656786973,\u0006}', - ]); - logger.debug('result of grab was: ' + JSON.stringify(result)); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[7], function () { - return runners.withSession(config.regular, 7, async (logger, done, comps) => { - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.PcapLegacy) - .file(config.regular.files['someip-pcap']) - .asSomeip({ - fibex_file_paths: [], - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let grabbing: boolean = false; - let received: number = 0; - const timeout = setTimeout(() => { - finish( - comps.session, - done, - new Error( - `Failed because timeout. Waited for at least 55 rows. Has been gotten: ${received}`, - ), - ); - }, 20000); - comps.events.StreamUpdated.subscribe((rows: number) => { - received = rows; - if (rows < 55 || grabbing) { - return; - } - clearTimeout(timeout); - grabbing = true; - comps.stream - .grab(0, 4) - .then((result: GrabbedElement[]) => { - expect(result.length).toEqual(4); - expect(result[0].content.split('\u0004')).toEqual([ - 'SD', - /* Header */ - '65535', // Service-ID - '33024', // Method-ID - '60', // Length-Field - '0', // Client-ID - '0', // Session-ID - '1', // Interface-Version - '2', // Message-Type - '0', // Return-Type - /* Payload */ - 'Flags [C0], Offer 123 v1.0 Inst 1 Ttl 3 UDP 192.168.178.58:30000 TCP 192.168.178.58:30000', - ]); - expect(result[3].content.split('\u0004')).toEqual([ - 'RPC', - /* Header */ - '123', // Service-ID - '32773', // Method-ID - '16', // Length-Field - '1', // Client-ID - '0', // Session-ID - '1', // Interface-Version - '2', // Message-Type - '0', // Return-Type - /* Payload */ - '[00, 00, 01, 88, 01, C3, C4, 1D]', - ]); - logger.debug('result of grab was: ' + JSON.stringify(result)); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[8], function () { - return runners.withSession(config.regular, 8, async (logger, done, comps) => { - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.PcapLegacy) - .file(config.regular.files['someip-pcap']) - .asSomeip({ - fibex_file_paths: [config.regular.files['someip-fibex']], - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let grabbing: boolean = false; - let received: number = 0; - const timeout = setTimeout(() => { - finish( - comps.session, - done, - new Error( - `Failed because timeout. Waited for at least 55 rows. Has been gotten: ${received}`, - ), - ); - }, 20000); - comps.events.StreamUpdated.subscribe((rows: number) => { - received = rows; - if (rows < 55 || grabbing) { - return; - } - clearTimeout(timeout); - grabbing = true; - comps.stream - .grab(0, 4) - .then((result: GrabbedElement[]) => { - expect(result.length).toEqual(4); - expect(result[0].content.split('\u0004')).toEqual([ - 'SD', - /* Header */ - '65535', // Service-ID - '33024', // Method-ID - '60', // Length-Field - '0', // Client-ID - '0', // Session-ID - '1', // Interface-Version - '2', // Message-Type - '0', // Return-Type - /* Payload */ - 'Flags [C0], Offer 123 v1.0 Inst 1 Ttl 3 UDP 192.168.178.58:30000 TCP 192.168.178.58:30000', - ]); - expect(result[3].content.split('\u0004')).toEqual([ - 'RPC', - /* Header */ - '123', // Service-ID - '32773', // Method-ID - '16', // Length-Field - '1', // Client-ID - '0', // Session-ID - '1', // Interface-Version - '2', // Message-Type - '0', // Return-Type - /* Payload */ - 'TestService::timeEvent {\u0006\ttimestamp (INT64) : 1683656786973,\u0006}', - ]); - logger.debug('result of grab was: ' + JSON.stringify(result)); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[9], function () { - return runners.withSession(config.regular, 9, async (logger, done, comps) => { - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .file(config.regular.files['someip-dlt']) - .asDlt({ - filter_config: undefined, - fibex_file_paths: [], - with_storage_header: true, - tz: undefined, - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let grabbing: boolean = false; - let received: number = 0; - const timeout = setTimeout(() => { - finish( - comps.session, - done, - new Error( - `Failed because timeout. Waited for at least 55 rows. Has been gotten: ${received}`, - ), - ); - }, 20000); - comps.events.StreamUpdated.subscribe((rows: number) => { - received = rows; - if (rows < 6 || grabbing) { - return; - } - clearTimeout(timeout); - grabbing = true; - comps.stream - .grab(0, 6) - .then((result: GrabbedElement[]) => { - expect(result.length).toEqual(6); - expect(result[0].content.split('\u0004')).toEqual([ - '2024-02-20T13:17:26.713537000Z', - 'ECU1', - '1', - '571', - '204', - '28138506', - 'ECU1', - 'APP1', - 'C1', - 'IPC', - 'SOME/IP 0.0.0.0:0 >> INST:1 RPC SERV:123 METH:32773 LENG:16 CLID:0 SEID:58252 IVER:1 MSTP:2 RETC:0 [00, 00, 01, 88, 01, C3, C4, 1D]', - ]); - expect(result[5].content.split('\u0004')).toEqual([ - '2024-02-20T13:17:26.713537000Z', - 'ECU1', - '1', - '571', - '209', - '28138506', - 'ECU1', - 'APP1', - 'C1', - 'IPC', - "SOME/IP 'Incomplete, not enough data for a message' [00, 7B, 80, 05, 00, 00, 00, 11, 00, 00, E3, 8C, 01, 01, 02, 00, 00, 00, 01, 88, 01, C3, C4, 1D]", - ]); - logger.debug('result of grab was: ' + JSON.stringify(result)); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[10], function () { - return runners.withSession(config.regular, 10, async (logger, done, comps) => { - comps.stream - .observe( - new Factory.File() - .type(Factory.FileType.Binary) - .file(config.regular.files['someip-dlt']) - .asDlt({ - filter_config: undefined, - fibex_file_paths: [config.regular.files['someip-fibex']], - with_storage_header: true, - tz: undefined, - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let grabbing: boolean = false; - let received: number = 0; - const timeout = setTimeout(() => { - finish( - comps.session, - done, - new Error( - `Failed because timeout. Waited for at least 55 rows. Has been gotten: ${received}`, - ), - ); - }, 20000); - comps.events.StreamUpdated.subscribe((rows: number) => { - received = rows; - if (rows < 6 || grabbing) { - return; - } - clearTimeout(timeout); - grabbing = true; - comps.stream - .grab(0, 6) - .then((result: GrabbedElement[]) => { - expect(result.length).toEqual(6); - expect(result[0].content.split('\u0004')).toEqual([ - '2024-02-20T13:17:26.713537000Z', - 'ECU1', - '1', - '571', - '204', - '28138506', - 'ECU1', - 'APP1', - 'C1', - 'IPC', - 'SOME/IP 0.0.0.0:0 >> INST:1 RPC SERV:123 METH:32773 LENG:16 CLID:0 SEID:58252 IVER:1 MSTP:2 RETC:0 TestService::timeEvent {\u0006\ttimestamp (INT64) : 1683656786973,\u0006}', - ]); - expect(result[1].content.split('\u0004')).toEqual([ - '2024-02-20T13:17:26.713537000Z', - 'ECU1', - '1', - '571', - '205', - '28138506', - 'ECU1', - 'APP1', - 'C1', - 'IPC', - 'SOME/IP 0.0.0.0:0 >> INST:1 RPC SERV:124 METH:32773 LENG:16 CLID:0 SEID:58252 IVER:1 MSTP:2 RETC:0 UnknownService [00, 00, 01, 88, 01, C3, C4, 1D]', - ]); - expect(result[2].content.split('\u0004')).toEqual([ - '2024-02-20T13:17:26.713537000Z', - 'ECU1', - '1', - '571', - '206', - '28138506', - 'ECU1', - 'APP1', - 'C1', - 'IPC', - 'SOME/IP 0.0.0.0:0 >> INST:1 RPC SERV:123 METH:32773 LENG:16 CLID:0 SEID:58252 IVER:3 MSTP:2 RETC:0 TestService<1?>::timeEvent {\u0006\ttimestamp (INT64) : 1683656786973,\u0006}', - ]); - expect(result[3].content.split('\u0004')).toEqual([ - '2024-02-20T13:17:26.713537000Z', - 'ECU1', - '1', - '571', - '207', - '28138506', - 'ECU1', - 'APP1', - 'C1', - 'IPC', - 'SOME/IP 0.0.0.0:0 >> INST:1 RPC SERV:123 METH:32774 LENG:16 CLID:0 SEID:58252 IVER:1 MSTP:2 RETC:0 TestService::UnknownMethod [00, 00, 01, 88, 01, C3, C4, 1D]', - ]); - expect(result[4].content.split('\u0004')).toEqual([ - '2024-02-20T13:17:26.713537000Z', - 'ECU1', - '1', - '571', - '208', - '28138506', - 'ECU1', - 'APP1', - 'C1', - 'IPC', - "SOME/IP 0.0.0.0:0 >> INST:1 RPC SERV:123 METH:32773 LENG:15 CLID:0 SEID:58252 IVER:1 MSTP:2 RETC:0 TestService::timeEvent 'SOME/IP Error: Parser exhausted at offset 0 for Object size 8' [00, 00, 01, 88, 01, C3, C4]", - ]); - expect(result[5].content.split('\u0004')).toEqual([ - '2024-02-20T13:17:26.713537000Z', - 'ECU1', - '1', - '571', - '209', - '28138506', - 'ECU1', - 'APP1', - 'C1', - 'IPC', - "SOME/IP 'Incomplete, not enough data for a message' [00, 7B, 80, 05, 00, 00, 00, 11, 00, 00, E3, 8C, 01, 01, 02, 00, 00, 00, 01, 88, 01, C3, C4, 1D]", - ]); - logger.debug('result of grab was: ' + JSON.stringify(result)); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.observing.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.observing.spec.ts deleted file mode 100644 index 628c807f6c..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.observing.spec.ts +++ /dev/null @@ -1,462 +0,0 @@ -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { finish } from './common'; -import { readConfigurationFile } from './config'; -import { Observer } from 'platform/env/observer'; - -import * as $ from 'platform/types/observe'; -import * as Factory from 'platform/types/observe/factory'; -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.observing; - -function checkContext( - observe: $.Observe, - flags: { file: boolean; stream: boolean; concat: boolean }, -) { - expect( - observe.origin.as<$.Origin.Stream.Configuration>($.Origin.Stream.Configuration) instanceof - $.Origin.Stream.Configuration, - ).toEqual(flags.stream); - expect( - observe.origin.as<$.Origin.File.Configuration>($.Origin.File.Configuration) instanceof - $.Origin.File.Configuration, - ).toEqual(flags.file); - expect( - observe.origin.as<$.Origin.Concat.Configuration>($.Origin.Concat.Configuration) instanceof - $.Origin.Concat.Configuration, - ).toEqual(flags.concat); -} - -function checkStream( - observe: $.Observe, - flags: { udp: boolean; tcp: boolean; serial: boolean; process: boolean }, -) { - expect( - observe.origin.as<$.Origin.Stream.Stream.UDP.Configuration>( - $.Origin.Stream.Stream.UDP.Configuration, - ) instanceof $.Origin.Stream.Stream.UDP.Configuration, - ).toEqual(flags.udp); - expect( - observe.origin.as<$.Origin.Stream.Stream.TCP.Configuration>( - $.Origin.Stream.Stream.TCP.Configuration, - ) instanceof $.Origin.Stream.Stream.TCP.Configuration, - ).toEqual(flags.tcp); - expect( - observe.origin.as<$.Origin.Stream.Stream.Process.Configuration>( - $.Origin.Stream.Stream.Process.Configuration, - ) instanceof $.Origin.Stream.Stream.Process.Configuration, - ).toEqual(flags.process); - expect( - observe.origin.as<$.Origin.Stream.Stream.Serial.Configuration>( - $.Origin.Stream.Stream.Serial.Configuration, - ) instanceof $.Origin.Stream.Stream.Serial.Configuration, - ).toEqual(flags.serial); -} - -function checkParser(observe: $.Observe, flags: { text: boolean; dlt: boolean; someip: boolean }) { - expect( - observe.parser.as<$.Parser.Text.Configuration>($.Parser.Text.Configuration) instanceof - $.Parser.Text.Configuration, - ).toEqual(flags.text); - expect( - observe.parser.as<$.Parser.Dlt.Configuration>($.Parser.Dlt.Configuration) instanceof - $.Parser.Dlt.Configuration, - ).toEqual(flags.dlt); - expect( - observe.parser.as<$.Parser.SomeIp.Configuration>($.Parser.SomeIp.Configuration) instanceof - $.Parser.SomeIp.Configuration, - ).toEqual(flags.someip); -} - -describe('Platform: observing', function () { - it(config.regular.list[1], function () { - return runners.noSession(config.regular, 1, async (logger, done) => { - const entity = new Observer({ - a: 1, - b: 2, - c: [1, 2, 3], - d: [ - { a: 1, b: 2, c: [1, 2, 3] }, - { a: 1, b: 2, c: [1, 2, 3] }, - ], - }); - let changes: number = 0; - entity.watcher.subscribe((event) => { - changes += 1; - if (changes === 1) { - expect(entity.target.a).toEqual(2); - } else if (changes === 2) { - expect(entity.target.b).toEqual(3); - } else if (changes === 3) { - expect(entity.target.c.length).toEqual(4); - } - }); - entity.target.a += 1; - expect(entity.target.a).toEqual(2); - entity.target.b += 1; - expect(entity.target.b).toEqual(3); - entity.target.c.push(4); - expect(entity.target.c.length).toEqual(4); - entity.target.c.splice(1, 1); - expect(entity.target.c.length).toEqual(3); - entity.target.d[0].a += 1; - expect(entity.target.d[0].a).toEqual(2); - entity.target.d[0].b += 1; - expect(entity.target.d[0].b).toEqual(3); - entity.target.d[0].c.push(4); - expect(entity.target.d[0].c.length).toEqual(4); - entity.target.d.push({ a: 1, b: 2, c: [1, 2, 3] }); - expect(entity.target.d.length).toEqual(3); - entity.target.d[entity.target.d.length - 1].a += 1; - expect(entity.target.d[entity.target.d.length - 1].a).toEqual(2); - entity.target.d[entity.target.d.length - 1].b += 1; - expect(entity.target.d[entity.target.d.length - 1].b).toEqual(3); - entity.target.d[entity.target.d.length - 1].c.push(4); - expect(entity.target.d[entity.target.d.length - 1].c.length).toEqual(4); - entity.target.d.splice(1, 1); - expect(entity.target.d.length).toEqual(2); - (entity.target as any)['newProp'] = 'test'; - expect((entity.target as any)['newProp']).toEqual('test'); - (entity.target as any)['newObj'] = { a: 1, b: 2 }; - (entity.target as any)['newObj'].a += 1; - (entity.target as any)['newObj'].b += 1; - expect((entity.target as any)['newObj'].a).toEqual(2); - expect((entity.target as any)['newObj'].b).toEqual(3); - // Note: splice of array gives multiple changes: - // - change of position of each element - // - change of array's length - expect(changes).toEqual(19); - finish(undefined, done); - }); - }); - - it(config.regular.list[2], function () { - return runners.noSession(config.regular, 2, async (logger, done) => { - const observe = new Factory.Stream().asDlt().tcp().get(); - checkStream(observe, { udp: false, tcp: true, serial: false, process: false }); - const stream = observe.origin.as<$.Origin.Stream.Configuration>( - $.Origin.Stream.Configuration, - ) as $.Origin.Stream.Configuration; - expect(stream instanceof $.Origin.Stream.Configuration).toEqual(true); - stream.change( - new $.Origin.Stream.Stream.UDP.Configuration( - $.Origin.Stream.Stream.UDP.Configuration.initial(), - undefined, - ), - ); - expect( - stream.as<$.Origin.Stream.Stream.UDP.Configuration>( - $.Origin.Stream.Stream.UDP.Configuration, - ) instanceof $.Origin.Stream.Stream.UDP.Configuration, - ).toEqual(true); - checkStream(observe, { udp: true, tcp: false, serial: false, process: false }); - stream.change( - new $.Origin.Stream.Stream.Serial.Configuration( - $.Origin.Stream.Stream.Serial.Configuration.initial(), - undefined, - ), - ); - checkStream(observe, { udp: false, tcp: false, serial: true, process: false }); - expect( - stream.as<$.Origin.Stream.Stream.Serial.Configuration>( - $.Origin.Stream.Stream.Serial.Configuration, - ) instanceof $.Origin.Stream.Stream.Serial.Configuration, - ).toEqual(true); - stream.change( - new $.Origin.Stream.Stream.Process.Configuration( - $.Origin.Stream.Stream.Process.Configuration.initial(), - undefined, - ), - ); - checkStream(observe, { udp: false, tcp: false, serial: false, process: true }); - expect( - stream.as<$.Origin.Stream.Stream.Process.Configuration>( - $.Origin.Stream.Stream.Process.Configuration, - ) instanceof $.Origin.Stream.Stream.Process.Configuration, - ).toEqual(true); - // Command for process isn't defined; so validation should give error - expect(observe.validate() instanceof Error).toEqual(true); - const process = observe.origin.as<$.Origin.Stream.Stream.Process.Configuration>( - $.Origin.Stream.Stream.Process.Configuration, - ) as $.Origin.Stream.Stream.Process.Configuration; - expect(process !== undefined).toEqual(true); - process.configuration.command = 'ls -lsa'; - process.configuration.cwd = '/'; - // As soon as command and cwd are defined, validation should be OK - expect(observe.validate() instanceof Error).toEqual(false); - // Set invalid command - process.configuration.command = ''; - expect(observe.validate() instanceof Error).toEqual(true); - stream.change( - new $.Origin.Stream.Stream.TCP.Configuration( - $.Origin.Stream.Stream.TCP.Configuration.initial(), - undefined, - ), - ); - checkStream(observe, { udp: false, tcp: true, serial: false, process: false }); - expect( - stream.as<$.Origin.Stream.Stream.TCP.Configuration>( - $.Origin.Stream.Stream.TCP.Configuration, - ) instanceof $.Origin.Stream.Stream.TCP.Configuration, - ).toEqual(true); - const tcp = observe.origin.as<$.Origin.Stream.Stream.TCP.Configuration>( - $.Origin.Stream.Stream.TCP.Configuration, - ) as $.Origin.Stream.Stream.TCP.Configuration; - expect(tcp !== undefined).toEqual(true); - // No binding address, should be error - expect(observe.validate() instanceof Error).toEqual(true); - tcp.configuration.bind_addr = '0.0.0.0'; - // Valid IP address setup, no errors should be - expect(observe.validate() instanceof Error).toEqual(false); - stream.change( - new $.Origin.Stream.Stream.UDP.Configuration( - $.Origin.Stream.Stream.UDP.Configuration.initial(), - undefined, - ), - ); - checkStream(observe, { udp: true, tcp: false, serial: false, process: false }); - const udp = observe.origin.as<$.Origin.Stream.Stream.UDP.Configuration>( - $.Origin.Stream.Stream.UDP.Configuration, - ) as $.Origin.Stream.Stream.UDP.Configuration; - expect(udp !== undefined).toEqual(true); - // No binding address, should be error - expect(observe.validate() instanceof Error).toEqual(true); - udp.configuration.bind_addr = '0.0.0.0'; - // Valid IP address setup, no errors should be - expect(observe.validate() instanceof Error).toEqual(false); - udp.configuration.multicast.push({ - multiaddr: '', - interface: '', - }); - // Not valid multicast, should be error - expect(observe.validate() instanceof Error).toEqual(true); - udp.configuration.multicast[0].multiaddr = '0.0.0.0'; - udp.configuration.multicast[0].interface = '0.0.0.0'; - // Valid multicast setup, no errors should be - expect(observe.validate() instanceof Error).toEqual(false); - finish(undefined, done); - }); - }); - - it(config.regular.list[3], function () { - return runners.noSession(config.regular, 3, async (logger, done) => { - const observe = new Factory.File().type($.Types.File.FileType.Text).asText().get(); - checkContext(observe, { file: true, concat: false, stream: false }); - let file = observe.origin.as<$.Origin.File.Configuration>( - $.Origin.File.Configuration, - ) as $.Origin.File.Configuration; - expect(file.filetype()).toEqual($.Types.File.FileType.Text); - expect(observe.validate() instanceof Error).toEqual(true); - const filename = '/some_file_name'; - file.set().filename(filename); - expect(observe.validate() instanceof Error).toEqual(false); - file.set().type($.Types.File.FileType.Binary); - observe.parser.change( - new $.Parser.Dlt.Configuration($.Parser.Dlt.Configuration.initial(), undefined), - ); - expect(observe.validate() instanceof Error).toEqual(false); - file = observe.origin.as<$.Origin.File.Configuration>( - $.Origin.File.Configuration, - ) as $.Origin.File.Configuration; - expect(file.filename()).toEqual(filename); - expect(file.filetype()).toEqual($.Types.File.FileType.Binary); - finish(undefined, done); - }); - }); - - it(config.regular.list[4], function () { - return runners.noSession(config.regular, 4, async (logger, done) => { - const observe = new Factory.File().type($.Types.File.FileType.Text).asText().get(); - checkParser(observe, { text: true, dlt: false, someip: false }); - let file = observe.origin.as<$.Origin.File.Configuration>( - $.Origin.File.Configuration, - ) as $.Origin.File.Configuration; - expect(file.filetype()).toEqual($.Types.File.FileType.Text); - file.set().type($.Types.File.FileType.Binary); - observe.parser.change( - new $.Parser.Dlt.Configuration($.Parser.Dlt.Configuration.initial(), undefined), - ); - checkParser(observe, { text: false, dlt: true, someip: false }); - expect(observe.validate() instanceof Error).toEqual(true); - file.set().type($.Types.File.FileType.PcapNG); - observe.parser.change( - new $.Parser.SomeIp.Configuration( - $.Parser.SomeIp.Configuration.initial(), - undefined, - ), - ); - checkParser(observe, { text: false, dlt: false, someip: true }); - expect(observe.validate() instanceof Error).toEqual(true); - file.set().filename('some_file'); - expect(observe.validate() instanceof Error).toEqual(false); - finish(undefined, done); - }); - }); - - it(config.regular.list[5], function () { - return runners.noSession(config.regular, 5, async (logger, done) => { - const observe = new Factory.Stream().asDlt().tcp().get(); - checkStream(observe, { udp: false, tcp: true, serial: false, process: false }); - observe.subscribe(() => { - if (currentAction >= actions.length) { - console.log(`[warn] Update out of actions (this is NOT an error)`); - return; - } - actions[currentAction].check(); - next(); - }); - const actions = [ - { - action: () => { - const stream = observe.origin.as<$.Origin.Stream.Configuration>( - $.Origin.Stream.Configuration, - ) as $.Origin.Stream.Configuration; - expect(stream instanceof $.Origin.Stream.Configuration).toEqual(true); - stream.change( - new $.Origin.Stream.Stream.UDP.Configuration( - $.Origin.Stream.Stream.UDP.Configuration.initial(), - undefined, - ), - ); - }, - check: () => { - checkStream(observe, { - udp: true, - tcp: false, - serial: false, - process: false, - }); - expect(observe.validate() instanceof Error).toEqual(true); - }, - }, - { - action: () => { - const udp = observe.origin.as<$.Origin.Stream.Stream.UDP.Configuration>( - $.Origin.Stream.Stream.UDP.Configuration, - ) as $.Origin.Stream.Stream.UDP.Configuration; - expect(udp instanceof $.Origin.Stream.Stream.UDP.Configuration).toEqual( - true, - ); - udp.configuration.bind_addr = '0.0.0.0'; - }, - check: () => { - expect(observe.validate() instanceof Error).toEqual(false); - }, - }, - { - action: () => { - const udp = observe.origin.as<$.Origin.Stream.Stream.UDP.Configuration>( - $.Origin.Stream.Stream.UDP.Configuration, - ) as $.Origin.Stream.Stream.UDP.Configuration; - expect(udp instanceof $.Origin.Stream.Stream.UDP.Configuration).toEqual( - true, - ); - udp.configuration.multicast.push({ multiaddr: '', interface: '0.0.0.0' }); - }, - check: () => { - expect(observe.validate() instanceof Error).toEqual(true); - const udp = observe.origin.as<$.Origin.Stream.Stream.UDP.Configuration>( - $.Origin.Stream.Stream.UDP.Configuration, - ) as $.Origin.Stream.Stream.UDP.Configuration; - expect(udp instanceof $.Origin.Stream.Stream.UDP.Configuration).toEqual( - true, - ); - expect(udp.configuration.multicast.length).toEqual(1); - }, - }, - { - action: () => { - const udp = observe.origin.as<$.Origin.Stream.Stream.UDP.Configuration>( - $.Origin.Stream.Stream.UDP.Configuration, - ) as $.Origin.Stream.Stream.UDP.Configuration; - expect(udp instanceof $.Origin.Stream.Stream.UDP.Configuration).toEqual( - true, - ); - udp.configuration.multicast[0].multiaddr = '0.0.0.0'; - }, - check: () => { - const udp = observe.origin.as<$.Origin.Stream.Stream.UDP.Configuration>( - $.Origin.Stream.Stream.UDP.Configuration, - ) as $.Origin.Stream.Stream.UDP.Configuration; - expect(udp instanceof $.Origin.Stream.Stream.UDP.Configuration).toEqual( - true, - ); - expect(udp.configuration.multicast[0].multiaddr).toEqual('0.0.0.0'); - }, - }, - { - action: () => { - const udp = observe.origin.as<$.Origin.Stream.Stream.UDP.Configuration>( - $.Origin.Stream.Stream.UDP.Configuration, - ) as $.Origin.Stream.Stream.UDP.Configuration; - expect(udp instanceof $.Origin.Stream.Stream.UDP.Configuration).toEqual( - true, - ); - udp.configuration.multicast.splice(0, 1); - }, - check: () => { - const udp = observe.origin.as<$.Origin.Stream.Stream.UDP.Configuration>( - $.Origin.Stream.Stream.UDP.Configuration, - ) as $.Origin.Stream.Stream.UDP.Configuration; - expect(udp instanceof $.Origin.Stream.Stream.UDP.Configuration).toEqual( - true, - ); - expect(udp.configuration.multicast.length).toEqual(0); - }, - }, - ]; - let currentAction = -1; - const next = () => { - currentAction += 1; - if (currentAction >= actions.length) { - finish(undefined, done); - return; - } - actions[currentAction].action(); - }; - next(); - }); - }); - - it(config.regular.list[6], function () { - return runners.noSession(config.regular, 6, async (logger, done) => { - const observe = new Factory.Stream().asText().serial().get(); - checkContext(observe, { file: false, concat: false, stream: true }); - const serial = observe.origin.as<$.Origin.Stream.Stream.Serial.Configuration>( - $.Origin.Stream.Stream.Serial.Configuration, - ) as $.Origin.Stream.Stream.Serial.Configuration; - expect(serial instanceof $.Origin.Stream.Stream.Serial.Configuration).toEqual(true); - expect(typeof serial.configuration.path).toEqual('string'); - const initial = $.Origin.Stream.Stream.Serial.Configuration.initial(); - initial.path = '/dev/test'; - serial.overwrite(initial); - expect(typeof serial.configuration.path).toEqual('string'); - expect(serial.configuration.path).toEqual('/dev/test'); - const stream = observe.origin.as<$.Origin.Stream.Configuration>( - $.Origin.Stream.Configuration, - ) as $.Origin.Stream.Configuration; - expect(stream instanceof $.Origin.Stream.Configuration).toEqual(true); - stream.change( - new $.Origin.Stream.Stream.Process.Configuration( - $.Origin.Stream.Stream.Process.Configuration.initial(), - undefined, - ), - ); - const process = observe.origin.as<$.Origin.Stream.Stream.Process.Configuration>( - $.Origin.Stream.Stream.Process.Configuration, - ) as $.Origin.Stream.Stream.Process.Configuration; - expect(process instanceof $.Origin.Stream.Stream.Process.Configuration).toEqual(true); - const params = $.Origin.Stream.Stream.Process.Configuration.initial(); - params.command = 'test'; - process.overwrite(params); - expect(typeof process.configuration.command).toEqual('string'); - expect(process.configuration.command).toEqual('test'); - finish(undefined, done); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.promises.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.promises.spec.ts deleted file mode 100644 index d86d7ee513..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.promises.spec.ts +++ /dev/null @@ -1,334 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { finish } from './common'; -import { readConfigurationFile } from './config'; -import { CancelablePromise } from 'platform/env/promise'; - -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.promises; - -describe('Promises', function () { - it(config.regular.list[1], function () { - return runners.noSession(config.regular, 1, async (logger, done) => { - let resolved = 0; - let rejected = 0; - Promise.allSettled([ - new CancelablePromise((resolve, _reject) => { - setTimeout(resolve, 50); - }) - .then(() => { - resolved += 1; - }) - .asPromise(), - new CancelablePromise((_resolve, reject) => { - setTimeout(() => { - reject(new Error(`Dummy error`)); - }, 50); - }) - .catch(() => { - rejected += 1; - }) - .asPromise(), - ]) - .then(() => { - expect(resolved).toBe(1); - expect(rejected).toBe(1); - finish(undefined, done, undefined); - }) - .catch((err: Error) => { - finish(undefined, done, err); - }); - }); - }); - - it(config.regular.list[2], function () { - return runners.noSession(config.regular, 2, async (logger, done) => { - new CancelablePromise((_resolve, reject) => { - setTimeout(() => { - reject(new Error(`Dummy error`)); - }, 50); - }) - - .catch((err: Error) => { - finish(undefined, done, err); - }) - .then(() => { - finish(undefined, done, new Error(`Promise should be cancelled`)); - }) - .canceled(() => { - // Set timer to make sure - promise ONLY cancelled - setTimeout(() => { - finish(undefined, done, undefined); - }, 100); - }) - .abort(); - }); - }); - - it(config.regular.list[3], function () { - return runners.noSession(config.regular, 3, async (logger, done) => { - let delegated = false; - new CancelablePromise((_resolve, reject, cancel, setCancelDelegation) => { - setCancelDelegation(() => { - setTimeout(() => { - delegated = true; - cancel(); - }, 100); - }); - setTimeout(() => { - reject(new Error(`Dummy error`)); - }, 50); - }) - .catch((err: Error) => { - finish(undefined, done, err); - }) - .then(() => { - finish(undefined, done, new Error(`Promise should be cancelled`)); - }) - .canceled(() => { - // Set timer to make sure - promise ONLY cancelled - setTimeout(() => { - expect(delegated).toBe(true); - finish(undefined, done, undefined); - }, 100); - }) - .abort(); - }); - }); - - it(config.regular.list[4], function () { - return runners.noSession(config.regular, 4, async (logger, done) => { - let resolved = 0; - let rejected = 0; - const a = new CancelablePromise((resolve, _reject) => { - setTimeout(resolve, 50); - }) - .then(() => { - resolved += 1; - }) - .catch(() => { - rejected += 1; - }); - const b = new CancelablePromise((_resolve, _reject) => {}) - .then(() => { - resolved += 1; - }) - .catch(() => { - rejected += 1; - }); - a.bind(b); - Promise.allSettled([a.asPromise(), b.asPromise()]) - .then(() => { - expect(resolved).toBe(2); - expect(rejected).toBe(0); - finish(undefined, done, undefined); - }) - .catch((err: Error) => { - finish(undefined, done, err); - }); - }); - }); - - it(config.regular.list[5], function () { - return runners.noSession(config.regular, 5, async (logger, done) => { - let resolved = 0; - let rejected = 0; - const a = new CancelablePromise((_resolve, reject) => { - setTimeout(() => { - reject(new Error('Dummy error')); - }, 50); - }) - .then(() => { - resolved += 1; - }) - .catch(() => { - rejected += 1; - }); - const b = new CancelablePromise((_resolve, _reject) => {}) - .then(() => { - resolved += 1; - }) - .catch(() => { - rejected += 1; - }); - b.bind(a); - Promise.allSettled([a.asPromise(), b.asPromise()]) - .then(() => { - expect(resolved).toBe(0); - expect(rejected).toBe(2); - finish(undefined, done, undefined); - }) - .catch((err: Error) => { - finish(undefined, done, err); - }); - }); - }); - - it(config.regular.list[6], function () { - return runners.noSession(config.regular, 6, async (logger, done) => { - let resolved = 0; - let rejected = 0; - let canceled = 0; - const a = new CancelablePromise((_resolve, _reject, cancel) => { - setTimeout(cancel, 50); - }) - .then(() => { - resolved += 1; - }) - .canceled(() => { - canceled += 1; - }) - .catch(() => { - rejected += 1; - }); - const b = new CancelablePromise((_resolve, _reject) => {}) - .then(() => { - resolved += 1; - }) - .canceled(() => { - canceled += 1; - }) - .catch(() => { - rejected += 1; - }); - a.bind(b); - Promise.allSettled([a.asPromise(), b.asPromise()]) - .then(() => { - expect(resolved).toBe(0); - expect(canceled).toBe(2); - expect(rejected).toBe(0); - finish(undefined, done, undefined); - }) - .catch((err: Error) => { - finish(undefined, done, err); - }); - }); - }); - - it(config.regular.list[7], function () { - return runners.noSession(config.regular, 7, async (logger, done) => { - let resolved = 0; - let rejected = 0; - let canceled = 0; - let delegated = false; - const a = new CancelablePromise((_resolve, _reject, cancel, setCancelDelegation) => { - setCancelDelegation(() => { - setTimeout(() => { - delegated = true; - cancel(); - }, 100); - }); - }) - .then(() => { - resolved += 1; - }) - .canceled(() => { - canceled += 1; - }) - .catch(() => { - rejected += 1; - }); - const b = new CancelablePromise((_resolve, _reject) => {}) - .then(() => { - resolved += 1; - }) - .canceled(() => { - canceled += 1; - }) - .catch(() => { - rejected += 1; - }); - a.bind(b); - setTimeout(() => { - b.abort(); - }, 50); - Promise.allSettled([a.asPromise(), b.asPromise()]) - .then(() => { - expect(resolved).toBe(0); - expect(canceled).toBe(2); - expect(rejected).toBe(0); - expect(delegated).toBe(true); - finish(undefined, done, undefined); - }) - .catch((err: Error) => { - finish(undefined, done, err); - }); - }); - }); - - it(config.regular.list[8], function () { - return runners.noSession(config.regular, 8, async (logger, done) => { - let resolved = 0; - let rejected = 0; - let canceled = 0; - let emitted = 0; - let delegated = false; - const a = new CancelablePromise( - (_resolve, _reject, cancel, setCancelDelegation, self) => { - setCancelDelegation(() => { - setTimeout(() => { - delegated = true; - cancel(); - }, 100); - }); - }, - ) - .then(() => { - resolved += 1; - }) - .canceled(() => { - canceled += 1; - }) - .catch(() => { - rejected += 1; - }) - .on('test', (event) => { - expect(event).toBe(42); - emitted += 1; - }); - a.emit('test', 42); - const b = new CancelablePromise((_resolve, _reject) => {}) - .then(() => { - resolved += 1; - }) - .canceled(() => { - canceled += 1; - }) - .catch(() => { - rejected += 1; - }) - .on('test', (event) => { - expect(event).toBe(42); - emitted += 1; - }); - a.bind(b); - setTimeout(() => { - b.abort(); - }, 50); - Promise.allSettled([a.asPromise(), b.asPromise()]) - .then(() => { - // This event should ignored, because promise already finished - a.emit('test', 42); - b.emit('test', 42); - // Check results with delay to make sure nothing useless happens - setTimeout(() => { - expect(resolved).toBe(0); - expect(canceled).toBe(2); - expect(rejected).toBe(0); - expect(emitted).toBe(1); - expect(delegated).toBe(true); - finish(undefined, done, undefined); - }, 100); - }) - .catch((err: Error) => { - finish(undefined, done, err); - }); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.protocol.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.protocol.spec.ts deleted file mode 100644 index 006fe47feb..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.protocol.spec.ts +++ /dev/null @@ -1,358 +0,0 @@ -// tslint:disable - -// We need to provide path to TypeScript types definitions -/// -/// -import { initLogger } from './logger'; -initLogger(); - -import { finish } from './common'; -import { readConfigurationFile } from './config'; - -import * as protocol from 'protocol'; -import * as $ from 'platform/types/observe'; -import * as runners from './runners'; -import * as fs from 'fs'; -import * as path from 'path'; - -const config = readConfigurationFile().get().tests.protocol; - -function deepEqualObj(a: any, b: any, depth = Infinity): boolean { - if (depth < 1 || (typeof a !== 'object' && typeof b !== 'object')) { - return a === b || (a == null && b == null); - } - if (a == null || b == null) { - return a == null && b == null; - } - if (Array.isArray(a) && Array.isArray(b)) { - if (a.length !== b.length) return false; - return a.every((item, index) => deepEqualObj(item, b[index], depth - 1)); - } - if (a instanceof Map && b instanceof Map) { - if (a.size !== b.size) { - return false; - } - for (let [key, value] of a) { - if (!b.has(key)) return false; - if (!deepEqualObj(b.get(key), value)) return false; - } - } else if (typeof a === 'object' && typeof b === 'object') { - const keys1 = Object.keys(a); - const keys2 = Object.keys(b); - - if (keys1.length !== keys2.length) return false; - if (!keys1.every((key) => keys2.includes(key))) return false; - - return keys1.every((key) => deepEqualObj(a[key], b[key], depth - 1)); - } - return a === b; -} - -const MAP: { [key: string]: (buf: Uint8Array) => any } = { - AroundIndexes: protocol.decodeAroundIndexes, - AttachmentInfo: protocol.decodeAttachmentInfo, - AttachmentList: protocol.decodeAttachmentList, - CallbackEvent: protocol.decodeCallbackEvent, - CommandOutcome_bool: protocol.decodeCommandOutcomeWithbool, - CommandOutcome_FoldersScanningResult: protocol.decodeCommandOutcomeWithFoldersScanningResult, - CommandOutcome_DltStatisticInfo: protocol.decodeCommandOutcomeWithDltStatisticInfo, - CommandOutcome_ProfileList: protocol.decodeCommandOutcomeWithProfileList, - CommandOutcome_MapKeyValue: protocol.decodeCommandOutcomeWithMapKeyValue, - CommandOutcome_i64: protocol.decodeCommandOutcomeWithi64, - CommandOutcome_Option_String: protocol.decodeCommandOutcomeWithOptionString, - CommandOutcome_SerialPortsList: protocol.decodeCommandOutcomeWithSerialPortsList, - CommandOutcome_String: protocol.decodeCommandOutcomeWithString, - CommandOutcome_Void: protocol.decodeCommandOutcomeWithVoid, - ComputationError: protocol.decodeComputationError, - DltParserSettings: protocol.decodeDltParserSettings, - FileFormat: protocol.decodeFileFormat, - FilterMatch: protocol.decodeFilterMatch, - FilterMatchList: protocol.decodeFilterMatchList, - FolderEntity: protocol.decodeFolderEntity, - FolderEntityDetails: protocol.decodeFolderEntityDetails, - FolderEntityType: protocol.decodeFolderEntityType, - FoldersScanningResult: protocol.decodeFoldersScanningResult, - GrabbedElement: protocol.decodeGrabbedElement, - GrabbedElementList: protocol.decodeGrabbedElementList, - LifecycleTransition: protocol.decodeLifecycleTransition, - MulticastInfo: protocol.decodeMulticastInfo, - NativeError: protocol.decodeNativeError, - NativeErrorKind: protocol.decodeNativeErrorKind, - ObserveOptions: protocol.decodeObserveOptions, - ObserveOrigin: protocol.decodeObserveOrigin, - OperationDone: protocol.decodeOperationDone, - ParserType: protocol.decodeParserType, - ProcessTransportConfig: protocol.decodeProcessTransportConfig, - Progress: protocol.decodeProgress, - Ranges: protocol.decodeRanges, - SdeRequest: protocol.decodeSdeRequest, - SdeResponse: protocol.decodeSdeResponse, - SerialPortsList: protocol.decodeSerialPortsList, - SerialTransportConfig: protocol.decodeSerialTransportConfig, - Severity: protocol.decodeSeverity, - SomeIpParserSettings: protocol.decodeSomeIpParserSettings, - SourceDefinition: protocol.decodeSourceDefinition, - Sources: protocol.decodeSources, - TCPTransportConfig: protocol.decodeTCPTransportConfig, - Transport: protocol.decodeTransport, - UdpConnectionInfo: protocol.decodeUdpConnectionInfo, - UDPTransportConfig: protocol.decodeUDPTransportConfig, - DltStatisticInfo: protocol.decodeDltStatisticInfo, - ShellType: protocol.decodeShellType, - ShellProfile: protocol.decodeShellProfile, - ProfileList: protocol.decodeProfileList, - ExtractedMatchValue: protocol.decodeExtractedMatchValue, - ResultExtractedMatchValues: protocol.decodeResultExtractedMatchValues, - ResultU64: protocol.decodeResultU64, - ResultBool: protocol.decodeResultBool, - ResultSleep: protocol.decodeResultSleep, - NearestPosition: protocol.decodeNearestPosition, - ResultNearestPosition: protocol.decodeResultNearestPosition, - Point: protocol.decodePoint, - ResultSearchValues: protocol.decodeResultSearchValues, - ResultScaledDistribution: protocol.decodeResultScaledDistribution, - DltLevelDistribution: protocol.decodeDltLevelDistribution, - PluginParserSettings: protocol.decodePluginParserSettings, - PluginParserGeneralSettings: protocol.decodePluginParserGeneralSettings, - PluginByteSourceSettings: protocol.decodePluginByteSourceSettings, - PluginByteSourceGeneralSettings: protocol.decodePluginByteSourceGeneralSettings, - PluginConfigItem: protocol.decodePluginConfigItem, - PluginConfigValue: protocol.decodePluginConfigValue, - PluginConfigSchemaType: protocol.decodePluginConfigSchemaType, - PluginConfigSchemaItem: protocol.decodePluginConfigSchemaItem, - PluginEntity: protocol.decodePluginEntity, - PluginMetadata: protocol.decodePluginMetadata, - PluginType: protocol.decodePluginType, - PluginInfo: protocol.decodePluginInfo, - PluginLogMessage: protocol.decodePluginLogMessage, - PluginLogLevel: protocol.decodePluginLogLevel, - InvalidPluginEntity: protocol.decodeInvalidPluginEntity, - SemanticVersion: protocol.decodeSemanticVersion, - RenderOptions: protocol.decodeRenderOptions, - ParserRenderOptions: protocol.decodeParserRenderOptions, - ColumnsRenderOptions: protocol.decodeColumnsRenderOptions, - ColumnInfo: protocol.decodeColumnInfo, - PluginsList: protocol.decodePluginsList, - InvalidPluginsList: protocol.decodeInvalidPluginsList, - PluginsPathsList: protocol.decodePluginsPathsList, - CommandOutcome_PluginsList: protocol.decodeCommandOutcomeWithPluginsList, - CommandOutcome_InvalidPluginsList: protocol.decodeCommandOutcomeWithInvalidPluginsList, - CommandOutcome_PluginsPathsList: protocol.decodeCommandOutcomeWithPluginsPathsList, - CommandOutcome_Option_PluginEntity: protocol.decodeCommandOutcomeWithOptionPluginEntity, - CommandOutcome_Option_InvalidPluginEntity: - protocol.decodeCommandOutcomeWithOptionInvalidPluginEntity, - CommandOutcome_Option_PluginRunData: protocol.decodeCommandOutcomeWithOptionPluginRunData, -}; - -const OUTPUT_PATH_ENVVAR = 'CHIPMUNK_PROTOCOL_TEST_OUTPUT'; - -describe('Protocol', function () { - it(config.regular.list[1], function () { - return runners.noSession(config.regular, 1, async (logger, done) => { - function check(origin: $.IObserve) { - const bytes = protocol.encodeObserveOptions(origin); - const decoded = protocol.decodeObserveOptions(bytes); - expect(deepEqualObj(decoded, origin)).toBe(true); - } - check({ - origin: { File: ['somefile', $.Types.File.FileType.Text, 'path_to_file'] }, - parser: { Text: null }, - }); - check({ - origin: { - Stream: ['stream', { TCP: { bind_addr: '0.0.0.0' } }], - }, - parser: { Text: null }, - }); - check({ - origin: { - Stream: [ - 'stream', - { - Process: { - command: 'command', - cwd: 'cwd', - shell: undefined, - }, - }, - ], - }, - parser: { Text: null }, - }); - check({ - origin: { - Concat: [ - ['somefile1', $.Types.File.FileType.Text, 'path_to_file'], - ['somefile2', $.Types.File.FileType.Text, 'path_to_file'], - ['somefile3', $.Types.File.FileType.Text, 'path_to_file'], - ], - }, - parser: { Text: null }, - }); - check({ - origin: { - File: ['somefile', $.Types.File.FileType.Binary, 'path_to_file'], - }, - parser: { - Dlt: { - fibex_file_paths: ['path'], - filter_config: undefined, - with_storage_header: true, - tz: 'zz', - }, - }, - }); - check({ - origin: { - File: ['somefile', $.Types.File.FileType.Binary, 'path_to_file'], - }, - parser: { - Dlt: { - fibex_file_paths: [], - filter_config: undefined, - with_storage_header: true, - tz: 'zz', - }, - }, - }); - check({ - origin: { - File: ['somefile', $.Types.File.FileType.Binary, 'path_to_file'], - }, - parser: { - Dlt: { - fibex_file_paths: undefined, - filter_config: undefined, - with_storage_header: true, - tz: 'zz', - }, - }, - }); - check({ - origin: { - File: ['somefile', $.Types.File.FileType.Binary, 'path_to_file'], - }, - parser: { - Dlt: { - fibex_file_paths: ['path'], - filter_config: { - min_log_level: 1, - app_id_count: 1, - context_id_count: 1, - app_ids: ['test'], - ecu_ids: ['test'], - context_ids: ['test'], - }, - with_storage_header: true, - tz: 'zz', - }, - }, - }); - check({ - origin: { - File: ['somefile', $.Types.File.FileType.PcapNG, 'path_to_file'], - }, - parser: { - SomeIp: { - fibex_file_paths: ['path'], - }, - }, - }); - check({ - origin: { - File: ['somefile', $.Types.File.FileType.PcapNG, 'path_to_file'], - }, - parser: { - SomeIp: { - fibex_file_paths: [], - }, - }, - }); - check({ - origin: { - File: ['somefile', $.Types.File.FileType.PcapNG, 'path_to_file'], - }, - parser: { - SomeIp: { - fibex_file_paths: undefined, - }, - }, - }); - finish(undefined, done); - }); - }); - it(config.regular.list[2], function () { - return runners.noSession(config.regular, 2, async (logger, done) => { - const casesPath = process.env[OUTPUT_PATH_ENVVAR]; - if (typeof casesPath !== 'string' || casesPath.trim() === '') { - console.log( - `${'='.repeat(50)}\n${logger.warn( - `Testing of all use-cases is skipped because ${OUTPUT_PATH_ENVVAR} isn't defined`, - )}\n${'='.repeat(50)}`, - ); - return finish(undefined, done); - } - if (!fs.existsSync(casesPath)) { - return finish( - undefined, - done, - new Error( - `Fail to find data passed due ${OUTPUT_PATH_ENVVAR}: ${casesPath} doesn't exist`, - ), - ); - } - const folders = fs.readdirSync(casesPath); - for (let typeOfMessage of folders) { - const targetFullPath = path.join(casesPath, typeOfMessage); - if (!fs.statSync(targetFullPath).isDirectory()) { - continue; - } - const cases = fs.readdirSync(targetFullPath); - for (let testCase of cases) { - const fullPath = path.join(targetFullPath, testCase); - if (!fs.statSync(fullPath).isFile()) { - continue; - } - const buffer = fs.readFileSync(fullPath); - const decoder = MAP[typeOfMessage]; - if (decoder === undefined) { - return finish( - undefined, - done, - new Error(`Fail to find decoder for ${typeOfMessage}`), - ); - } - const _msg = decoder(Uint8Array.from(buffer)); - } - console.log(`[OK]: ${typeOfMessage}`); - } - finish(undefined, done); - }); - }); - it(config.regular.list[3], function () { - return runners.withSession(config.regular, 3, async (logger, done, comps) => { - const MESSAGES_COUNT = 100; - const meausere: { json: number; bin: number } = { json: 0, bin: 0 }; - meausere.json = Date.now(); - for (let i = MESSAGES_COUNT; i >= 0; i -= 1) { - const msg = comps.session.getNativeSession().testGrabElsAsJson(); - expect(msg instanceof Array).toBe(true); - } - meausere.json = Date.now() - meausere.json; - meausere.bin = Date.now(); - for (let i = MESSAGES_COUNT; i >= 0; i -= 1) { - const msg = comps.session.getNativeSession().testGrabElsAsBin(); - expect(msg instanceof Array).toBe(true); - } - meausere.bin = Date.now() - meausere.bin; - console.log( - `Grabbing messages (with decoding) count: ${MESSAGES_COUNT}\nJSON: ${ - meausere.json - }ms (per msg ${(meausere.json / MESSAGES_COUNT).toFixed(4)});\nBIN: ${ - meausere.bin - }ms (per msg ${(meausere.bin / MESSAGES_COUNT).toFixed(4)})`, - ); - finish(comps.session, done); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.ranges.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.ranges.spec.ts deleted file mode 100644 index b04c5c48bc..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.ranges.spec.ts +++ /dev/null @@ -1,100 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { GrabbedElement } from 'platform/types/bindings'; -import { createSampleFile, finish } from './common'; -import { readConfigurationFile } from './config'; - -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.ranges; - -function sum(from: number, to: number): number { - let s = 0; - for (let i = from; i <= to; i += 1) { - s += i; - } - return s; -} - -describe('Grab ranges', function () { - it(config.regular.list[1], function () { - return runners.withSession(config.regular, 1, async (logger, done, comps) => { - const tmpobj = createSampleFile(1000, logger, (i: number) => `${i}\n`); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - let grabbing: boolean = false; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows === 0 || grabbing) { - return; - } - grabbing = true; - Promise.all([ - comps.stream - .grabRanges([{ start: 0, end: 99 }]) - .then((result: GrabbedElement[]) => { - logger.debug('result of grab was: ' + JSON.stringify(result)); - expect( - result - .map((v) => parseInt(v.content, 10)) - .reduce((partialSum, a) => partialSum + a, 0), - ).toEqual(sum(0, 99)); - }), - comps.stream - .grabRanges([ - { start: 0, end: 0 }, - { start: 10, end: 10 }, - ]) - .then((result: GrabbedElement[]) => { - logger.debug('result of grab was: ' + JSON.stringify(result)); - expect(result.length).toEqual(2); - expect(parseInt(result[0].content, 10)).toEqual(0); - expect(parseInt(result[1].content, 10)).toEqual(10); - }), - comps.stream - .grabRanges([ - { start: 0, end: 10 }, - { start: 99, end: 200 }, - { start: 299, end: 300 }, - { start: 599, end: 600 }, - ]) - .then((result: GrabbedElement[]) => { - logger.debug('result of grab was: ' + JSON.stringify(result)); - expect( - result - .map((v) => parseInt(v.content, 10)) - .reduce((partialSum, a) => partialSum + a, 0), - ).toEqual(sum(0, 10) + sum(99, 200) + sum(299, 300) + sum(599, 600)); - }), - ]) - .then(() => { - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.search.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.search.spec.ts deleted file mode 100644 index 2f65d60b81..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.search.spec.ts +++ /dev/null @@ -1,845 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { GrabbedElement } from 'platform/types/bindings'; -import { finish, createSampleFile } from './common'; -import { readConfigurationFile } from './config'; - -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.search; - -describe('Search', function () { - it(config.regular.list[1], function () { - return runners.withSession(config.regular, 1, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => - `[${i}]:: ${ - i % 100 === 0 || i <= 5 ? `some match line data\n` : `some line data\n` - }`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'match', - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then((_) => { - comps.search - .getMap(54) - .then((map) => { - logger.verbose(map); - comps.search - .grab(0, 11) - .then((result: GrabbedElement[]) => { - expect(result.map((i) => i.content)).toEqual([ - '[0]:: some match line data', - '[1]:: some match line data', - '[2]:: some match line data', - '[3]:: some match line data', - '[4]:: some match line data', - '[5]:: some match line data', - '[100]:: some match line data', - '[200]:: some match line data', - '[300]:: some match line data', - '[400]:: some match line data', - '[500]:: some match line data', - ]); - console.log(`GRABBED`); - console.log(result); - expect(result.map((i) => i.pos)).toEqual([ - 0, // 0 - 1, // 1 - 2, // 2 - 3, // 3 - 4, // 4 - 5, // 5 - 100, // 6 - 200, // 7 - 300, // 8 - 400, // 9 - 500, // 10 - ]); - Promise.allSettled( - [ - [10, 5, 5], - [110, 6, 100], - [390, 9, 400], - [600, 11, 600], - ].map((data) => { - return comps.search - .getNearest(data[0]) - .then((nearest) => { - expect(typeof nearest).toEqual( - 'object', - ); - expect((nearest as any).index).toEqual( - data[1], - ); - expect( - (nearest as any).position, - ).toEqual(data[2]); - }) - .catch((err: Error) => { - fail(err); - }); - }), - ) - .then(() => { - comps.search - .len() - .then((len: number) => { - expect(len).toEqual(55); - expect(searchStreamUpdated).toEqual( - true, - ); - comps.stream - .getIndexedRanges() - .then((ranges) => { - expect(ranges[0].start).toEqual( - 0, - ); - expect(ranges[0].end).toEqual( - 5, - ); - expect(ranges.length).toEqual( - 50, - ); - for ( - let i = 1; - i < 50; - i += 1 - ) { - expect( - ranges[i].start, - ).toEqual(i * 100); - expect( - ranges[i].end, - ).toEqual(i * 100); - } - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - err, - ); - }); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - let searchStreamUpdated = false; - comps.events.SearchUpdated.subscribe((event) => { - searchStreamUpdated = true; - }); - }); - }); - - it(config.regular.list[2], function () { - return runners.withSession(config.regular, 2, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => - `[${i}]:: ${ - i % 100 === 0 || i <= 5 - ? `some match A line data\n` - : i % 50 === 0 - ? `some match B line data\n` - : i === 9 - ? `some 666 line data\n` - : `some line data\n` - }`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'match A', - flags: { reg: true, word: false, cases: false }, - }, - { - filter: 'match B', - flags: { reg: true, word: false, cases: false }, - }, - { - filter: '666', - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then((result) => { - comps.search - .grab(0, 11) - .then((result: GrabbedElement[]) => { - expect(result.map((i) => i.content)).toEqual([ - '[0]:: some match A line data', - '[1]:: some match A line data', - '[2]:: some match A line data', - '[3]:: some match A line data', - '[4]:: some match A line data', - '[5]:: some match A line data', - '[9]:: some 666 line data', - '[50]:: some match B line data', - '[100]:: some match A line data', - '[150]:: some match B line data', - '[200]:: some match A line data', - ]); - expect(result.map((i) => i.pos)).toEqual([ - 0, // 0 - 1, // 1 - 2, // 2 - 3, // 3 - 4, // 4 - 5, // 5 - 9, // 6 - 50, // 7 - 100, // 8 - 150, // 9 - 200, // 10 - ]); - Promise.allSettled( - [ - [5, 5, 5], - [10, 6, 9], - [55, 7, 50], - [190, 10, 200], - ].map((data) => { - return comps.search - .getNearest(data[0]) - .then((nearest) => { - expect(typeof nearest).toEqual('object'); - expect((nearest as any).index).toEqual(data[1]); - expect((nearest as any).position).toEqual( - data[2], - ); - }) - .catch((err: Error) => { - fail(err); - }); - }), - ) - .then(() => { - comps.search - .len() - .then((len: number) => { - expect(len).toEqual(111); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - - it(config.regular.list[3], function () { - return runners.withSession(config.regular, 3, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => `[${i}]:: some line data\n`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'not relevant search', - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then((found) => { - expect(found).toEqual(0); - finish(comps.session, done); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - - it(config.regular.list[4], function () { - return runners.withSession(config.regular, 4, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => - `[${i}]:: ${ - i % 100 === 0 || i <= 5 ? `some mAtCh line data\n` : `some line data\n` - }`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'match', - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then((_) => { - // search results available on rust side - comps.search - .getMap(54) - .then((map) => { - comps.search - .grab(0, 11) - .then((result: GrabbedElement[]) => { - expect(result.map((i) => i.content)).toEqual([ - '[0]:: some mAtCh line data', - '[1]:: some mAtCh line data', - '[2]:: some mAtCh line data', - '[3]:: some mAtCh line data', - '[4]:: some mAtCh line data', - '[5]:: some mAtCh line data', - '[100]:: some mAtCh line data', - '[200]:: some mAtCh line data', - '[300]:: some mAtCh line data', - '[400]:: some mAtCh line data', - '[500]:: some mAtCh line data', - ]); - expect(result.map((i) => i.pos)).toEqual([ - 0, // 0 - 1, // 1 - 2, // 2 - 3, // 3 - 4, // 4 - 5, // 5 - 100, // 6 - 200, // 7 - 300, // 8 - 400, // 9 - 500, // 10 - ]); - Promise.allSettled( - [ - [10, 5, 5], - [110, 6, 100], - [390, 9, 400], - [600, 11, 600], - ].map((data) => { - return comps.search - .getNearest(data[0]) - .then((nearest) => { - expect(typeof nearest).toEqual( - 'object', - ); - expect((nearest as any).index).toEqual( - data[1], - ); - expect( - (nearest as any).position, - ).toEqual(data[2]); - }) - .catch((err: Error) => { - fail(err); - }); - }), - ) - .then(() => { - comps.search - .len() - .then((len: number) => { - expect(len).toEqual(55); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - - it(config.regular.list[5], function () { - return runners.withSession(config.regular, 5, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => - `[${i}]:: ${ - i % 100 === 0 || i <= 5 - ? `some match line data\n` - : `some line matchmatchmatch data\n` - }`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'match', - flags: { reg: true, word: true, cases: false }, - }, - ]) - .then((_) => { - // search results available on rust side - comps.search - .getMap(54) - .then((map) => { - comps.search - .grab(0, 11) - .then((result: GrabbedElement[]) => { - expect(result.map((i) => i.content)).toEqual([ - '[0]:: some match line data', - '[1]:: some match line data', - '[2]:: some match line data', - '[3]:: some match line data', - '[4]:: some match line data', - '[5]:: some match line data', - '[100]:: some match line data', - '[200]:: some match line data', - '[300]:: some match line data', - '[400]:: some match line data', - '[500]:: some match line data', - ]); - expect(result.map((i) => i.pos)).toEqual([ - 0, // 0 - 1, // 1 - 2, // 2 - 3, // 3 - 4, // 4 - 5, // 5 - 100, // 6 - 200, // 7 - 300, // 8 - 400, // 9 - 500, // 10 - ]); - Promise.allSettled( - [ - [10, 5, 5], - [110, 6, 100], - [390, 9, 400], - [600, 11, 600], - ].map((data) => { - return comps.search - .getNearest(data[0]) - .then((nearest) => { - expect(typeof nearest).toEqual( - 'object', - ); - expect((nearest as any).index).toEqual( - data[1], - ); - expect( - (nearest as any).position, - ).toEqual(data[2]); - }) - .catch((err: Error) => { - fail(err); - }); - }), - ) - .then(() => { - comps.search - .len() - .then((len: number) => { - expect(len).toEqual(55); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - - it(config.regular.list[6], function () { - return runners.withSession(config.regular, 6, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 501, - logger, - (i: number) => - `[${i}]:: ${ - i % 100 === 0 || i <= 5 - ? `some match A ${i % 6 === 0 ? 'B' : ''} line data\n` - : `some line data\n` - }`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'match A', - flags: { reg: true, word: false, cases: false }, - }, - { - filter: 'match [A,B]', - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then((_) => { - comps.search - .getMap(501) - .then((map) => { - expect(map[0].length).toEqual(2); - expect(map[0][0][0]).toEqual(0); - expect(map[0][1][0]).toEqual(1); - expect(map[500][0][0]).toEqual(0); - expect(map[500][1][0]).toEqual(1); - logger.verbose(map); - comps.search - .grab(0, 11) - .then((result: GrabbedElement[]) => { - expect(result.map((i) => i.content)).toEqual([ - '[0]:: some match A B line data', - '[1]:: some match A line data', - '[2]:: some match A line data', - '[3]:: some match A line data', - '[4]:: some match A line data', - '[5]:: some match A line data', - '[100]:: some match A line data', - '[200]:: some match A line data', - '[300]:: some match A B line data', - '[400]:: some match A line data', - '[500]:: some match A line data', - ]); - expect(result.map((i) => i.pos)).toEqual([ - 0, // 0 - 1, // 1 - 2, // 2 - 3, // 3 - 4, // 4 - 5, // 5 - 100, // 6 - 200, // 7 - 300, // 8 - 400, // 9 - 500, // 10 - ]); - comps.search - .len() - .then((len: number) => { - expect(len).toEqual(11); - expect(searchStreamUpdated).toEqual(true); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - let searchStreamUpdated = false; - comps.events.SearchUpdated.subscribe((event) => { - searchStreamUpdated = true; - }); - }); - }); - - it(config.regular.list[7], function () { - return runners.withSession(config.regular, 7, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => - `[${i}]:: ${ - i % 100 === 0 || i <= 5 - ? `some match ${ - i % 6 === 0 ? 'B' : i % 4 === 0 ? 'C' : i % 3 === 0 ? 'D' : 'A' - } line data\n` - : `some line data\n` - }`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - const calls = ['match A', 'match D', 'match C', 'match B']; - let canceled = 0; - calls.forEach((filter) => { - comps.search - .search([ - { - filter, - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then((_) => { - expect(canceled).toEqual(3); - comps.search - .grab(0, 16) - .then((result: GrabbedElement[]) => { - expect(result.map((i) => i.content)).toEqual([ - '[0]:: some match B line data', - '[300]:: some match B line data', - '[600]:: some match B line data', - '[900]:: some match B line data', - '[1200]:: some match B line data', - '[1500]:: some match B line data', - '[1800]:: some match B line data', - '[2100]:: some match B line data', - '[2400]:: some match B line data', - '[2700]:: some match B line data', - '[3000]:: some match B line data', - '[3300]:: some match B line data', - '[3600]:: some match B line data', - '[3900]:: some match B line data', - '[4200]:: some match B line data', - '[4500]:: some match B line data', - ]); - expect(result.map((i) => i.pos)).toEqual([ - 0, 300, 600, 900, 1200, 1500, 1800, 2100, 2400, 2700, - 3000, 3300, 3600, 3900, 4200, 4500, - ]); - comps.search - .len() - .then((len: number) => { - expect(len).toEqual(17); - expect(searchStreamUpdated).toEqual(true); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish(comps.session, done, err); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .canceled(() => { - canceled += 1; - }) - .catch((err: Error) => { - finish(comps.session, done); - }); - }); - }) - .catch(finish.bind(null, comps.session, done)); - let searchStreamUpdated = false; - comps.events.SearchUpdated.subscribe((event) => { - searchStreamUpdated = true; - }); - }); - }); - - it(config.regular.list[8], function () { - return runners.withSession(config.regular, 8, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => - `[${i}]:: ${ - i % 100 === 0 || i <= 5 - ? `some match line ${i % 500 === 0 ? 'Nested' : ''} data\n` - : `some line ${i % 500 === 0 ? 'Nested' : ''} data\n` - }`, - ); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .search([ - { - filter: 'match', - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then((_) => { - comps.search - .searchNestedMatch( - { - filter: 'Nested', - flags: { reg: true, cases: false, word: false }, - }, - 10, - false, - ) - .then((pos: [number, number] | undefined) => { - expect((pos as [number, number])[0]).toBe(500); - expect((pos as [number, number])[1]).toBe(10); - finish(comps.session, done); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - let searchStreamUpdated = false; - comps.events.SearchUpdated.subscribe((event) => { - searchStreamUpdated = true; - }); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/session.stream.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.stream.spec.ts deleted file mode 100644 index 24c362624d..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.stream.spec.ts +++ /dev/null @@ -1,488 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { GrabbedElement } from 'platform/types/bindings'; -import { createSampleFile, finish } from './common'; -import { readConfigurationFile } from './config'; -import { utils } from 'platform/log'; - -import * as fs from 'fs'; -import * as os from 'os'; -import * as path from 'path'; -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.stream; -// ================================== IMPORTANT ================================== -// THIS TEST WILL BE IGNORED ON WINDOWS -// =============================================================================== -if (process.platform === 'win32') { - console.log(`${'='.repeat(75)}`); - console.log(`TESTING OF STREAMS (session.stream.spec) are ignored on WINDOWS`); - console.log(`${'='.repeat(75)}`); - describe('Stream', function () { - it('dummy', function (done) { - done(); - }); - }); -} else { - describe('Stream', function () { - it(config.regular.list[1], function () { - return runners.withSession(config.regular, 1, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => `some line data: ${i}\n`, - ); - - comps.stream - .observe( - new Factory.Stream() - .asText() - .process({ - command: `less ${tmpobj.name}`, - cwd: process.cwd(), - shell: undefined, - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 5000) { - return; - } - comps.stream - .grab(500, 7) - .then((result: GrabbedElement[]) => { - logger.debug('result of grab was: ' + JSON.stringify(result)); - expect(result.map((i) => i.content)).toEqual([ - 'some line data: 500', - 'some line data: 501', - 'some line data: 502', - 'some line data: 503', - 'some line data: 504', - 'some line data: 505', - 'some line data: 506', - ]); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[2], function () { - return runners.withSession(config.regular, 2, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => `some line data: ${i}\n`, - ); - const lifeCycleEvents: string[] = []; - comps.stream - .observe( - new Factory.Stream() - .asText() - .process({ - command: `less ${tmpobj.name}`, - cwd: process.cwd(), - shell: undefined, - }) - .get() - .sterilized(), - ) - .on('confirmed', () => { - lifeCycleEvents.push('confirmed'); - }) - .on('processing', () => { - lifeCycleEvents.push('processing'); - }) - .catch(finish.bind(null, comps.session, done)); - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 5000) { - return; - } - expect(lifeCycleEvents).toEqual(['confirmed', 'processing']); - finish(comps.session, done); - }); - }); - }); - - it(config.regular.list[3], function () { - return runners.withSession(config.regular, 3, async (logger, done, comps) => { - const lifeCycleEvents: string[] = []; - comps.stream - .observe( - new Factory.Stream() - .asText() - .process({ - command: `some_invalid_command`, - cwd: process.cwd(), - shell: undefined, - }) - .get() - .sterilized(), - ) - .on('confirmed', () => { - lifeCycleEvents.push('confirmed'); - }) - .on('processing', () => { - lifeCycleEvents.push('processing'); - }) - .then(() => { - // Session will still start with the invalid command because spawned shell - // is the one responsible for evaluating command and not Chipmunk. - // In this case session will open with the error message from shell. - finish(comps.session, done); - }) - .catch((err: Error) => { - // Event 'processing' should not come, because stream was created (confirmed), but - // it cannot be processed as soon as command is invalid - expect(lifeCycleEvents).toEqual(['confirmed']); - finish(comps.session, done); - }); - }); - }); - - it(config.regular.list[4], function () { - return runners.withSession(config.regular, 4, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => `some line data: ${i}\n`, - ); - comps.stream - .observe( - new Factory.Stream() - .asText() - .process({ - command: `tail --lines=5000 -f ${tmpobj.name}`, - cwd: process.cwd(), - shell: undefined, - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - const append = () => { - comps.stream - .len() - .then((len) => { - expect(len).toBe(5000); - let chunk = []; - for (let i = 0; i < 5000; i += 1) { - chunk.push(`some line data: ${i}`); - } - fs.promises - .appendFile(tmpobj.name, `${'\n'}${chunk.join(`\n`)}`) - .then(() => { - fs.closeSync(tmpobj.fd); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows === 5000) { - append(); - return; - } - if (rows < 10000) { - return; - } - comps.stream - .grab(500, 7) - .then((result: GrabbedElement[]) => { - logger.debug('result of grab was: ' + JSON.stringify(result)); - expect(result.map((i) => i.content)).toEqual([ - 'some line data: 500', - 'some line data: 501', - 'some line data: 502', - 'some line data: 503', - 'some line data: 504', - 'some line data: 505', - 'some line data: 506', - ]); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - - it(config.regular.list[5], function () { - return runners.withSession(config.regular, 5, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 500, - logger, - (i: number) => `some line data: ${i}\n`, - ); - comps.stream - .observe( - new Factory.Stream() - .asText() - .process({ - command: `tail --lines=5000 -f ${tmpobj.name}`, - cwd: process.cwd(), - shell: undefined, - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - const filter = 'match A'; - let expectedMatchesCount = 0; - const append = () => { - comps.stream - .len() - .then((len) => { - expect(len).toBe(500); - let chunk = []; - for (let i = 0; i < 500; i += 1) { - chunk.push( - `some line data ${((n) => { - if (n % 10 === 0) { - expectedMatchesCount += 1; - return filter; - } - return ''; - })(i)}: ${i}`, - ); - } - fs.promises - .appendFile(tmpobj.name, `${'\n'}${chunk.join(`\n`)}`) - .then(() => { - fs.closeSync(tmpobj.fd); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }; - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows === 500) { - comps.search - .search([ - { - filter, - flags: { reg: true, word: false, cases: false }, - }, - ]) - .then(() => { - // We are appending new data only after search was done to make sure, - // updated search results will come - append(); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to search due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - return; - } - }); - comps.events.SearchUpdated.subscribe((updated) => { - if (updated.found <= 0) { - return; - } - expect(updated.found).toBe(expectedMatchesCount); - finish(comps.session, done); - }); - }); - }); - - it(config.regular.list[6], function () { - return runners.withSession(config.regular, 6, async (logger, done, comps) => { - const tmpobj = createSampleFile( - 5000, - logger, - (i: number) => `some line data: ${i}\n`, - ); - const tailing = comps.stream - .observe( - new Factory.Stream() - .asText() - .process({ - command: `tail --lines=5000 -f ${tmpobj.name}`, - cwd: process.cwd(), - shell: undefined, - }) - .get() - .sterilized(), - ) - .catch(finish.bind(null, comps.session, done)); - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 5000) { - return; - } - tailing - .canceled(() => { - finish(comps.session, done); - }) - .abort(); - }); - }); - }); - - it(config.regular.list[7], function () { - return runners.withSession(config.regular, 7, async (logger, done, comps) => { - const filename = path.join(os.tmpdir(), 'chipmunk_test_file.log'); - // Create or overwrite file - fs.writeFileSync(filename, ''); - let ready = 0; - const TEST_LINES = ['test A', 'test B']; - const procceed = async () => { - ready += 1; - if (ready < 2) { - return; - } - try { - // Send first message - await comps.stream.sde(sed.uuid(), { WriteText: `${TEST_LINES[0]}\n` }); - // Send second message - await comps.stream.sde(sed.uuid(), { WriteText: `${TEST_LINES[1]}\n` }); - } catch (e) { - finish(comps.session, done, new Error(utils.error(e))); - } - }; - const sed = comps.stream - .observe( - new Factory.Stream() - .asText() - .process({ - command: `sed -u "w ${filename}"`, - cwd: process.cwd(), - shell: undefined, - }) - .get() - .sterilized(), - ) - .on('processing', (e) => { - procceed(); - }) - .catch(finish.bind(null, comps.session, done)); - // Tail file - const _tail = comps.stream - .observe( - new Factory.Stream() - .asText() - .process({ - command: `tail -f ${filename}`, - cwd: process.cwd(), - shell: undefined, - }) - .get() - .sterilized(), - ) - .on('processing', () => { - procceed(); - }) - .catch(finish.bind(null, comps.session, done)); - comps.events.StreamUpdated.subscribe((rows: number) => { - if (rows < 4) { - return; - } - comps.stream - .grab(0, 4) - .then((result: GrabbedElement[]) => { - logger.debug('result of grab was: ' + JSON.stringify(result)); - expect( - result - .map((i) => i.source_id) - .reduce((partialSum, a) => partialSum + a, 0), - ).toBe(2); - expect(result.map((i) => i.pos)).toEqual([0, 1, 2, 3]); - expect(result.filter((i) => i.content === TEST_LINES[0]).length).toBe( - 2, - ); - expect(result.filter((i) => i.content === TEST_LINES[1]).length).toBe( - 2, - ); - finish(comps.session, done); - }) - .catch((err: Error) => { - finish( - comps.session, - done, - new Error( - `Fail to grab data due error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - }); - }); - }); - }); - }); -} diff --git a/application/apps/rustcore/ts-bindings/spec/session.values.spec.ts b/application/apps/rustcore/ts-bindings/spec/session.values.spec.ts deleted file mode 100644 index 8a1e32616f..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/session.values.spec.ts +++ /dev/null @@ -1,140 +0,0 @@ -// tslint:disable -// We need to provide path to TypeScript types definitions -/// -/// - -import { initLogger } from './logger'; -initLogger(); -import { Factory } from '../src/api/session'; -import { finish, createSampleFile, appendToSampleFile } from './common'; -import { readConfigurationFile } from './config'; - -import * as runners from './runners'; - -const config = readConfigurationFile().get().tests.values; -const MAX_DATASET_LEN = 65000; - -describe('Values', function () { - it(config.regular.list[1], function () { - return runners.withSession(config.regular, 1, async (logger, done, comps) => { - let sum = 0; - const tmpobj = createSampleFile(5000, logger, (i: number) => { - if (i % 100 === 0 || i <= 5) { - sum += i; - return `[${i}]:: some data CPU=${i}% line data\n`; - } else { - return `[${i}]:: some line data\n`; - } - }); - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .values([`CPU=(\\d{1,})`]) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - comps.events.SearchValuesUpdated.subscribe((map) => { - if (map === null) { - // Before get results rustcore should inform FE about dropping results. - return; - } - comps.search - .getValues(MAX_DATASET_LEN) - .then((data) => { - let control = 0; - data.forEach((points, _k) => { - points.forEach((p) => { - control += p.y_value; - }); - }); - expect(control).toEqual(sum); - finish(comps.session, done); - }) - .catch(finish.bind(null, comps.session, done)); - }); - }); - }); - it(config.regular.list[2], function () { - return runners.withSession(config.regular, 2, async (logger, done, comps) => { - let sum = 0; - const tmpobj = createSampleFile(5000, logger, (i: number) => { - if (i % 100 === 0 || i <= 5) { - sum += i; - return `[${i}]:: some data CPU=${i}% line data\n`; - } else { - return `[${i}]:: some line data\n`; - } - }); - let iteration = 0; - comps.stream - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(tmpobj.name) - .get() - .sterilized(), - ) - .on('processing', () => { - comps.search - .values([`CPU=(\\d{1,})`]) - .catch(finish.bind(null, comps.session, done)); - }) - .catch(finish.bind(null, comps.session, done)); - comps.events.SearchValuesUpdated.subscribe((map) => { - if (map === null) { - // Before get results rustcore should inform FE about dropping results. - return; - } - if (iteration === 0) { - comps.search - .getValues(MAX_DATASET_LEN) - .then((data) => { - let control = 0; - data.forEach((points, _k) => { - points.forEach((p) => { - control += p.y_value; - }); - }); - expect(control).toEqual(sum); - const offset = 5000; - appendToSampleFile(tmpobj, 5000, logger, (i: number) => { - if (i % 100 === 0 || i <= 5) { - sum += i + offset; - return `[${i}]:: some data CPU=${i + offset}% line data\n`; - } else { - return `[${i}]:: some line data\n`; - } - }); - }) - .catch(finish.bind(null, comps.session, done)); - iteration += 1; - } else if (iteration === 1) { - comps.search - .getValues(MAX_DATASET_LEN) - .then((data) => { - let control = 0; - data.forEach((points, _k) => { - points.forEach((p) => { - control += p.y_value; - }); - }); - expect(control).toEqual(sum); - finish(comps.session, done); - }) - .catch(finish.bind(null, comps.session, done)); - } else { - expect(iteration).toEqual(1); - } - }); - }); - }); -}); diff --git a/application/apps/rustcore/ts-bindings/spec/setup_config.sh b/application/apps/rustcore/ts-bindings/spec/setup_config.sh deleted file mode 100755 index 42c1c4d606..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/setup_config.sh +++ /dev/null @@ -1,8 +0,0 @@ -export JASMIN_TEST_CONFIGURATION="./spec/benchmarks.json" -export SH_HOME_DIR="/chipmunk" -if [ "$#" -gt 0 ]; then - export PERFORMANCE_RESULTS_FOLDER="chipmunk_performance_results" - export PERFORMANCE_RESULTS="Benchmark_$1.json" -else - echo "No arguments provided." -fi \ No newline at end of file diff --git a/application/apps/rustcore/ts-bindings/spec/support/jasmine.json b/application/apps/rustcore/ts-bindings/spec/support/jasmine.json deleted file mode 100644 index 2564c32c4f..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/support/jasmine.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "spec_dir": "spec/", - "spec_files": ["**/*[sS]pec.js"], - "helpers": ["helpers/**/*.js", "helpers/**/*.ts"], - "stopSpecOnExpectationFailure": false, - "random": false -} diff --git a/application/apps/rustcore/ts-bindings/spec/tests.notes.md b/application/apps/rustcore/ts-bindings/spec/tests.notes.md deleted file mode 100644 index 83adb21cbe..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/tests.notes.md +++ /dev/null @@ -1,85 +0,0 @@ -# Making TypeScript available for IDE -We need to provide path to TypeScript types definitions in each `*.spec.ts` file -``` -/// -/// -``` - -# Manual start of defined test: -``` -./node_modules/.bin/jasmine-ts src/something.spec.ts -``` - -# Debug -Add next configuration into `launch.json` of VSCode - -``` -{ - "version": "0.2.0", - "configurations": [ - - { - "type": "node", - "request": "launch", - "name": "Jasmine Current File", - "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", - "program": "${workspaceFolder}/node_modules/jasmine-ts/lib/index", - "args": ["--config=${workspaceFolder}/spec/support/jasmine.json", "${file}"], - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen" - } - ] -} -``` - -Take in account, jasmine should be started considering embedded version of node. That's why there parameter `runtimeExecutable` - -# Troubleshooting -## ts-node issue - -If you have error like next: - -``` -Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './dist' is not defined by "exports" in ./application/apps/rustcore/ts/node_modules/ts-node/package.json -``` - -You have to resolve it by hands. - -1. Open "./application/apps/rustcore/ts/node_modules/ts-node/package.json" -2. Add there ("./dist": "./dist/index.js") into "exports" sections. Like this: - -``` -"exports": { - ".": "./dist/index.js", - "./dist": "./dist/index.js", - ... -} -``` - -## Wrong version of node module -Test should be started in scope of embedded (into electron) version on node. To start test, just add next into `package.json` - -``` - "scripts": { - ... - "test": "./node_modules/.bin/electron ./node_modules/jasmine-ts/lib/index.js" - ... - }, -``` - -Make sure you have right version of electron as dependency - -``` -"dependencies": { - ... - "electron": "22.3.6" - ... -}, -``` - -## Jasmine timeout -To get rid of short Jasmine timeout (can be useful for testing async operation, which may take long time) just add it into `*.spec.ts` file - -``` -jasmine.DEFAULT_TIMEOUT_INTERVAL = 900000; -``` \ No newline at end of file diff --git a/application/apps/rustcore/ts-bindings/spec/tsconfig.json b/application/apps/rustcore/ts-bindings/spec/tsconfig.json deleted file mode 100644 index e0a96fbb16..0000000000 --- a/application/apps/rustcore/ts-bindings/spec/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "outDir": "./build/", - "forceConsistentCasingInFileNames": true, - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "sourceMap": true, - "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, - "moduleResolution": "node", - "importHelpers": true, - "target": "ESNext", - "module": "CommonJS", - "lib": ["ESNext"], - "paths": { - "*": ["./node_modules/*"] - }, - "types": ["node"] - }, - "include": ["./*.spec.ts"], - "exclude": ["node_modules"] -} diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/executor.async.results.ts b/application/apps/rustcore/ts-bindings/src/api/executors/executor.async.results.ts deleted file mode 100644 index 58a058b9c9..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/executor.async.results.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { Logger, utils } from 'platform/log'; -import { cutUuid } from 'platform/log/utils'; -import { CancelablePromise } from 'platform/env/promise'; -import { RustSession } from '../../native/native.session'; -import { EventProvider, IErrorEvent, IOperationDoneEvent } from '../session.provider'; -import { ICancelablePromise, TCanceler } from 'platform/env/promise'; -import { v4 as uuidv4 } from 'uuid'; -import { NativeError } from '../../interfaces/errors'; -import { Subscriber } from 'platform/env/subscription'; - -export type TOperationRunner = ( - session: RustSession, - options: TOptions, - operationUuid: string, -) => Promise; - -export type TOperationResultReader = ( - result: any, - resolve: (res: TResult) => void, - reject: (err: Error) => void, -) => void; - -class LifeCycle extends Subscriber { - protected abortOperationId: string | undefined; - - constructor( - protected readonly session: RustSession, - protected readonly provider: EventProvider, - protected readonly logger: Logger, - protected readonly reader: TOperationResultReader, - protected readonly signature: string, - protected readonly resolve: (results: TResult) => void, - protected readonly reject: (err: Error) => void, - protected readonly cancel: (reason?: any) => void, - protected readonly refCancelCB: (cb: TCanceler) => void, - protected readonly task: ICancelablePromise, - ) { - super(); - this.register( - provider.getEvents().SessionDestroyed.subscribe(this.onSessionDestroyed.bind(this)), - ); - this.register( - provider.getEvents().OperationError.subscribe(this.onOperationError.bind(this)), - ); - this.register( - provider.getEvents().OperationDone.subscribe(this.onOperationDone.bind(this)), - ); - task.finally(() => { - this.logger.verbose(`${signature}: finished`); - this.unsubscribe(); - }); - refCancelCB(this.cancelling.bind(this)); - } - - protected onSessionDestroyed(): void { - this.reject(new Error(this.logger.warn(`${this.signature}: session was destroyed`))); - } - - protected onOperationError(event: IErrorEvent): void { - if (event.uuid !== this.task.uuid() && event.uuid !== this.abortOperationId) { - return; // Ignore. This is another operation - } - if (event.uuid === this.abortOperationId) { - if (this.task.isCompleted()) { - this.logger.warn( - `${this.signature}: cancellation was done with error: ${event.error.message}, but promise already completed.`, - ); - return; - } - this.logger.error( - `${this.signature}: cancellation was done with error: ${event.error.message}, but promise wasn't completed.`, - ); - } else { - this.logger.warn(`${this.signature}: (event) error ${event.error.message}`); - } - this.reject(new Error(event.error.message)); - } - - protected onOperationDone(event: IOperationDoneEvent): void { - if (event.uuid !== this.task.uuid() && event.uuid !== this.abortOperationId) { - return; // Ignore. This is another operation - } - this.logger.verbose(`${this.signature}: (event) done`); - if (event.uuid === this.abortOperationId || this.abortOperationId !== undefined) { - if (event.uuid !== this.abortOperationId) { - this.logger.warn( - `${this.signature}: promise was canceled, but results comes first; promise will be canceled in any way`, - ); - } - this.cancel(); - return; - } - if (this.task.isCanceling()) { - if (!this.task.tryToStopCancellation()) { - this.logger.warn(`${this.signature}: promise had been cancelled already`); - return; - } - this.logger.debug(`${this.signature}: cancellation is stopped`); - } - this.reader(event.result, this.resolve, this.reject); - } - - protected cancelling(): void { - this.logger.verbose(`${this.signature}: canceling`); - if (this.abortOperationId !== undefined) { - this.logger.warn(`${this.signature}: already canceled`); - return; - } - /** - * We do not need to listen event "done" for cancelation of this operation - * because we are listening event "destroyed" in the scope of operation's - * computation object - */ - this.abortOperationId = uuidv4(); - const state: NativeError | undefined = this.session.abort( - this.abortOperationId, - this.task.uuid(), - ); - if (state instanceof NativeError) { - this.logger.error(`${this.signature}: fail to cancel; error: ${state.message}`); - if (!this.task.tryToStopCancellation()) { - this.logger.error( - `${this.signature}: cancellation procudure of operation could not be stopped: promise had been cancelled already`, - ); - } else { - this.abortOperationId = undefined; - this.reject(new Error(`Fail to cancel operation. Error: ${state.message}`)); - } - return; - } - this.logger.debug(`${this.signature}: cancel signal has been sent`); - } -} - -// TODO: should be implemented timeout to prevent memory leaking -export function AsyncResultsExecutor( - session: RustSession, - provider: EventProvider, - logger: Logger, - options: TOptions, - runner: TOperationRunner, - reader: TOperationResultReader, - name: string, -): CancelablePromise { - return new CancelablePromise((resolve, reject, cancel, refCancelCB, self) => { - const signature = `${name} (${cutUuid(self.uuid())})`; - new LifeCycle( - session, - provider, - logger, - reader, - signature, - resolve, - reject, - cancel, - refCancelCB, - self, - ); - logger.verbose(`${signature}: started`); - // Call operation - runner(session, options, self.uuid()).catch((err: Error) => { - if (self.isProcessing()) { - reject(new Error(logger.error(`${signature}: fail to run: ${utils.error(err)}`))); - } - }); - }); -} diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/executor.async.void.confirmed.ts b/application/apps/rustcore/ts-bindings/src/api/executors/executor.async.void.confirmed.ts deleted file mode 100644 index e0cd554cda..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/executor.async.void.confirmed.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { Logger, utils } from 'platform/log'; -import { cutUuid } from 'platform/log/utils'; -import { CancelablePromise, ICancelablePromise, TCanceler } from 'platform/env/promise'; -import { RustSession } from '../../native/native.session'; -import { EventProvider, IErrorEvent, IOperationDoneEvent } from '../session.provider'; -import { Subscriber } from 'platform/env/subscription'; -import { v4 as uuidv4 } from 'uuid'; -import { NativeError } from '../../interfaces/errors'; - -export type TOperationRunner = ( - session: RustSession, - options: TOptions, - operationUuid: string, -) => Promise; - -class LifeCycle extends Subscriber { - protected abortOperationId: string | undefined; - - constructor( - protected readonly session: RustSession, - protected readonly provider: EventProvider, - protected readonly logger: Logger, - protected readonly signature: string, - protected readonly resolve: () => void, - protected readonly reject: (err: Error) => void, - protected readonly cancel: (reason?: any) => void, - protected readonly refCancelCB: (cb: TCanceler) => void, - protected readonly getDebugInfo: () => string, - protected readonly task: ICancelablePromise, - ) { - super(); - this.register( - provider.getEvents().SessionDestroyed.subscribe(this.onSessionDestroyed.bind(this)), - ); - this.register( - provider.getEvents().OperationError.subscribe(this.onOperationError.bind(this)), - ); - this.register( - provider.getEvents().OperationDone.subscribe(this.onOperationDone.bind(this)), - ); - this.register( - provider.getEvents().OperationStarted.subscribe(this.onOperationStarted.bind(this)), - ); - this.register( - provider - .getEvents() - .OperationProcessing.subscribe(this.onOperationProcessing.bind(this)), - ); - task.finally(() => { - this.logger.verbose(`${signature}: finished`); - this.unsubscribe(); - }); - refCancelCB(this.cancelling.bind(this)); - } - - protected onSessionDestroyed(): void { - this.reject(new Error(this.logger.warn(`${this.signature}: session was destroyed`))); - } - - protected onOperationError(event: IErrorEvent): void { - if (event.uuid !== this.task.uuid() && event.uuid !== this.abortOperationId) { - return; // Ignore. This is another operation - } - if (event.uuid === this.abortOperationId) { - if (this.task.isCompleted()) { - this.logger.warn( - `${this.signature}: cancellation was done with error: ${event.error.message}, but promise already completed.`, - ); - return; - } - this.logger.error( - `${this.signature}: cancellation was done with error: ${ - event.error.message - }, but promise wasn't completed; info: ${this.getDebugInfo()}`, - ); - } else { - this.logger.warn( - `${this.signature}: (event) error ${ - event.error.message - }; info: ${this.getDebugInfo()}`, - ); - } - this.reject(new Error(event.error.message)); - } - - protected onOperationDone(event: IOperationDoneEvent): void { - if (event.uuid !== this.task.uuid() && event.uuid !== this.abortOperationId) { - return; // Ignore. This is another operation - } - this.logger.verbose(`${this.signature}: (event) done`); - if (event.uuid === this.abortOperationId || this.abortOperationId !== undefined) { - if (event.uuid !== this.abortOperationId) { - this.logger.warn( - `${this.signature}: promise was canceled, but results comes first; promise will be canceled in any way`, - ); - } - this.cancel(); - return; - } - if (this.task.isCanceling()) { - if (!this.task.tryToStopCancellation()) { - this.logger.warn(`${this.signature}: promise had been cancelled already`); - return; - } - this.logger.debug(`${this.signature}: cancellation is stopped`); - } - this.resolve(); - } - - protected onOperationStarted(uuid: string): void { - if (uuid !== this.task.uuid()) { - return; - } - this.logger.verbose(`${this.signature}: (event) confirmed; info: ${this.getDebugInfo()}`); - this.task.emit('confirmed'); - } - - protected onOperationProcessing(uuid: string): void { - if (uuid !== this.task.uuid()) { - return; - } - this.logger.verbose(`${this.signature}: (event) processing`); - this.task.emit('processing'); - } - - protected cancelling(): void { - this.logger.verbose(`${this.signature}: canceling`); - if (this.abortOperationId !== undefined) { - this.logger.warn(`${this.signature}: already canceled`); - return; - } - /** - * We do not need to listen event "done" for cancelation of this operation - * because we are listening event "destroyed" in the scope of operation's - * computation object - */ - this.abortOperationId = uuidv4(); - const state: NativeError | undefined = this.session.abort( - this.abortOperationId, - this.task.uuid(), - ); - if (state instanceof NativeError) { - this.logger.error(`${this.signature}: fail to cancel; error: ${state.message}`); - if (!this.task.tryToStopCancellation()) { - this.logger.error( - `${this.signature}: cancellation procudure of operation could not be stopped: promise had been cancelled already`, - ); - } else { - this.abortOperationId = undefined; - this.reject(new Error(`Fail to cancel operation. Error: ${state.message}`)); - } - return; - } - this.logger.debug(`${this.signature}: cancel signal has been sent`); - } -} - -export function AsyncVoidConfirmedExecutor( - session: RustSession, - provider: EventProvider, - logger: Logger, - options: TOptions, - runner: TOperationRunner, - getDebugInfo: () => string, - name: string, -): CancelablePromise { - return new CancelablePromise((resolve, reject, cancel, refCancelCB, self) => { - const signature = `${name} (${cutUuid(self.uuid())})`; - // Setup subscriptions - new LifeCycle( - session, - provider, - logger, - signature, - resolve, - reject, - cancel, - refCancelCB, - getDebugInfo, - self, - ); - logger.verbose(`${signature}: started`); - runner(session, options, self.uuid()).catch((err: Error) => { - if (self.isProcessing()) { - reject(new Error(logger.error(`${signature}: fail to run: ${utils.error(err)}`))); - } - }); - }); -} diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/executor.ts b/application/apps/rustcore/ts-bindings/src/api/executors/executor.ts deleted file mode 100644 index c6e32d5522..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/executor.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Logger } from 'platform/log'; -import { CancelablePromise } from 'platform/env/promise'; -import { RustSession } from '../../native/native.session'; -import { EventProvider } from '../../api/session.provider'; -export { Logger, CancelablePromise }; - -export type TExecutor = ( - session: RustSession, - provider: EventProvider, - logger: Logger, - options: TOptions, -) => CancelablePromise; - -export { AsyncResultsExecutor } from './executor.async.results'; -export { AsyncVoidConfirmedExecutor } from './executor.async.void.confirmed'; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/session.executors.ts b/application/apps/rustcore/ts-bindings/src/api/executors/session.executors.ts deleted file mode 100644 index 5068476048..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/session.executors.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { executor as SleepExecutor } from './session.sleep.executor'; - -export const Executors = { - sleep: SleepExecutor, -}; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/session.sleep.executor.ts b/application/apps/rustcore/ts-bindings/src/api/executors/session.sleep.executor.ts deleted file mode 100644 index 020793adee..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/session.sleep.executor.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { TExecutor, Logger, CancelablePromise, AsyncResultsExecutor } from './executor'; -import { RustSession } from '../../native/native.session'; -import { EventProvider } from '../../api/session.provider'; - -import * as protocol from 'protocol'; - -export interface IExecuteSleepOptions { - duration: number; - ignoreCancellation: boolean; -} -export interface ISleepResults { - sleep_well: boolean; -} - -export const executor: TExecutor = ( - session: RustSession, - provider: EventProvider, - logger: Logger, - options: IExecuteSleepOptions, -): CancelablePromise => { - return AsyncResultsExecutor( - session, - provider, - logger, - options, - function ( - session: RustSession, - options: IExecuteSleepOptions, - operationUuid: string, - ): Promise { - return session.sleep(operationUuid, options.duration, options.ignoreCancellation); - }, - function ( - data: Uint8Array, - resolve: (res: ISleepResults) => void, - reject: (err: Error) => void, - ) { - try { - const result: ISleepResults = protocol.decodeResultSleep(data); - resolve(result); - } catch (e) { - return reject( - new Error( - `Fail to parse sleep results. Error: ${e instanceof Error ? e.message : e}`, - ), - ); - } - }, - 'sleep', - ); -}; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.executors.ts b/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.executors.ts deleted file mode 100644 index 601f438980..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.executors.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { executor as SearchExecutor } from './session.stream.search.executor'; -import { executor as SearchValuesExecutor } from './session.stream.searchvalues.executor'; -import { executor as MapExecutor } from './session.stream.map.executor'; -import { executor as ValuesGetterExecutor } from './session.stream.get_values.executor'; -import { executor as AssignExecutor } from './session.stream.observe.executor'; -import { executor as ExportExecutor } from './session.stream.export.executor'; -import { executor as ExportRawExecutor } from './session.stream.export_raw.executor'; -import { executor as ExtractExecutor } from './session.stream.extract.executor'; -import { executor as NearestExecutor } from './session.stream.nearest.executor'; - -export const Executors = { - search: SearchExecutor, - values: SearchValuesExecutor, - map: MapExecutor, - values_getter: ValuesGetterExecutor, - observe: AssignExecutor, - export: ExportExecutor, - exportRaw: ExportRawExecutor, - extract: ExtractExecutor, - nearest: NearestExecutor, -}; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.export.executor.ts b/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.export.executor.ts deleted file mode 100644 index 06201f131c..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.export.executor.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { TExecutor, Logger, CancelablePromise, AsyncResultsExecutor } from './executor'; -import { RustSession } from '../../native/native.session'; -import { EventProvider } from '../../api/session.provider'; -import { IRange } from 'platform/types/range'; -import { TextExportOptions } from 'platform/types/exporting'; - -import * as protocol from 'protocol'; - -export interface Options { - dest: string; - ranges: IRange[]; - opt: TextExportOptions; -} - -export const executor: TExecutor = ( - session: RustSession, - provider: EventProvider, - logger: Logger, - opt: Options, -): CancelablePromise => { - return AsyncResultsExecutor( - session, - provider, - logger, - opt, - function (session: RustSession, opt: Options, operationUuid: string): Promise { - return session.export(opt.dest, opt.ranges, opt.opt, operationUuid); - }, - function ( - data: Uint8Array, - resolve: (done: boolean) => void, - reject: (err: Error) => void, - ) { - const result: boolean = protocol.decodeResultBool(data); - if (typeof result !== 'boolean') { - return reject( - new Error( - `Fail to parse export results. Invalid format. Expecting valid { boolean }; gotten: ${typeof data}`, - ), - ); - } - resolve(result); - }, - 'exporting', - ); -}; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.export_raw.executor.ts b/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.export_raw.executor.ts deleted file mode 100644 index e2c3027f35..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.export_raw.executor.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { TExecutor, Logger, CancelablePromise, AsyncResultsExecutor } from './executor'; -import { RustSession } from '../../native/native.session'; -import { EventProvider } from '../session.provider'; -import { IRange } from 'platform/types/range'; - -import * as protocol from 'protocol'; - -export interface Options { - dest: string; - ranges: IRange[]; -} - -export const executor: TExecutor = ( - session: RustSession, - provider: EventProvider, - logger: Logger, - opt: Options, -): CancelablePromise => { - return AsyncResultsExecutor( - session, - provider, - logger, - opt, - function (session: RustSession, opt: Options, operationUuid: string): Promise { - return session.exportRaw(opt.dest, opt.ranges, operationUuid); - }, - function ( - data: Uint8Array, - resolve: (done: boolean) => void, - reject: (err: Error) => void, - ) { - const result: boolean = protocol.decodeResultBool(data); - if (typeof result !== 'boolean') { - return reject( - new Error( - `Fail to parse export results. Invalid format. Expecting valid { boolean }; gotten: ${typeof data}`, - ), - ); - } - resolve(result); - }, - 'exporting', - ); -}; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.extract.executor.ts b/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.extract.executor.ts deleted file mode 100644 index 4d2a5fcdbc..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.extract.executor.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { TExecutor, Logger, CancelablePromise, AsyncResultsExecutor } from './executor'; -import { RustSession } from '../../native/native.session'; -import { EventProvider } from '../../api/session.provider'; -import { - IFilter, - TExtractedValuesSrc, - IExtractedValueSrc, - TExtractedValues, - IExtractedMatch, - IExtractedValue, -} from 'platform/types/filter'; - -import * as protocol from 'protocol'; - -export const executor: TExecutor = ( - session: RustSession, - provider: EventProvider, - logger: Logger, - filters: IFilter[], -): CancelablePromise => { - return AsyncResultsExecutor( - session, - provider, - logger, - filters, - function (session: RustSession, filters: IFilter[], operationUuid: string): Promise { - return session.extractMatchesValues(filters, operationUuid); - }, - function ( - data: Uint8Array, - resolve: (res: TExtractedValues) => void, - reject: (err: Error) => void, - ) { - try { - const src: TExtractedValuesSrc = protocol.decodeResultExtractedMatchValues(data); - if (!(src instanceof Array)) { - return reject( - new Error( - `Fail to parse extracting results. Invalid format. Expecting TExtractedValuesSrc (Array), but has been gotten: ${typeof src}`, - ), - ); - } - const results: TExtractedValues = src.map((value: IExtractedValueSrc) => { - if (typeof value !== 'object' || value === null) { - throw new Error( - `Invalid format of {value: IExtractedValueSrc}: ${typeof value}.`, - ); - } - if (typeof value.index !== 'number') { - throw new Error( - `Expecting value.index will be {number}, but it's: ${typeof value.index}`, - ); - } - if (!(value.values instanceof Array)) { - throw new Error( - `Expecting value.values will be an Array, but it's: ${typeof value.values}`, - ); - } - return { - position: value.index, - values: value.values.map((values: Array) => { - if (values.length !== 2) { - throw new Error( - `Expecting nested array in IExtractedValueSrc.values always will have len 2. But len is: ${values.length}`, - ); - } - if (typeof values[0] !== 'number') { - throw new Error( - `Expecting IExtractedValueSrc.values[0] will be {number} (index of filter). But it's: ${typeof values[0]} / ${ - values[0] - }`, - ); - } - if (!(values[1] instanceof Array)) { - throw new Error( - `Expecting IExtractedValueSrc.values[1] will be {string[]} (values of matches). But it's: ${typeof values[1]} / ${ - values[1] - }`, - ); - } - return { - filter: filters[values[0] as number], - values: values[1] as string[], - } as IExtractedMatch; - }), - } as IExtractedValue; - }); - resolve(results); - } catch (err) { - return reject( - new Error( - `Fail to parse extracting values results. Error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - } - }, - 'extract_matches_values', - ); -}; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.get_values.executor.ts b/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.get_values.executor.ts deleted file mode 100644 index b326764869..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.get_values.executor.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { TExecutor, Logger, CancelablePromise, AsyncResultsExecutor } from './executor'; -import { RustSession } from '../../native/native.session'; -import { EventProvider } from '../session.provider'; -import { error } from 'platform/log/utils'; -import { ResultSearchValues } from 'platform/types/bindings'; - -import * as protocol from 'protocol'; - -export interface IOptions { - datasetLength: number; - from?: number; - to?: number; -} - -export const executor: TExecutor = ( - session: RustSession, - provider: EventProvider, - logger: Logger, - options: IOptions, -): CancelablePromise => { - return AsyncResultsExecutor( - session, - provider, - logger, - options, - function (session: RustSession, options: IOptions, operationUuid: string): Promise { - return new Promise((resolve, reject) => { - if (options.from !== undefined && options.to !== undefined) { - if ( - isNaN(options.from) || - isNaN(options.to) || - !isFinite(options.from) || - !isFinite(options.to) - ) { - return reject(new Error(`Range is invalid`)); - } - if (options.from > options.to) { - return reject( - new Error(`Range is invalid: "from" should not be less "to"`), - ); - } - } - session - .getValues(operationUuid, options.datasetLength, options.from, options.to) - .catch(reject); - }); - }, - function ( - data: Uint8Array, - resolve: (r: ResultSearchValues) => void, - reject: (e: Error) => void, - ) { - try { - const map: ResultSearchValues = protocol.decodeResultSearchValues(data); - resolve(map); - } catch (e) { - reject(new Error(error(e))); - } - }, - 'get_values', - ); -}; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.map.executor.ts b/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.map.executor.ts deleted file mode 100644 index c8841a83b0..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.map.executor.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { TExecutor, Logger, CancelablePromise, AsyncResultsExecutor } from './executor'; -import { RustSession } from '../../native/native.session'; -import { EventProvider } from '../../api/session.provider'; -import { ISearchMap } from 'platform/types/filter'; - -import * as protocol from 'protocol'; - -export interface IOptions { - datasetLength: number; - from?: number; - to?: number; -} - -export const executor: TExecutor = ( - session: RustSession, - provider: EventProvider, - logger: Logger, - options: IOptions, -): CancelablePromise => { - return AsyncResultsExecutor( - session, - provider, - logger, - options, - function (session: RustSession, options: IOptions, operationUuid: string): Promise { - return new Promise((resolve, reject) => { - if (options.from !== undefined && options.to !== undefined) { - if ( - isNaN(options.from) || - isNaN(options.to) || - !isFinite(options.from) || - !isFinite(options.to) - ) { - return reject(new Error(`Range is invalid`)); - } - if (options.from > options.to) { - return reject( - new Error(`Range is invalid: "from" should not be less "to"`), - ); - } - } - session - .getMap(operationUuid, options.datasetLength, options.from, options.to) - .catch(reject); - }); - }, - function ( - data: Uint8Array, - resolve: (res: ISearchMap) => void, - reject: (err: Error) => void, - ) { - try { - const result: ISearchMap = protocol.decodeResultScaledDistribution(data); - if (!(result instanceof Array)) { - return reject( - new Error( - `Fail to parse search map. Invalid format. Expecting ISearchMap.`, - ), - ); - } - resolve(result); - } catch (err) { - return reject( - new Error( - `Fail to parse search map. Error: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - } - }, - 'get_map', - ); -}; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.nearest.executor.ts b/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.nearest.executor.ts deleted file mode 100644 index 51b4206364..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.nearest.executor.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { TExecutor, Logger, CancelablePromise, AsyncResultsExecutor } from './executor'; -import { RustSession } from '../../native/native.session'; -import { EventProvider } from '../../api/session.provider'; -import { NearestPosition, ResultNearestPosition } from 'platform/types/bindings'; - -import * as protocol from 'protocol'; - -export interface IExecuteNearestOptions { - positionInStream: number; -} - -export const executor: TExecutor = ( - session: RustSession, - provider: EventProvider, - logger: Logger, - options: IExecuteNearestOptions, -): CancelablePromise => { - return AsyncResultsExecutor( - session, - provider, - logger, - options, - function ( - session: RustSession, - options: IExecuteNearestOptions, - operationUuid: string, - ): Promise { - return session.getNearestTo(operationUuid, options.positionInStream); - }, - function ( - data: Uint8Array, - resolve: (res: NearestPosition | undefined) => void, - reject: (err: Error) => void, - ) { - try { - const result: ResultNearestPosition = protocol.decodeResultNearestPosition(data); - resolve(result === null ? undefined : result); - } catch (e) { - return reject( - new Error( - `Fail to parse getNearestTo results. Error: ${ - e instanceof Error ? e.message : e - }`, - ), - ); - } - }, - 'getNearestTo', - ); -}; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.observe.executor.ts b/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.observe.executor.ts deleted file mode 100644 index 86253a1d43..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.observe.executor.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { TExecutor, Logger, CancelablePromise, AsyncVoidConfirmedExecutor } from './executor'; -import { RustSession } from '../../native/native.session'; -import { EventProvider } from '../../api/session.provider'; -import { IObserve } from 'platform/types/observe'; - -export interface IFileOptionsDLT {} - -export enum EFileOptionsRequirements { - DLTOptions = 'DLTOptions', - NoOptionsRequired = 'NoOptionsRequires', -} - -export type TFileOptions = IFileOptionsDLT | undefined; - -export const executor: TExecutor = ( - session: RustSession, - provider: EventProvider, - logger: Logger, - options: IObserve, -): CancelablePromise => { - const debugInfo = JSON.stringify(options); - return AsyncVoidConfirmedExecutor( - session, - provider, - logger, - options, - function (session: RustSession, options: IObserve, operationUuid: string): Promise { - return session.observe(options, operationUuid); - }, - (): string => { - return debugInfo; - }, - 'observe', - ); -}; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.search.executor.ts b/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.search.executor.ts deleted file mode 100644 index 2feadac343..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.search.executor.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { TExecutor, Logger, CancelablePromise, AsyncResultsExecutor } from './executor'; -import { RustSession } from '../../native/native.session'; -import { EventProvider } from '../../api/session.provider'; -import { IFilter } from 'platform/types/filter'; - -import * as protocol from 'protocol'; - -export const executor: TExecutor = ( - session: RustSession, - provider: EventProvider, - logger: Logger, - filters: IFilter[], -): CancelablePromise => { - return AsyncResultsExecutor( - session, - provider, - logger, - filters, - function (session: RustSession, filters: IFilter[], operationUuid: string): Promise { - return session.search(filters, operationUuid); - }, - function ( - data: Uint8Array, - resolve: (found: number) => void, - reject: (err: Error) => void, - ) { - const found: number = protocol.decodeResultU64(data); - if (typeof found !== 'number' || isNaN(found) || !isFinite(found)) { - return reject( - new Error( - `Fail to parse search results. Invalid format. Expecting valid { number }.`, - ), - ); - } - resolve(found); - }, - 'search', - ); -}; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.searchvalues.executor.ts b/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.searchvalues.executor.ts deleted file mode 100644 index e00766be98..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/session.stream.searchvalues.executor.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { TExecutor, Logger, CancelablePromise, AsyncResultsExecutor } from './executor'; -import { RustSession } from '../../native/native.session'; -import { EventProvider } from '../session.provider'; - -export const executor: TExecutor = ( - session: RustSession, - provider: EventProvider, - logger: Logger, - filters: string[], -): CancelablePromise => { - return AsyncResultsExecutor( - session, - provider, - logger, - filters, - function (session: RustSession, filters: string[], operationUuid: string): Promise { - return session.searchValues(filters, operationUuid); - }, - function (_data: Uint8Array, resolve: () => void, _reject: (err: Error) => void) { - resolve(); - }, - 'search_values', - ); -}; diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/single.task.extract.ts b/application/apps/rustcore/ts-bindings/src/api/executors/single.task.extract.ts deleted file mode 100644 index b6cdbac534..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/single.task.extract.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { RustSession } from '../../native/native.session'; -import { ICancelablePromise } from 'platform/env/promise'; -import { EventProvider } from '../../api/session.provider'; -import { IFilter, TExtractedValues } from 'platform/types/filter'; -import { Executors } from './session.stream.executors'; -import { TaskManager } from './single.task'; -import { scope } from 'platform/env/scope'; - -export class ExtractTaskManager extends TaskManager { - protected readonly provider: EventProvider; - protected readonly session: RustSession; - - constructor(provider: EventProvider, session: RustSession, uuid: string) { - super(scope.getLogger(`ExtractTaskManager: ${uuid}`)); - this.provider = provider; - this.session = session; - } - - executor(filters: IFilter[]): ICancelablePromise { - return Executors.extract(this.session, this.provider, this.logger, filters); - } -} diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/single.task.search.ts b/application/apps/rustcore/ts-bindings/src/api/executors/single.task.search.ts deleted file mode 100644 index 0324ff4c59..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/single.task.search.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { scope } from 'platform/env/scope'; -import { RustSession } from '../../native/native.session'; -import { ICancelablePromise } from 'platform/env/promise'; -import { EventProvider } from '../../api/session.provider'; -import { IFilter } from 'platform/types/filter'; -import { Executors } from './session.stream.executors'; -import { TaskManager } from './single.task'; - -export class SearchTaskManager extends TaskManager { - protected readonly provider: EventProvider; - protected readonly session: RustSession; - - constructor(provider: EventProvider, session: RustSession, uuid: string) { - super(scope.getLogger(`SearchTaskManager: ${uuid}`)); - this.provider = provider; - this.session = session; - } - - executor(filters: IFilter[]): ICancelablePromise { - return Executors.search(this.session, this.provider, this.logger, filters); - } -} diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/single.task.ts b/application/apps/rustcore/ts-bindings/src/api/executors/single.task.ts deleted file mode 100644 index 5c5e2756cc..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/single.task.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { ICancelablePromise, CancelablePromise } from 'platform/env/promise'; -import { Logger } from 'platform/log'; - -export abstract class TaskManager { - protected queue: { - args: T; - task: ICancelablePromise; - }[] = []; - protected running: ICancelablePromise | undefined; - protected dropping: boolean = false; - protected readonly logger: Logger; - - constructor(logger: Logger) { - this.logger = logger; - } - - public destroy(): Promise { - return this.drop(); - } - - public drop(): Promise { - this.dropping = true; - const pendings = this.queue.map((t) => t.task); - if (this.running !== undefined) { - pendings.push(this.running); - } - return Promise.all( - pendings.map((task) => { - return new Promise((resolve) => { - task.finally(() => resolve(undefined)); - task.abort(); - }); - }), - ) - .catch((err: Error) => { - this.logger.error(`Fail to drop all task: ${err.message}`); - }) - .then(() => { - return Promise.resolve(); - }) - .finally(() => { - this.dropping = false; - }); - } - - public run(args: T): ICancelablePromise { - if (this.dropping) { - return new CancelablePromise((_resolve, _reject, cancel, _refCancel, _self) => { - cancel(); - }); - } - // Check current task - if (this.running !== undefined) { - this.running.abort(); - } - return new CancelablePromise((_resolve, _reject, _cancel, _refCancel, self) => { - // Put task into queue - this.queue.push({ args, task: self }); - // Try to next - this.next(); - }); - } - - protected next(): void { - // Check current task - if (this.running !== undefined) { - return; - } - // Get latest task - const task = this.queue.pop(); - if (task === undefined) { - return; - } - // Drop rest task - this.queue.forEach((pending) => { - pending.task.abort(); - }); - this.queue = []; - // Run search - this.running = this.executor(task.args) - .finally(() => { - this.running = undefined; - this.next(); - }) - .bind(task.task); - task.task.uuid(this.running.uuid()); - } - - abstract executor(args: T): ICancelablePromise; -} diff --git a/application/apps/rustcore/ts-bindings/src/api/executors/single.task.values.ts b/application/apps/rustcore/ts-bindings/src/api/executors/single.task.values.ts deleted file mode 100644 index 93c7eed82c..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/executors/single.task.values.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { RustSession } from '../../native/native.session'; -import { ICancelablePromise } from 'platform/env/promise'; -import { EventProvider } from '../session.provider'; -import { Executors } from './session.stream.executors'; -import { TaskManager } from './single.task'; -import { scope } from 'platform/env/scope'; - -export class ValuesTaskManager extends TaskManager { - protected readonly provider: EventProvider; - protected readonly session: RustSession; - - constructor(provider: EventProvider, session: RustSession, uuid: string) { - super(scope.getLogger(`ValuesTaskManager: ${uuid}`)); - this.provider = provider; - this.session = session; - } - - executor(filters: string[]): ICancelablePromise { - return Executors.values(this.session, this.provider, this.logger, filters); - } -} diff --git a/application/apps/rustcore/ts-bindings/src/api/jobs.ts b/application/apps/rustcore/ts-bindings/src/api/jobs.ts deleted file mode 100644 index 0e5be666d7..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/jobs.ts +++ /dev/null @@ -1,382 +0,0 @@ -import { CancelablePromise } from 'platform/env/promise'; -import { Base, Cancelled, decode } from '../native/native.jobs'; -import { error } from 'platform/log/utils'; -import { IFilter } from 'platform/types/filter'; -import { SomeipStatistic } from 'platform/types/observe/parser/someip'; -import { - FoldersScanningResult, - DltStatisticInfo, - ShellProfile, - ProfileList, -} from 'platform/types/bindings'; -import { - InvalidPluginEntity, - InvalidPluginsList, - PluginEntity, - PluginsList, - PluginsPathsList, - PluginRunData, -} from 'platform/types/bindings/plugins'; - -import * as protocol from 'protocol'; - -export class Jobs extends Base { - public static async create(): Promise { - const instance = new Jobs(); - await instance.init(); - return instance; - } - - // This method is used for testing - public cancelTest(num_a: number, num_b: number, seq?: number): CancelablePromise { - const sequence = seq === undefined ? this.sequence() : seq; - const job: CancelablePromise = this.execute( - // We should define validation callback. As argument it takes result of job, - // which should be checked for type. In case it type is correct, callback - // should return true - (buf: Uint8Array): number | Error => { - return decode(buf, protocol.decodeCommandOutcomeWithi64); - }, - // As second argument of executor we should provide native function of job. - this.native.jobCancelTest(sequence, num_a, num_b), - // Sequence of job - sequence, - // Alias of job for logs - 'cancelTest', - ); - return job; - } - - public listContent(options: { - depth: number; - max: number; - paths: string[]; - include: { files: boolean; folders: boolean }; - }): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): any | Error => { - const output = decode( - buf, - protocol.decodeCommandOutcomeWithFoldersScanningResult, - ); - if (output instanceof Error || output instanceof Cancelled) { - return output; - } else { - return output; - } - }, - this.native.listFolderContent( - sequence, - options.depth, - options.max, - options.paths, - options.include.files, - options.include.folders, - ), - sequence, - 'listContent', - ); - return job; - } - - public isFileBinary(options: { filePath: string }): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): boolean | Error => { - return decode(buf, protocol.decodeCommandOutcomeWithbool); - }, - this.native.isFileBinary(sequence, options.filePath), - sequence, - 'isFileBinary', - ); - return job; - } - - public getFileChecksum(path: string): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): string | Error => { - return decode(buf, protocol.decodeCommandOutcomeWithString); - }, - this.native.getFileChecksum(sequence, path), - sequence, - 'getFileChecksum', - ); - return job; - } - - public getDltStats(paths: string[]): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): any | Error => { - const decoded = decode( - buf, - protocol.decodeCommandOutcomeWithDltStatisticInfo, - ); - if (decoded instanceof Error) { - return decoded; - } - return decoded; - }, - this.native.getDltStats(sequence, paths), - sequence, - 'getDltStats', - ); - return job; - } - - public getSomeipStatistic(paths: string[]): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): any | Error => { - const decoded = decode(buf, protocol.decodeCommandOutcomeWithString); - if (decoded instanceof Error) { - return decoded; - } - try { - return JSON.parse(decoded) as SomeipStatistic; - } catch (e) { - return new Error(error(e)); - } - }, - this.native.getSomeipStatistic(sequence, paths), - sequence, - 'getSomeipStatistic', - ); - return job; - } - - public getShellProfiles(): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): any | Error => { - const decoded = decode( - buf, - protocol.decodeCommandOutcomeWithProfileList, - ); - return decoded; - }, - this.native.getShellProfiles(sequence), - sequence, - 'getShellProfiles', - ); - return job; - } - - public getSerialPortsList(): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): string[] | Error => { - return decode(buf, protocol.decodeCommandOutcomeWithSerialPortsList); - }, - this.native.getSerialPortsList(sequence), - sequence, - 'getSerialPortsList', - ); - return job; - } - - public getRegexError(filter: IFilter): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): any | Error => { - const decoded = decode( - buf, - protocol.decodeCommandOutcomeWithOptionString, - ); - if (decoded instanceof Error) { - return decoded; - } else if (typeof decoded === 'string' && decoded.trim() !== '') { - return decoded; - } else { - return undefined; - } - }, - this.native.getRegexError(sequence, { - value: filter.filter, - is_regex: filter.flags.reg, - ignore_case: !filter.flags.cases, - is_word: filter.flags.word, - }), - sequence, - 'getRegexError', - ); - return job; - } - - public sleep(ms: number): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): any | Error => { - return decode(buf, protocol.decodeCommandOutcomeWithVoid); - }, - this.native.sleep(sequence, ms), - sequence, - 'sleep', - ); - return job; - } - - public installedPluginsList(): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): PluginEntity[] | Error => { - const decoded = decode( - buf, - protocol.decodeCommandOutcomeWithPluginsList, - ); - return decoded; - }, - this.native.installedPluginsList(sequence), - sequence, - 'installedPluginsList', - ); - return job; - } - - public invalidPluginsList(): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): InvalidPluginEntity[] | Error => { - const decoded = decode( - buf, - protocol.decodeCommandOutcomeWithInvalidPluginsList, - ); - return decoded; - }, - this.native.invalidPluginsList(sequence), - sequence, - 'invalidPluginsList', - ); - return job; - } - - public installedPluginsPaths(): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): string[] | Error => { - const decoded = decode( - buf, - protocol.decodeCommandOutcomeWithPluginsPathsList, - ); - return decoded; - }, - this.native.installedPluginsPaths(sequence), - sequence, - 'installedPluginsPaths', - ); - return job; - } - - public invalidPluginsPaths(): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): string[] | Error => { - const decoded = decode( - buf, - protocol.decodeCommandOutcomeWithPluginsPathsList, - ); - return decoded; - }, - this.native.invalidPluginsPaths(sequence), - sequence, - 'invalidPluginsPaths', - ); - return job; - } - - public installedPluginsInfo(plugin_path: string): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): PluginEntity | undefined | Error => { - const decoded = decode( - buf, - protocol.decodeCommandOutcomeWithOptionPluginEntity, - ); - return decoded; - }, - this.native.installedPluginsInfo(sequence, plugin_path), - sequence, - 'installedPluginsInfo', - ); - return job; - } - - public invalidPluginsInfo( - plugin_path: string, - ): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): InvalidPluginEntity | undefined | Error => { - const decoded = decode( - buf, - protocol.decodeCommandOutcomeWithOptionInvalidPluginEntity, - ); - return decoded; - }, - this.native.invalidPluginsInfo(sequence, plugin_path), - sequence, - 'invalidPluginsInfo', - ); - return job; - } - - public getPluginRunData(plugin_path: string): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): PluginRunData | undefined | Error => { - const decoded = decode( - buf, - protocol.decodeCommandOutcomeWithOptionPluginRunData, - ); - return decoded; - }, - this.native.getPluginRunData(sequence, plugin_path), - sequence, - 'getPluginRunData', - ); - return job; - } - - public reloadPlugins(): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): any | Error => { - return decode(buf, protocol.decodeCommandOutcomeWithVoid); - }, - this.native.reloadPlugins(sequence), - sequence, - 'reloadPlugins', - ); - return job; - } - - public addPlugin(plugin_path: string): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): any | Error => { - return decode(buf, protocol.decodeCommandOutcomeWithVoid); - }, - this.native.addPlugin(sequence, plugin_path), - sequence, - 'addPlugin', - ); - - return job; - } - - public removePlugin(plugin_path: string): CancelablePromise { - const sequence = this.sequence(); - const job: CancelablePromise = this.execute( - (buf: Uint8Array): any | Error => { - return decode(buf, protocol.decodeCommandOutcomeWithVoid); - }, - this.native.removePlugin(sequence, plugin_path), - sequence, - `removePlugin`, - ); - - return job; - } -} diff --git a/application/apps/rustcore/ts-bindings/src/api/session.provider.ts b/application/apps/rustcore/ts-bindings/src/api/session.provider.ts deleted file mode 100644 index e561b8cc98..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/session.provider.ts +++ /dev/null @@ -1,226 +0,0 @@ -import { Subject } from 'platform/env/subscription'; -import { ISearchUpdated } from 'platform/types/filter'; -import { Computation } from '../provider/provider'; -import { EErrorKind, EErrorSeverity } from '../provider/provider.errors'; -import { IMapEntity, IMatchEntity, FilterMatch } from 'platform/types/filter'; -import { AttachmentInfo } from 'platform/types/bindings'; - -import * as protocol from 'protocol'; - -export interface IProgressState { - total: number; - count: number; -} - -export interface IProgressEvent { - uuid: string; - Progress: IProgressState; -} - -export interface IError { - severity: EErrorSeverity; - kind: EErrorKind; - message?: string; -} - -export interface IErrorEvent { - uuid: string; - error: IError; -} - -export interface IOperationDoneEvent { - uuid: string; - result: any; -} - -export interface IEventMapUpdated { - map: IMapEntity[]; -} - -export interface IEventIndexedMapUpdated { - len: number; -} - -export interface IEventMatchesUpdated { - matches: IMatchEntity[]; -} - -export interface IAttachmentsUpdatedUpdated { - len: number; - attachment: AttachmentInfo; -} - -export interface ISessionEvents { - StreamUpdated: Subject; - FileRead: Subject; - SearchUpdated: Subject; - SearchValuesUpdated: Subject | null>; - SearchMapUpdated: Subject; - MapUpdated: Subject; - IndexedMapUpdated: Subject; - MatchesUpdated: Subject; - Progress: Subject; - AttachmentsUpdated: Subject; - SessionError: Subject; - OperationError: Subject; - SessionDestroyed: Subject; - OperationStarted: Subject; - OperationProcessing: Subject; - OperationDone: Subject; -} - -export interface ISessionEventsConvertors {} - -interface ISessionEventsSignatures { - StreamUpdated: 'StreamUpdated'; - FileRead: 'FileRead'; - SearchUpdated: 'SearchUpdated'; - SearchValuesUpdated: 'SearchValuesUpdated'; - SearchMapUpdated: 'SearchMapUpdated'; - MapUpdated: 'MapUpdated'; - IndexedMapUpdated: 'IndexedMapUpdated'; - MatchesUpdated: 'MatchesUpdated'; - Progress: 'Progress'; - AttachmentsUpdated: 'AttachmentsUpdated'; - SessionError: 'SessionError'; - OperationError: 'OperationError'; - SessionDestroyed: 'SessionDestroyed'; - OperationStarted: 'OperationStarted'; - OperationProcessing: 'OperationProcessing'; - OperationDone: 'OperationDone'; -} - -const SessionEventsSignatures: ISessionEventsSignatures = { - StreamUpdated: 'StreamUpdated', - FileRead: 'FileRead', - SearchUpdated: 'SearchUpdated', - SearchValuesUpdated: 'SearchValuesUpdated', - SearchMapUpdated: 'SearchMapUpdated', - MapUpdated: 'MapUpdated', - IndexedMapUpdated: 'IndexedMapUpdated', - MatchesUpdated: 'MatchesUpdated', - AttachmentsUpdated: 'AttachmentsUpdated', - Progress: 'Progress', - SessionError: 'SessionError', - OperationError: 'OperationError', - SessionDestroyed: 'SessionDestroyed', - OperationStarted: 'OperationStarted', - OperationProcessing: 'OperationProcessing', - OperationDone: 'OperationDone', -}; - -interface ISessionEventsInterfaces { - StreamUpdated: { self: 'number' }; - FileRead: { self: null }; - SearchUpdated: { self: 'object'; found: 'number'; stat: typeof Map }; - SearchValuesUpdated: { self: ['object', null] }; - SearchMapUpdated: { self: [typeof Array, null] }; - MapUpdated: { self: 'object'; map: typeof Array }; - IndexedMapUpdated: { self: 'object'; len: 'number' }; - MatchesUpdated: { self: 'object'; matches: typeof Array }; - Progress: { - self: 'object'; - uuid: 'string'; - progress: [ - { self: 'object'; total: 'number'; count: 'number' }, - { self: 'object'; type: 'string' }, - ]; - }; - AttachmentsUpdated: { self: 'object'; len: 'number'; attachment: typeof Object }; - SessionError: { self: 'object'; severity: 'string'; message: 'string'; kind: 'string' }; - OperationError: { - self: 'object'; - uuid: 'string'; - error: { self: 'object'; severity: 'string'; message: 'string'; kind: 'string' }; - }; - SessionDestroyed: { self: null }; - OperationStarted: { self: 'string' }; - OperationProcessing: { self: 'string' }; - OperationDone: { self: 'object'; uuid: 'string'; result: 'any' }; -} - -const SessionEventsInterfaces: ISessionEventsInterfaces = { - StreamUpdated: { self: 'number' }, - FileRead: { self: null }, - SearchUpdated: { self: 'object', found: 'number', stat: Map }, - SearchValuesUpdated: { self: ['object', null] }, - SearchMapUpdated: { self: [Array, null] }, - MapUpdated: { self: 'object', map: Array }, - IndexedMapUpdated: { self: 'object', len: 'number' }, - MatchesUpdated: { self: 'object', matches: Array }, - Progress: { - self: 'object', - uuid: 'string', - progress: [ - { self: 'object', total: 'number', count: 'number' }, - { self: 'object', type: 'string' }, - ], - }, - AttachmentsUpdated: { self: 'object', len: 'number', attachment: Object }, - SessionError: { self: 'object', severity: 'string', message: 'string', kind: 'string' }, - OperationError: { - self: 'object', - uuid: 'string', - error: { self: 'object', severity: 'string', message: 'string', kind: 'string' }, - }, - SessionDestroyed: { self: null }, - OperationStarted: { self: 'string' }, - OperationProcessing: { self: 'string' }, - OperationDone: { self: 'object', uuid: 'string', result: 'any' }, -}; - -export class EventProvider extends Computation< - ISessionEvents, - ISessionEventsSignatures, - ISessionEventsInterfaces -> { - private readonly _events: ISessionEvents = { - StreamUpdated: new Subject(), - FileRead: new Subject(), - SearchUpdated: new Subject(), - SearchValuesUpdated: new Subject | null>(), - SearchMapUpdated: new Subject(), - MapUpdated: new Subject(), - IndexedMapUpdated: new Subject(), - MatchesUpdated: new Subject(), // dummy - Progress: new Subject(), - AttachmentsUpdated: new Subject(), - SessionError: new Subject(), - OperationError: new Subject(), - SessionDestroyed: new Subject(), - OperationStarted: new Subject(), - OperationProcessing: new Subject(), - OperationDone: new Subject(), - }; - - private readonly _convertors: ISessionEventsConvertors = {}; - - constructor(uuid: string) { - super(uuid, protocol.decodeCallbackEvent); - } - - public getName(): string { - return 'EventProvider'; - } - - public getEvents(): ISessionEvents { - return this._events; - } - - public getEventsSignatures(): ISessionEventsSignatures { - return SessionEventsSignatures; - } - - public getEventsInterfaces(): ISessionEventsInterfaces { - return SessionEventsInterfaces; - } - - public getConvertor(event: keyof ISessionEventsSignatures, data: T): T | O | Error { - const convertors = this._convertors as unknown as { [key: string]: (data: T) => T | O }; - if (typeof convertors[event] !== 'function') { - return data; - } else { - return convertors[event](data); - } - } -} diff --git a/application/apps/rustcore/ts-bindings/src/api/session.search.ts b/application/apps/rustcore/ts-bindings/src/api/session.search.ts deleted file mode 100644 index 269b5e844b..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/session.search.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Logger } from 'platform/log'; -import { scope } from 'platform/env/scope'; -import { RustSession } from '../native/native.session'; -import { ICancelablePromise } from 'platform/env/promise'; -import { EventProvider } from '../api/session.provider'; -import { GrabbedElement } from 'platform/types/bindings/miscellaneous'; -import { IFilter, ISearchMap, TExtractedValues } from 'platform/types/filter'; -import { ResultSearchValues, NearestPosition } from 'platform/types/bindings'; -import { Executors } from './executors/session.stream.executors'; -import { SearchTaskManager } from './executors/single.task.search'; -import { ValuesTaskManager } from './executors/single.task.values'; -import { ExtractTaskManager } from './executors/single.task.extract'; - -export class SessionSearch { - protected readonly provider: EventProvider; - protected readonly session: RustSession; - protected readonly logger: Logger; - protected readonly managers: { - search: SearchTaskManager; - values: ValuesTaskManager; - extract: ExtractTaskManager; - }; - - constructor(provider: EventProvider, session: RustSession, uuid: string) { - this.logger = scope.getLogger(`SessionSearch: ${uuid}`); - this.provider = provider; - this.session = session; - this.managers = { - search: new SearchTaskManager(provider, session, uuid), - values: new ValuesTaskManager(provider, session, uuid), - extract: new ExtractTaskManager(provider, session, uuid), - }; - } - - public destroy(): Promise { - return Promise.all([ - this.managers.search.destroy(), - this.managers.values.destroy(), - this.managers.extract.destroy(), - ]) - .catch((err: Error) => { - this.logger.error(`Fail to drop managers: ${err.message}`); - }) - .then(() => Promise.resolve()); - } - - /** - * Retruns a chunk of search results, which were gotten with filters by @method setFilters - * @param start { number } - first row number in search result - * @param len { number } - count of rows, which should be included into chank from @param start - */ - public grab(start: number, len: number): Promise { - return this.session.grabSearchChunk(start, len); - } - - /** - * Retruns a chunk of matches results, which were gotten with filters by @method setMatches - * @param start { number } - first row number in search result - * @param len { number } - count of rows, which should be included into chank from @param start - */ - public grabMatchesChunk(start: number, len: number): string[] | Error { - return this.session.grabMatchesChunk(start, len); - } - - public search(filters: IFilter[]): ICancelablePromise { - return this.managers.search.run(filters); - } - - public searchNestedMatch( - filter: IFilter, - from: number, - rev: boolean, - ): Promise<[number, number] | undefined> { - return this.session.searchNestedMatch(filter, from, rev); - } - - public values(filters: string[]): ICancelablePromise { - return this.managers.values.run(filters); - } - - public extract(filters: IFilter[]): ICancelablePromise { - return this.managers.extract.run(filters); - } - - public drop(): Promise { - return new Promise((resolve, reject) => { - this.managers.search.drop().finally(() => { - this.session.dropSearch().then(resolve).catch(reject); - }); - }); - } - - public getMap( - datasetLength: number, - from?: number, - to?: number, - ): ICancelablePromise { - return Executors.map(this.session, this.provider, this.logger, { - datasetLength, - from, - to, - }); - } - - public getValues( - datasetLength: number, - from?: number, - to?: number, - ): ICancelablePromise { - return Executors.values_getter(this.session, this.provider, this.logger, { - datasetLength, - from, - to, - }); - } - - public getNearest(positionInStream: number): ICancelablePromise { - return Executors.nearest(this.session, this.provider, this.logger, { - positionInStream, - }); - } - - public len(): Promise { - return this.session.getSearchLen(); - } -} diff --git a/application/apps/rustcore/ts-bindings/src/api/session.stream.ts b/application/apps/rustcore/ts-bindings/src/api/session.stream.ts deleted file mode 100644 index ec67b4fa2b..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/session.stream.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { Logger } from 'platform/log'; -import { scope } from 'platform/env/scope'; -import { RustSession } from '../native/native.session'; -import { ICancelablePromise } from 'platform/env/promise'; -import { SdeRequest, SdeResponse } from 'platform/types/sde'; -import { EventProvider } from '../api/session.provider'; -import { Executors } from './executors/session.stream.executors'; -import { EFileOptionsRequirements } from './executors/session.stream.observe.executor'; -import { GrabbedElement } from 'platform/types/bindings/miscellaneous'; -import { IRange } from 'platform/types/range'; -import { ISourceLink } from 'platform/types/observe/types'; -import { Attachment, IndexingMode } from 'platform/types/content'; -import { IObserve } from 'platform/types/observe'; -import { TextExportOptions } from 'platform/types/exporting'; - -export class SessionStream { - private readonly _provider: EventProvider; - private readonly _session: RustSession; - private readonly _uuid: string; - private readonly _logger: Logger; - - constructor(provider: EventProvider, session: RustSession, uuid: string) { - this._logger = scope.getLogger(`SessionStream: ${uuid}`); - this._provider = provider; - this._session = session; - this._uuid = uuid; - } - - public destroy(): Promise { - return Promise.resolve(undefined); - } - - public grab(start: number, len: number): Promise { - return this._session.grabStreamChunk(start, len); - } - - public grabIndexed(start: number, len: number): Promise { - return this._session.grabIndexed(start, len); - } - - public setIndexingMode(mode: IndexingMode): Promise { - return this._session.setIndexingMode(mode); - } - - public getIndexedLen(): Promise { - return this._session.getIndexedLen(); - } - - public getAroundIndexes(position: number): Promise<{ - before: number | undefined; - after: number | undefined; - }> { - return this._session.getAroundIndexes(position); - } - - public addBookmark(row: number): Promise { - return this._session.addBookmark(row); - } - - public setBookmarks(rows: number[]): Promise { - return this._session.setBookmarks(rows); - } - - public removeBookmark(row: number): Promise { - return this._session.removeBookmark(row); - } - - public expandBreadcrumbs(seporator: number, offset: number, above: boolean): Promise { - return this._session.expandBreadcrumbs(seporator, offset, above); - } - - public grabRanges(ranges: IRange[]): Promise { - return this._session.grabStreamRanges(ranges); - } - - public getFileOptionsRequirements(filename: string): EFileOptionsRequirements { - return this._session.getFileOptionsRequirements(filename); - } - - public getSourcesDefinitions(): Promise { - return this._session.getSourcesDefinitions(); - } - - public observe(source: IObserve): ICancelablePromise { - return Executors.observe(this._session, this._provider, this._logger, source); - } - - public sde(operation: string, request: SdeRequest): Promise { - return this._session.sendIntoSde(operation, request).then((response) => { - try { - return response; - } catch (_err) { - return Promise.reject(new Error(`Fail to parse response`)); - } - }); - } - - public getAttachments(): Promise { - return this._session.getAttachments(); - } - - public getIndexedRanges(): Promise { - return this._session.getIndexedRanges(); - } - - public export( - dest: string, - ranges: IRange[], - opt: TextExportOptions, - ): ICancelablePromise { - return Executors.export(this._session, this._provider, this._logger, { dest, ranges, opt }); - } - - public exportRaw(dest: string, ranges: IRange[]): ICancelablePromise { - return Executors.exportRaw(this._session, this._provider, this._logger, { dest, ranges }); - } - - public len(): Promise { - return this._session.getStreamLen(); - } -} diff --git a/application/apps/rustcore/ts-bindings/src/api/session.ts b/application/apps/rustcore/ts-bindings/src/api/session.ts deleted file mode 100644 index 0a7dededa2..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/session.ts +++ /dev/null @@ -1,515 +0,0 @@ -import { Logger } from 'platform/log'; -import { scope } from 'platform/env/scope'; -import { v4 as uuid } from 'uuid'; -import { Subscription } from 'platform/env/subscription'; -import { RustSession, RustSessionConstructor } from '../native/native.session'; -import { EventProvider, ISessionEvents, IError } from '../api/session.provider'; -import { SessionStream } from '../api/session.stream'; -import { SessionSearch } from '../api/session.search'; -import { IOrderStat } from '../provider/provider'; -import { Executors } from './executors/session.executors'; -import { ISleepResults } from './executors/session.sleep.executor'; -import { ICancelablePromise } from 'platform/env/promise'; -import { OperationStat } from '../interfaces/index'; - -export { - ISessionEvents, - IProgressEvent, - IProgressState, - IEventMapUpdated, - IEventMatchesUpdated, - IEventIndexedMapUpdated, -} from '../api/session.provider'; -export { EventProvider, SessionStream, SessionSearch }; - -export * as $ from 'platform/types/observe'; -export * as Factory from 'platform/types/observe/factory'; - -enum ESessionState { - destroyed, - available, -} - -export class Session { - private readonly _session: RustSession; - private readonly _provider: EventProvider; - private _stream: SessionStream | undefined; - private _search: SessionSearch | undefined; - private readonly _uuid: string = uuid(); - private readonly _logger: Logger; - private readonly _subs: Map = new Map(); - private _state: ESessionState = ESessionState.available; - private _destroying: boolean = false; - private _debug: { - native: OperationStat[]; - } = { - native: [], - }; - - public static create(): Promise { - return new Promise((resolve, reject) => { - new Session((session: Error | Session) => { - if (session instanceof Error) { - reject(session); - } else { - resolve(session); - } - }); - }); - } - - constructor(cb: (err: Error | Session) => void) { - this._logger = scope.getLogger(`Session: ${this._uuid}`); - this._provider = new EventProvider(this._uuid); - this._session = new RustSessionConstructor( - this._uuid, - this._provider, - (err: Error | undefined) => { - if (err instanceof Error) { - cb(err); - } else { - this._stream = new SessionStream(this._provider, this._session, this._uuid); - this._search = new SessionSearch(this._provider, this._session, this._uuid); - this._subs.set( - 'SessionError', - this._provider.getEvents().SessionError.subscribe((err: IError) => { - this._logger.error( - `Session "${this._uuid}" would be destroyed because of error: [${ - err.kind - }/${err.severity}]:: ${err instanceof Error ? err.message : err}`, - ); - }), - ); - this._subs.set( - 'SessionDestroyed', - this._provider.getEvents().SessionDestroyed.subscribe(() => { - this._logger.warn( - `Destroy event has been gotten unexpectedly. Force destroy of session.`, - ); - this._state = ESessionState.destroyed; - this.destroy(); - }), - ); - cb(this); - } - }, - ); - } - - public destroy(): Promise { - const stream = this._stream; - const search = this._search; - const logger = this._logger; - function preparing(): Promise { - if (stream === undefined || search === undefined) { - logger.error(`Attempt to destroy session while it wasn't inited`); - } - return Promise.all([ - // Destroy stream controller - stream === undefined - ? Promise.resolve() - : stream.destroy().catch((err: Error) => { - logger.error( - `Fail correctly destroy SessionStream due error: ${ - err instanceof Error ? err.message : err - }`, - ); - }), - // Destroy search controller - search === undefined - ? Promise.resolve() - : search.destroy().catch((err: Error) => { - logger.error( - `Fail correctly destroy SessionSearch due error: ${ - err instanceof Error ? err.message : err - }`, - ); - }), - ]).then((_) => undefined); - } - return new Promise((resolve, reject) => { - this.requestNativeDebugStat() - .catch((err: Error) => { - this._logger.error(err.message); - }) - .finally(() => { - this._subs.forEach((subscription: Subscription) => { - subscription.destroy(); - }); - if (this._destroying) { - return reject(new Error(`Session is already destroyed or destroing`)); - } - this._destroying = true; - preparing() - .catch((err: Error) => { - this._logger.error( - `Error while destroying: ${ - err instanceof Error ? err.message : err - }`, - ); - }) - .finally(() => { - if (this._state !== ESessionState.destroyed) { - this._provider.getEvents().SessionDestroyed.subscribe(() => { - this._logger.debug( - `Confirmation of session destroying has been received`, - ); - }); - this._session.destroy().then(resolve).catch(reject); - } else { - this._provider.destroy().then(resolve).catch(reject); - } - }); - }); - }); - } - - public getUUID(): string { - return this._uuid; - } - - public getSessionFile(): Promise { - return this._session.getSessionFile(); - } - - public getEvents(): ISessionEvents { - if (this._provider === undefined) { - throw new Error(`EventProvider wasn't created`); - } - return this._provider.getEvents(); - } - - public getStream(): SessionStream { - if (this._stream === undefined) { - throw new Error(`SessionStream wasn't created`); - } - return this._stream; - } - - public getSearch(): SessionSearch { - if (this._search === undefined) { - throw new Error(`SessionSearch wasn't created`); - } - return this._search; - } - - public reset(): Promise { - return new Promise((resolve) => { - resolve(); - }); - } - - public getSocketPath(): string | Error { - if (this._session === undefined) { - return new Error(`RustSession wasn't created`); - } - return this._session.getSocketPath(); - } - - public async isRawExportAvailable(): Promise { - return await this._session.isRawExportAvailable(); - } - - public getNativeSession(): RustSession { - return this._session; - } - - /** - * Method sleep uses ONLY for cancellation testing - * @param duration - duration in ms - * @returns - */ - public sleep(duration: number, ignoreCancellation: boolean): ICancelablePromise { - return Executors.sleep(this._session, this._provider, this._logger, { - duration, - ignoreCancellation, - }); - } - - /** - * Switch session provider into debug mode - * Shows addition logs related to lifecircle - * @param state {boolean}: true - debug mode ON; false - debug mode OFF - */ - public debug(state: boolean, alias?: string) { - this._provider.debug().setStoring(state); - this._provider.debug().setTracking(state); - this._provider.debug().setCount(state); - this.getNativeSession() - .setDebug(true) - .catch((err: Error) => { - this._logger.error( - `Fail set debug mode on native: ${err instanceof Error ? err.message : err}`, - ); - }); - typeof alias === 'string' && this._provider.debug().setAlias(alias); - } - - /** - * Returns debug information: - * - unsupported - list of unsupported events. Events come from rust side to typescript side - * - error - list of errors on provider level - * Note: data will be available only if debug mode is ON - * @returns { - * unsupported: number; - * errors: number; - * } - */ - public getDebugStat(): { - alias: string | undefined; - unsupported: string[]; - errors: string[]; - order: IOrderStat[]; - counter: { [key: string]: number }; - operations: { [key: string]: number }; - } { - return { - alias: this._provider.debug().getAlias(), - unsupported: this._provider.debug().stat.unsupported(), - errors: this._provider.debug().stat.error(), - order: this._provider.debug().stat.order(), - counter: this._provider.debug().stat.counter(), - operations: this._provider.debug().stat.operations(), - }; - } - - public requestNativeDebugStat(): Promise { - if (this._state !== ESessionState.available) { - return Promise.resolve(); - } - return new Promise((resolve, reject) => { - if (this._provider.debug().isTracking()) { - this.getNativeSession() - .getOperationsStat() - .then((op: string) => { - try { - this._debug.native = JSON.parse(op); - resolve(undefined); - } catch (err) { - reject( - new Error( - `Fail get debug stat data from native: ${ - err instanceof Error ? err.message : err - }`, - ), - ); - } - }) - .catch(reject); - } else { - resolve(undefined); - } - }); - } - - public printDebugStat(stdout: boolean) { - const native: OperationStat[] = this._debug.native; - const stat = this.getDebugStat(); - const output = stdout ? console.log : this._logger.debug; - const LEN: number = 80; - const MAX = LEN + 2; - const SCALE = 10; - const format = (str: string, filler: string = ' '): string => { - return `│ ${str}${filler.repeat(MAX > str.length - 3 ? MAX - str.length - 3 : 0)}│`; - }; - const splitter = (): string => { - return `├${'─'.repeat(MAX - 2)}┤`; - }; - const fill = (str: string, len: number, filler: string = ' '): string => { - if (len - str.length < 0) { - return str; - } - return `${filler.repeat(len - str.length)}${str}`; - }; - output(`\n┌${'─'.repeat(LEN)}┐`); - stat.alias !== undefined && output(format(`▒▒▒ ${stat.alias} `, '▒')); - output(format(`Stat information. Session: ${this._uuid}`)); - output(`├${'─'.repeat(LEN)}┤`); - output(format(`Events:`)); - Object.keys(stat.counter).forEach((event: string) => { - output(format(` - [${event}]: ${stat.counter[event]}`)); - }); - output(format(`Operations:`)); - Object.keys(stat.operations).forEach((op: string) => { - output(format(` - [${op}]: ${stat.operations[op]}`)); - }); - const operations: IOrderStat[] = []; - stat.order.forEach((entity: IOrderStat) => { - if (entity.type === 'O' && entity.id !== undefined) { - operations.push(Object.assign({}, entity)); - } - }); - output(format(`Flow:`)); - stat.order.forEach((entity: IOrderStat, i: number) => { - let bound: IOrderStat | undefined; - if ( - entity.type === 'E' && - entity.id !== undefined && - operations.find((e) => e.id === entity.id) !== undefined - ) { - bound = operations.find((e) => e.id === entity.id); - } - output( - format( - `${fill((i + 1).toString(), 4)}. [${entity.type}][${ - entity.id === undefined ? ' ---- ' : entity.id.substr(0, 6) - }] ${entity.name}${bound !== undefined ? ` <-- ${bound.name}` : ''}`, - ), - ); - }); - const unboundEvents: IOrderStat[] = stat.order - .map((entity: IOrderStat) => { - if ( - entity.type !== 'E' || - entity.id === undefined || - operations.find((e) => e.id === entity.id) !== undefined || - native.find((op) => op.uuid == entity.id) !== undefined - ) { - return undefined; - } - return entity; - }) - .filter((ev) => ev !== undefined) as IOrderStat[]; - const jsOperationsScope = ( - stat.order - .map((op) => (op.type === 'O' ? op : undefined)) - .filter((op) => op !== undefined) as IOrderStat[] - ).filter((op) => op.id !== undefined); - const jsOperationsScopeValid = jsOperationsScope.filter((op) => op.duration >= 0); - const merged: Array<{ native: OperationStat; js: IOrderStat }> = []; - jsOperationsScopeValid.forEach((jsOp) => { - const natOp = native.find((op) => op.uuid === jsOp.id); - if (natOp !== undefined) { - merged.push({ - native: Object.assign({}, natOp), - js: Object.assign({}, jsOp), - }); - } - }); - if (merged.length > 0) { - output(format(`NodeJS / Rust scope:`)); - const step = Math.max(...merged.map((op) => op.js.duration)) / SCALE; - merged.forEach((operation: { native: OperationStat; js: IOrderStat }, i: number) => { - let scale = Math.floor(operation.native.duration / 1000 / step); - output( - format( - `${fill((i + 1).toString(), 4)}. [${( - operation.native.uuid as string - ).substr(0, 6)}][${fill( - (operation.native.duration / 1000).toFixed(2), - 8, - )}ms][${'■'.repeat(scale)}${'·'.repeat(SCALE - scale)}][ Rust ] ${ - operation.native.name - }`, - ), - ); - scale = Math.floor(operation.js.duration / step); - output( - format( - `${fill('', 14)}[${fill( - operation.js.duration.toFixed(2), - 8, - )}ms][${'■'.repeat(scale)}${'·'.repeat(SCALE - scale)}][ JS ] ${ - operation.js.name - }`, - ), - ); - const diff = operation.js.duration - operation.native.duration / 1000; - scale = diff <= 0 ? 0 : Math.floor(diff / step); - output( - format( - `${fill('', 14)}[${fill( - (diff < 0 ? 0 : diff).toFixed(2), - 8, - )}ms][${'■'.repeat(scale)}${'·'.repeat(SCALE - scale)}][ diff ]`, - ), - ); - }); - } - const jsOperationsScopeFiltered = jsOperationsScopeValid.filter( - (op) => merged.find((o) => o.js.id === op.id) === undefined, - ); - if (jsOperationsScopeFiltered.length > 0) { - output(format(`NodeJS scope:`)); - const step = Math.max(...jsOperationsScopeFiltered.map((op) => op.duration)) / SCALE; - jsOperationsScopeFiltered.forEach((operation: IOrderStat, i: number) => { - const scale = Math.floor(operation.duration / step); - output( - format( - `${fill((i + 1).toString(), 4)}. [${(operation.id as string).substr( - 0, - 6, - )}][${fill(operation.duration.toFixed(2), 8)}ms][${'■'.repeat( - scale, - )}${'·'.repeat(SCALE - scale)}][ T/R ] ${operation.name}`, - ), - ); - }); - } - const nativeFiltered = native.filter( - (op) => merged.find((o) => o.native.uuid === op.uuid) === undefined, - ); - if (nativeFiltered.length > 0) { - output(format(`Native scope:`)); - const isBound = (uuid: string): boolean => { - return operations.find((e) => e.id === uuid) !== undefined; - }; - const step = Math.max(...nativeFiltered.map((op) => op.duration)) / SCALE; - nativeFiltered.forEach((operation: OperationStat, i: number) => { - const scale = Math.floor(operation.duration / step); - output( - format( - `${fill((i + 1).toString(), 4)}. [${operation.uuid.substr(0, 6)}][${fill( - (operation.duration / 1000).toFixed(2), - 8, - )}ms][${'■'.repeat(scale)}${'·'.repeat(SCALE - scale)}][${ - isBound(operation.uuid) ? ' T/R ' : ' R ' - }] ${operation.name}`, - ), - ); - }); - } - if (unboundEvents.length === 0) { - output(format(`Unbound events: no events`)); - } else { - output(format(`Unbound events:`)); - unboundEvents.forEach((entity: IOrderStat, i: number) => { - output( - format( - `${fill((i + 1).toString(), 4)}. [${entity.type}][${ - entity.id === undefined ? ' ---- ' : entity.id.substr(0, 6) - }] ${entity.name}`, - ), - ); - }); - } - if (stat.unsupported.length === 0) { - output(format(`Unsupported events: nothing`)); - } else { - output(format(`Unsupported events:`)); - stat.unsupported.forEach((event: string) => { - output(format(` - ${event}`)); - }); - } - if (stat.errors.length === 0) { - output(format(`Errors: no errors`)); - } else { - output(format(`Errors:`)); - stat.errors.forEach((event: string) => { - output(format(` - ${event}`)); - }); - } - if (stat.order.length > 0 || native.length > 0) { - output(splitter()); - if (stat.order.length > 0) { - output(format(` - [O] - operation`)); - output(format(` - [E] - event`)); - } - if (native.length > 0) { - output(format(` - [T/R] - called like TS -> Rust`)); - output(format(` - [R] - called in Rust only`)); - } - } - output(`└${'─'.repeat(LEN)}┘`); - } -} diff --git a/application/apps/rustcore/ts-bindings/src/api/tracker.provider.ts b/application/apps/rustcore/ts-bindings/src/api/tracker.provider.ts deleted file mode 100644 index 84def0887f..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/tracker.provider.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { Subject } from 'platform/env/subscription'; -import { Computation } from '../provider/provider'; - -import * as protocol from 'protocol'; - -export interface Job { - alias: string; - uuid: string; -} - -export interface JobProgress { - uuid: string; - ticks: Ticks; -} -export interface Ticks { - count: number; - state: string | undefined; - total: number | undefined; -} - -export interface ISessionEvents { - Started: Subject; - Stopped: Subject; - Ticks: Subject; -} - -interface ISessionEventsSignatures { - Started: 'Started'; - Stopped: 'Stopped'; - Ticks: 'Ticks'; -} - -const SessionEventsSignatures: ISessionEventsSignatures = { - Started: 'Started', - Stopped: 'Stopped', - Ticks: 'Ticks', -}; - -interface ISessionEventsInterfaces { - Started: { self: 'object'; uuid: 'string'; alias: 'string' }; - Stopped: { self: 'string' }; - Ticks: { - self: 'object'; - uuid: 'string'; - progress: [ - { self: 'object'; total: 'number'; count: 'number' }, - { self: 'object'; type: 'string' }, - ]; - }; -} - -const SessionEventsInterfaces: ISessionEventsInterfaces = { - Started: { self: 'object', uuid: 'string', alias: 'string' }, - Stopped: { self: 'string' }, - Ticks: { - self: 'object', - uuid: 'string', - progress: [ - { self: 'object', total: 'number', count: 'number' }, - { self: 'object', type: 'string' }, - ], - }, -}; - -export class EventProvider extends Computation< - ISessionEvents, - ISessionEventsSignatures, - ISessionEventsInterfaces -> { - private readonly _events: ISessionEvents = { - Started: new Subject(), - Stopped: new Subject(), - Ticks: new Subject(), - }; - - private readonly _convertors = {}; - - constructor(uuid: string) { - super(uuid, protocol.decodeLifecycleTransition); - } - - public getName(): string { - return 'EventProvider'; - } - - public getEvents(): ISessionEvents { - return this._events; - } - - public getEventsSignatures(): ISessionEventsSignatures { - return SessionEventsSignatures; - } - - public getEventsInterfaces(): ISessionEventsInterfaces { - return SessionEventsInterfaces; - } - - public getConvertor(event: keyof ISessionEventsSignatures, data: T): T | O | Error { - const convertors = this._convertors as unknown as { [key: string]: (data: T) => T | O }; - if (typeof convertors[event] !== 'function') { - return data; - } else { - return convertors[event](data); - } - } -} diff --git a/application/apps/rustcore/ts-bindings/src/api/tracker.ts b/application/apps/rustcore/ts-bindings/src/api/tracker.ts deleted file mode 100644 index c7b1f5af22..0000000000 --- a/application/apps/rustcore/ts-bindings/src/api/tracker.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { Logger } from 'platform/log'; -import { scope } from 'platform/env/scope'; -import { getNativeModule } from '../native/native'; -import { TrackerNative } from '../native/native.tracker'; -import { EventProvider } from './tracker.provider'; -import { unique } from 'platform/env/sequence'; - -enum State { - destroyed, - destroying, - inited, - created, -} - -export class Tracker { - public static async create(): Promise { - const instance = new Tracker(); - await instance.init(); - return instance; - } - - protected readonly logger: Logger = scope.getLogger(`Tracker`); - protected readonly native: TrackerNative; - protected readonly uuid = unique(); - - public readonly provider: EventProvider; - - private _state: State = State.created; - - constructor() { - this.native = new (getNativeModule().RustProgressTracker)() as TrackerNative; - this.provider = new EventProvider(this.uuid); - this.logger.debug(`Rust Tracker native session is created`); - } - - public async init(): Promise { - return new Promise((resolve, reject) => { - this.native - .init(this.provider.getEmitter()) - .then(() => { - this.logger.debug(`Rust Tracker native session is inited`); - this._state = State.inited; - resolve(this); - }) - .catch((err: Error) => { - this.logger.error( - `Fail to init Tracker session: ${err instanceof Error ? err.message : err}`, - ); - reject(err); - }); - }); - } - - public async destroy(): Promise { - if (this._state !== State.inited) { - return Promise.reject(new Error(`Session isn't inited`)); - } - this._state = State.destroying; - return new Promise((resolve, reject) => { - const timeout = setTimeout(() => { - this.logger.error(`Timeout error. Session wasn't closed in 5 sec.`); - reject(new Error(`Timeout error. Session wasn't closed in 5 sec.`)); - }, 5000); - this.native - .destroy() - .then(() => { - this.logger.debug(`Session has been destroyed`); - resolve(); - }) - .catch((err: Error) => { - this.logger.error( - `Fail to close session due error: ${ - err instanceof Error ? err.message : err - }`, - ); - reject(err); - }) - .finally(() => { - this._state = State.destroyed; - clearTimeout(timeout); - }); - }); - } -} diff --git a/application/apps/rustcore/ts-bindings/src/index.ts b/application/apps/rustcore/ts-bindings/src/index.ts deleted file mode 100644 index da344f180b..0000000000 --- a/application/apps/rustcore/ts-bindings/src/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { v4 } from 'uuid'; -import { setUuidGenerator } from 'platform/env/sequence'; - -import * as Units from './util/units'; -import * as Interfaces from './interfaces/index'; -import * as Events from 'platform/env/subscription'; - -export { CancelablePromise, PromiseExecutor, ICancelablePromise } from 'platform/env/promise'; -export { - TFileOptions, - IFileOptionsDLT, - EFileOptionsRequirements, -} from './api/executors/session.stream.observe.executor'; -export { - Session, - SessionSearch, - SessionStream, - ISessionEvents, - IProgressEvent, - IProgressState, - IEventMapUpdated, - IEventMatchesUpdated, - IEventIndexedMapUpdated, -} from './api/session'; -export { Jobs } from './api/jobs'; -export { Tracker } from './api/tracker'; -export { Units, Events, Interfaces }; - -export * as $ from 'platform/types/observe'; - -setUuidGenerator(v4); diff --git a/application/apps/rustcore/ts-bindings/src/interfaces/debug.ts b/application/apps/rustcore/ts-bindings/src/interfaces/debug.ts deleted file mode 100644 index d91200e602..0000000000 --- a/application/apps/rustcore/ts-bindings/src/interfaces/debug.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface OperationStat { - uuid: string; - name: string; - duration: number; - started: number; -} diff --git a/application/apps/rustcore/ts-bindings/src/interfaces/errors.ts b/application/apps/rustcore/ts-bindings/src/interfaces/errors.ts deleted file mode 100644 index 9d5dc0583d..0000000000 --- a/application/apps/rustcore/ts-bindings/src/interfaces/errors.ts +++ /dev/null @@ -1,230 +0,0 @@ -import { Logger } from 'platform/log'; -import { scope } from 'platform/env/scope'; - -import * as utils from 'platform/log/utils'; -import * as protocol from 'protocol'; - -export enum Type { - NotImplemented = 'NotImplemented', - InvalidInput = 'InvalidInput', - InvalidOutput = 'InvalidOutput', - GrabbingSearch = 'GrabbingSearch', - GrabbingContent = 'GrabbingContent', - ParsingContentChunk = 'ParsingContentChunk', - ParsingSearchChunk = 'ParsingSearchChunk', - CancelationError = 'CancelationError', - ContentManipulation = 'ContentManipulation', - Communication = 'Communication', - DestinationPath = 'DestinationPath', - Grabbing = 'Grabbing', - InvalidArgs = 'InvalidArgs', - InvalidData = 'InvalidData', - IoOperation = 'IoOperation', - MultipleInitCall = 'MultipleInitCall', - NativeError = 'NativeError', - OperationNotSupported = 'OperationNotSupported', - Process = 'Process', - Protocol = 'Protocol', - Sde = 'Sde', - SearchError = 'SearchError', - SessionCreatingFail = 'SessionCreatingFail', - SessionUnavailable = 'SessionUnavailable', - Unrecognized = 'Unrecognized', - Decoding = 'Decoding', - Encoding = 'Encoding', - Other = 'Other', -} - -export enum Source { - Assign = 'Assign', - Search = 'Search', - SearchNested = 'SearchNested', - SearchValues = 'SearchValues', - GetMap = 'GetMap', - ExtractMatchesValues = 'ExtractMatchesValues', - GrabStreamChunk = 'GrabStreamChunk', - GrabSearchChunk = 'GrabSearchChunk', - GetSocketPath = 'GetSocketPath', - GetNearestTo = 'GetNearestTo', - GetStreamLen = 'GetStreamLen', - GetSearchLen = 'GetSearchLen', - GetFilters = 'GetFilters', - GetSourcesDefinitions = 'GetSourcesDefinitions', - GetOperationsStat = 'GetOperationsStat', - SetDebug = 'SetDebug', - SendIntoSde = 'SendIntoSde', - GetAttachments = 'GetAttachments', - GetIndexedRanges = 'GetIndexedRanges', - Concat = 'Concat', - Merge = 'Merge', - Extract = 'Extract', - Export = 'Export', - Detect = 'Detect', - Abort = 'Abort', - Sleep = 'Sleep', - TriggerStateError = 'TriggerStateError', - TriggerTrackerError = 'TriggerTrackerError', - AddBookmark = 'AddBookmark', - SetBookmarks = 'SetBookmarks', - RemoveSelection = 'RemoveSelection', - AddSelection = 'AddSelection', - RemoveBookmark = 'RemoveBookmark', - ExpandBreadcrumbs = 'ExpandBreadcrumbs', - SetIndexingMode = 'SetIndexingMode', - GetIndexedLen = 'GetIndexedLen', - getAroundIndexes = 'getAroundIndexes', - Native = 'Native', - Other = 'Other', -} - -export class NativeError extends Error { - private readonly _type: Type; - private readonly _source: Source; - private readonly _logger: Logger = scope.getLogger(`NativeError`); - - public static from(smth: any): Error { - if (smth instanceof Error) { - return smth; - } - if (typeof smth === 'string') { - return new Error(smth); - } - if (smth instanceof Buffer || smth instanceof Uint8Array) { - try { - const err = protocol.decodeComputationError( - smth instanceof Buffer ? Uint8Array.from(smth) : smth, - ); - if (err === null) { - return new NativeError( - new Error(`Fail decode error`), - Type.InvalidData, - Source.Native, - ); - } - if (typeof err === 'string') { - if ('DestinationPath' === err) { - return new NativeError( - new Error(`Destination path error`), - Type.Communication, - Source.Native, - ); - } else if ('SessionCreatingFail' === err) { - return new NativeError( - new Error(`Fail to create a session`), - Type.SessionCreatingFail, - Source.Native, - ); - } else if ('InvalidData' === err) { - return new NativeError( - new Error(`Invalid data`), - Type.InvalidData, - Source.Native, - ); - } else if ('MultipleInitCall' === err) { - return new NativeError( - new Error(`Multiple init call`), - Type.MultipleInitCall, - Source.Native, - ); - } else if ('SessionUnavailable' === err) { - return new NativeError( - new Error(`Session is unavailable`), - Type.SessionUnavailable, - Source.Native, - ); - } - } else if ('Communication' in err) { - return new NativeError( - new Error(err.Communication), - Type.Communication, - Source.Native, - ); - } else if ('OperationNotSupported' in err) { - return new NativeError( - new Error(err.OperationNotSupported), - Type.OperationNotSupported, - Source.Native, - ); - } else if ('IoOperation' in err) { - return new NativeError( - new Error(err.IoOperation), - Type.IoOperation, - Source.Native, - ); - } else if ('InvalidArgs' in err) { - return new NativeError( - new Error(err.InvalidArgs), - Type.InvalidArgs, - Source.Native, - ); - } else if ('Process' in err) { - return new NativeError(new Error(err.Process), Type.Process, Source.Native); - } else if ('Protocol' in err) { - return new NativeError(new Error(err.Protocol), Type.Protocol, Source.Native); - } else if ('SearchError' in err) { - return new NativeError( - new Error(`Search error: ${err.SearchError}`), - Type.SearchError, - Source.Native, - ); - } else if ('NativeError' in err) { - return new NativeError( - new Error(err.NativeError?.message), - Type.NativeError, - Source.Native, - ); - } else if ('Grabbing' in err) { - return new NativeError( - new Error(`Grabbing error: ${err.Grabbing}`), - Type.SearchError, - Source.Native, - ); - } else if ('Sde' in err) { - return new NativeError(new Error(err.Sde), Type.Sde, Source.Native); - } else if ('Decoding' in err) { - return new NativeError(new Error(err.Decoding), Type.Decoding, Source.Native); - } else if ('Encoding' in err) { - return new NativeError(new Error(err.Encoding), Type.Encoding, Source.Native); - } else { - return new NativeError( - new Error(`Fail to recognize error: ${JSON.stringify(err)}`), - Type.Unrecognized, - Source.Native, - ); - } - } catch (err) { - return new NativeError( - new Error(`Fail to decode error: ${utils.error(err)}`), - Type.Other, - Source.Other, - ); - } - } - return smth instanceof Error - ? smth - : new Error(`${typeof smth !== 'string' ? JSON.stringify(smth) : smth}`); - } - constructor(error: Error, kind: Type, source: Source) { - super(error.message); - this.stack = error.stack; - this._type = kind; - this._source = source; - this.log(); - } - - public getType(): Type { - return this._type; - } - - public getSource(): Source { - return this._source; - } - - public log(): void { - this._logger.error( - `\n\ttype: ${this.getType()};\n\tsource: ${this.getSource()};\n\tmessage: ${ - this.message - }`, - ); - } -} diff --git a/application/apps/rustcore/ts-bindings/src/interfaces/index.ts b/application/apps/rustcore/ts-bindings/src/interfaces/index.ts deleted file mode 100644 index 213f83454d..0000000000 --- a/application/apps/rustcore/ts-bindings/src/interfaces/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { OperationStat } from '../interfaces/debug'; diff --git a/application/apps/rustcore/ts-bindings/src/native/native.jobs.ts b/application/apps/rustcore/ts-bindings/src/native/native.jobs.ts deleted file mode 100644 index 2ce5c1dbd3..0000000000 --- a/application/apps/rustcore/ts-bindings/src/native/native.jobs.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { Logger } from 'platform/log'; -import { scope } from 'platform/env/scope'; -import { CancelablePromise } from 'platform/env/promise'; -import { error } from 'platform/log/utils'; -import { getNativeModule } from '../native/native'; -import { NativeError } from '../interfaces/errors'; - -export abstract class JobsNative { - public abstract abort(sequence: number): Promise; - - public abstract init(): Promise; - - public abstract destroy(): Promise; - - public abstract isFileBinary(sequence: number, filePath: string): Promise; - - public abstract jobCancelTest( - sequence: number, - num_a: number, - num_b: number, - ): Promise; - - public abstract listFolderContent( - sequence: number, - depth: number, - max: number, - paths: string[], - includeFiles: boolean, - includeFolders: boolean, - ): Promise; - - public abstract getFileChecksum(sequence: number, path: string): Promise; - public abstract getDltStats(sequence: number, files: string[]): Promise; - public abstract getSomeipStatistic(sequence: number, files: string[]): Promise; - public abstract getShellProfiles(sequence: number): Promise; - public abstract getSerialPortsList(sequence: number): Promise; - public abstract sleep(sequence: number, ms: number): Promise; - public abstract getRegexError( - sequence: number, - filter: { - value: string; - is_regex: boolean; - ignore_case: boolean; - is_word: boolean; - }, - ): Promise; - public abstract installedPluginsList(sequence: number): Promise; - public abstract invalidPluginsList(sequence: number): Promise; - public abstract installedPluginsPaths(sequence: number): Promise; - public abstract invalidPluginsPaths(sequence: number): Promise; - public abstract installedPluginsInfo( - sequence: number, - plugin_path: string, - ): Promise; - public abstract invalidPluginsInfo(sequence: number, plugin_path: string): Promise; - public abstract getPluginRunData(sequence: number, plugin_path: string): Promise; - public abstract reloadPlugins(sequence: number): Promise; - public abstract addPlugin(sequence: number, plugin_path: string): Promise; - public abstract removePlugin(sequence: number, plugin_path: string): Promise; -} - -interface Job { - started: number; - alias: string; -} - -export class Queue { - protected jobs: Map = new Map(); - private _sequence: number = 0; - - public add(sequence: number, alias: string): void { - this.jobs.set(sequence, { - started: Date.now(), - alias, - }); - } - - public remove(sequence: number): void { - this.jobs.delete(sequence); - } - - public sequence(): number { - return ++this._sequence; - } -} - -export type JobResult = { Finished: T } | 'Cancelled'; - -export type ConvertCallback = (input: Uint8Array) => Output | Error | Cancelled; - -enum State { - destroyed, - destroying, - inited, - created, -} - -export class Cancelled extends Error {} - -export function decode( - buf: Uint8Array, - decoder: (buf: Uint8Array) => any, -): Output | Error | Cancelled { - try { - const output = decoder(buf); - if (output === 'Cancelled') { - return new Cancelled(`Job has been cancelled`); - } else if ('Finished' in output) { - return output.Finished as Output; - } else { - return new Error(`Fail to detect job status.`); - } - } catch (err) { - return new Error(`Fail to decode job's results: ${error(err)}`); - } -} - -const DESTROY_TIMEOUT = 5000; - -export class Base { - protected readonly logger: Logger = scope.getLogger(`Jobs`); - protected readonly native: JobsNative; - protected readonly queue: Queue = new Queue(); - - private _state: State = State.created; - - constructor() { - this.native = new (getNativeModule().UnboundJobs)() as JobsNative; - this.logger.debug(`Rust Jobs native session is created`); - } - - public async init(): Promise { - return new Promise((resolve, reject) => { - this.native - .init() - .then(() => { - this.logger.debug(`Rust Jobs native session is inited`); - this._state = State.inited; - resolve(this); - }) - .catch((err: Error) => { - this.logger.error( - `Fail to init Jobs session: ${err instanceof Error ? err.message : err}`, - ); - reject(err); - }); - }); - } - - public async destroy(): Promise { - if (this._state !== State.inited) { - return Promise.reject(new Error(`Session isn't inited`)); - } - this._state = State.destroying; - return new Promise((resolve, reject) => { - const timeout = setTimeout(() => { - reject( - new Error( - this.logger.error( - `Timeout error. Session wasn't closed in ${ - DESTROY_TIMEOUT / 1000 - } sec.`, - ), - ), - ); - }, DESTROY_TIMEOUT); - this.native - .destroy() - .then(() => { - this.logger.debug(`Session has been destroyed`); - resolve(); - }) - .catch((err: Error) => { - this.logger.error( - `Fail to close session due error: ${ - err instanceof Error ? err.message : err - }`, - ); - reject(err); - }) - .finally(() => { - this._state = State.destroyed; - clearTimeout(timeout); - }); - }); - } - - protected async abort(sequence: number): Promise { - return new Promise((resolve, reject) => { - this.native - .abort(sequence) - .then(resolve) - .catch((err: Error) => { - this.logger.error( - `Fail to abort operation due error: ${ - err instanceof Error ? err.message : err - }`, - ); - reject(err); - }); - }); - } - - protected sequence(): number { - return this.queue.sequence(); - } - - protected execute( - convert: ConvertCallback, - task: Promise, - sequence: number, - alias: string, - ): CancelablePromise { - return new CancelablePromise((resolve, reject, cancel, refCancel, self) => { - if (this._state !== State.inited) { - return reject(new Error(`Session isn't inited`)); - } - this.queue.add(sequence, alias); - refCancel(() => { - this.abort(sequence).catch((err: Error) => { - if (self.isCompleted()) { - this.logger.warn('Job was already completed on aborting'); - return; - } - this.logger.error(`Fail to cancel ${error(err)}`); - }); - }); - task.then((buf: Uint8Array) => { - const decoded = convert(buf); - if (decoded instanceof Cancelled || self.isCanceling()) { - cancel(); - } else if (decoded instanceof Error) { - reject(decoded); - } else { - resolve(decoded); - } - }) - .catch((err: Error | Uint8Array) => { - const nerr = NativeError.from(err); - this.logger.error(`Fail to do "${alias}" operation due error: ${error(nerr)}`); - reject(nerr); - }) - .finally(() => { - this.queue.remove(sequence); - }); - }); - } -} diff --git a/application/apps/rustcore/ts-bindings/src/native/native.session.required.ts b/application/apps/rustcore/ts-bindings/src/native/native.session.required.ts deleted file mode 100644 index 2483146050..0000000000 --- a/application/apps/rustcore/ts-bindings/src/native/native.session.required.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * TODO: - * Method destroy should be asynch on NodeJS level. It should returns standard (not cancelable) promise. - * Because from rust we cannot return a promise, method should be implemented here. Considering: - * - prevent multiple calls - * - listen event destroy and resolve on it - * - add timeout and reject on it - * - listen error and ? What to do it error was between calling destroy and getting event destroy? - * - naming: destroy good for NodeJS level, on Rust level probably shutdown would be fine - */ -export abstract class RustSessionRequiered { - - public abstract destroy(): void; - -} diff --git a/application/apps/rustcore/ts-bindings/src/native/native.session.ts b/application/apps/rustcore/ts-bindings/src/native/native.session.ts deleted file mode 100644 index eeece0c673..0000000000 --- a/application/apps/rustcore/ts-bindings/src/native/native.session.ts +++ /dev/null @@ -1,1206 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { RustSessionRequiered } from '../native/native.session.required'; -import { TEventEmitter } from '../provider/provider.general'; -import { Computation } from '../provider/provider'; -import { IFilter } from 'platform/types/filter'; -import { GrabbedElement } from 'platform/types/bindings/miscellaneous'; -import { getNativeModule } from '../native/native'; -import { EFileOptionsRequirements } from '../api/executors/session.stream.observe.executor'; -import { Type, Source, NativeError } from '../interfaces/errors'; -import { v4 as uuidv4 } from 'uuid'; -import { getValidNum } from '../util/numbers'; -import { IRange, fromTuple } from 'platform/types/range'; -import { ISourceLink } from 'platform/types/observe/types'; -import { IndexingMode, Attachment } from 'platform/types/content'; -import { Logger, utils } from 'platform/log'; -import { scope } from 'platform/env/scope'; -import { IObserve } from 'platform/types/observe'; -import { TextExportOptions } from 'platform/types/exporting'; - -import * as protocol from 'protocol'; -import * as types from 'platform/types'; - -export type RustSessionConstructorImpl = new ( - uuid: string, - provider: Computation, - cb: (err: Error | undefined) => void, -) => T; -export type TCanceler = () => void; - -// Create abstract class to declare available methods -export abstract class RustSession extends RustSessionRequiered { - constructor(uuid: string, provider: Computation) { - super(); - } - - public abstract override destroy(): Promise; - - /** - * Returns chunk of stream/session file. - * @param start { number } row number of range's start - * @param len { number } length of the chunk's range - * @returns { string } - * - * @error In case of incorrect range should return { NativeError } - */ - public abstract grabStreamChunk(start: number, len: number): Promise; - - public abstract grabStreamRanges(ranges: IRange[]): Promise; - - public abstract grabIndexed(start: number, len: number): Promise; - - public abstract setIndexingMode(mode: IndexingMode): Promise; - - public abstract getIndexedLen(): Promise; - - public abstract getAroundIndexes( - position: number, - ): Promise<{ before: number | undefined; after: number | undefined }>; - - public abstract expandBreadcrumbs( - seporator: number, - offset: number, - above: boolean, - ): Promise; - - public abstract removeBookmark(row: number): Promise; - - public abstract addBookmark(row: number): Promise; - - public abstract setBookmarks(rows: number[]): Promise; - - /** - * Returns chunk of stream/session file. - * @param start { number } row number of range's start - * @param len { number } length of the chunk's range - * @returns { string } - * @error In case of incorrect range should return { NativeError } - */ - public abstract grabSearchChunk(start: number, len: number): Promise; - - /** - * TODO: @return needs interface. It should not be a string - */ - public abstract grabMatchesChunk(start: number, len: number): string[] | NativeError; - - /** - * Returns list of observed sources. - * @returns { string } - */ - public abstract getSourcesDefinitions(): Promise; - - public abstract getUuid(): string; - - public abstract getSessionFile(): Promise; - - /** - * Returns reference to option's type, which should be defined for @method append - * Would be called each time before @method append - * @param filename { string } full filename - * @returns { EFileOptionsRequirements } - */ - public abstract getFileOptionsRequirements(filename: string): EFileOptionsRequirements; - - /** - * Returns length (count of rows) of session/stream file - * @returns { nummber } - */ - public abstract getStreamLen(): Promise; - - /** - * Returns length (count of rows) of search results stream - * @returns { nummber } - */ - public abstract getSearchLen(): Promise; - - /** - * Returns length (count of rows with matches) of getting matches in stream - * @returns { nummber } - */ - public abstract getMatchesLen(): number | NativeError; - - /** - * Returns path to socket, which can be used to pass data into session stream - * @returns { string } - */ - public abstract getSocketPath(): string | NativeError; - - /** - * Assigns session with the file. After the file was assigned, @method concat, @method merge cannot be used - * and should return @error NativeError. - * @param emitter { TEventEmitter } emitter to handle event related to lifecircle of this method only - * @param filename { string } file, which should be assigned to session - * @param options { TFileOptions } options to open file - * @returns { string | NativeError } - callback, which can be called on NodeJS level to cancel - * async operation. After TCanceler was called, @event destroy of @param emitter would be expected to - * confirm cancelation. - */ - public abstract observe(source: IObserve, operationUuid: string): Promise; - - public abstract export( - dest: string, - ranges: IRange[], - opt: TextExportOptions, - operationUuid: string, - ): Promise; - - public abstract exportRaw(dest: string, ranges: IRange[], operationUuid: string): Promise; - - public abstract isRawExportAvailable(): Promise; - - public abstract searchNestedMatch( - filter: IFilter, - from: number, - rev: boolean, - ): Promise<[number, number] | undefined>; - - public abstract search(filters: IFilter[], operationUuid: string): Promise; - - public abstract searchValues(filters: string[], operationUuid: string): Promise; - - public abstract dropSearch(): Promise; - - public abstract extractMatchesValues(filters: IFilter[], operationUuid: string): Promise; - - public abstract getMap( - operationUuid: string, - datasetLength: number, - from?: number, - to?: number, - ): Promise; - - public abstract getValues( - operationUuid: string, - datasetLength: number, - from?: number, - to?: number, - ): Promise; - - public abstract getNearestTo( - operationUuid: string, - positionInStream: number, - ): Promise<{ index: number; position: number } | undefined>; - - public abstract sendIntoSde( - targetOperationUuid: string, - request: types.sde.SdeRequest, - ): Promise; - - public abstract getAttachments(): Promise; - public abstract getIndexedRanges(): Promise; - - public abstract abort( - selfOperationUuid: string, - targetOperationUuid: string, - ): NativeError | undefined; - - public abstract setDebug(debug: boolean): Promise; - - public abstract getOperationsStat(): Promise; - - // Used only for testing and debug - public abstract sleep( - operationUuid: string, - duration: number, - ignoreCancellation: boolean, - ): Promise; - - // Used only for testing and debug - public abstract triggerStateError(): Promise; - - // Used only for testing and debug - public abstract triggerTrackerError(): Promise; - - // Used only for testing and debug - public abstract testGrabElsAsJson(): GrabbedElement[] | NativeError; - - // Used only for testing and debug - public abstract testGrabElsAsBin(): GrabbedElement[] | NativeError; -} - -export abstract class RustSessionNative { - public abstract stop(operationUuid: string): Promise; - - public abstract init(callback: TEventEmitter): Promise; - - public abstract getUuid(): string; - - public abstract getSessionFile(): Promise; - - public abstract observe(source: Uint8Array, operationUuid: string): Promise; - - public abstract getStreamLen(): Promise; - - public abstract getSourcesDefinitions(): Promise; - - public abstract grab(start: number, len: number): Promise; - - public abstract grabIndexed(start: number, len: number): Promise; - - public abstract setIndexingMode(mode: number): Promise; - - public abstract getIndexedLen(): Promise; - - public abstract getAroundIndexes(position: number): Promise<[number | null, number | null]>; - - public abstract expandBreadcrumbs( - seporator: number, - offset: number, - above: boolean, - ): Promise; - - public abstract removeBookmark(row: number): Promise; - - public abstract addBookmark(row: number): Promise; - - public abstract setBookmarks(rows: number[]): Promise; - - public abstract grabRanges(ranges: number[][]): Promise; - - public abstract grabSearch(start: number, len: number): Promise; - - public abstract getSearchLen(): Promise; - - public abstract export( - dest: string, - ranges: number[][], - columns: number[], - spliter: string, - delimiter: string, - operationUuid: string, - ): Promise; - - public abstract exportRaw( - dest: string, - ranges: number[][], - operationUuid: string, - ): Promise; - - public abstract isRawExportAvailable(): Promise; - - public abstract applySearchFilters( - filters: Array<{ - value: string; - is_regex: boolean; - ignore_case: boolean; - is_word: boolean; - }>, - operationUuid: string, - ): Promise; - - public abstract searchNestedMatch( - filter: { - value: string; - is_regex: boolean; - ignore_case: boolean; - is_word: boolean; - }, - from: number, - rev: boolean, - ): Promise<[number, number] | undefined>; - - public abstract applySearchValuesFilters( - filters: string[], - operationUuid: string, - ): Promise; - - public abstract dropSearch(): Promise; - - public abstract extractMatches( - filters: Array<{ - value: string; - is_regex: boolean; - ignore_case: boolean; - is_word: boolean; - }>, - operationUuid: string, - ): Promise; - - public abstract getMap( - operationUuid: string, - datasetLength: number, - from?: number, - to?: number, - ): Promise; - - public abstract getValues( - operationUuid: string, - datasetLength: number, - from?: number, - to?: number, - ): Promise; - - public abstract getNearestTo( - operationUuid: string, - positionInStream: number, - ): Promise; - - public abstract sendIntoSde( - targetOperationUuid: string, - request: Uint8Array, - ): Promise; - public abstract getAttachments(): Promise; - public abstract getIndexedRanges(): Promise; - - public abstract abort( - selfOperationUuid: string, - targetOperationUuid: string, - ): NativeError | undefined; - - public abstract setDebug(debug: boolean): Promise; - - public abstract getOperationsStat(): Promise; - - // Used only for testing and debug - public abstract sleep( - operationUuid: string, - duration: number, - ignoreCancellation: boolean, - ): Promise; - - // Used only for testing and debug - public abstract triggerStateError(): Promise; - - // Used only for testing and debug - public abstract triggerTrackerError(): Promise; - - // Used only for testing and debug - public abstract testGrabElsAsJson(): string; - - // Used only for testing and debug - public abstract testGrabElsAsBin(): number[]; -} - -export function rustSessionFactory( - uuid: string, - provider: Computation, -): Promise { - return new Promise((resolve, reject) => { - const session = new RustSessionConstructor(uuid, provider, (err: Error | undefined) => { - if (err instanceof Error) { - reject(err); - } else { - resolve(session); - } - }); - }); -} - -const DESTROY_TIMEOUT = 5000; - -export class RustSessionWrapper extends RustSession { - private readonly _logger: Logger = scope.getLogger(`RustSessionWrapper`); - private readonly _uuid: string; - private readonly _native: RustSessionNative; - private _assigned: boolean = false; - private _provider: Computation; - - constructor( - uuid: string, - provider: Computation, - cb: (err: Error | undefined) => void, - ) { - super(uuid, provider); - this._native = new (getNativeModule().RustSession)(uuid) as RustSessionNative; - this._logger.debug(`Rust native session is created`); - this._uuid = uuid; - this._provider = provider; - this._provider.debug().emit.operation('init'); - this._native - .init(provider.getEmitter()) - .then(() => { - this._logger.debug(`Rust native session is inited`); - cb(undefined); - }) - .catch((err: Error) => { - this._logger.error( - `Fail to init session: ${err instanceof Error ? err.message : err}`, - ); - cb(err); - }); - } - - public destroy(): Promise { - const destroyOperationId = uuidv4(); - this._provider.debug().emit.operation('stop', destroyOperationId); - return new Promise((resolve, reject) => { - const timeout = setTimeout(() => { - reject( - new Error( - this._logger.error( - `Timeout error. Session wasn't closed in ${ - DESTROY_TIMEOUT / 1000 - } sec.`, - ), - ), - ); - }, DESTROY_TIMEOUT); - this._native - .stop(destroyOperationId) - .then(() => { - this._logger.debug(`Session has been destroyed`); - resolve(); - }) - .catch((err: Error) => { - this._logger.error( - `Fail to close session due error: ${ - err instanceof Error ? err.message : err - }`, - ); - reject(err); - }) - .finally(() => { - clearTimeout(timeout); - }); - }); - } - - public getSessionFile(): Promise { - return this._native.getSessionFile(); - } - - public getUuid(): string { - return this._native.getUuid(); - } - - public getSourcesDefinitions(): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('getSourcesDefinitions'); - this._native - .getSourcesDefinitions() - .then((buf: Uint8Array) => { - try { - resolve(protocol.decodeSources(buf)); - } catch (err) { - reject( - new NativeError( - new Error( - this._logger.error( - `Fail to decode message: ${utils.error(err)}`, - ), - ), - Type.InvalidOutput, - Source.GetSourcesDefinitions, - ), - ); - } - }) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public grabStreamChunk(start: number, len: number): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('grab'); - this._native - .grab(start, len) - .then((buf: Uint8Array) => { - try { - resolve(protocol.decodeGrabbedElementList(buf)); - } catch (err) { - reject( - new NativeError( - new Error( - this._logger.error( - `Fail to decode message: ${utils.error(err)}`, - ), - ), - Type.InvalidOutput, - Source.GrabStreamChunk, - ), - ); - } - }) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public grabIndexed(start: number, len: number): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('grabIndexed'); - this._native - .grabIndexed(start, len) - .then((buf: Uint8Array) => { - try { - resolve(protocol.decodeGrabbedElementList(buf)); - } catch (err) { - reject( - new NativeError( - new Error( - this._logger.error( - `Fail to decode message: ${utils.error(err)}`, - ), - ), - Type.InvalidOutput, - Source.GrabStreamChunk, - ), - ); - } - }) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public setIndexingMode(mode: IndexingMode): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('setIndexingMode'); - this._native - .setIndexingMode(mode) - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public getIndexedLen(): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('getIndexedLen'); - this._native - .getIndexedLen() - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public getAroundIndexes( - position: number, - ): Promise<{ before: number | undefined; after: number | undefined }> { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('getAroundIndexes'); - this._native - .getAroundIndexes(position) - .then((result) => { - resolve({ - before: typeof result[0] !== 'number' ? undefined : result[0], - after: typeof result[1] !== 'number' ? undefined : result[1], - }); - }) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public expandBreadcrumbs(seporator: number, offset: number, above: boolean): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('expandBreadcrumbs'); - this._native - .expandBreadcrumbs(seporator, offset, above) - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public removeBookmark(row: number): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('removeBookmark'); - this._native - .removeBookmark(row) - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public addBookmark(row: number): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('addBookmark'); - this._native - .addBookmark(row) - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public setBookmarks(rows: number[]): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('setBookmarks'); - this._native - .setBookmarks(rows) - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public grabStreamRanges(ranges: IRange[]): Promise { - return new Promise((resolve, reject) => { - try { - this._provider.debug().emit.operation('grabRanges'); - this._native - .grabRanges(ranges.map((r) => [r.start, r.end])) - .then((buf: Uint8Array) => { - try { - resolve(protocol.decodeGrabbedElementList(buf)); - } catch (err) { - reject( - new NativeError( - new Error( - this._logger.error( - `Fail to decode message: ${utils.error(err)}`, - ), - ), - Type.InvalidOutput, - Source.GrabStreamChunk, - ), - ); - } - }) - .catch((err: Error) => { - reject(NativeError.from(err)); - }); - } catch (err) { - return reject( - new NativeError(NativeError.from(err), Type.Other, Source.GrabStreamChunk), - ); - } - }); - } - - public grabSearchChunk(start: number, len: number): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('grabSearch'); - this._native - .grabSearch(start, len) - .then((buf: Uint8Array) => { - try { - resolve(protocol.decodeGrabbedElementList(buf)); - } catch (err) { - reject( - new NativeError( - new Error( - this._logger.error( - `Fail to decode message: ${utils.error(err)}`, - ), - ), - Type.InvalidOutput, - Source.GrabSearchChunk, - ), - ); - } - }) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public grabMatchesChunk(start: number, len: number): string[] | NativeError { - return new NativeError(new Error('Not implemented yet'), Type.Other, Source.GetSocketPath); - } - - public getFileOptionsRequirements(filename: string): EFileOptionsRequirements { - return EFileOptionsRequirements.NoOptionsRequired; - } - - public getStreamLen(): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('getStreamLen'); - this._native - .getStreamLen() - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public getSearchLen(): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('getSearchLen'); - this._native - .getSearchLen() - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public getMatchesLen(): number | NativeError { - return this._assigned ? 1000 : 0; - } - - public getSocketPath(): string | NativeError { - // return new NativeError(new Error('Not implemented yet'), Type.Other, Source.GetSocketPath); - return ''; - } - - public observe(source: IObserve, operationUuid: string): Promise { - return new Promise((resolve, reject) => { - try { - this._provider.debug().emit.operation('observe', operationUuid); - this._native - .observe(protocol.encodeObserveOptions(source), operationUuid) - .then(resolve) - .catch((err: Error) => { - reject(NativeError.from(err)); - }); - } catch (err) { - return reject(new NativeError(NativeError.from(err), Type.Other, Source.Assign)); - } - }); - } - - public export( - dest: string, - ranges: IRange[], - opt: TextExportOptions, - operationUuid: string, - ): Promise { - return new Promise((resolve, reject) => { - try { - this._provider.debug().emit.operation('export', operationUuid); - this._native - .export( - dest, - ranges.map((r) => [r.start, r.end]), - opt.columns, - opt.spliter === undefined ? '' : opt.spliter, - opt.delimiter === undefined ? '' : opt.delimiter, - operationUuid, - ) - .then(resolve) - .catch((err: Error) => { - reject(NativeError.from(err)); - }); - } catch (err) { - return reject(new NativeError(NativeError.from(err), Type.Other, Source.Assign)); - } - }); - } - - public exportRaw(dest: string, ranges: IRange[], operationUuid: string): Promise { - return new Promise((resolve, reject) => { - try { - this._provider.debug().emit.operation('exportRaw', operationUuid); - this._native - .exportRaw( - dest, - ranges.map((r) => [r.start, r.end]), - operationUuid, - ) - .then(resolve) - .catch((err: Error) => { - reject(NativeError.from(err)); - }); - } catch (err) { - return reject(new NativeError(NativeError.from(err), Type.Other, Source.Assign)); - } - }); - } - - public isRawExportAvailable(): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('isRawExportAvailable'); - this._native - .isRawExportAvailable() - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public search(filters: IFilter[], operationUuid: string): Promise { - return new Promise((resolve, reject) => { - try { - this._provider.debug().emit.operation('applySearchFilters', operationUuid); - this._native - .applySearchFilters( - filters.map((filter) => { - return { - value: filter.filter, - is_regex: filter.flags.reg, - ignore_case: !filter.flags.cases, - is_word: filter.flags.word, - }; - }), - operationUuid, - ) - .then(resolve) - .catch((err: Error) => { - reject(NativeError.from(err)); - }); - } catch (err) { - return reject(new NativeError(NativeError.from(err), Type.Other, Source.Search)); - } - }); - } - - public searchNestedMatch( - filter: IFilter, - from: number, - rev: boolean, - ): Promise<[number, number] | undefined> { - return new Promise((resolve, reject) => { - try { - this._native - .searchNestedMatch( - { - value: filter.filter, - is_regex: filter.flags.reg, - ignore_case: !filter.flags.cases, - is_word: filter.flags.word, - }, - from, - rev, - ) - .then(resolve) - .catch((err: Error) => { - reject(NativeError.from(err)); - }); - } catch (err) { - return reject( - new NativeError(NativeError.from(err), Type.Other, Source.SearchNested), - ); - } - }); - } - - public searchValues(filters: string[], operationUuid: string): Promise { - return new Promise((resolve, reject) => { - try { - this._provider.debug().emit.operation('applySearchValuesFilters', operationUuid); - this._native - .applySearchValuesFilters(filters, operationUuid) - .then(resolve) - .catch((err: Error) => { - reject(NativeError.from(err)); - }); - } catch (err) { - return reject( - new NativeError(NativeError.from(err), Type.Other, Source.SearchValues), - ); - } - }); - } - - public dropSearch(): Promise { - return this._native.dropSearch(); - } - - public extractMatchesValues(filters: IFilter[], operationUuid: string): Promise { - return new Promise((resolve, reject) => { - try { - this._provider.debug().emit.operation('extractMatches', operationUuid); - this._native - .extractMatches( - filters.map((filter) => { - return { - value: filter.filter, - is_regex: filter.flags.reg, - ignore_case: !filter.flags.cases, - is_word: filter.flags.word, - }; - }), - operationUuid, - ) - .then(resolve) - .catch((err: Error) => { - reject(NativeError.from(err)); - }); - } catch (err) { - return reject( - new NativeError(NativeError.from(err), Type.Other, Source.ExtractMatchesValues), - ); - } - }); - } - - public getMap( - operationUuid: string, - datasetLength: number, - from?: number, - to?: number, - ): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('getMap', operationUuid); - (() => { - if (from === undefined || to === undefined) { - return this._native.getMap(operationUuid, datasetLength); - } else { - return this._native.getMap(operationUuid, datasetLength, from, to); - } - })() - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public getValues( - operationUuid: string, - datasetLength: number, - from?: number, - to?: number, - ): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('getValues', operationUuid); - (() => { - if (from === undefined || to === undefined) { - return this._native.getValues(operationUuid, datasetLength); - } else { - return this._native.getValues(operationUuid, datasetLength, from, to); - } - })() - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public getNearestTo( - operationUuid: string, - positionInStream: number, - ): Promise<{ index: number; position: number } | undefined> { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('getNearestTo', operationUuid); - this._native - .getNearestTo(operationUuid, positionInStream) - .then((nearest) => { - if (nearest instanceof Array && nearest.length !== 2) { - reject( - new NativeError( - new Error( - `Invalid format of data: ${nearest}. Expecting an array (size 2): [number, number]`, - ), - Type.InvalidOutput, - Source.GetNearestTo, - ), - ); - } else if (nearest === null) { - resolve(undefined); - } else if (nearest instanceof Array && nearest.length === 2) { - resolve({ index: nearest[0], position: nearest[1] }); - } - }) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public sendIntoSde( - targetOperationUuid: string, - request: types.sde.SdeRequest, - ): Promise { - return new Promise((resolve, reject) => { - this._native - .sendIntoSde(targetOperationUuid, protocol.encodeSdeRequest(request)) - .then((buf: Uint8Array) => { - try { - resolve(protocol.decodeSdeResponse(buf)); - } catch (err) { - reject( - new NativeError( - new Error( - this._logger.error( - `Fail to decode message: ${utils.error(err)}`, - ), - ), - Type.InvalidOutput, - Source.SendIntoSde, - ), - ); - } - }) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public getAttachments(): Promise { - return new Promise((resolve, reject) => { - this._native - .getAttachments() - .then((buf: Uint8Array) => { - try { - resolve(protocol.decodeAttachmentList(buf)); - } catch (err) { - reject( - new NativeError( - new Error( - this._logger.error( - `Fail to decode message: ${utils.error(err)}`, - ), - ), - Type.InvalidOutput, - Source.GetAttachments, - ), - ); - } - }) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public getIndexedRanges(): Promise { - return new Promise((resolve, reject) => { - this._native - .getIndexedRanges() - .then((buf: Uint8Array) => { - try { - resolve(protocol.decodeRanges(buf)); - } catch (err) { - reject( - new NativeError( - new Error( - this._logger.error( - `Fail to decode message: ${utils.error(err)}`, - ), - ), - Type.InvalidOutput, - Source.GetIndexedRanges, - ), - ); - } - }) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public abort(selfOperationUuid: string, targetOperationUuid: string): NativeError | undefined { - try { - this._provider.debug().emit.operation('abort', selfOperationUuid); - return this._native.abort(selfOperationUuid, targetOperationUuid); - } catch (err) { - return new NativeError(NativeError.from(err), Type.CancelationError, Source.Abort); - } - } - - public setDebug(debug: boolean): Promise { - return new Promise((resolve, reject) => { - this._native - .setDebug(debug) - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public getOperationsStat(): Promise { - return new Promise((resolve, reject) => { - this._native - .getOperationsStat() - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - // Used only for testing and debug - public sleep( - operationUuid: string, - duration: number, - ignoreCancellation: boolean, - ): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('sleep', operationUuid); - this._native - .sleep(operationUuid, duration, ignoreCancellation) - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - // Used only for testing and debug - public triggerStateError(): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('triggerStateError'); - this._native - .triggerStateError() - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - // Used only for testing and debug - public triggerTrackerError(): Promise { - return new Promise((resolve, reject) => { - this._provider.debug().emit.operation('triggerTrackerError'); - this._native - .triggerTrackerError() - .then(resolve) - .catch((err) => { - reject(NativeError.from(err)); - }); - }); - } - - public testGrabElsAsJson(): GrabbedElement[] | NativeError { - try { - const lines: Array<{ - content: string; - source_id: number; - pos: number; - nature: number; - }> = JSON.parse(this._native.testGrabElsAsJson()); - const elements = lines.map( - ( - item: { - content: string; - source_id: number; - pos: number; - nature: number; - }, - i: number, - ) => { - return { - content: item.content, - source_id: item.source_id, - pos: getValidNum(item.pos), - nature: item.nature, - }; - }, - ); - return elements; - } catch (err) { - return new NativeError(new Error(utils.error(err)), Type.Other, Source.Other); - } - } - - public testGrabElsAsBin(): GrabbedElement[] | NativeError { - try { - const received = this._native.testGrabElsAsBin(); - const elements = protocol.decodeGrabbedElementList(Uint8Array.from(received)); - return elements; - } catch (err) { - return new NativeError(new Error(utils.error(err)), Type.Other, Source.Other); - } - } -} - -export const RustSessionWrapperConstructor: RustSessionConstructorImpl = - RustSessionWrapper; - -export const RustSessionConstructor: RustSessionConstructorImpl = - RustSessionWrapperConstructor; diff --git a/application/apps/rustcore/ts-bindings/src/native/native.tracker.ts b/application/apps/rustcore/ts-bindings/src/native/native.tracker.ts deleted file mode 100644 index 15e8202325..0000000000 --- a/application/apps/rustcore/ts-bindings/src/native/native.tracker.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { TEventEmitter } from '../provider/provider.general'; - -export abstract class TrackerNative { - public abstract init(callback: TEventEmitter): Promise; - public abstract destroy(): Promise; - public abstract stats(): Promise; -} diff --git a/application/apps/rustcore/ts-bindings/src/native/native.ts b/application/apps/rustcore/ts-bindings/src/native/native.ts deleted file mode 100644 index 46a6d9167f..0000000000 --- a/application/apps/rustcore/ts-bindings/src/native/native.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { v4 } from 'uuid'; -import { setUuidGenerator } from 'platform/env/sequence'; -import { scope } from 'platform/env/scope'; - -import * as path from 'path'; -import * as fs from 'fs'; - -export interface IRustModuleExports { - RustSession: any; - UnboundJobs: any; - RustProgressTracker: any; -} - -export function getNativeModule(): IRustModuleExports { - const modulePath = (() => { - const paths = [ - path.resolve(module.path, './index.node'), - // This path is actual for Jasmine tests use-cases - path.resolve(module.path, '../../../../src/native/index.node'), - ]; - for (const target of paths) { - if (fs.existsSync(target)) { - return target; - } - } - throw new Error(`Fail to find modules in:\n${paths.join('\n')}`); - })(); - scope.getLogger('Native module getter').verbose(`Target: ${modulePath}`); - // eslint-disable-next-line @typescript-eslint/no-require-imports - return require(modulePath); -} - -const { RustSession: RustSessionNoType, RustProgressTracker: ProgressTrackerNoType } = - getNativeModule(); - -export { RustSessionNoType, ProgressTrackerNoType }; - -setUuidGenerator(v4); diff --git a/application/apps/rustcore/ts-bindings/src/native/remarks.txt b/application/apps/rustcore/ts-bindings/src/native/remarks.txt deleted file mode 100644 index e41a33ed63..0000000000 --- a/application/apps/rustcore/ts-bindings/src/native/remarks.txt +++ /dev/null @@ -1,52 +0,0 @@ -12-11-2021 -- add time measurements for JS side too and compare it with Rust scope - -e.g. show text file content - -1. create session => RustSession - - -// TODO: -- rename computation to something like Emitter or EventsStore or EventSource or EventProvider etc... -- rename channel to just session. - -// Possible events -{ Progress: { uuid: string, ticks: { ... }}}, where uuid - reference to async operation -{ Done: { uuid: string, status: finished | canceled }} - - -// -//-js-------------------------> Rust: - -let text_session = new RustSession(emitter callback); - - ----------------------------> rust-session-channel - -JS -> RUST: assign file to session -// rust will build index asynchronically - - ----------------------------> rust-session-channel.file = "path/to/textfile.txt" - ----------------------------> rust is indexing - // [xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx] - // [xxxxx] => report progress 100 rows from 1000 rows - //... - JS <- RUST: Event::Progress (callback(PROGRESS, (100, 1000))) - ... - JS -> RUST: grabStreamChunk(20, 10) - JS <- RUST: content [20..30] - JS -> RUST: grabStreamChunk(900, 10) - JS <- RUST: Error(content not yet available) - ... - JS <- RUST: Event::Progress (callback(PROGRESS, 1000, 1000)) - JS <- RUST: Event::Finished (callback(FINISHED)) - ...fully initialized - - JS -> RUST: grabStreamChunk(900, 10) - JS <- RUST: content [900..910] - ... - Js -> RUST: setSearch(filters) - // Rust: session-file: Path, index-of-file, search-filters: [String], index-of-search-results - RUST -> RipGrep: create search result file & index - JS <- RUST: Event::Progress (callback(SEARCH_PROGRESS, 40)) - - diff --git a/application/apps/rustcore/ts-bindings/src/provider/provider.errors.ts b/application/apps/rustcore/ts-bindings/src/provider/provider.errors.ts deleted file mode 100644 index e13a3d45c0..0000000000 --- a/application/apps/rustcore/ts-bindings/src/provider/provider.errors.ts +++ /dev/null @@ -1,9 +0,0 @@ -export enum EErrorSeverity { - warn = 'warn', - error = 'error', - logs = 'logs', -} - -export enum EErrorKind { - something = 'something', -} \ No newline at end of file diff --git a/application/apps/rustcore/ts-bindings/src/provider/provider.general.ts b/application/apps/rustcore/ts-bindings/src/provider/provider.general.ts deleted file mode 100644 index 40e689e492..0000000000 --- a/application/apps/rustcore/ts-bindings/src/provider/provider.general.ts +++ /dev/null @@ -1 +0,0 @@ -export type TEventEmitter = (event: Uint8Array) => void; diff --git a/application/apps/rustcore/ts-bindings/src/provider/provider.ts b/application/apps/rustcore/ts-bindings/src/provider/provider.ts deleted file mode 100644 index 7afd6d5ac9..0000000000 --- a/application/apps/rustcore/ts-bindings/src/provider/provider.ts +++ /dev/null @@ -1,314 +0,0 @@ -/// 1. All RUST public methods should have operation ID -/// 2. In Summary (test) we should highlight link between operation caller and operation done event; -/// we should show IDs -/// 3. Add performance test (grabbing) - -import { Subject, validateEventDesc } from 'platform/env/subscription'; -import { error } from 'platform/log/utils'; -import { Logger } from 'platform/log'; -import { scope } from 'platform/env/scope'; -import { TEventEmitter } from '../provider/provider.general'; - -export interface IOrderStat { - type: 'E' | 'O'; - name: string; - id: string | undefined; - emitted: number; // Time of emitting event or operation - duration: number; -} -export abstract class Computation { - private _destroyed: boolean = false; - protected readonly uuid: string; - protected readonly tracking: { - subjects: { - unsupported: Subject; - error: Subject; - }; - stat: { - alias: string | undefined; - unsupported: string[]; - error: string[]; - counter: { [key: string]: number }; - order: IOrderStat[]; - operations: { [key: string]: number }; - }; - track: boolean; - store: boolean; - count: boolean; - } = { - subjects: { - unsupported: new Subject(), - error: new Subject(), - }, - stat: { - alias: undefined, - unsupported: [], - error: [], - counter: {}, - order: [], - operations: {}, - }, - track: false, - store: false, - count: false, - }; - protected readonly decoder: (buf: Uint8Array) => any; - public readonly logger: Logger; - - constructor(uuid: string, decoder: (buf: Uint8Array) => any) { - this.uuid = uuid; - this.decoder = decoder; - this._emitter = this._emitter.bind(this); - this.logger = scope.getLogger(`${this.getName()}: ${uuid}`); - } - - public destroy(): Promise { - if (this._destroyed) { - this.logger.warn(`Computation (${this.uuid}) is already destroying or destroyed`); - } else { - this._destroy(); - } - return Promise.resolve(); - } - - public abstract getName(): string; - - public abstract getEvents(): TEvents; - - public abstract getEventsSignatures(): IEventsSignatures; - - public abstract getEventsInterfaces(): IEventsInterfaces; - - public abstract getConvertor(event: string, data: T): T | O | Error; - - public debug(): { - getEvents(): { - unsupported: Subject; - error: Subject; - }; - isTracking(): boolean; - isStored(): boolean; - setTracking(value: boolean): void; - setStoring(value: boolean): void; - setCount(value: boolean): void; - setAlias(value: string): void; - getAlias(): string | undefined; - stat: { - unsupported(): string[]; - error(): string[]; - counter(): { [key: string]: number }; - order(): IOrderStat[]; - operations(): { [key: string]: number }; - }; - emit: { - unsupported(msg: string): void; - error(msg: string): void; - event(event: string, id?: string): void; - operation(operation: string, id?: string): void; - }; - } { - const self = this; - return { - getEvents() { - return { - unsupported: self.tracking.subjects.unsupported, - error: self.tracking.subjects.error, - }; - }, - isTracking(): boolean { - return self.tracking.track; - }, - isStored(): boolean { - return self.tracking.store; - }, - setTracking(value: boolean): void { - self.tracking.track = value; - }, - setStoring(value: boolean): void { - self.tracking.store = value; - }, - setCount(value: boolean): void { - self.tracking.count = value; - }, - setAlias(value: string): void { - self.tracking.stat.alias = value; - }, - getAlias(): string | undefined { - return self.tracking.stat.alias; - }, - stat: { - unsupported(): string[] { - return self.tracking.stat.unsupported; - }, - error(): string[] { - return self.tracking.stat.error; - }, - counter(): { [key: string]: number } { - return self.tracking.stat.counter; - }, - order(): IOrderStat[] { - return self.tracking.stat.order; - }, - operations(): { [key: string]: number } { - return self.tracking.stat.operations; - }, - }, - emit: { - unsupported(msg: string): void { - if (self.tracking.track) { - self.tracking.subjects.unsupported.emit(msg); - } - if (self.tracking.store) { - self.tracking.stat.unsupported.push(msg); - } - }, - error(msg: string): void { - if (self.tracking.track) { - self.tracking.subjects.error.emit(msg); - } - if (self.tracking.store) { - self.tracking.stat.error.push(msg); - } - }, - event(event: string, id?: string): void { - if (!self.tracking.count) { - return; - } - if (self.tracking.stat.counter[event] === undefined) { - self.tracking.stat.counter[event] = 0; - } - self.tracking.stat.counter[event] += 1; - const operation = - id === undefined - ? undefined - : self.tracking.stat.order.find((s) => s.id === id); - if (operation === undefined) { - self.tracking.stat.order.push({ - type: 'E', - name: event, - id, - emitted: -1, - duration: -1, - }); - } else { - const emitted = Date.now(); - self.tracking.stat.order.push({ - type: 'E', - name: event, - id, - emitted: emitted, - duration: -1, - }); - operation.duration = emitted - operation.emitted; - } - }, - operation(operation: string, id?: string): void { - if (!self.tracking.count) { - return; - } - if (self.tracking.stat.operations[operation] === undefined) { - self.tracking.stat.operations[operation] = 0; - } - self.tracking.stat.operations[operation] += 1; - self.tracking.stat.order.push({ - type: 'O', - name: operation, - id, - emitted: Date.now(), - duration: -1, - }); - }, - }, - }; - } - - /** - * We are expecting to get from rust event data as JSON string. Required format is: - * { [type: string]: string | undefined } - * @param data {string} - */ - private _emitter(buf: Uint8Array) { - let event: any; - try { - event = this.decoder(buf); - } catch (err) { - this.debug().emit.error( - this.logger.error(`Fail to decode CallbackEvent: ${error(err)}`), - ); - return; - } - if (typeof event === 'string') { - this._emit(event, null); - } else if (typeof event !== 'object' || event === null || Object.keys(event).length !== 1) { - this.debug().emit.error( - this.logger.error( - `Has been gotten incorrect event data: ${JSON.stringify( - event, - )}. No any props field found.\nExpecting type: { [type: string]: string | undefined }`, - ), - ); - } else { - const type: string = Object.keys(event)[0]; - const body: any = event[type]; - this._emit(type, body); - } - } - - private _destroy() { - this._destroyed = true; - // Unsubscribe all event listeners - Object.keys(this.getEvents() as unknown as object).forEach((key: string) => { - (this.getEvents() as any)[key].destroy(); - }); - Object.keys(this.tracking.subjects).forEach((key: string) => { - (this.tracking.subjects as any)[key].destroy(); - }); - this.logger.debug(`Provider has been destroyed.`); - } - - private _emit(event: string, data: any) { - // Callback (_emitter(data: TEventData)) is executed in rust scope. - // It means if we will have some JS exception it will make rust crash. - // To prevent it, we have to move event forward in separeted "JS-thread". - // That's why here used timer with 0 delay. - // Using of try { } catch() {} here isn't good idea as soon as it would not - // allow to localize an issue - setTimeout(() => { - if ((this.getEventsSignatures() as any)[event] === undefined) { - const msg: string = `Has been gotten unsupported event: "${event}".`; - this.debug().emit.unsupported(msg); - this.logger.error(msg); - this.debug().emit.event(event); - } else { - if (event === 'OperationDone' && typeof data.uuid === 'string') { - this.debug().emit.event(event, data.uuid); - } else { - this.debug().emit.event(event); - } - const err: Error | undefined = validateEventDesc( - (this.getEventsInterfaces() as any)[event], - data, - ); - if (err instanceof Error) { - this.debug().emit.error(`Error: ${error(err)}. Input: ${JSON.stringify(data)}`); - this.logger.error(`Failed to parse event "${event}" due error: ${error(err)}`); - } else { - const converted = data === null ? data : this.getConvertor(event, data); - if (converted instanceof Error) { - this.logger.error( - `Failed to convert results fro event "${event}" due error: ${error( - converted, - )}`, - ); - } - (this.getEvents() as any)[event].emit(converted); - this.logger.verbose(`Event "${event}" is processed`); - } - } - }, 0); - } - - public getEmitter(): TEventEmitter { - return this._emitter; - } -} diff --git a/application/apps/rustcore/ts-bindings/src/services/service.production.ts b/application/apps/rustcore/ts-bindings/src/services/service.production.ts deleted file mode 100644 index f885ef6704..0000000000 --- a/application/apps/rustcore/ts-bindings/src/services/service.production.ts +++ /dev/null @@ -1,19 +0,0 @@ -export interface IDebugSettings { - initChannelDelay: number, // {ms} Delay between creating channel and sending event "ready" -} - -export class ServiceProduction { - - public isProd(): boolean { - return false; - } - - public getDebugSettings(): IDebugSettings { - return { - initChannelDelay: 250 - } - } - -} - -export default new ServiceProduction(); \ No newline at end of file diff --git a/application/apps/rustcore/ts-bindings/src/util/numbers.ts b/application/apps/rustcore/ts-bindings/src/util/numbers.ts deleted file mode 100644 index e66fdb1e92..0000000000 --- a/application/apps/rustcore/ts-bindings/src/util/numbers.ts +++ /dev/null @@ -1,6 +0,0 @@ -export function getValidNum(val: unknown): number { - if (typeof val !== 'number' || isNaN(val) || !isFinite(val)) { - throw new Error(`Invalid number: ${val}`); - } - return val; -} diff --git a/application/apps/rustcore/ts-bindings/src/util/units.ts b/application/apps/rustcore/ts-bindings/src/util/units.ts deleted file mode 100644 index c68172d02f..0000000000 --- a/application/apps/rustcore/ts-bindings/src/util/units.ts +++ /dev/null @@ -1,53 +0,0 @@ -export class TimeUnit { - nanoseconds: number; - constructor(inNs: number) { - this.nanoseconds = inNs; - } - - setMilliseconds(ms: number): TimeUnit { - this.nanoseconds = 1000 * ms; - return this; - } - - setSeconds(s: number): TimeUnit { - this.nanoseconds = 1000 * 1000 * 1000 * s; - return this; - } - - /// create a TimeUnit that represents empty (0 ns) - static zero(): TimeUnit { - return new TimeUnit(0); - } - - /// create a TimeUnit by specifiing the amount of minutes it should represent - static fromMinutes(minutes: number): TimeUnit { - return TimeUnit.fromSeconds(60 * minutes); - } - - /// create a TimeUnit by specifiing the amount of seconds it should represent - static fromSeconds(seconds: number): TimeUnit { - return TimeUnit.fromMilliseconds(1000 * seconds); - } - - /// create a TimeUnit by specifiing the amount of milliseconds it should represent - static fromMilliseconds(ms: number): TimeUnit { - return TimeUnit.fromNanoseconds(1000 * ms); - } - - /// create a TimeUnit by specifiing the amount of nanoseconds it should represent - static fromNanoseconds(ns: number): TimeUnit { - return new TimeUnit(ns); - } - - inNanoseconds(): number { - return this.nanoseconds; - } - - inMilliseconds(): number { - return this.nanoseconds / 1000.0; - } - - inSeconds(): number { - return this.nanoseconds / 1000.0 / 1000.0; - } -} diff --git a/application/apps/rustcore/ts-bindings/tsconfig.json b/application/apps/rustcore/ts-bindings/tsconfig.json deleted file mode 100644 index bed594daa4..0000000000 --- a/application/apps/rustcore/ts-bindings/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "outDir": "./dist/", - "forceConsistentCasingInFileNames": true, - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "sourceMap": true, - "declaration": true, - "downlevelIteration": true, - "experimentalDecorators": true, - "moduleResolution": "node", - "importHelpers": true, - "target": "ESNext", - "module": "CommonJS", - "lib": ["ESNext"], - "paths": { - "*": ["./node_modules/*"] - }, - "types": ["node"] - }, - "include": ["./src/**/*"], - "exclude": ["node_modules"] -} diff --git a/application/apps/rustcore/ts-bindings/yarn.lock b/application/apps/rustcore/ts-bindings/yarn.lock deleted file mode 100644 index 02f10c1472..0000000000 --- a/application/apps/rustcore/ts-bindings/yarn.lock +++ /dev/null @@ -1,4218 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10c0 - -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": "npm:0.3.9" - checksum: 10c0/05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 - languageName: node - linkType: hard - -"@electron/get@npm:^2.0.0": - version: 2.0.3 - resolution: "@electron/get@npm:2.0.3" - dependencies: - debug: "npm:^4.1.1" - env-paths: "npm:^2.2.0" - fs-extra: "npm:^8.1.0" - global-agent: "npm:^3.0.0" - got: "npm:^11.8.5" - progress: "npm:^2.0.3" - semver: "npm:^6.2.0" - sumchecker: "npm:^3.0.1" - dependenciesMeta: - global-agent: - optional: true - checksum: 10c0/148957d531bac50c29541515f2483c3e5c9c6ba9f0269a5d536540d2b8d849188a89588f18901f3a84c2b4fd376d1e0c5ea2159eb2d17bda68558f57df19015e - languageName: node - linkType: hard - -"@electron/rebuild@npm:^4.0.3": - version: 4.0.3 - resolution: "@electron/rebuild@npm:4.0.3" - dependencies: - "@malept/cross-spawn-promise": "npm:^2.0.0" - debug: "npm:^4.1.1" - detect-libc: "npm:^2.0.1" - got: "npm:^11.7.0" - graceful-fs: "npm:^4.2.11" - node-abi: "npm:^4.2.0" - node-api-version: "npm:^0.2.1" - node-gyp: "npm:^11.2.0" - ora: "npm:^5.1.0" - read-binary-file-arch: "npm:^1.0.6" - semver: "npm:^7.3.5" - tar: "npm:^7.5.6" - yargs: "npm:^17.0.1" - dependenciesMeta: - electron: - built: true - bin: - electron-rebuild: lib/cli.js - checksum: 10c0/43bdbf85cde13874a2185c161d1943c3c4f12323f25cc3534890b1b0ec451b5bb940aa80e2c42476fe0d8c854d2e62b0e56f0d98c482c03b0715305bf9688171 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.1 - resolution: "@eslint-community/eslint-utils@npm:4.4.1" - dependencies: - eslint-visitor-keys: "npm:^3.4.3" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/2aa0ac2fc50ff3f234408b10900ed4f1a0b19352f21346ad4cc3d83a1271481bdda11097baa45d484dd564c895e0762a27a8240be7a256b3ad47129e96528252 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": - version: 4.12.1 - resolution: "@eslint-community/regexpp@npm:4.12.1" - checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 - languageName: node - linkType: hard - -"@eslint/config-array@npm:^0.19.0": - version: 0.19.1 - resolution: "@eslint/config-array@npm:0.19.1" - dependencies: - "@eslint/object-schema": "npm:^2.1.5" - debug: "npm:^4.3.1" - minimatch: "npm:^3.1.2" - checksum: 10c0/43b01f596ddad404473beae5cf95c013d29301c72778d0f5bf8a6699939c8a9a5663dbd723b53c5f476b88b0c694f76ea145d1aa9652230d140fe1161e4a4b49 - languageName: node - linkType: hard - -"@eslint/core@npm:^0.10.0": - version: 0.10.0 - resolution: "@eslint/core@npm:0.10.0" - dependencies: - "@types/json-schema": "npm:^7.0.15" - checksum: 10c0/074018075079b3ed1f14fab9d116f11a8824cdfae3e822badf7ad546962fafe717a31e61459bad8cc59cf7070dc413ea9064ddb75c114f05b05921029cde0a64 - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^3.2.0": - version: 3.2.0 - resolution: "@eslint/eslintrc@npm:3.2.0" - dependencies: - ajv: "npm:^6.12.4" - debug: "npm:^4.3.2" - espree: "npm:^10.0.1" - globals: "npm:^14.0.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 10c0/43867a07ff9884d895d9855edba41acf325ef7664a8df41d957135a81a477ff4df4196f5f74dc3382627e5cc8b7ad6b815c2cea1b58f04a75aced7c43414ab8b - languageName: node - linkType: hard - -"@eslint/js@npm:9.18.0": - version: 9.18.0 - resolution: "@eslint/js@npm:9.18.0" - checksum: 10c0/3938344c5ac7feef4b73fcb30f3c3e753570cea74c24904bb5d07e9c42fcd34fcbc40f545b081356a299e11f360c9c274b348c05fb0113fc3d492e5175eee140 - languageName: node - linkType: hard - -"@eslint/object-schema@npm:^2.1.5": - version: 2.1.5 - resolution: "@eslint/object-schema@npm:2.1.5" - checksum: 10c0/5320691ed41ecd09a55aff40ce8e56596b4eb81f3d4d6fe530c50fdd6552d88102d1c1a29d970ae798ce30849752a708772de38ded07a6f25b3da32ebea081d8 - languageName: node - linkType: hard - -"@eslint/plugin-kit@npm:^0.2.5": - version: 0.2.5 - resolution: "@eslint/plugin-kit@npm:0.2.5" - dependencies: - "@eslint/core": "npm:^0.10.0" - levn: "npm:^0.4.1" - checksum: 10c0/ba9832b8409af618cf61791805fe201dd62f3c82c783adfcec0f5cd391e68b40beaecb47b9a3209e926dbcab65135f410cae405b69a559197795793399f61176 - languageName: node - linkType: hard - -"@humanfs/core@npm:^0.19.1": - version: 0.19.1 - resolution: "@humanfs/core@npm:0.19.1" - checksum: 10c0/aa4e0152171c07879b458d0e8a704b8c3a89a8c0541726c6b65b81e84fd8b7564b5d6c633feadc6598307d34564bd53294b533491424e8e313d7ab6c7bc5dc67 - languageName: node - linkType: hard - -"@humanfs/node@npm:^0.16.6": - version: 0.16.6 - resolution: "@humanfs/node@npm:0.16.6" - dependencies: - "@humanfs/core": "npm:^0.19.1" - "@humanwhocodes/retry": "npm:^0.3.0" - checksum: 10c0/8356359c9f60108ec204cbd249ecd0356667359b2524886b357617c4a7c3b6aace0fd5a369f63747b926a762a88f8a25bc066fa1778508d110195ce7686243e1 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 - languageName: node - linkType: hard - -"@humanwhocodes/retry@npm:^0.3.0": - version: 0.3.1 - resolution: "@humanwhocodes/retry@npm:0.3.1" - checksum: 10c0/f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b - languageName: node - linkType: hard - -"@humanwhocodes/retry@npm:^0.4.1": - version: 0.4.1 - resolution: "@humanwhocodes/retry@npm:0.4.1" - checksum: 10c0/be7bb6841c4c01d0b767d9bb1ec1c9359ee61421ce8ba66c249d035c5acdfd080f32d55a5c9e859cdd7868788b8935774f65b2caf24ec0b7bd7bf333791f063b - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e - languageName: node - linkType: hard - -"@isaacs/fs-minipass@npm:^4.0.0": - version: 4.0.1 - resolution: "@isaacs/fs-minipass@npm:4.0.1" - dependencies: - minipass: "npm:^7.0.4" - checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.0.3": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.0.3" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - checksum: 10c0/fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b - languageName: node - linkType: hard - -"@malept/cross-spawn-promise@npm:^2.0.0": - version: 2.0.0 - resolution: "@malept/cross-spawn-promise@npm:2.0.0" - dependencies: - cross-spawn: "npm:^7.0.1" - checksum: 10c0/84d60b8d467f4252114849f0a33c3763f07898335269eec5c94978ccac9d5680e1e268d993dd1a6d25a91476f9e0992759d7e1f385f9f3a090d862f9bb949603 - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 - languageName: node - linkType: hard - -"@npmcli/agent@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/agent@npm:3.0.0" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/fs@npm:4.0.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd - languageName: node - linkType: hard - -"@rtsao/scc@npm:^1.1.0": - version: 1.1.0 - resolution: "@rtsao/scc@npm:1.1.0" - checksum: 10c0/b5bcfb0d87f7d1c1c7c0f7693f53b07866ed9fec4c34a97a8c948fb9a7c0082e416ce4d3b60beb4f5e167cbe04cdeefbf6771320f3ede059b9ce91188c409a5b - languageName: node - linkType: hard - -"@sindresorhus/is@npm:^4.0.0": - version: 4.6.0 - resolution: "@sindresorhus/is@npm:4.6.0" - checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e - languageName: node - linkType: hard - -"@szmarczak/http-timer@npm:^4.0.5": - version: 4.0.6 - resolution: "@szmarczak/http-timer@npm:4.0.6" - dependencies: - defer-to-connect: "npm:^2.0.0" - checksum: 10c0/73946918c025339db68b09abd91fa3001e87fc749c619d2e9c2003a663039d4c3cb89836c98a96598b3d47dec2481284ba85355392644911f5ecd2336536697f - languageName: node - linkType: hard - -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node10@npm:1.0.11" - checksum: 10c0/28a0710e5d039e0de484bdf85fee883bfd3f6a8980601f4d44066b0a6bcd821d31c4e231d1117731c4e24268bd4cf2a788a6787c12fc7f8d11014c07d582783c - languageName: node - linkType: hard - -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 - languageName: node - linkType: hard - -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 - languageName: node - linkType: hard - -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.4 - resolution: "@tsconfig/node16@npm:1.0.4" - checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb - languageName: node - linkType: hard - -"@types/cacheable-request@npm:^6.0.1": - version: 6.0.3 - resolution: "@types/cacheable-request@npm:6.0.3" - dependencies: - "@types/http-cache-semantics": "npm:*" - "@types/keyv": "npm:^3.1.4" - "@types/node": "npm:*" - "@types/responselike": "npm:^1.0.0" - checksum: 10c0/10816a88e4e5b144d43c1d15a81003f86d649776c7f410c9b5e6579d0ad9d4ca71c541962fb403077388b446e41af7ae38d313e46692144985f006ac5e11fa03 - languageName: node - linkType: hard - -"@types/estree@npm:^1.0.6": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a - languageName: node - linkType: hard - -"@types/http-cache-semantics@npm:*": - version: 4.0.4 - resolution: "@types/http-cache-semantics@npm:4.0.4" - checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 - languageName: node - linkType: hard - -"@types/jasmine@npm:^5.1.5": - version: 5.1.5 - resolution: "@types/jasmine@npm:5.1.5" - checksum: 10c0/904a2a6bfe7478478ec73d502708dc4b4cc46fa554c459cee3e0be01efda96fba7d26ef8bec2f246d9163cc517407b135acabcf6f076c11aa514ed9b79bc67e5 - languageName: node - linkType: hard - -"@types/json-schema@npm:^7.0.15": - version: 7.0.15 - resolution: "@types/json-schema@npm:7.0.15" - checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db - languageName: node - linkType: hard - -"@types/json5@npm:^0.0.29": - version: 0.0.29 - resolution: "@types/json5@npm:0.0.29" - checksum: 10c0/6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac - languageName: node - linkType: hard - -"@types/keyv@npm:^3.1.4": - version: 3.1.4 - resolution: "@types/keyv@npm:3.1.4" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c - languageName: node - linkType: hard - -"@types/node@npm:*, @types/node@npm:^22.10.10": - version: 22.10.10 - resolution: "@types/node@npm:22.10.10" - dependencies: - undici-types: "npm:~6.20.0" - checksum: 10c0/3425772d4513cd5dbdd87c00acda088113c03a97445f84f6a89744c60a66990b56c9d3a7213d09d57b6b944ae8ff45f985565e0c1846726112588e33a22dd12b - languageName: node - linkType: hard - -"@types/node@npm:^20.9.0": - version: 20.17.16 - resolution: "@types/node@npm:20.17.16" - dependencies: - undici-types: "npm:~6.19.2" - checksum: 10c0/50c589dd6a377238bc51b6fb5b8fc60ff6d688df0bde621d4a9fc59f480eb956cdf6d46052e1cb9536f150bc62e9194ddc733aa78b65e812155b4d3a32717de2 - languageName: node - linkType: hard - -"@types/responselike@npm:^1.0.0": - version: 1.0.3 - resolution: "@types/responselike@npm:1.0.3" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129 - languageName: node - linkType: hard - -"@types/tmp@npm:^0.2.4": - version: 0.2.6 - resolution: "@types/tmp@npm:0.2.6" - checksum: 10c0/a11bfa2cd8eaa6c5d62f62a3569192d7a2c28efdc5c17af0b0551db85816b2afc8156f3ca15ac76f0b142ae1403f04f44279871424233a1f3390b2e5fc828cd0 - languageName: node - linkType: hard - -"@types/uuid@npm:^10.0.0": - version: 10.0.0 - resolution: "@types/uuid@npm:10.0.0" - checksum: 10c0/9a1404bf287164481cb9b97f6bb638f78f955be57c40c6513b7655160beb29df6f84c915aaf4089a1559c216557dc4d2f79b48d978742d3ae10b937420ddac60 - languageName: node - linkType: hard - -"@types/yauzl@npm:^2.9.1": - version: 2.10.3 - resolution: "@types/yauzl@npm:2.10.3" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/f1b7c1b99fef9f2fe7f1985ef7426d0cebe48cd031f1780fcdc7451eec7e31ac97028f16f50121a59bcf53086a1fc8c856fd5b7d3e00970e43d92ae27d6b43dc - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:^8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.21.0" - dependencies: - "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.21.0" - "@typescript-eslint/type-utils": "npm:8.21.0" - "@typescript-eslint/utils": "npm:8.21.0" - "@typescript-eslint/visitor-keys": "npm:8.21.0" - graphemer: "npm:^1.4.0" - ignore: "npm:^5.3.1" - natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^2.0.0" - peerDependencies: - "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/4601d21ec35b9fa5cfc1ad0330733ab40d6c6822c7fc15c3584a16f678c9a72e077a1725a950823fe0f499a15f3981795b1ea5d1e7a1be5c7b8296ea9ae6327c - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/parser@npm:8.21.0" - dependencies: - "@typescript-eslint/scope-manager": "npm:8.21.0" - "@typescript-eslint/types": "npm:8.21.0" - "@typescript-eslint/typescript-estree": "npm:8.21.0" - "@typescript-eslint/visitor-keys": "npm:8.21.0" - debug: "npm:^4.3.4" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/aadebd50ca7aa2d61ad85d890c0d7010f2c293ec4d50a7833ef9674f232f0bc7118faa93a898771fbea50f02d542d687cf3569421b23f72fe6fed6895d5506fc - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/scope-manager@npm:8.21.0" - dependencies: - "@typescript-eslint/types": "npm:8.21.0" - "@typescript-eslint/visitor-keys": "npm:8.21.0" - checksum: 10c0/ea405e79dc884ea1c76465604db52f9b0941d6cbb0bde6bce1af689ef212f782e214de69d46503c7c47bfc180d763369b7433f1965e3be3c442b417e8c9f8f75 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/type-utils@npm:8.21.0" - dependencies: - "@typescript-eslint/typescript-estree": "npm:8.21.0" - "@typescript-eslint/utils": "npm:8.21.0" - debug: "npm:^4.3.4" - ts-api-utils: "npm:^2.0.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/617f5dfe83fd9a7c722b27fa4e7f0c84f29baa94f75a4e8e5ccfd5b0a373437f65724e21b9642870fb0960f204b1a7f516a038200a12f8118f21b1bf86315bf3 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/types@npm:8.21.0" - checksum: 10c0/67dfd300cc614d7b02e94d0dacfb228a7f4c3fd4eede29c43adb9e9fcc16365ae3df8d6165018da3c123dce65545bef03e3e8183f35e9b3a911ffc727e3274c2 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.21.0" - dependencies: - "@typescript-eslint/types": "npm:8.21.0" - "@typescript-eslint/visitor-keys": "npm:8.21.0" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.2" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^2.0.0" - peerDependencies: - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/0cf5b0382524f4af54fb5ec71ca7e939ec922711f2d77b383740b28dd4b21407b0ab5dded62df6819d01c12c0b354e95667e3c7025a5d27d05b805161ab94855 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/utils@npm:8.21.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.21.0" - "@typescript-eslint/types": "npm:8.21.0" - "@typescript-eslint/typescript-estree": "npm:8.21.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/d8347dbe9176417220aa62902cfc1b2007a9246bb7a8cccdf8590120903eb50ca14cb668efaab4646d086277f2367559985b62230e43ebd8b0723d237eeaa2f2 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.21.0": - version: 8.21.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.21.0" - dependencies: - "@typescript-eslint/types": "npm:8.21.0" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/b3f1412f550e35c0d7ae0410db616951116b365167539f9b85710d8bc2b36b322c5e637caee84cc1ae5df8f1d961880250d52ffdef352b31e5bdbef74ba6fea9 - languageName: node - linkType: hard - -"abbrev@npm:^3.0.0": - version: 3.0.0 - resolution: "abbrev@npm:3.0.0" - checksum: 10c0/049704186396f571650eb7b22ed3627b77a5aedf98bb83caf2eac81ca2a3e25e795394b0464cfb2d6076df3db6a5312139eac5b6a126ca296ac53c5008069c28 - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 - languageName: node - linkType: hard - -"acorn-walk@npm:^8.1.1": - version: 8.3.4 - resolution: "acorn-walk@npm:8.3.4" - dependencies: - acorn: "npm:^8.11.0" - checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 - languageName: node - linkType: hard - -"acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1": - version: 8.14.0 - resolution: "acorn@npm:8.14.0" - bin: - acorn: bin/acorn - checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 - languageName: node - linkType: hard - -"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.3 - resolution: "agent-base@npm:7.1.3" - checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 - languageName: node - linkType: hard - -"ajv@npm:^6.12.4": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: "npm:^2.0.1" - checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e - languageName: node - linkType: hard - -"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": - version: 1.0.2 - resolution: "array-buffer-byte-length@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.3" - is-array-buffer: "npm:^3.0.5" - checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d - languageName: node - linkType: hard - -"array-includes@npm:^3.1.8": - version: 3.1.8 - resolution: "array-includes@npm:3.1.8" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.4" - is-string: "npm:^1.0.7" - checksum: 10c0/5b1004d203e85873b96ddc493f090c9672fd6c80d7a60b798da8a14bff8a670ff95db5aafc9abc14a211943f05220dacf8ea17638ae0af1a6a47b8c0b48ce370 - languageName: node - linkType: hard - -"array.prototype.findlastindex@npm:^1.2.5": - version: 1.2.5 - resolution: "array.prototype.findlastindex@npm:1.2.5" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/962189487728b034f3134802b421b5f39e42ee2356d13b42d2ddb0e52057ffdcc170b9524867f4f0611a6f638f4c19b31e14606e8bcbda67799e26685b195aa3 - languageName: node - linkType: hard - -"array.prototype.flat@npm:^1.3.2": - version: 1.3.3 - resolution: "array.prototype.flat@npm:1.3.3" - dependencies: - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/d90e04dfbc43bb96b3d2248576753d1fb2298d2d972e29ca7ad5ec621f0d9e16ff8074dae647eac4f31f4fb7d3f561a7ac005fb01a71f51705a13b5af06a7d8a - languageName: node - linkType: hard - -"array.prototype.flatmap@npm:^1.3.2": - version: 1.3.3 - resolution: "array.prototype.flatmap@npm:1.3.3" - dependencies: - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-shim-unscopables: "npm:^1.0.2" - checksum: 10c0/ba899ea22b9dc9bf276e773e98ac84638ed5e0236de06f13d63a90b18ca9e0ec7c97d622d899796e3773930b946cd2413d098656c0c5d8cc58c6f25c21e6bd54 - languageName: node - linkType: hard - -"arraybuffer.prototype.slice@npm:^1.0.4": - version: 1.0.4 - resolution: "arraybuffer.prototype.slice@npm:1.0.4" - dependencies: - array-buffer-byte-length: "npm:^1.0.1" - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - is-array-buffer: "npm:^3.0.4" - checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06 - languageName: node - linkType: hard - -"async-function@npm:^1.0.0": - version: 1.0.0 - resolution: "async-function@npm:1.0.0" - checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73 - languageName: node - linkType: hard - -"available-typed-arrays@npm:^1.0.7": - version: 1.0.7 - resolution: "available-typed-arrays@npm:1.0.7" - dependencies: - possible-typed-array-names: "npm:^1.0.0" - checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee - languageName: node - linkType: hard - -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - -"bl@npm:^4.1.0": - version: 4.1.0 - resolution: "bl@npm:4.1.0" - dependencies: - buffer: "npm:^5.5.0" - inherits: "npm:^2.0.4" - readable-stream: "npm:^3.4.0" - checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f - languageName: node - linkType: hard - -"boolean@npm:^3.0.1": - version: 3.2.0 - resolution: "boolean@npm:3.2.0" - checksum: 10c0/6a0dc9668f6f3dda42a53c181fcbdad223169c8d87b6c4011b87a8b14a21770efb2934a778f063d7ece17280f8c06d313c87f7b834bb1dd526a867ffcd00febf - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f - languageName: node - linkType: hard - -"braces@npm:^3.0.3": - version: 3.0.3 - resolution: "braces@npm:3.0.3" - dependencies: - fill-range: "npm:^7.1.1" - checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 - languageName: node - linkType: hard - -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 10c0/cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 - languageName: node - linkType: hard - -"buffer@npm:^5.5.0": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.1.13" - checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e - languageName: node - linkType: hard - -"cacache@npm:^19.0.1": - version: 19.0.1 - resolution: "cacache@npm:19.0.1" - dependencies: - "@npmcli/fs": "npm:^4.0.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^7.0.2" - ssri: "npm:^12.0.0" - tar: "npm:^7.4.3" - unique-filename: "npm:^4.0.0" - checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c - languageName: node - linkType: hard - -"cacheable-lookup@npm:^5.0.3": - version: 5.0.4 - resolution: "cacheable-lookup@npm:5.0.4" - checksum: 10c0/a6547fb4954b318aa831cbdd2f7b376824bc784fb1fa67610e4147099e3074726072d9af89f12efb69121415a0e1f2918a8ddd4aafcbcf4e91fbeef4a59cd42c - languageName: node - linkType: hard - -"cacheable-request@npm:^7.0.2": - version: 7.0.4 - resolution: "cacheable-request@npm:7.0.4" - dependencies: - clone-response: "npm:^1.0.2" - get-stream: "npm:^5.1.0" - http-cache-semantics: "npm:^4.0.0" - keyv: "npm:^4.0.0" - lowercase-keys: "npm:^2.0.0" - normalize-url: "npm:^6.0.1" - responselike: "npm:^2.0.0" - checksum: 10c0/0834a7d17ae71a177bc34eab06de112a43f9b5ad05ebe929bec983d890a7d9f2bc5f1aa8bb67ea2b65e07a3bc74bea35fa62dd36dbac52876afe36fdcf83da41 - languageName: node - linkType: hard - -"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1": - version: 1.0.1 - resolution: "call-bind-apply-helpers@npm:1.0.1" - dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - checksum: 10c0/acb2ab68bf2718e68a3e895f0d0b73ccc9e45b9b6f210f163512ba76f91dab409eb8792f6dae188356f9095747512a3101646b3dea9d37fb8c7c6bf37796d18c - languageName: node - linkType: hard - -"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": - version: 1.0.8 - resolution: "call-bind@npm:1.0.8" - dependencies: - call-bind-apply-helpers: "npm:^1.0.0" - es-define-property: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.2" - checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4 - languageName: node - linkType: hard - -"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3": - version: 1.0.3 - resolution: "call-bound@npm:1.0.3" - dependencies: - call-bind-apply-helpers: "npm:^1.0.1" - get-intrinsic: "npm:^1.2.6" - checksum: 10c0/45257b8e7621067304b30dbd638e856cac913d31e8e00a80d6cf172911acd057846572d0b256b45e652d515db6601e2974a1b1a040e91b4fc36fb3dd86fa69cf - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.1.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 - languageName: node - linkType: hard - -"chownr@npm:^3.0.0": - version: 3.0.0 - resolution: "chownr@npm:3.0.0" - checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 - languageName: node - linkType: hard - -"cli-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-cursor@npm:3.1.0" - dependencies: - restore-cursor: "npm:^3.1.0" - checksum: 10c0/92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 - languageName: node - linkType: hard - -"cli-spinners@npm:^2.5.0": - version: 2.9.2 - resolution: "cli-spinners@npm:2.9.2" - checksum: 10c0/907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 - languageName: node - linkType: hard - -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.1" - wrap-ansi: "npm:^7.0.0" - checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 - languageName: node - linkType: hard - -"clone-response@npm:^1.0.2": - version: 1.0.3 - resolution: "clone-response@npm:1.0.3" - dependencies: - mimic-response: "npm:^1.0.0" - checksum: 10c0/06a2b611824efb128810708baee3bd169ec9a1bf5976a5258cd7eb3f7db25f00166c6eee5961f075c7e38e194f373d4fdf86b8166ad5b9c7e82bbd2e333a6087 - languageName: node - linkType: hard - -"clone@npm:^1.0.2": - version: 1.0.4 - resolution: "clone@npm:1.0.4" - checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: "npm:~1.1.4" - checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 - languageName: node - linkType: hard - -"commander@npm:^2.9.0": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.6": - version: 7.0.6 - resolution: "cross-spawn@npm:7.0.6" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 - languageName: node - linkType: hard - -"custom.stdout@npm:^1.0.2": - version: 1.0.2 - resolution: "custom.stdout@npm:1.0.2" - checksum: 10c0/17caebc82f48b347307df4c7accc075f9ccf245a45e370806860de21f05687f27eea5fdc577bfbede889f6789c82479f9fb0ab9a1c01e665f24482ea574105f9 - languageName: node - linkType: hard - -"data-view-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "data-view-buffer@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.2" - checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c - languageName: node - linkType: hard - -"data-view-byte-length@npm:^1.0.2": - version: 1.0.2 - resolution: "data-view-byte-length@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.2" - checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55 - languageName: node - linkType: hard - -"data-view-byte-offset@npm:^1.0.1": - version: 1.0.1 - resolution: "data-view-byte-offset@npm:1.0.1" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - is-data-view: "npm:^1.0.1" - checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": - version: 4.4.0 - resolution: "debug@npm:4.4.0" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de - languageName: node - linkType: hard - -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a - languageName: node - linkType: hard - -"decompress-response@npm:^6.0.0": - version: 6.0.0 - resolution: "decompress-response@npm:6.0.0" - dependencies: - mimic-response: "npm:^3.1.0" - checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c - languageName: node - linkType: hard - -"defaults@npm:^1.0.3": - version: 1.0.4 - resolution: "defaults@npm:1.0.4" - dependencies: - clone: "npm:^1.0.2" - checksum: 10c0/9cfbe498f5c8ed733775db62dfd585780387d93c17477949e1670bfcfb9346e0281ce8c4bf9f4ac1fc0f9b851113bd6dc9e41182ea1644ccd97de639fa13c35a - languageName: node - linkType: hard - -"defer-to-connect@npm:^2.0.0": - version: 2.0.1 - resolution: "defer-to-connect@npm:2.0.1" - checksum: 10c0/625ce28e1b5ad10cf77057b9a6a727bf84780c17660f6644dab61dd34c23de3001f03cedc401f7d30a4ed9965c2e8a7336e220a329146f2cf85d4eddea429782 - languageName: node - linkType: hard - -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.0.1" - checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 - languageName: node - linkType: hard - -"define-properties@npm:^1.2.1": - version: 1.2.1 - resolution: "define-properties@npm:1.2.1" - dependencies: - define-data-property: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - object-keys: "npm:^1.1.1" - checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 - languageName: node - linkType: hard - -"detect-libc@npm:^2.0.1": - version: 2.0.3 - resolution: "detect-libc@npm:2.0.3" - checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 - languageName: node - linkType: hard - -"detect-node@npm:^2.0.4": - version: 2.1.0 - resolution: "detect-node@npm:2.1.0" - checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 - languageName: node - linkType: hard - -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 - languageName: node - linkType: hard - -"doctrine@npm:^2.1.0": - version: 2.1.0 - resolution: "doctrine@npm:2.1.0" - dependencies: - esutils: "npm:^2.0.2" - checksum: 10c0/b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac - languageName: node - linkType: hard - -"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "dunder-proto@npm:1.0.1" - dependencies: - call-bind-apply-helpers: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.2.0" - checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 - languageName: node - linkType: hard - -"electron-build-env@npm:0.2.0": - version: 0.2.0 - resolution: "electron-build-env@npm:0.2.0" - dependencies: - commander: "npm:^2.9.0" - mkdirp: "npm:^0.5.1" - bin: - electron-build-env: ./cli.js - checksum: 10c0/fbd03925f3426003e7f7bd713ab041101b3555bb7b5cd35e526fa5c7d1d843e470b07044310fade1080b0d33ecbe46a31584a38d88b6c7c3e406d7e3c62242b6 - languageName: node - linkType: hard - -"electron@npm:^34.0.1": - version: 34.0.1 - resolution: "electron@npm:34.0.1" - dependencies: - "@electron/get": "npm:^2.0.0" - "@types/node": "npm:^20.9.0" - extract-zip: "npm:^2.0.1" - bin: - electron: cli.js - checksum: 10c0/0a63edd57633edac8e4f4d1310dbb82ac01287f1f9113a18cef310dfef7f266ef8be98eda7d01890e23b37d03f36811bbac0fe5c4e0a27c9f3719ba3b7841f83 - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 - languageName: node - linkType: hard - -"end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: "npm:^1.4.0" - checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 - languageName: node - linkType: hard - -"es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.9": - version: 1.23.9 - resolution: "es-abstract@npm:1.23.9" - dependencies: - array-buffer-byte-length: "npm:^1.0.2" - arraybuffer.prototype.slice: "npm:^1.0.4" - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - data-view-buffer: "npm:^1.0.2" - data-view-byte-length: "npm:^1.0.2" - data-view-byte-offset: "npm:^1.0.1" - es-define-property: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - es-set-tostringtag: "npm:^2.1.0" - es-to-primitive: "npm:^1.3.0" - function.prototype.name: "npm:^1.1.8" - get-intrinsic: "npm:^1.2.7" - get-proto: "npm:^1.0.0" - get-symbol-description: "npm:^1.1.0" - globalthis: "npm:^1.0.4" - gopd: "npm:^1.2.0" - has-property-descriptors: "npm:^1.0.2" - has-proto: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - hasown: "npm:^2.0.2" - internal-slot: "npm:^1.1.0" - is-array-buffer: "npm:^3.0.5" - is-callable: "npm:^1.2.7" - is-data-view: "npm:^1.0.2" - is-regex: "npm:^1.2.1" - is-shared-array-buffer: "npm:^1.0.4" - is-string: "npm:^1.1.1" - is-typed-array: "npm:^1.1.15" - is-weakref: "npm:^1.1.0" - math-intrinsics: "npm:^1.1.0" - object-inspect: "npm:^1.13.3" - object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.7" - own-keys: "npm:^1.0.1" - regexp.prototype.flags: "npm:^1.5.3" - safe-array-concat: "npm:^1.1.3" - safe-push-apply: "npm:^1.0.0" - safe-regex-test: "npm:^1.1.0" - set-proto: "npm:^1.0.0" - string.prototype.trim: "npm:^1.2.10" - string.prototype.trimend: "npm:^1.0.9" - string.prototype.trimstart: "npm:^1.0.8" - typed-array-buffer: "npm:^1.0.3" - typed-array-byte-length: "npm:^1.0.3" - typed-array-byte-offset: "npm:^1.0.4" - typed-array-length: "npm:^1.0.7" - unbox-primitive: "npm:^1.1.0" - which-typed-array: "npm:^1.1.18" - checksum: 10c0/1de229c9e08fe13c17fe5abaec8221545dfcd57e51f64909599a6ae896df84b8fd2f7d16c60cb00d7bf495b9298ca3581aded19939d4b7276854a4b066f8422b - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": - version: 1.0.1 - resolution: "es-define-property@npm:1.0.1" - checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 - languageName: node - linkType: hard - -"es-object-atoms@npm:^1.0.0": - version: 1.1.1 - resolution: "es-object-atoms@npm:1.1.1" - dependencies: - es-errors: "npm:^1.3.0" - checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c - languageName: node - linkType: hard - -"es-set-tostringtag@npm:^2.1.0": - version: 2.1.0 - resolution: "es-set-tostringtag@npm:2.1.0" - dependencies: - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.2" - checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af - languageName: node - linkType: hard - -"es-shim-unscopables@npm:^1.0.2": - version: 1.0.2 - resolution: "es-shim-unscopables@npm:1.0.2" - dependencies: - hasown: "npm:^2.0.0" - checksum: 10c0/f495af7b4b7601a4c0cfb893581c352636e5c08654d129590386a33a0432cf13a7bdc7b6493801cadd990d838e2839b9013d1de3b880440cb537825e834fe783 - languageName: node - linkType: hard - -"es-to-primitive@npm:^1.3.0": - version: 1.3.0 - resolution: "es-to-primitive@npm:1.3.0" - dependencies: - is-callable: "npm:^1.2.7" - is-date-object: "npm:^1.0.5" - is-symbol: "npm:^1.0.4" - checksum: 10c0/c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b - languageName: node - linkType: hard - -"es6-error@npm:^4.1.1": - version: 4.1.1 - resolution: "es6-error@npm:4.1.1" - checksum: 10c0/357663fb1e845c047d548c3d30f86e005db71e122678f4184ced0693f634688c3f3ef2d7de7d4af732f734de01f528b05954e270f06aa7d133679fb9fe6600ef - languageName: node - linkType: hard - -"escalade@npm:^3.1.1": - version: 3.2.0 - resolution: "escalade@npm:3.2.0" - checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 - languageName: node - linkType: hard - -"eslint-import-resolver-node@npm:^0.3.9": - version: 0.3.9 - resolution: "eslint-import-resolver-node@npm:0.3.9" - dependencies: - debug: "npm:^3.2.7" - is-core-module: "npm:^2.13.0" - resolve: "npm:^1.22.4" - checksum: 10c0/0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61 - languageName: node - linkType: hard - -"eslint-module-utils@npm:^2.12.0": - version: 2.12.0 - resolution: "eslint-module-utils@npm:2.12.0" - dependencies: - debug: "npm:^3.2.7" - peerDependenciesMeta: - eslint: - optional: true - checksum: 10c0/4d8b46dcd525d71276f9be9ffac1d2be61c9d54cc53c992e6333cf957840dee09381842b1acbbb15fc6b255ebab99cd481c5007ab438e5455a14abe1a0468558 - languageName: node - linkType: hard - -"eslint-plugin-es@npm:^3.0.0": - version: 3.0.1 - resolution: "eslint-plugin-es@npm:3.0.1" - dependencies: - eslint-utils: "npm:^2.0.0" - regexpp: "npm:^3.0.0" - peerDependencies: - eslint: ">=4.19.1" - checksum: 10c0/12ae730aa9603e680af048e1653aac15e529411b68b8d0da6e290700b17c695485af7c3f5360f531f80970786cab7288c2c1d4a58c35ec1bb89649897c016c4a - languageName: node - linkType: hard - -"eslint-plugin-import@npm:^2.31.0": - version: 2.31.0 - resolution: "eslint-plugin-import@npm:2.31.0" - dependencies: - "@rtsao/scc": "npm:^1.1.0" - array-includes: "npm:^3.1.8" - array.prototype.findlastindex: "npm:^1.2.5" - array.prototype.flat: "npm:^1.3.2" - array.prototype.flatmap: "npm:^1.3.2" - debug: "npm:^3.2.7" - doctrine: "npm:^2.1.0" - eslint-import-resolver-node: "npm:^0.3.9" - eslint-module-utils: "npm:^2.12.0" - hasown: "npm:^2.0.2" - is-core-module: "npm:^2.15.1" - is-glob: "npm:^4.0.3" - minimatch: "npm:^3.1.2" - object.fromentries: "npm:^2.0.8" - object.groupby: "npm:^1.0.3" - object.values: "npm:^1.2.0" - semver: "npm:^6.3.1" - string.prototype.trimend: "npm:^1.0.8" - tsconfig-paths: "npm:^3.15.0" - peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - checksum: 10c0/e21d116ddd1900e091ad120b3eb68c5dd5437fe2c930f1211781cd38b246f090a6b74d5f3800b8255a0ed29782591521ad44eb21c5534960a8f1fb4040fd913a - languageName: node - linkType: hard - -"eslint-plugin-node@npm:^11.1.0": - version: 11.1.0 - resolution: "eslint-plugin-node@npm:11.1.0" - dependencies: - eslint-plugin-es: "npm:^3.0.0" - eslint-utils: "npm:^2.0.0" - ignore: "npm:^5.1.1" - minimatch: "npm:^3.0.4" - resolve: "npm:^1.10.1" - semver: "npm:^6.1.0" - peerDependencies: - eslint: ">=5.16.0" - checksum: 10c0/c7716adac4020cb852fd2410dcd8bdb13a227004de77f96d7f9806d0cf2274f24e0920a7ca73bcd72d90003696c1f17fdd9fe3ca218e64ee03dc2b840e4416fa - languageName: node - linkType: hard - -"eslint-plugin-promise@npm:^7.2.1": - version: 7.2.1 - resolution: "eslint-plugin-promise@npm:7.2.1" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/d494982faeeafbd2aa5fae9cbceca546169a8399000f72d5d940fa5c4ba554612903bcafbb8033647179e5d21ccf1d621b433d089695f7f47ce3d9fcf4cd0abf - languageName: node - linkType: hard - -"eslint-scope@npm:^8.2.0": - version: 8.2.0 - resolution: "eslint-scope@npm:8.2.0" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^5.2.0" - checksum: 10c0/8d2d58e2136d548ac7e0099b1a90d9fab56f990d86eb518de1247a7066d38c908be2f3df477a79cf60d70b30ba18735d6c6e70e9914dca2ee515a729975d70d6 - languageName: node - linkType: hard - -"eslint-utils@npm:^2.0.0": - version: 2.1.0 - resolution: "eslint-utils@npm:2.1.0" - dependencies: - eslint-visitor-keys: "npm:^1.1.0" - checksum: 10c0/69521c5d6569384b24093125d037ba238d3d6e54367f7143af9928f5286369e912c26cad5016d730c0ffb9797ac9e83831059d7f1d863f7dc84330eb02414611 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^1.1.0": - version: 1.3.0 - resolution: "eslint-visitor-keys@npm:1.3.0" - checksum: 10c0/10c91fdbbe36810dd4308e57f9a8bc7177188b2a70247e54e3af1fa05ebc66414ae6fd4ce3c6c6821591f43a556e9037bc6b071122e099b5f8b7d2f76df553e3 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^4.2.0": - version: 4.2.0 - resolution: "eslint-visitor-keys@npm:4.2.0" - checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 - languageName: node - linkType: hard - -"eslint@npm:^9.18.0": - version: 9.18.0 - resolution: "eslint@npm:9.18.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.12.1" - "@eslint/config-array": "npm:^0.19.0" - "@eslint/core": "npm:^0.10.0" - "@eslint/eslintrc": "npm:^3.2.0" - "@eslint/js": "npm:9.18.0" - "@eslint/plugin-kit": "npm:^0.2.5" - "@humanfs/node": "npm:^0.16.6" - "@humanwhocodes/module-importer": "npm:^1.0.1" - "@humanwhocodes/retry": "npm:^0.4.1" - "@types/estree": "npm:^1.0.6" - "@types/json-schema": "npm:^7.0.15" - ajv: "npm:^6.12.4" - chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.6" - debug: "npm:^4.3.2" - escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^8.2.0" - eslint-visitor-keys: "npm:^4.2.0" - espree: "npm:^10.3.0" - esquery: "npm:^1.5.0" - esutils: "npm:^2.0.2" - fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^8.0.0" - find-up: "npm:^5.0.0" - glob-parent: "npm:^6.0.2" - ignore: "npm:^5.2.0" - imurmurhash: "npm:^0.1.4" - is-glob: "npm:^4.0.0" - json-stable-stringify-without-jsonify: "npm:^1.0.1" - lodash.merge: "npm:^4.6.2" - minimatch: "npm:^3.1.2" - natural-compare: "npm:^1.4.0" - optionator: "npm:^0.9.3" - peerDependencies: - jiti: "*" - peerDependenciesMeta: - jiti: - optional: true - bin: - eslint: bin/eslint.js - checksum: 10c0/7f592ad228b9bd627a24870fdc875bacdab7bf535d4b67316c4cb791e90d0125130a74769f3c407b0c4b7027b3082ef33864a63ee1024552a60a17db60493f15 - languageName: node - linkType: hard - -"espree@npm:^10.0.1, espree@npm:^10.3.0": - version: 10.3.0 - resolution: "espree@npm:10.3.0" - dependencies: - acorn: "npm:^8.14.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/272beeaca70d0a1a047d61baff64db04664a33d7cfb5d144f84bc8a5c6194c6c8ebe9cc594093ca53add88baa23e59b01e69e8a0160ab32eac570482e165c462 - languageName: node - linkType: hard - -"esquery@npm:^1.5.0": - version: 1.6.0 - resolution: "esquery@npm:1.6.0" - dependencies: - estraverse: "npm:^5.1.0" - checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: "npm:^5.2.0" - checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 - languageName: node - linkType: hard - -"extract-zip@npm:^2.0.1": - version: 2.0.1 - resolution: "extract-zip@npm:2.0.1" - dependencies: - "@types/yauzl": "npm:^2.9.1" - debug: "npm:^4.1.1" - get-stream: "npm:^5.1.0" - yauzl: "npm:^2.10.0" - dependenciesMeta: - "@types/yauzl": - optional: true - bin: - extract-zip: cli.js - checksum: 10c0/9afbd46854aa15a857ae0341a63a92743a7b89c8779102c3b4ffc207516b2019337353962309f85c66ee3d9092202a83cdc26dbf449a11981272038443974aee - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 - languageName: node - linkType: hard - -"fast-glob@npm:^3.3.2": - version: 3.3.3 - resolution: "fast-glob@npm:3.3.3" - dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.8" - checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.18.0 - resolution: "fastq@npm:1.18.0" - dependencies: - reusify: "npm:^1.0.4" - checksum: 10c0/7be87ecc41762adbddf558d24182f50a4b1a3ef3ee807d33b7623da7aee5faecdcc94fce5aa13fe91df93e269f383232bbcdb2dc5338cd1826503d6063221f36 - languageName: node - linkType: hard - -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" - dependencies: - pend: "npm:~1.2.0" - checksum: 10c0/304dd70270298e3ffe3bcc05e6f7ade2511acc278bc52d025f8918b48b6aa3b77f10361bddfadfe2a28163f7af7adbdce96f4d22c31b2f648ba2901f0c5fc20e - languageName: node - linkType: hard - -"fdir@npm:^6.5.0": - version: 6.5.0 - resolution: "fdir@npm:6.5.0" - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f - languageName: node - linkType: hard - -"file-entry-cache@npm:^8.0.0": - version: 8.0.0 - resolution: "file-entry-cache@npm:8.0.0" - dependencies: - flat-cache: "npm:^4.0.0" - checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 - languageName: node - linkType: hard - -"fill-range@npm:^7.1.1": - version: 7.1.1 - resolution: "fill-range@npm:7.1.1" - dependencies: - to-regex-range: "npm:^5.0.1" - checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a - languageName: node - linkType: hard - -"flat-cache@npm:^4.0.0": - version: 4.0.1 - resolution: "flat-cache@npm:4.0.1" - dependencies: - flatted: "npm:^3.2.9" - keyv: "npm:^4.5.4" - checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc - languageName: node - linkType: hard - -"flatted@npm:^3.2.9": - version: 3.3.2 - resolution: "flatted@npm:3.3.2" - checksum: 10c0/24cc735e74d593b6c767fe04f2ef369abe15b62f6906158079b9874bdb3ee5ae7110bb75042e70cd3f99d409d766f357caf78d5ecee9780206f5fdc5edbad334 - languageName: node - linkType: hard - -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" - dependencies: - is-callable: "npm:^1.1.3" - checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.3.0 - resolution: "foreground-child@npm:3.3.0" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^4.0.1" - checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 - languageName: node - linkType: hard - -"fs-extra@npm:^8.1.0": - version: 8.1.0 - resolution: "fs-extra@npm:8.1.0" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^4.0.0" - universalify: "npm:^0.1.0" - checksum: 10c0/259f7b814d9e50d686899550c4f9ded85c46c643f7fe19be69504888e007fcbc08f306fae8ec495b8b998635e997c9e3e175ff2eeed230524ef1c1684cc96423 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 - languageName: node - linkType: hard - -"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": - version: 1.1.8 - resolution: "function.prototype.name@npm:1.1.8" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - functions-have-names: "npm:^1.2.3" - hasown: "npm:^2.0.2" - is-callable: "npm:^1.2.7" - checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253 - languageName: node - linkType: hard - -"functions-have-names@npm:^1.2.3": - version: 1.2.3 - resolution: "functions-have-names@npm:1.2.3" - checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7": - version: 1.2.7 - resolution: "get-intrinsic@npm:1.2.7" - dependencies: - call-bind-apply-helpers: "npm:^1.0.1" - es-define-property: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - function-bind: "npm:^1.1.2" - get-proto: "npm:^1.0.0" - gopd: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - hasown: "npm:^2.0.2" - math-intrinsics: "npm:^1.1.0" - checksum: 10c0/b475dec9f8bff6f7422f51ff4b7b8d0b68e6776ee83a753c1d627e3008c3442090992788038b37eff72e93e43dceed8c1acbdf2d6751672687ec22127933080d - languageName: node - linkType: hard - -"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "get-proto@npm:1.0.1" - dependencies: - dunder-proto: "npm:^1.0.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c - languageName: node - linkType: hard - -"get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: "npm:^3.0.0" - checksum: 10c0/43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 - languageName: node - linkType: hard - -"get-symbol-description@npm:^1.1.0": - version: 1.1.0 - resolution: "get-symbol-description@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.6" - checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: "npm:^4.0.1" - checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: "npm:^4.0.3" - checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 - languageName: node - linkType: hard - -"glob@npm:^10.2.2, glob@npm:^10.3.7": - version: 10.4.5 - resolution: "glob@npm:10.4.5" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^3.1.2" - minimatch: "npm:^9.0.4" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^1.11.1" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e - languageName: node - linkType: hard - -"global-agent@npm:^3.0.0": - version: 3.0.0 - resolution: "global-agent@npm:3.0.0" - dependencies: - boolean: "npm:^3.0.1" - es6-error: "npm:^4.1.1" - matcher: "npm:^3.0.0" - roarr: "npm:^2.15.3" - semver: "npm:^7.3.2" - serialize-error: "npm:^7.0.1" - checksum: 10c0/bb8750d026b25da437072762fd739098bad92ff72f66483c3929db4579e072f5523960f7e7fd70ee0d75db48898067b5dc1c9c1d17888128cff008fcc34d1bd3 - languageName: node - linkType: hard - -"globals@npm:^14.0.0": - version: 14.0.0 - resolution: "globals@npm:14.0.0" - checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d - languageName: node - linkType: hard - -"globalthis@npm:^1.0.1, globalthis@npm:^1.0.4": - version: 1.0.4 - resolution: "globalthis@npm:1.0.4" - dependencies: - define-properties: "npm:^1.2.1" - gopd: "npm:^1.0.1" - checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846 - languageName: node - linkType: hard - -"gopd@npm:^1.0.1, gopd@npm:^1.2.0": - version: 1.2.0 - resolution: "gopd@npm:1.2.0" - checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead - languageName: node - linkType: hard - -"got@npm:^11.7.0, got@npm:^11.8.5": - version: 11.8.6 - resolution: "got@npm:11.8.6" - dependencies: - "@sindresorhus/is": "npm:^4.0.0" - "@szmarczak/http-timer": "npm:^4.0.5" - "@types/cacheable-request": "npm:^6.0.1" - "@types/responselike": "npm:^1.0.0" - cacheable-lookup: "npm:^5.0.3" - cacheable-request: "npm:^7.0.2" - decompress-response: "npm:^6.0.0" - http2-wrapper: "npm:^1.0.0-beta.5.2" - lowercase-keys: "npm:^2.0.0" - p-cancelable: "npm:^2.0.0" - responselike: "npm:^2.0.0" - checksum: 10c0/754dd44877e5cf6183f1e989ff01c648d9a4719e357457bd4c78943911168881f1cfb7b2cb15d885e2105b3ad313adb8f017a67265dd7ade771afdb261ee8cb1 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 - languageName: node - linkType: hard - -"has-bigints@npm:^1.0.2": - version: 1.1.0 - resolution: "has-bigints@npm:1.1.0" - checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788 - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: "npm:^1.0.0" - checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 - languageName: node - linkType: hard - -"has-proto@npm:^1.2.0": - version: 1.2.0 - resolution: "has-proto@npm:1.2.0" - dependencies: - dunder-proto: "npm:^1.0.0" - checksum: 10c0/46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": - version: 1.1.0 - resolution: "has-symbols@npm:1.1.0" - checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.2": - version: 1.0.2 - resolution: "has-tostringtag@npm:1.0.2" - dependencies: - has-symbols: "npm:^1.0.3" - checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c - languageName: node - linkType: hard - -"hasown@npm:^2.0.0, hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"http2-wrapper@npm:^1.0.0-beta.5.2": - version: 1.0.3 - resolution: "http2-wrapper@npm:1.0.3" - dependencies: - quick-lru: "npm:^5.1.1" - resolve-alpn: "npm:^1.0.0" - checksum: 10c0/6a9b72a033e9812e1476b9d776ce2f387bc94bc46c88aea0d5dab6bd47d0a539b8178830e77054dd26d1142c866d515a28a4dc7c3ff4232c88ff2ebe4f5d12d1 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.6 - resolution: "https-proxy-agent@npm:7.0.6" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:4" - checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 - languageName: node - linkType: hard - -"ieee754@npm:^1.1.13": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb - languageName: node - linkType: hard - -"ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.3.1": - version: 5.3.2 - resolution: "ignore@npm:5.3.2" - checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 - languageName: node - linkType: hard - -"import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: "npm:^1.0.0" - resolve-from: "npm:^4.0.0" - checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 - languageName: node - linkType: hard - -"inherits@npm:^2.0.3, inherits@npm:^2.0.4": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 - languageName: node - linkType: hard - -"internal-slot@npm:^1.1.0": - version: 1.1.0 - resolution: "internal-slot@npm:1.1.0" - dependencies: - es-errors: "npm:^1.3.0" - hasown: "npm:^2.0.2" - side-channel: "npm:^1.1.0" - checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7 - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc - languageName: node - linkType: hard - -"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": - version: 3.0.5 - resolution: "is-array-buffer@npm:3.0.5" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - get-intrinsic: "npm:^1.2.6" - checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d - languageName: node - linkType: hard - -"is-async-function@npm:^2.0.0": - version: 2.1.1 - resolution: "is-async-function@npm:2.1.1" - dependencies: - async-function: "npm:^1.0.0" - call-bound: "npm:^1.0.3" - get-proto: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.2" - safe-regex-test: "npm:^1.1.0" - checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298 - languageName: node - linkType: hard - -"is-bigint@npm:^1.1.0": - version: 1.1.0 - resolution: "is-bigint@npm:1.1.0" - dependencies: - has-bigints: "npm:^1.0.2" - checksum: 10c0/f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4 - languageName: node - linkType: hard - -"is-boolean-object@npm:^1.2.1": - version: 1.2.1 - resolution: "is-boolean-object@npm:1.2.1" - dependencies: - call-bound: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/2ef601d255a39fdbde79cfe6be80c27b47430ed6712407f29b17d002e20f64c1e3d6692f1d842ba16bf1e9d8ddf1c4f13cac3ed7d9a4a21290f44879ebb4e8f5 - languageName: node - linkType: hard - -"is-callable@npm:^1.1.3, is-callable@npm:^1.2.7": - version: 1.2.7 - resolution: "is-callable@npm:1.2.7" - checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f - languageName: node - linkType: hard - -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1, is-core-module@npm:^2.16.0": - version: 2.16.1 - resolution: "is-core-module@npm:2.16.1" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd - languageName: node - linkType: hard - -"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": - version: 1.0.2 - resolution: "is-data-view@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.6" - is-typed-array: "npm:^1.1.13" - checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153 - languageName: node - linkType: hard - -"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": - version: 1.1.0 - resolution: "is-date-object@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 - languageName: node - linkType: hard - -"is-finalizationregistry@npm:^1.1.0": - version: 1.1.1 - resolution: "is-finalizationregistry@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.3" - checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc - languageName: node - linkType: hard - -"is-generator-function@npm:^1.0.10": - version: 1.1.0 - resolution: "is-generator-function@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.3" - get-proto: "npm:^1.0.0" - has-tostringtag: "npm:^1.0.2" - safe-regex-test: "npm:^1.1.0" - checksum: 10c0/fdfa96c8087bf36fc4cd514b474ba2ff404219a4dd4cfa6cf5426404a1eed259bdcdb98f082a71029a48d01f27733e3436ecc6690129a7ec09cb0434bee03a2a - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: "npm:^2.1.1" - checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a - languageName: node - linkType: hard - -"is-interactive@npm:^1.0.0": - version: 1.0.0 - resolution: "is-interactive@npm:1.0.0" - checksum: 10c0/dd47904dbf286cd20aa58c5192161be1a67138485b9836d5a70433b21a45442e9611b8498b8ab1f839fc962c7620667a50535fdfb4a6bc7989b8858645c06b4d - languageName: node - linkType: hard - -"is-map@npm:^2.0.3": - version: 2.0.3 - resolution: "is-map@npm:2.0.3" - checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc - languageName: node - linkType: hard - -"is-number-object@npm:^1.1.1": - version: 1.1.1 - resolution: "is-number-object@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.3" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 - languageName: node - linkType: hard - -"is-regex@npm:^1.2.1": - version: 1.2.1 - resolution: "is-regex@npm:1.2.1" - dependencies: - call-bound: "npm:^1.0.2" - gopd: "npm:^1.2.0" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.2" - checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 - languageName: node - linkType: hard - -"is-set@npm:^2.0.3": - version: 2.0.3 - resolution: "is-set@npm:2.0.3" - checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 - languageName: node - linkType: hard - -"is-shared-array-buffer@npm:^1.0.4": - version: 1.0.4 - resolution: "is-shared-array-buffer@npm:1.0.4" - dependencies: - call-bound: "npm:^1.0.3" - checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db - languageName: node - linkType: hard - -"is-string@npm:^1.0.7, is-string@npm:^1.1.1": - version: 1.1.1 - resolution: "is-string@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.3" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d - languageName: node - linkType: hard - -"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": - version: 1.1.1 - resolution: "is-symbol@npm:1.1.1" - dependencies: - call-bound: "npm:^1.0.2" - has-symbols: "npm:^1.1.0" - safe-regex-test: "npm:^1.1.0" - checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e - languageName: node - linkType: hard - -"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": - version: 1.1.15 - resolution: "is-typed-array@npm:1.1.15" - dependencies: - which-typed-array: "npm:^1.1.16" - checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4 - languageName: node - linkType: hard - -"is-unicode-supported@npm:^0.1.0": - version: 0.1.0 - resolution: "is-unicode-supported@npm:0.1.0" - checksum: 10c0/00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 - languageName: node - linkType: hard - -"is-weakmap@npm:^2.0.2": - version: 2.0.2 - resolution: "is-weakmap@npm:2.0.2" - checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 - languageName: node - linkType: hard - -"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": - version: 1.1.0 - resolution: "is-weakref@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.2" - checksum: 10c0/aa835f62e29cb60132ecb3ec7d11bd0f39ec7322325abe8412b805aef47153ec2daefdb21759b049711c674f49b13202a31d8d126bcdff7d8671c78babd4ae5b - languageName: node - linkType: hard - -"is-weakset@npm:^2.0.3": - version: 2.0.4 - resolution: "is-weakset@npm:2.0.4" - dependencies: - call-bound: "npm:^1.0.3" - get-intrinsic: "npm:^1.2.6" - checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647 - languageName: node - linkType: hard - -"isarray@npm:^2.0.5": - version: 2.0.5 - resolution: "isarray@npm:2.0.5" - checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d - languageName: node - linkType: hard - -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 - languageName: node - linkType: hard - -"jackspeak@npm:^3.1.2": - version: 3.4.3 - resolution: "jackspeak@npm:3.4.3" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 - languageName: node - linkType: hard - -"jasmine-core@npm:~5.5.0": - version: 5.5.0 - resolution: "jasmine-core@npm:5.5.0" - checksum: 10c0/9914f45ce6bcc016d61ee591a8a71dd0d88902ddf5fa887b11966040ce0916379bc4d5f446c07c58226b16f8a0f9719fa201cd92a3f07b02e8c8aa4169448600 - languageName: node - linkType: hard - -"jasmine@npm:^5.5.0": - version: 5.5.0 - resolution: "jasmine@npm:5.5.0" - dependencies: - glob: "npm:^10.2.2" - jasmine-core: "npm:~5.5.0" - bin: - jasmine: bin/jasmine.js - checksum: 10c0/3b86e6f19987c9d49092dac783ac84a0429ba3786580573d57ffdca6bc21468476613ca94748cfc282f0adbcc2810c20420bee78ef8f37a897f34dd4cd83107e - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 - languageName: node - linkType: hard - -"json-stringify-safe@npm:^5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 10c0/7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 - languageName: node - linkType: hard - -"json5@npm:^1.0.2": - version: 1.0.2 - resolution: "json5@npm:1.0.2" - dependencies: - minimist: "npm:^1.2.0" - bin: - json5: lib/cli.js - checksum: 10c0/9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f - languageName: node - linkType: hard - -"jsonfile@npm:^4.0.0": - version: 4.0.0 - resolution: "jsonfile@npm:4.0.0" - dependencies: - graceful-fs: "npm:^4.1.6" - dependenciesMeta: - graceful-fs: - optional: true - checksum: 10c0/7dc94b628d57a66b71fb1b79510d460d662eb975b5f876d723f81549c2e9cd316d58a2ddf742b2b93a4fa6b17b2accaf1a738a0e2ea114bdfb13a32e5377e480 - languageName: node - linkType: hard - -"keyv@npm:^4.0.0, keyv@npm:^4.5.4": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" - dependencies: - json-buffer: "npm:3.0.1" - checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: "npm:^1.2.1" - type-check: "npm:~0.4.0" - checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: "npm:^5.0.0" - checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 - languageName: node - linkType: hard - -"log-symbols@npm:^4.1.0": - version: 4.1.0 - resolution: "log-symbols@npm:4.1.0" - dependencies: - chalk: "npm:^4.1.0" - is-unicode-supported: "npm:^0.1.0" - checksum: 10c0/67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 - languageName: node - linkType: hard - -"loglevel@npm:^1.9.2": - version: 1.9.2 - resolution: "loglevel@npm:1.9.2" - checksum: 10c0/1e317fa4648fe0b4a4cffef6de037340592cee8547b07d4ce97a487abe9153e704b98451100c799b032c72bb89c9366d71c9fb8192ada8703269263ae77acdc7 - languageName: node - linkType: hard - -"lowercase-keys@npm:^2.0.0": - version: 2.0.0 - resolution: "lowercase-keys@npm:2.0.0" - checksum: 10c0/f82a2b3568910509da4b7906362efa40f5b54ea14c2584778ddb313226f9cbf21020a5db35f9b9a0e95847a9b781d548601f31793d736b22a2b8ae8eb9ab1082 - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb - languageName: node - linkType: hard - -"make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f - languageName: node - linkType: hard - -"make-fetch-happen@npm:^14.0.3": - version: 14.0.3 - resolution: "make-fetch-happen@npm:14.0.3" - dependencies: - "@npmcli/agent": "npm:^3.0.0" - cacache: "npm:^19.0.1" - http-cache-semantics: "npm:^4.1.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^4.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^1.0.0" - proc-log: "npm:^5.0.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^12.0.0" - checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 - languageName: node - linkType: hard - -"matcher@npm:^3.0.0": - version: 3.0.0 - resolution: "matcher@npm:3.0.0" - dependencies: - escape-string-regexp: "npm:^4.0.0" - checksum: 10c0/2edf24194a2879690bcdb29985fc6bc0d003df44e04df21ebcac721fa6ce2f6201c579866bb92f9380bffe946f11ecd8cd31f34117fb67ebf8aca604918e127e - languageName: node - linkType: hard - -"math-intrinsics@npm:^1.1.0": - version: 1.1.0 - resolution: "math-intrinsics@npm:1.1.0" - checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f - languageName: node - linkType: hard - -"merge2@npm:^1.3.0": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb - languageName: node - linkType: hard - -"micromatch@npm:^4.0.8": - version: 4.0.8 - resolution: "micromatch@npm:4.0.8" - dependencies: - braces: "npm:^3.0.3" - picomatch: "npm:^2.3.1" - checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 - languageName: node - linkType: hard - -"mimic-response@npm:^1.0.0": - version: 1.0.1 - resolution: "mimic-response@npm:1.0.1" - checksum: 10c0/c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa - languageName: node - linkType: hard - -"mimic-response@npm:^3.1.0": - version: 3.1.0 - resolution: "mimic-response@npm:3.1.0" - checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed - languageName: node - linkType: hard - -"minimist@npm:^1.2.0, minimist@npm:^1.2.6": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^4.0.0": - version: 4.0.0 - resolution: "minipass-fetch@npm:4.0.0" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^3.0.1" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/7fa30ce7c373fb6f94c086b374fff1589fd7e78451855d2d06c2e2d9df936d131e73e952163063016592ed3081444bd8d1ea608533313b0149156ce23311da4b - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 - languageName: node - linkType: hard - -"minizlib@npm:^3.0.1": - version: 3.0.1 - resolution: "minizlib@npm:3.0.1" - dependencies: - minipass: "npm:^7.0.4" - rimraf: "npm:^5.0.5" - checksum: 10c0/82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 - languageName: node - linkType: hard - -"minizlib@npm:^3.1.0": - version: 3.1.0 - resolution: "minizlib@npm:3.1.0" - dependencies: - minipass: "npm:^7.1.2" - checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec - languageName: node - linkType: hard - -"mkdirp@npm:^0.5.1": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: "npm:^1.2.6" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 - languageName: node - linkType: hard - -"mkdirp@npm:^3.0.1": - version: 3.0.1 - resolution: "mkdirp@npm:3.0.1" - bin: - mkdirp: dist/cjs/src/bin.js - checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d - languageName: node - linkType: hard - -"ms@npm:^2.1.1, ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 - languageName: node - linkType: hard - -"negotiator@npm:^1.0.0": - version: 1.0.0 - resolution: "negotiator@npm:1.0.0" - checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b - languageName: node - linkType: hard - -"node-abi@npm:^4.2.0": - version: 4.28.0 - resolution: "node-abi@npm:4.28.0" - dependencies: - semver: "npm:^7.6.3" - checksum: 10c0/d734dc7d25247fdd7bba7f1f12ddadc23c6ada9c639cf2cd2b11a6e568591c82f609e41bf740077b838f2eb88ff4d9489eb111eef4e530c8dbdb41355e6f0343 - languageName: node - linkType: hard - -"node-api-version@npm:^0.2.1": - version: 0.2.1 - resolution: "node-api-version@npm:0.2.1" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/3fe6c273e4f9dd184bb8b959ba3d8afae7eade663611d82c8538c79ac3a7b8f1d136632ceb4bf8cdc46a851fc169407746996cf7d1096de9a186e0e70fca95fa - languageName: node - linkType: hard - -"node-gyp@npm:^11.2.0": - version: 11.5.0 - resolution: "node-gyp@npm:11.5.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^14.0.3" - nopt: "npm:^8.0.0" - proc-log: "npm:^5.0.0" - semver: "npm:^7.3.5" - tar: "npm:^7.4.3" - tinyglobby: "npm:^0.2.12" - which: "npm:^5.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/31ff49586991b38287bb15c3d529dd689cfc32f992eed9e6997b9d712d5d21fe818a8b1bbfe3b76a7e33765c20210c5713212f4aa329306a615b87d8a786da3a - languageName: node - linkType: hard - -"nopt@npm:^8.0.0": - version: 8.1.0 - resolution: "nopt@npm:8.1.0" - dependencies: - abbrev: "npm:^3.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef - languageName: node - linkType: hard - -"normalize-url@npm:^6.0.1": - version: 6.1.0 - resolution: "normalize-url@npm:6.1.0" - checksum: 10c0/95d948f9bdd2cfde91aa786d1816ae40f8262946e13700bf6628105994fe0ff361662c20af3961161c38a119dc977adeb41fc0b41b1745eb77edaaf9cb22db23 - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.3": - version: 1.13.3 - resolution: "object-inspect@npm:1.13.3" - checksum: 10c0/cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 - languageName: node - linkType: hard - -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d - languageName: node - linkType: hard - -"object.assign@npm:^4.1.7": - version: 4.1.7 - resolution: "object.assign@npm:4.1.7" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - has-symbols: "npm:^1.1.0" - object-keys: "npm:^1.1.1" - checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc - languageName: node - linkType: hard - -"object.fromentries@npm:^2.0.8": - version: 2.0.8 - resolution: "object.fromentries@npm:2.0.8" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/cd4327e6c3369cfa805deb4cbbe919bfb7d3aeebf0bcaba291bb568ea7169f8f8cdbcabe2f00b40db0c20cd20f08e11b5f3a5a36fb7dd3fe04850c50db3bf83b - languageName: node - linkType: hard - -"object.groupby@npm:^1.0.3": - version: 1.0.3 - resolution: "object.groupby@npm:1.0.3" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - checksum: 10c0/60d0455c85c736fbfeda0217d1a77525956f76f7b2495edeca9e9bbf8168a45783199e77b894d30638837c654d0cc410e0e02cbfcf445bc8de71c3da1ede6a9c - languageName: node - linkType: hard - -"object.values@npm:^1.2.0": - version: 1.2.1 - resolution: "object.values@npm:1.2.1" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/3c47814fdc64842ae3d5a74bc9d06bdd8d21563c04d9939bf6716a9c00596a4ebc342552f8934013d1ec991c74e3671b26710a0c51815f0b603795605ab6b2c9 - languageName: node - linkType: hard - -"once@npm:^1.3.1, once@npm:^1.4.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 - languageName: node - linkType: hard - -"onetime@npm:^5.1.0": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: "npm:^2.1.0" - checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f - languageName: node - linkType: hard - -"optionator@npm:^0.9.3": - version: 0.9.4 - resolution: "optionator@npm:0.9.4" - dependencies: - deep-is: "npm:^0.1.3" - fast-levenshtein: "npm:^2.0.6" - levn: "npm:^0.4.1" - prelude-ls: "npm:^1.2.1" - type-check: "npm:^0.4.0" - word-wrap: "npm:^1.2.5" - checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 - languageName: node - linkType: hard - -"ora@npm:^5.1.0": - version: 5.4.1 - resolution: "ora@npm:5.4.1" - dependencies: - bl: "npm:^4.1.0" - chalk: "npm:^4.1.0" - cli-cursor: "npm:^3.1.0" - cli-spinners: "npm:^2.5.0" - is-interactive: "npm:^1.0.0" - is-unicode-supported: "npm:^0.1.0" - log-symbols: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - wcwidth: "npm:^1.0.1" - checksum: 10c0/10ff14aace236d0e2f044193362b22edce4784add08b779eccc8f8ef97195cae1248db8ec1ec5f5ff076f91acbe573f5f42a98c19b78dba8c54eefff983cae85 - languageName: node - linkType: hard - -"own-keys@npm:^1.0.1": - version: 1.0.1 - resolution: "own-keys@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.2.6" - object-keys: "npm:^1.1.1" - safe-push-apply: "npm:^1.0.0" - checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a - languageName: node - linkType: hard - -"p-cancelable@npm:^2.0.0": - version: 2.1.1 - resolution: "p-cancelable@npm:2.1.1" - checksum: 10c0/8c6dc1f8dd4154fd8b96a10e55a3a832684c4365fb9108056d89e79fbf21a2465027c04a59d0d797b5ffe10b54a61a32043af287d5c4860f1e996cbdbc847f01 - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: "npm:^0.1.0" - checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: "npm:^3.0.2" - checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a - languageName: node - linkType: hard - -"p-map@npm:^7.0.2": - version: 7.0.3 - resolution: "p-map@npm:7.0.3" - checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c - languageName: node - linkType: hard - -"package-json-from-dist@npm:^1.0.0": - version: 1.0.1 - resolution: "package-json-from-dist@npm:1.0.1" - checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: "npm:^3.0.0" - checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d - languageName: node - linkType: hard - -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 10c0/8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 - languageName: node - linkType: hard - -"picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be - languageName: node - linkType: hard - -"picomatch@npm:^4.0.3": - version: 4.0.3 - resolution: "picomatch@npm:4.0.3" - checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 - languageName: node - linkType: hard - -"platform@link:../../../platform::locator=rustcore%40workspace%3A.": - version: 0.0.0-use.local - resolution: "platform@link:../../../platform::locator=rustcore%40workspace%3A." - languageName: node - linkType: soft - -"possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: 10c0/d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd - languageName: node - linkType: hard - -"proc-log@npm:^5.0.0": - version: 5.0.0 - resolution: "proc-log@npm:5.0.0" - checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 - languageName: node - linkType: hard - -"progress@npm:^2.0.3": - version: 2.0.3 - resolution: "progress@npm:2.0.3" - checksum: 10c0/1697e07cb1068055dbe9fe858d242368ff5d2073639e652b75a7eb1f2a1a8d4afd404d719de23c7b48481a6aa0040686310e2dac2f53d776daa2176d3f96369c - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 - languageName: node - linkType: hard - -"protocol@link:../../protocol/pkg::locator=rustcore%40workspace%3A.": - version: 0.0.0-use.local - resolution: "protocol@link:../../protocol/pkg::locator=rustcore%40workspace%3A." - languageName: node - linkType: soft - -"pump@npm:^3.0.0": - version: 3.0.2 - resolution: "pump@npm:3.0.2" - dependencies: - end-of-stream: "npm:^1.1.0" - once: "npm:^1.3.1" - checksum: 10c0/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 - languageName: node - linkType: hard - -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: 10c0/a24cba5da8cec30d70d2484be37622580f64765fb6390a928b17f60cd69e8dbd32a954b3ff9176fa1b86d86ff2ba05252fae55dc4d40d0291c60412b0ad096da - languageName: node - linkType: hard - -"read-binary-file-arch@npm:^1.0.6": - version: 1.0.6 - resolution: "read-binary-file-arch@npm:1.0.6" - dependencies: - debug: "npm:^4.3.4" - bin: - read-binary-file-arch: cli.js - checksum: 10c0/7665cb4ec61da1f4da7ba6c0fb64f53f6e739373d427dd0e1c4d19f240b3ebff0f596377c01e290a6370f611899b82df09edafa758200bf31216d855e3230058 - languageName: node - linkType: hard - -"readable-stream@npm:^3.4.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: "npm:^2.0.3" - string_decoder: "npm:^1.1.1" - util-deprecate: "npm:^1.0.1" - checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 - languageName: node - linkType: hard - -"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": - version: 1.0.10 - resolution: "reflect.getprototypeof@npm:1.0.10" - dependencies: - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.9" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.7" - get-proto: "npm:^1.0.1" - which-builtin-type: "npm:^1.2.1" - checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.5.3": - version: 1.5.4 - resolution: "regexp.prototype.flags@npm:1.5.4" - dependencies: - call-bind: "npm:^1.0.8" - define-properties: "npm:^1.2.1" - es-errors: "npm:^1.3.0" - get-proto: "npm:^1.0.1" - gopd: "npm:^1.2.0" - set-function-name: "npm:^2.0.2" - checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77 - languageName: node - linkType: hard - -"regexpp@npm:^3.0.0": - version: 3.2.0 - resolution: "regexpp@npm:3.2.0" - checksum: 10c0/d1da82385c8754a1681416b90b9cca0e21b4a2babef159099b88f640637d789c69011d0bc94705dacab85b81133e929d027d85210e8b8b03f8035164dbc14710 - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 - languageName: node - linkType: hard - -"resolve-alpn@npm:^1.0.0": - version: 1.2.1 - resolution: "resolve-alpn@npm:1.2.1" - checksum: 10c0/b70b29c1843bc39781ef946c8cd4482e6d425976599c0f9c138cec8209e4e0736161bf39319b01676a847000085dfdaf63583c6fb4427bf751a10635bd2aa0c4 - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 - languageName: node - linkType: hard - -"resolve@npm:^1.10.1, resolve@npm:^1.22.4": - version: 1.22.10 - resolution: "resolve@npm:1.22.10" - dependencies: - is-core-module: "npm:^2.16.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/8967e1f4e2cc40f79b7e080b4582b9a8c5ee36ffb46041dccb20e6461161adf69f843b43067b4a375de926a2cd669157e29a29578191def399dd5ef89a1b5203 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.10.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": - version: 1.22.10 - resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.16.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939 - languageName: node - linkType: hard - -"responselike@npm:^2.0.0": - version: 2.0.1 - resolution: "responselike@npm:2.0.1" - dependencies: - lowercase-keys: "npm:^2.0.0" - checksum: 10c0/360b6deb5f101a9f8a4174f7837c523c3ec78b7ca8a7c1d45a1062b303659308a23757e318b1e91ed8684ad1205721142dd664d94771cd63499353fd4ee732b5 - languageName: node - linkType: hard - -"restore-cursor@npm:^3.1.0": - version: 3.1.0 - resolution: "restore-cursor@npm:3.1.0" - dependencies: - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - checksum: 10c0/8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 - languageName: node - linkType: hard - -"rimraf@npm:^5.0.5": - version: 5.0.10 - resolution: "rimraf@npm:5.0.10" - dependencies: - glob: "npm:^10.3.7" - bin: - rimraf: dist/esm/bin.mjs - checksum: 10c0/7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc - languageName: node - linkType: hard - -"roarr@npm:^2.15.3": - version: 2.15.4 - resolution: "roarr@npm:2.15.4" - dependencies: - boolean: "npm:^3.0.1" - detect-node: "npm:^2.0.4" - globalthis: "npm:^1.0.1" - json-stringify-safe: "npm:^5.0.1" - semver-compare: "npm:^1.0.0" - sprintf-js: "npm:^1.1.2" - checksum: 10c0/7d01d4c14513c461778dd673a8f9e53255221f8d04173aafeb8e11b23d8b659bb83f1c90cfe81af7f9c213b8084b404b918108fd792bda76678f555340cc64ec - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: "npm:^1.2.2" - checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 - languageName: node - linkType: hard - -"rustcore@workspace:.": - version: 0.0.0-use.local - resolution: "rustcore@workspace:." - dependencies: - "@electron/rebuild": "npm:^4.0.3" - "@types/jasmine": "npm:^5.1.5" - "@types/node": "npm:^22.10.10" - "@types/tmp": "npm:^0.2.4" - "@types/uuid": "npm:^10.0.0" - "@typescript-eslint/eslint-plugin": "npm:^8.21.0" - "@typescript-eslint/parser": "npm:^8.21.0" - custom.stdout: "npm:^1.0.2" - electron: "npm:^34.0.1" - electron-build-env: "npm:0.2.0" - eslint: "npm:^9.18.0" - eslint-plugin-import: "npm:^2.31.0" - eslint-plugin-node: "npm:^11.1.0" - eslint-plugin-promise: "npm:^7.2.1" - jasmine: "npm:^5.5.0" - loglevel: "npm:^1.9.2" - platform: "link:../../../platform" - protocol: "link:../../protocol/pkg" - tmp: "npm:^0.2.3" - ts-node: "npm:^10.4.0" - tslib: "npm:^2.8.1" - typescript: "npm:^5.7.3" - uuid: "npm:^11.0.5" - languageName: unknown - linkType: soft - -"safe-array-concat@npm:^1.1.3": - version: 1.1.3 - resolution: "safe-array-concat@npm:1.1.3" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.6" - has-symbols: "npm:^1.1.0" - isarray: "npm:^2.0.5" - checksum: 10c0/43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d - languageName: node - linkType: hard - -"safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - -"safe-push-apply@npm:^1.0.0": - version: 1.0.0 - resolution: "safe-push-apply@npm:1.0.0" - dependencies: - es-errors: "npm:^1.3.0" - isarray: "npm:^2.0.5" - checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750 - languageName: node - linkType: hard - -"safe-regex-test@npm:^1.1.0": - version: 1.1.0 - resolution: "safe-regex-test@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - is-regex: "npm:^1.2.1" - checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - -"semver-compare@npm:^1.0.0": - version: 1.0.0 - resolution: "semver-compare@npm:1.0.0" - checksum: 10c0/9ef4d8b81847556f0865f46ddc4d276bace118c7cb46811867af82e837b7fc473911981d5a0abc561fa2db487065572217e5b06e18701c4281bcdd2a1affaff1 - languageName: node - linkType: hard - -"semver@npm:^6.1.0, semver@npm:^6.2.0, semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d - languageName: node - linkType: hard - -"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.6.0": - version: 7.6.3 - resolution: "semver@npm:7.6.3" - bin: - semver: bin/semver.js - checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf - languageName: node - linkType: hard - -"semver@npm:^7.6.3": - version: 7.7.4 - resolution: "semver@npm:7.7.4" - bin: - semver: bin/semver.js - checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2 - languageName: node - linkType: hard - -"serialize-error@npm:^7.0.1": - version: 7.0.1 - resolution: "serialize-error@npm:7.0.1" - dependencies: - type-fest: "npm:^0.13.1" - checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 - languageName: node - linkType: hard - -"set-function-length@npm:^1.2.2": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c - languageName: node - linkType: hard - -"set-function-name@npm:^2.0.2": - version: 2.0.2 - resolution: "set-function-name@npm:2.0.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - functions-have-names: "npm:^1.2.3" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 - languageName: node - linkType: hard - -"set-proto@npm:^1.0.0": - version: 1.0.0 - resolution: "set-proto@npm:1.0.0" - dependencies: - dunder-proto: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 - languageName: node - linkType: hard - -"side-channel-list@npm:^1.0.0": - version: 1.0.0 - resolution: "side-channel-list@npm:1.0.0" - dependencies: - es-errors: "npm:^1.3.0" - object-inspect: "npm:^1.13.3" - checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d - languageName: node - linkType: hard - -"side-channel-map@npm:^1.0.1": - version: 1.0.1 - resolution: "side-channel-map@npm:1.0.1" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.5" - object-inspect: "npm:^1.13.3" - checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 - languageName: node - linkType: hard - -"side-channel-weakmap@npm:^1.0.2": - version: 1.0.2 - resolution: "side-channel-weakmap@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.5" - object-inspect: "npm:^1.13.3" - side-channel-map: "npm:^1.0.1" - checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 - languageName: node - linkType: hard - -"side-channel@npm:^1.1.0": - version: 1.1.0 - resolution: "side-channel@npm:1.1.0" - dependencies: - es-errors: "npm:^1.3.0" - object-inspect: "npm:^1.13.3" - side-channel-list: "npm:^1.0.0" - side-channel-map: "npm:^1.0.1" - side-channel-weakmap: "npm:^1.0.2" - checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.2": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.5 - resolution: "socks-proxy-agent@npm:8.0.5" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:^4.3.4" - socks: "npm:^2.8.3" - checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 - languageName: node - linkType: hard - -"socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" - dependencies: - ip-address: "npm:^9.0.5" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.2, sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec - languageName: node - linkType: hard - -"ssri@npm:^12.0.0": - version: 12.0.0 - resolution: "ssri@npm:12.0.0" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: "npm:^8.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^9.2.2" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca - languageName: node - linkType: hard - -"string.prototype.trim@npm:^1.2.10": - version: 1.2.10 - resolution: "string.prototype.trim@npm:1.2.10" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.2" - define-data-property: "npm:^1.1.4" - define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.5" - es-object-atoms: "npm:^1.0.0" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8 - languageName: node - linkType: hard - -"string.prototype.trimend@npm:^1.0.8, string.prototype.trimend@npm:^1.0.9": - version: 1.0.9 - resolution: "string.prototype.trimend@npm:1.0.9" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.2" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6 - languageName: node - linkType: hard - -"string.prototype.trimstart@npm:^1.0.8": - version: 1.0.8 - resolution: "string.prototype.trimstart@npm:1.0.8" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366 - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: "npm:~5.2.0" - checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: "npm:^5.0.1" - checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 - languageName: node - linkType: hard - -"strip-bom@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-bom@npm:3.0.0" - checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 - languageName: node - linkType: hard - -"strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd - languageName: node - linkType: hard - -"sumchecker@npm:^3.0.1": - version: 3.0.1 - resolution: "sumchecker@npm:3.0.1" - dependencies: - debug: "npm:^4.1.0" - checksum: 10c0/43c387be9dfe22dbeaf39dfa4ffb279847aeb37a42a8988c0b066f548bbd209aa8c65e03da29f2b29be1a66b577801bf89fff0007df4183db2f286263a9569e5 - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 - languageName: node - linkType: hard - -"tar@npm:^7.4.3": - version: 7.4.3 - resolution: "tar@npm:7.4.3" - dependencies: - "@isaacs/fs-minipass": "npm:^4.0.0" - chownr: "npm:^3.0.0" - minipass: "npm:^7.1.2" - minizlib: "npm:^3.0.1" - mkdirp: "npm:^3.0.1" - yallist: "npm:^5.0.0" - checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d - languageName: node - linkType: hard - -"tar@npm:^7.5.6": - version: 7.5.13 - resolution: "tar@npm:7.5.13" - dependencies: - "@isaacs/fs-minipass": "npm:^4.0.0" - chownr: "npm:^3.0.0" - minipass: "npm:^7.1.2" - minizlib: "npm:^3.1.0" - yallist: "npm:^5.0.0" - checksum: 10c0/5c65b8084799bde7a791593a1c1a45d3d6ee98182e3700b24c247b7b8f8654df4191642abbdb07ff25043d45dcff35620827c3997b88ae6c12040f64bed5076b - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.12": - version: 0.2.15 - resolution: "tinyglobby@npm:0.2.15" - dependencies: - fdir: "npm:^6.5.0" - picomatch: "npm:^4.0.3" - checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 - languageName: node - linkType: hard - -"tmp@npm:^0.2.3": - version: 0.2.3 - resolution: "tmp@npm:0.2.3" - checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: "npm:^7.0.0" - checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 - languageName: node - linkType: hard - -"ts-api-utils@npm:^2.0.0": - version: 2.0.0 - resolution: "ts-api-utils@npm:2.0.0" - peerDependencies: - typescript: ">=4.8.4" - checksum: 10c0/6165e29a5b75bd0218e3cb0f9ee31aa893dbd819c2e46dbb086c841121eb0436ed47c2c18a20cb3463d74fd1fb5af62e2604ba5971cc48e5b38ebbdc56746dfc - languageName: node - linkType: hard - -"ts-node@npm:^10.4.0": - version: 10.9.2 - resolution: "ts-node@npm:10.9.2" - dependencies: - "@cspotcode/source-map-support": "npm:^0.8.0" - "@tsconfig/node10": "npm:^1.0.7" - "@tsconfig/node12": "npm:^1.0.7" - "@tsconfig/node14": "npm:^1.0.0" - "@tsconfig/node16": "npm:^1.0.2" - acorn: "npm:^8.4.1" - acorn-walk: "npm:^8.1.1" - arg: "npm:^4.1.0" - create-require: "npm:^1.1.0" - diff: "npm:^4.0.1" - make-error: "npm:^1.1.1" - v8-compile-cache-lib: "npm:^3.0.1" - yn: "npm:3.1.1" - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 - languageName: node - linkType: hard - -"tsconfig-paths@npm:^3.15.0": - version: 3.15.0 - resolution: "tsconfig-paths@npm:3.15.0" - dependencies: - "@types/json5": "npm:^0.0.29" - json5: "npm:^1.0.2" - minimist: "npm:^1.2.6" - strip-bom: "npm:^3.0.0" - checksum: 10c0/5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5 - languageName: node - linkType: hard - -"tslib@npm:^2.8.1": - version: 2.8.1 - resolution: "tslib@npm:2.8.1" - checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 - languageName: node - linkType: hard - -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: "npm:^1.2.1" - checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 - languageName: node - linkType: hard - -"type-fest@npm:^0.13.1": - version: 0.13.1 - resolution: "type-fest@npm:0.13.1" - checksum: 10c0/0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b - languageName: node - linkType: hard - -"typed-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "typed-array-buffer@npm:1.0.3" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - is-typed-array: "npm:^1.1.14" - checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079 - languageName: node - linkType: hard - -"typed-array-byte-length@npm:^1.0.3": - version: 1.0.3 - resolution: "typed-array-byte-length@npm:1.0.3" - dependencies: - call-bind: "npm:^1.0.8" - for-each: "npm:^0.3.3" - gopd: "npm:^1.2.0" - has-proto: "npm:^1.2.0" - is-typed-array: "npm:^1.1.14" - checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e - languageName: node - linkType: hard - -"typed-array-byte-offset@npm:^1.0.4": - version: 1.0.4 - resolution: "typed-array-byte-offset@npm:1.0.4" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" - for-each: "npm:^0.3.3" - gopd: "npm:^1.2.0" - has-proto: "npm:^1.2.0" - is-typed-array: "npm:^1.1.15" - reflect.getprototypeof: "npm:^1.0.9" - checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53 - languageName: node - linkType: hard - -"typed-array-length@npm:^1.0.7": - version: 1.0.7 - resolution: "typed-array-length@npm:1.0.7" - dependencies: - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - is-typed-array: "npm:^1.1.13" - possible-typed-array-names: "npm:^1.0.0" - reflect.getprototypeof: "npm:^1.0.6" - checksum: 10c0/e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295 - languageName: node - linkType: hard - -"typescript@npm:^5.7.3": - version: 5.7.3 - resolution: "typescript@npm:5.7.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/b7580d716cf1824736cc6e628ab4cd8b51877408ba2be0869d2866da35ef8366dd6ae9eb9d0851470a39be17cbd61df1126f9e211d8799d764ea7431d5435afa - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A^5.7.3#optional!builtin": - version: 5.7.3 - resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=5786d5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/6fd7e0ed3bf23a81246878c613423730c40e8bdbfec4c6e4d7bf1b847cbb39076e56ad5f50aa9d7ebd89877999abaee216002d3f2818885e41c907caaa192cc4 - languageName: node - linkType: hard - -"unbox-primitive@npm:^1.1.0": - version: 1.1.0 - resolution: "unbox-primitive@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.3" - has-bigints: "npm:^1.0.2" - has-symbols: "npm:^1.1.0" - which-boxed-primitive: "npm:^1.1.1" - checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982 - languageName: node - linkType: hard - -"undici-types@npm:~6.19.2": - version: 6.19.8 - resolution: "undici-types@npm:6.19.8" - checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 - languageName: node - linkType: hard - -"undici-types@npm:~6.20.0": - version: 6.20.0 - resolution: "undici-types@npm:6.20.0" - checksum: 10c0/68e659a98898d6a836a9a59e6adf14a5d799707f5ea629433e025ac90d239f75e408e2e5ff086afc3cace26f8b26ee52155293564593fbb4a2f666af57fc59bf - languageName: node - linkType: hard - -"unique-filename@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-filename@npm:4.0.0" - dependencies: - unique-slug: "npm:^5.0.0" - checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc - languageName: node - linkType: hard - -"unique-slug@npm:^5.0.0": - version: 5.0.0 - resolution: "unique-slug@npm:5.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 - languageName: node - linkType: hard - -"universalify@npm:^0.1.0": - version: 0.1.2 - resolution: "universalify@npm:0.1.2" - checksum: 10c0/e70e0339f6b36f34c9816f6bf9662372bd241714dc77508d231d08386d94f2c4aa1ba1318614f92015f40d45aae1b9075cd30bd490efbe39387b60a76ca3f045 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 - languageName: node - linkType: hard - -"uuid@npm:^11.0.5": - version: 11.0.5 - resolution: "uuid@npm:11.0.5" - bin: - uuid: dist/esm/bin/uuid - checksum: 10c0/6f59f0c605e02c14515401084ca124b9cb462b4dcac866916a49862bcf831874508a308588c23a7718269226ad11a92da29b39d761ad2b86e736623e3a33b6e7 - languageName: node - linkType: hard - -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 - languageName: node - linkType: hard - -"wcwidth@npm:^1.0.1": - version: 1.0.1 - resolution: "wcwidth@npm:1.0.1" - dependencies: - defaults: "npm:^1.0.3" - checksum: 10c0/5b61ca583a95e2dd85d7078400190efd452e05751a64accb8c06ce4db65d7e0b0cde9917d705e826a2e05cc2548f61efde115ffa374c3e436d04be45c889e5b4 - languageName: node - linkType: hard - -"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": - version: 1.1.1 - resolution: "which-boxed-primitive@npm:1.1.1" - dependencies: - is-bigint: "npm:^1.1.0" - is-boolean-object: "npm:^1.2.1" - is-number-object: "npm:^1.1.1" - is-string: "npm:^1.1.1" - is-symbol: "npm:^1.1.1" - checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe - languageName: node - linkType: hard - -"which-builtin-type@npm:^1.2.1": - version: 1.2.1 - resolution: "which-builtin-type@npm:1.2.1" - dependencies: - call-bound: "npm:^1.0.2" - function.prototype.name: "npm:^1.1.6" - has-tostringtag: "npm:^1.0.2" - is-async-function: "npm:^2.0.0" - is-date-object: "npm:^1.1.0" - is-finalizationregistry: "npm:^1.1.0" - is-generator-function: "npm:^1.0.10" - is-regex: "npm:^1.2.1" - is-weakref: "npm:^1.0.2" - isarray: "npm:^2.0.5" - which-boxed-primitive: "npm:^1.1.0" - which-collection: "npm:^1.0.2" - which-typed-array: "npm:^1.1.16" - checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471 - languageName: node - linkType: hard - -"which-collection@npm:^1.0.2": - version: 1.0.2 - resolution: "which-collection@npm:1.0.2" - dependencies: - is-map: "npm:^2.0.3" - is-set: "npm:^2.0.3" - is-weakmap: "npm:^2.0.2" - is-weakset: "npm:^2.0.3" - checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 - languageName: node - linkType: hard - -"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18": - version: 1.1.18 - resolution: "which-typed-array@npm:1.1.18" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - for-each: "npm:^0.3.3" - gopd: "npm:^1.2.0" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/0412f4a91880ca1a2a63056187c2e3de6b129b2b5b6c17bc3729f0f7041047ae48fb7424813e51506addb2c97320003ee18b8c57469d2cde37983ef62126143c - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: "npm:^2.0.0" - bin: - node-which: ./bin/node-which - checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f - languageName: node - linkType: hard - -"which@npm:^5.0.0": - version: 5.0.0 - resolution: "which@npm:5.0.0" - dependencies: - isexe: "npm:^3.1.1" - bin: - node-which: bin/which.js - checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b - languageName: node - linkType: hard - -"word-wrap@npm:^1.2.5": - version: 1.2.5 - resolution: "word-wrap@npm:1.2.5" - checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: "npm:^6.1.0" - string-width: "npm:^5.0.1" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - -"yallist@npm:^5.0.0": - version: 5.0.0 - resolution: "yallist@npm:5.0.0" - checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 - languageName: node - linkType: hard - -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 - languageName: node - linkType: hard - -"yargs@npm:^17.0.1": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: "npm:^8.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 - languageName: node - linkType: hard - -"yauzl@npm:^2.10.0": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" - dependencies: - buffer-crc32: "npm:~0.2.3" - fd-slicer: "npm:~1.1.0" - checksum: 10c0/f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 - languageName: node - linkType: hard - -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f - languageName: node - linkType: hard diff --git a/application/apps/rustcore/wasm-bindings/.gitignore b/application/apps/rustcore/wasm-bindings/.gitignore deleted file mode 100644 index ecc5d281d5..0000000000 --- a/application/apps/rustcore/wasm-bindings/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -test_output -package-lock.json - -!karma.conf.js diff --git a/application/apps/rustcore/wasm-bindings/.yarnrc.yml b/application/apps/rustcore/wasm-bindings/.yarnrc.yml deleted file mode 100644 index 3186f3f079..0000000000 --- a/application/apps/rustcore/wasm-bindings/.yarnrc.yml +++ /dev/null @@ -1 +0,0 @@ -nodeLinker: node-modules diff --git a/application/apps/rustcore/wasm-bindings/Cargo.lock b/application/apps/rustcore/wasm-bindings/Cargo.lock deleted file mode 100644 index c2b74b3d2c..0000000000 --- a/application/apps/rustcore/wasm-bindings/Cargo.lock +++ /dev/null @@ -1,465 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "ansi-to-html" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12e283a4fc285735ef99577e81a125f738429516161ac33977e466d0d8d40764" -dependencies = [ - "regex", - "thiserror", -] - -[[package]] -name = "bumpalo" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" - -[[package]] -name = "cc" -version = "1.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "fuzzy-matcher" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" -dependencies = [ - "thread_local", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "minicov" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" -dependencies = [ - "cc", - "walkdir", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "regex" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-wasm-bindgen" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" -dependencies = [ - "js-sys", - "serde", - "wasm-bindgen", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "strip-ansi-escapes" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a8f8038e7e7969abb3f1b7c2a811225e9296da208539e0f79c5251d6cac0025" -dependencies = [ - "vte", -] - -[[package]] -name = "syn" -version = "2.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "vte" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "231fdcd7ef3037e8330d8e17e61011a2c244126acc0a982f4040ac3f9f0bc077" -dependencies = [ - "memchr", -] - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-bindgen-test" -version = "0.3.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" -dependencies = [ - "js-sys", - "minicov", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-test-macro", -] - -[[package]] -name = "wasm-bindgen-test-macro" -version = "0.3.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "wasm-bindings" -version = "0.2.0" -dependencies = [ - "ansi-to-html", - "fuzzy-matcher", - "regex", - "serde", - "serde-wasm-bindgen", - "strip-ansi-escapes", - "wasm-bindgen", - "wasm-bindgen-test", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/application/apps/rustcore/wasm-bindings/Cargo.toml b/application/apps/rustcore/wasm-bindings/Cargo.toml deleted file mode 100644 index 62692e36e4..0000000000 --- a/application/apps/rustcore/wasm-bindings/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "wasm-bindings" -version = "0.2.0" -edition = "2024" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -crate-type = ["cdylib"] - -[dependencies] -ansi-to-html = { version = "0.2", features = ["lazy-init"] } -fuzzy-matcher = "0.3" -regex = "1" -serde = { version = "1.0", features = ["derive"] } -serde-wasm-bindgen = "0.6" -strip-ansi-escapes = "0.2" -wasm-bindgen = "0.2" -wasm-bindgen-test = "0.3" diff --git a/application/apps/rustcore/wasm-bindings/karma.conf.js b/application/apps/rustcore/wasm-bindings/karma.conf.js deleted file mode 100644 index 72f28c13fe..0000000000 --- a/application/apps/rustcore/wasm-bindings/karma.conf.js +++ /dev/null @@ -1,71 +0,0 @@ -const path = require("path"); -const WasmPackPlugin = require('@wasm-tool/wasm-pack-plugin'); - -const outputPath = path.resolve(__dirname, 'test_output'); -module.exports = function (config) { - config.set({ - - frameworks: ["jasmine"], - - mime: { - 'application/wasm': ['wasm'] - }, - - files: [ - - { pattern: "node_modules/expect.js/index.js" }, - { pattern: "spec/**/*.ts" }, - { - pattern: `${outputPath}/**/*`, // <-- here - watched: false, - included: false, - }, - ], - - webpack: { - mode: "development", - module: { - rules: [ - { - test: /\.ts$/, - exclude: /node_modules/, - use: "ts-loader", - } - ], - }, - output: { - path: outputPath, - }, - plugins: [ - new WasmPackPlugin({ - crateDirectory: __dirname, - outDir: "pkg" - }) - ], - resolve: { - extensions: [".tsx", ".ts", ".js", ".wasm"], - }, - experiments: { - asyncWebAssembly: true, - }, - - }, - - preprocessors: { - "**/*.ts": ["webpack"] - }, - - browsers: ['ChromeHeadless'], - customLaunchers: { - ChromeHeadlessCustom: { - base: 'ChromeHeadless', - flags: ['--no-sandbox', '--disable-gpu'] - } - }, - - exprContextCritical: false, - - singleRun: true - - }); -}; \ No newline at end of file diff --git a/application/apps/rustcore/wasm-bindings/package.json b/application/apps/rustcore/wasm-bindings/package.json deleted file mode 100644 index 049b38de0e..0000000000 --- a/application/apps/rustcore/wasm-bindings/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "wasm-bindings", - "version": "0.0.2", - "description": "Test env for wasm bindings", - "scripts": { - "build": "node_modules/.bin/webpack", - "start": "node_modules/.bin/webpack-dev-server", - "test": "node_modules/.bin/karma start", - "test_win": "node_modules\\.bin\\karma start" - }, - "author": "", - "license": "MIT", - "devDependencies": { - "@types/jasmine": "^5.1.5", - "@wasm-tool/wasm-pack-plugin": "^1.6.0", - "karma": "^6.4.0", - "karma-chrome-launcher": "^3.1.1", - "karma-jasmine": "^5.1.0", - "karma-spec-reporter": "^0.0.36", - "karma-typescript": "^5.5.3", - "karma-webpack": "^5.0.0", - "ts-loader": "^9.5.2", - "ts-node": "^10.8.2", - "typescript": "^5.7.3", - "webpack": "^5.97.1", - "webpack-cli": "^6.0.1", - "webpack-dev-server": "^5.2.0" - }, - "packageManager": "yarn@4.6.0" -} diff --git a/application/apps/rustcore/wasm-bindings/spec/ansi.spec.ts b/application/apps/rustcore/wasm-bindings/spec/ansi.spec.ts deleted file mode 100644 index 7ce6a0e2f8..0000000000 --- a/application/apps/rustcore/wasm-bindings/spec/ansi.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -describe('test', function () { - let wasm: typeof import('../pkg'); - - beforeAll(async function () { - wasm = await import('../pkg'); - }); - - it('converting', (done) => { - const { convert } = wasm; - const input = '

\x1b[1m Hello \x1b[31m world!

'; - const result = convert(input); - expect(result).toBe( - "<h1> Hello world! </h1>", - ); - done(); - }); - - it('escape', (done) => { - const { escape } = wasm; - const input = - '01-23 10:01:29.103 2116 2710 I chatty : uid=1000(system) Binder:2116_4 expire 4 lines'; - const result = escape(input); - const expected = - '01-23 10:01:29.103 2116 2710 I chatty : uid=1000(system) Binder:2116_4 expire 4 lines'; - expect(result).toEqual(expected); - done(); - }); -}); diff --git a/application/apps/rustcore/wasm-bindings/spec/filter.spec.ts b/application/apps/rustcore/wasm-bindings/spec/filter.spec.ts deleted file mode 100644 index 92bc30a378..0000000000 --- a/application/apps/rustcore/wasm-bindings/spec/filter.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ - -describe('test', function () { - let wasm: typeof import('../pkg'); - beforeAll(async function () { - wasm = await import('../pkg'); - }); - - it('valid regex', (done) => { - const { get_filter_error } = wasm; - const filter = '[Warn]'; - const caseSensitive = true; - const wholeWord = false; - const regex = true; - const result = get_filter_error(filter, caseSensitive, wholeWord, regex); - expect(result).toBeUndefined(); - done(); - }); - - it('invalid regex', (done) => { - const { get_filter_error } = wasm; - const filter = '[Warn(]\\)('; - const caseSensitive = false; - const wholeWord = true; - const regex = true; - const result = get_filter_error(filter, caseSensitive, wholeWord, regex); - expect(typeof result).toEqual('string'); - done(); - }); - - it('plain_string_regex_off', (done) => { - const { get_filter_error } = wasm; - const filter = 'Some random stuff written'; - const caseSensitive = true; - const wholeWord = false; - const regex = false; - const result = get_filter_error(filter, caseSensitive, wholeWord, regex); - expect(result).toBeUndefined(); - done(); - }); - - it('plain_string_regex_on', (done) => { - const { get_filter_error } = wasm; - const filter = 'Another bunch of random stuff'; - const caseSensitive = false; - const wholeWord = false; - const regex = true; - const result = get_filter_error(filter, caseSensitive, wholeWord, regex); - expect(result).toBeUndefined(); - done(); - }); -}); diff --git a/application/apps/rustcore/wasm-bindings/spec/matcher.spec.ts b/application/apps/rustcore/wasm-bindings/spec/matcher.spec.ts deleted file mode 100644 index d7258d2972..0000000000 --- a/application/apps/rustcore/wasm-bindings/spec/matcher.spec.ts +++ /dev/null @@ -1,152 +0,0 @@ -class Item { - private _name: string; - private _size: string; - private _path: string; - private _index!: number; - - constructor(name: string, size: string, path: string) { - this._name = name; - this._size = size; - this._path = path; - } - - public set index(i: number) { - this._index = i; - } - - public get index(): number { - return this._index; - } - - public get(): { [key: string]: string } { - return { - name: this._name, - size: this._size, - path: this._path, - }; - } -} - -describe('test', function () { - let wasm: typeof import('../pkg'); - beforeAll(async function () { - wasm = await import('../pkg'); - }); - - function test(expected: { [key: string]: string }[], query: string, tag?: string) { - const { Matcher } = wasm; - const matcher = Matcher.new(); - const items: Item[] = [ - new Item('very_large_file.dlt', '20gb', '/home/user/Desktop/very_large_file.dlt'), - new Item('small_file.log', '630kb', '/home/user/Desktop/small_file.log'), - new Item('medium_sized_file.txt', '15mb', '/home/user/Desktop/medium_sized_file.txt'), - ]; - items.forEach((item: Item) => { - item.index = matcher.set_item(item.get()); - }); - matcher.search(query, tag); - items.sort((a: Item, b: Item) => { - const a_score: number = a.index === undefined ? 0 : Number(matcher.get_score(a.index)); - const b_score: number = b.index === undefined ? 0 : Number(matcher.get_score(b.index)); - return b_score - a_score; - }); - items.forEach((item: Item, index: number) => { - const keys: string[] = Object.keys(item.get()); - keys.forEach((key: string) => { - expect(matcher.get_html_of(item.index, `html_${key}`)).toBe( - expected[index][`html_${key}`], - ); - }); - }); - } - - it('should all match', () => { - const expected: { [key: string]: string }[] = [ - { - html_name: 'very_large_file.dlt', - html_size: '20gb', - html_path: '/home/user/Desktop/very_large_file.dlt', - }, - { - html_name: 'small_file.log', - html_size: '630kb', - html_path: '/home/user/Desktop/small_file.log', - }, - { - html_name: 'medium_sized_file.txt', - html_size: '15mb', - html_path: '/home/user/Desktop/medium_sized_file.txt', - }, - ]; - const query: string = 'l'; - test(expected, query); - }); - - it('should not match', () => { - const expected: { [key: string]: string }[] = [ - { - html_name: 'very_large_file.dlt', - html_size: '20gb', - html_path: '/home/user/Desktop/very_large_file.dlt', - }, - { - html_name: 'small_file.log', - html_size: '630kb', - html_path: '/home/user/Desktop/small_file.log', - }, - { - html_name: 'medium_sized_file.txt', - html_size: '15mb', - html_path: '/home/user/Desktop/medium_sized_file.txt', - }, - ]; - const query: string = 'c'; - test(expected, query); - }); - - it('should scattered match', () => { - const expected: { [key: string]: string }[] = [ - { - html_name: 'medium_sized_file.txt', - html_size: '15mb', - html_path: '/home/user/Desktop/medium_sized_file.txt', - }, - { - html_name: 'small_file.log', - html_size: '630kb', - html_path: - '/home/user/Desktop/small_file.log', - }, - { - html_name: 'very_large_file.dlt', - html_size: '20gb', - html_path: '/home/user/Desktop/very_large_file.dlt', - }, - ]; - const query: string = 'mel'; - test(expected, query); - }); - - it('should match few', () => { - const expected: { [key: string]: string }[] = [ - { - html_name: 'very_lar

g

e_file.dlt', - html_size: '20

g

b', - html_path: '/home/user/Desktop/very_lar

g

e_file.dlt', - }, - { - html_name: 'small_file.lo

g

', - html_size: '630kb', - html_path: '/home/user/Desktop/small_file.lo

g

', - }, - { - html_name: 'medium_sized_file.txt', - html_size: '15mb', - html_path: '/home/user/Desktop/medium_sized_file.txt', - }, - ]; - const query: string = 'g'; - const tag: string = 'p'; - test(expected, query, tag); - }); -}); diff --git a/application/apps/rustcore/wasm-bindings/src/ansi.rs b/application/apps/rustcore/wasm-bindings/src/ansi.rs deleted file mode 100644 index fc896410e0..0000000000 --- a/application/apps/rustcore/wasm-bindings/src/ansi.rs +++ /dev/null @@ -1,244 +0,0 @@ -extern crate ansi_to_html; -extern crate strip_ansi_escapes; -extern crate wasm_bindgen; - -use regex::Regex; -use serde::{Deserialize, Serialize}; -use std::str; -use strip_ansi_escapes::strip_str; -use wasm_bindgen::prelude::*; -use wasm_bindgen_test::*; - -#[wasm_bindgen] -pub fn convert(input: &str) -> Result { - ansi_to_html::convert(input).map_err(|e| e.to_string()) -} - -#[wasm_bindgen] -pub fn escape(input: &str) -> Result { - Ok(strip_str(input)) -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct Slot { - pub from: usize, - pub to: usize, - pub color: Option, - pub background: Option, - pub bold: bool, - pub italic: bool, -} -impl Slot { - pub fn new(from: usize, to: usize, tag: String, mapper: &AnsiMapper) -> Self { - Slot { - from, - to, - color: mapper.get_color(&tag), - background: mapper.get_background(&tag), - bold: tag.starts_with(" bool { - &self.from == from && &self.to == to - } -} - -#[wasm_bindgen] -pub struct AnsiMapper { - color: Regex, - background: Regex, -} - -#[wasm_bindgen] -impl AnsiMapper { - #[wasm_bindgen] - pub fn new() -> Result { - Ok(AnsiMapper { - color: Regex::new(r"color:[^>]*?(#[\d\w]{1,})").map_err(|e| e.to_string())?, - background: Regex::new(r"background:[^>]*?(#[\d\w]{1,})").map_err(|e| e.to_string())?, - }) - } - #[wasm_bindgen] - pub fn get_map(&self, input: &str) -> Result { - let map = self.create_map(&convert(input)?)?; - serde_wasm_bindgen::to_value(&map).map_err(|e| e.to_string()) - } - - pub fn get_color(&self, input: &str) -> Option { - self.color.captures(input).map(|captures| { - if let Some(s) = captures.get(1) { - s.as_str().to_owned() - } else { - String::new() - } - }) - } - - pub fn get_background(&self, input: &str) -> Option { - self.background.captures(input).map(|captures| { - if let Some(s) = captures.get(1) { - s.as_str().to_owned() - } else { - String::new() - } - }) - } - - fn create_map(&self, input: &str) -> Result, String> { - let mut map: Vec<(usize, usize, String)> = Vec::new(); - let mut slots: Vec = Vec::new(); - let mut stack = Vec::new(); - let mut clean_length = 0; - let mut i = 0; - while i < input.len() { - // call of input[i..] unfriendly to Unicode, so we should make sure we are - // taking completed sequences - let Some(current) = input.get(i..) else { - clean_length += 1; - i += 1; - continue; - }; - if input[i..].starts_with('<') && !input[i..].starts_with("') { - let tag = ¤t[..=pos]; - stack.push((clean_length, tag.to_string())); - i += tag.len(); - } else { - return Err(String::from("Fail to find closing \">\" on opening tag")); - } - } else if input[i..].starts_with("') { - let tag = ¤t[..=pos]; - if let Some((start, tag)) = stack.pop() { - map.push((start, clean_length, tag)); - } - i += tag.len(); - } else { - return Err(String::from("Fail to find closing \">\" on closing tag")); - } - } else { - clean_length += 1; - i += 1; - } - } - for (from, to, _tag) in map.iter() { - if slots.iter().any(|s| s.is_same(from, to)) { - continue; - } - let tag = map - .iter() - .filter_map(|(start, end, tag)| { - if start == from && end == to { - Some(tag) - } else { - None - } - }) - .map(|s| s.as_str()) - .collect::>() - .join("|"); - slots.push(Slot::new(*from, *to, tag, self)) - } - Ok(slots) - } -} - -#[allow(dead_code)] -#[wasm_bindgen_test] -fn converting() { - assert_eq!( - convert("

\x1b[1m Hello \x1b[31m world!

") - .expect("Input string should be converted as well") - .as_str(), - "<h1> Hello world! </h1>" - ); -} - -#[allow(dead_code)] -#[wasm_bindgen_test] -fn error_handling() { - assert!( - convert("01-23 10:01:29.103 2116 2710 I chatty : uid=1000(system) Binder:2116_4 expire 4 lines").is_err() - ); -} - -#[allow(dead_code)] -#[wasm_bindgen_test] -fn escaping() { - assert_eq!( - escape("01-23 10:01:29.103 2116 2710 I chatty : uid=1000(system) Binder:2116_4 expire 4 lines") - .expect("Input string should be escaped as well") - .as_str(), - "01-23 10:01:29.103 2116 2710 I chatty : uid=1000(system) Binder:2116_4 expire 4 lines" - ); -} - -#[test] -fn creating_map() { - let mapper = AnsiMapper::new().expect("Asci mapper should be created"); - let cases = [ - ( - "01-23 10:01:25.642 2116 2711 I chatty : uid=1000(system) Binder:2116_5 expire 5 lines", - 0, - 88, - ), - ( - "01-23 10:01:25.642 2116 2711 I chatty : uid=1000(system) Binder:2116_5 expire 5 lines", - 0, - 18, - ), - ( - "01-23 10:01:25.642 2116 2711 I chatty : uid=1000(system) Binder:2116_5 expire 5 lines", - 15, - 18, - ), - ( - "01-23 10:01:25.642 2116 2711 I chatty : uid=1000(system) Binder:2116_5 expire 5 lines", - 83, - 88, - ), - ]; - cases.iter().for_each(|(content, from, to)| { - let converted = convert(content).expect("Input string should be parsed as well"); - let map = mapper.create_map(&converted).expect("Map should be built"); - assert_eq!(map.len(), 1); - assert_eq!(&map[0].from, from); - assert_eq!(&map[0].to, to); - assert_eq!(map[0].color, Some(String::from("#a0a"))); - assert_eq!(map[0].background, Some(String::from("#000"))); - }); - let cases = [( - "01-23 16:59:19.469 2116 5211 I chatty : uid=1000(system) Binder:2116_17 expire 2 lines", - 0, - 89, - )]; - cases.iter().for_each(|(content, from, to)| { - let converted = convert(content).expect("Input string should be parsed as well"); - let map = mapper.create_map(&converted).expect("Map should be built"); - assert_eq!(map.len(), 1); - assert_eq!(&map[0].from, from); - assert_eq!(&map[0].to, to); - assert!(map[0].color.is_some()); - assert!(map[0].background.is_none()); - }); - let cases = [ - ( - "lines01-23 10:01:25.642 2116 2711 I lineschatty : uid=1000(system) Binder:2116_5 expire 5 lines", - 3, - ), - ( - "lineslineslines01-23 10:01:25.642 2116 2711 I chatty : uid=1000(system) Binder:2116_5 expire 5 lines", - 4, - ), - ( - "lines01-23 10:01:25.642 lines2116 2711 I lineschatty : uid=1000(system) Binder:2116_5 expire 5 lines", - 4, - ), - ]; - cases.iter().for_each(|(content, count)| { - let converted = convert(content).expect("Input string should be parsed as well"); - let map = mapper.create_map(&converted).expect("Map should be built"); - assert_eq!(&map.len(), count); - }); -} diff --git a/application/apps/rustcore/wasm-bindings/src/filter.rs b/application/apps/rustcore/wasm-bindings/src/filter.rs deleted file mode 100644 index 1a4fab0816..0000000000 --- a/application/apps/rustcore/wasm-bindings/src/filter.rs +++ /dev/null @@ -1,84 +0,0 @@ -extern crate wasm_bindgen; - -use regex::Regex; -use std::str::FromStr; -use wasm_bindgen::prelude::*; -use wasm_bindgen_test::*; - -#[wasm_bindgen] -pub fn get_filter_error( - filter: String, - case_sensitive: bool, - whole_word: bool, - regex: bool, -) -> Option { - let regex_as_str = filter_as_regex(filter, case_sensitive, whole_word, regex); - Regex::from_str(®ex_as_str).map_or_else(|err| Some(err.to_string()), |_| None) -} - -fn filter_as_regex(filter: String, case_sensitive: bool, whole_word: bool, regex: bool) -> String { - let word_marker = if whole_word { "\\b" } else { "" }; - let ignore_case_start = if case_sensitive { "(?i)" } else { "" }; - let ignore_case_end = if case_sensitive { "(?-i)" } else { "" }; - let subject = if regex { - filter - } else { - regex::escape(&filter) - }; - format!("{ignore_case_start}{word_marker}{subject}{word_marker}{ignore_case_end}",) -} - -#[allow(dead_code)] -#[wasm_bindgen_test] -fn plain_string_regex_on() { - let filter = String::from("Some random filter"); - let case_sesitive = false; - let whole_word = false; - let regex = true; - assert_eq!( - get_filter_error(filter, case_sesitive, whole_word, regex), - None - ); -} - -#[allow(dead_code)] -#[wasm_bindgen_test] -fn plain_string_regex_off() { - let filter = String::from("Some random filter"); - let case_sesitive = false; - let whole_word = false; - let regex = false; - assert_eq!( - get_filter_error(filter, case_sesitive, whole_word, regex), - None - ); -} - -#[allow(dead_code)] -#[wasm_bindgen_test] -fn valid_regex() { - let filter = String::from(r"\[Warn\]"); - let case_sesitive = false; - let whole_word = false; - let regex = true; - assert_eq!( - get_filter_error(filter, case_sesitive, whole_word, regex), - None - ); -} - -#[allow(dead_code)] -#[wasm_bindgen_test] -fn invalid_regex() { - let filter = String::from(r"\[Warn(\]"); - let case_sesitive = false; - let whole_word = false; - let regex = true; - match get_filter_error(filter, case_sesitive, whole_word, regex) { - Some(result) => assert_eq!( - result, - "regex parse error:\n \\[Warn(\\]\n ^\nerror: unclosed group" - ), - None => panic!("Invalid regular expression should return error message"), - } -} diff --git a/application/apps/rustcore/wasm-bindings/src/lib.rs b/application/apps/rustcore/wasm-bindings/src/lib.rs deleted file mode 100644 index 330693e581..0000000000 --- a/application/apps/rustcore/wasm-bindings/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod ansi; -pub mod filter; -pub mod matcher; diff --git a/application/apps/rustcore/wasm-bindings/src/matcher.rs b/application/apps/rustcore/wasm-bindings/src/matcher.rs deleted file mode 100644 index 79bf54744e..0000000000 --- a/application/apps/rustcore/wasm-bindings/src/matcher.rs +++ /dev/null @@ -1,334 +0,0 @@ -extern crate fuzzy_matcher; -extern crate wasm_bindgen; - -use fuzzy_matcher::{FuzzyMatcher, skim::SkimMatcherV2}; -use std::{collections::HashMap, str::from_utf8}; -use wasm_bindgen::prelude::*; -use wasm_bindgen_test::*; - -#[wasm_bindgen] -pub struct Matcher { - matcher: SkimMatcherV2, - items_initial: Vec>, - items_scored: HashMap, i64)>, -} - -impl Default for Matcher { - fn default() -> Self { - Self::new() - } -} - -#[wasm_bindgen] -impl Matcher { - #[wasm_bindgen] - pub fn new() -> Self { - Self { - matcher: SkimMatcherV2::default(), - items_initial: Vec::new(), - items_scored: HashMap::new(), - } - } - - #[wasm_bindgen] - pub fn set_item(&mut self, item: JsValue) -> Result { - match serde_wasm_bindgen::from_value::>(item) { - Ok(item) => { - self.items_initial.push(item); - self.search(String::new(), None); - Ok(self.items_initial.len() - 1) - } - Err(err) => Err(format!("Parsing item into JSON String failed: {err}")), - } - } - - #[wasm_bindgen] - pub fn set_items(&mut self, items: JsValue) -> Result { - match serde_wasm_bindgen::from_value::>>(items) { - Ok(mut items) => { - let from = self.items_initial.len(); - self.items_initial.append(&mut items); - self.search(String::new(), None); - Ok(from) - } - Err(err) => Err(format!("Parsing item into JSON String failed: {err}")), - } - } - - #[wasm_bindgen] - pub fn len(&self) -> usize { - self.items_initial.len() - } - - #[wasm_bindgen] - pub fn is_empty(&self) -> bool { - self.items_initial.is_empty() - } - - #[wasm_bindgen] - pub fn search(&mut self, query: String, tag: Option) { - self.items_scored = HashMap::new(); - let mut total_score: i64; - let mut temp_hashmap: HashMap = HashMap::new(); - for (index, item) in self.items_initial.iter().enumerate() { - total_score = 0; - for (key, value) in item { - if query.is_empty() { - temp_hashmap.insert(key.clone(), value.clone()); - temp_hashmap.insert(format!("html_{key}"), value.to_string()); - total_score += (self.items_initial.len() - index) as i64; - } else { - match self.matcher.fuzzy_indices(value.as_str(), &query) { - Some(score) => { - let tagged_match = self.tag_match(value.to_owned(), score.1, &tag); - temp_hashmap.insert(key.clone(), value.to_owned()); - temp_hashmap.insert(format!("html_{key}"), tagged_match); - total_score += score.0; - } - None => { - temp_hashmap.insert(key.clone(), value.clone()); - temp_hashmap.insert(format!("html_{key}"), value.to_string()); - } - } - } - } - self.items_scored - .insert(index, (temp_hashmap.to_owned(), total_score)); - temp_hashmap.clear(); - } - } - - #[wasm_bindgen] - pub fn get_html_of(&self, index: usize, property: String) -> Option { - match self.items_scored.get(&index) { - Some(item) => item - .0 - .get(&property) - .as_ref() - .map(|html_value| html_value.to_string()), - None => None, - } - } - - #[wasm_bindgen] - pub fn get_score(&self, index: usize) -> i64 { - match self.items_scored.get(&index) { - Some(item) => item.1, - None => 0, - } - } - - fn tag_match(&self, mut value: String, indexes: Vec, tag: &Option) -> String { - let tag = tag.to_owned().unwrap_or_else(|| "span".to_string()); - let op_tag = format!("<{tag}>"); - let ed_tag = format!(""); - let value_clone = value.clone(); - let value_bytes = value_clone.as_bytes(); - let mut index = indexes.iter().rev(); - let mut start = 0; - let mut prev: usize = 0; - - if let Some(&curr) = index.next() { - start = curr; - prev = curr; - } - - for &curr in index { - if (curr + 1) != prev { - match from_utf8(&value_bytes[prev..start + 1]) { - Ok(substring) => { - value.replace_range( - prev..start + 1, - format!("{op_tag}{substring}{ed_tag}").as_str(), - ); - start = curr; - prev = curr; - } - Err(_err) => return value, - } - } else { - prev = curr; - } - } - match from_utf8(&value_bytes[prev..start + 1]) { - Ok(substring) => { - value.replace_range( - prev..start + 1, - format!("{op_tag}{substring}{ed_tag}").as_str(), - ); - value - } - Err(_err) => value, - } - } -} - -fn test(query: String, tag: Option, expected: Vec>) { - let mut matcher = Matcher::new(); - let items = Vec::from([ - HashMap::from([ - ("name", "very_large_file.dlt"), - ("size", "20gb"), - ("path", "/home/user/Desktop/very_large_file.dlt"), - ]), - HashMap::from([ - ("name", "medium_sized_file.txt"), - ("size", "15mb"), - ("path", "/home/user/Desktop/medium_sized_file.txt"), - ]), - HashMap::from([ - ("name", "small_file.log"), - ("size", "630kb"), - ("path", "/home/user/Desktop/small_file.log"), - ]), - ]); - for item in &items { - match serde_wasm_bindgen::to_value(&item) { - Ok(item) => { - if let Err(err) = matcher.set_item(item) { - panic!("{err}") - } - } - Err(err) => panic!("{err}"), - } - } - matcher.search(query, tag); - for (index, map) in expected.iter().enumerate() { - for (&key, &value) in map { - match matcher.get_html_of(index, key.to_string()) { - Some(html) => assert_eq!(html, value), - None => panic!("Failed to get html of {key}"), - } - } - } -} - -#[allow(dead_code)] -#[wasm_bindgen_test] -fn all_match() { - let query = "l".to_string(); - let tag: Option = None; - let expected = Vec::from([ - HashMap::from([ - ("html_name", "very_large_file.dlt"), - ("html_size", "20gb"), - ( - "html_path", - "/home/user/Desktop/very_large_file.dlt", - ), - ]), - HashMap::from([ - ("html_name", "medium_sized_file.txt"), - ("html_size", "15mb"), - ( - "html_path", - "/home/user/Desktop/medium_sized_file.txt", - ), - ]), - HashMap::from([ - ("html_name", "small_file.log"), - ("html_size", "630kb"), - ( - "html_path", - "/home/user/Desktop/small_file.log", - ), - ]), - ]); - test(query, tag, expected); -} - -#[allow(dead_code)] -#[wasm_bindgen_test] -fn no_match() { - let query = "c".to_string(); - let tag: Option = None; - let expected = Vec::from([ - HashMap::from([ - ("html_name", "very_large_file.dlt"), - ("html_size", "20gb"), - ("html_path", "/home/user/Desktop/very_large_file.dlt"), - ]), - HashMap::from([ - ("html_name", "medium_sized_file.txt"), - ("html_size", "15mb"), - ("html_path", "/home/user/Desktop/medium_sized_file.txt"), - ]), - HashMap::from([ - ("html_name", "small_file.log"), - ("html_size", "630kb"), - ("html_path", "/home/user/Desktop/small_file.log"), - ]), - ]); - test(query, tag, expected); -} - -#[allow(dead_code)] -#[wasm_bindgen_test] -fn scattered_match() { - let query = "mel".to_string(); - let tag: Option = None; - let expected = Vec::from([ - HashMap::from([ - ("html_name", "very_large_file.dlt"), - ("html_size", "20gb"), - ( - "html_path", - "/home/user/Desktop/very_large_file.dlt", - ), - ]), - HashMap::from([ - ( - "html_name", - "medium_sized_file.txt", - ), - ("html_size", "15mb"), - ( - "html_path", - "/home/user/Desktop/medium_sized_file.txt", - ), - ]), - HashMap::from([ - ( - "html_name", - "small_file.log", - ), - ("html_size", "630kb"), - ( - "html_path", - "/home/user/Desktop/small_file.log", - ), - ]), - ]); - test(query, tag, expected); -} - -#[allow(dead_code)] -#[wasm_bindgen_test] -fn few_match() { - let query = "g".to_string(); - let tag: Option = None; - let expected = Vec::from([ - HashMap::from([ - ("html_name", "very_large_file.dlt"), - ("html_size", "20gb"), - ( - "html_path", - "/home/user/Desktop/very_large_file.dlt", - ), - ]), - HashMap::from([ - ("html_name", "medium_sized_file.txt"), - ("html_size", "15mb"), - ("html_path", "/home/user/Desktop/medium_sized_file.txt"), - ]), - HashMap::from([ - ("html_name", "small_file.log"), - ("html_size", "630kb"), - ( - "html_path", - "/home/user/Desktop/small_file.log", - ), - ]), - ]); - test(query, tag, expected); -} diff --git a/application/apps/rustcore/wasm-bindings/tsconfig.json b/application/apps/rustcore/wasm-bindings/tsconfig.json deleted file mode 100644 index c84206e192..0000000000 --- a/application/apps/rustcore/wasm-bindings/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "forceConsistentCasingInFileNames": true, - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "sourceMap": true, - "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, - "moduleResolution": "node", - "importHelpers": true, - "target": "ESNext", - "module": "ESNext", - "lib": ["ESNext", "DOM"], - "outDir": "./dist/out-tsc" - }, - "include": ["spec/**/*"] -} diff --git a/application/apps/rustcore/wasm-bindings/webpack.config.js b/application/apps/rustcore/wasm-bindings/webpack.config.js deleted file mode 100644 index 70e1044a76..0000000000 --- a/application/apps/rustcore/wasm-bindings/webpack.config.js +++ /dev/null @@ -1,36 +0,0 @@ -const path = require("path"); -const WasmPackPlugin = require('@wasm-tool/wasm-pack-plugin'); - -module.exports = { - devtool: "inline-source-map", - devServer: { - static: path.join(__dirname, 'dist'), - compress: true - }, - mode: "none", - module: { - rules: [ - { - test: /\.ts$/, - exclude: /node_modules/, - use: "ts-loader", - } - ], - }, - output: { - filename: "bundle.js", - path: path.resolve(__dirname, "dist"), - }, - plugins: [ - new WasmPackPlugin({ - crateDirectory: __dirname, - outDir: "pkg" - }), - ], - resolve: { - extensions: [".tsx", ".ts", ".js", ".wasm"], - }, - experiments: { - asyncWebAssembly: true - }, -}; \ No newline at end of file diff --git a/application/apps/rustcore/wasm-bindings/yarn.lock b/application/apps/rustcore/wasm-bindings/yarn.lock deleted file mode 100644 index d66210cb0e..0000000000 --- a/application/apps/rustcore/wasm-bindings/yarn.lock +++ /dev/null @@ -1,5821 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10c0 - -"@ampproject/remapping@npm:^2.2.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2": - version: 7.26.2 - resolution: "@babel/code-frame@npm:7.26.2" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.9" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/compat-data@npm:7.26.5" - checksum: 10c0/9d2b41f0948c3dfc5de44d9f789d2208c2ea1fd7eb896dfbb297fe955e696728d6f363c600cd211e7f58ccbc2d834fe516bb1e4cf883bbabed8a32b038afc1a0 - languageName: node - linkType: hard - -"@babel/core@npm:^7.7.5": - version: 7.26.0 - resolution: "@babel/core@npm:7.26.0" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.26.0" - "@babel/generator": "npm:^7.26.0" - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helpers": "npm:^7.26.0" - "@babel/parser": "npm:^7.26.0" - "@babel/template": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.26.0" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/91de73a7ff5c4049fbc747930aa039300e4d2670c2a91f5aa622f1b4868600fc89b01b6278385fbcd46f9574186fa3d9b376a9e7538e50f8d118ec13cfbcb63e - languageName: node - linkType: hard - -"@babel/generator@npm:^7.26.0, @babel/generator@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/generator@npm:7.26.5" - dependencies: - "@babel/parser": "npm:^7.26.5" - "@babel/types": "npm:^7.26.5" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^3.0.2" - checksum: 10c0/3be79e0aa03f38858a465d12ee2e468320b9122dc44fc85984713e32f16f4d77ce34a16a1a9505972782590e0b8d847b6f373621f9c6fafa1906d90f31416cb0 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.25.9": - version: 7.26.5 - resolution: "@babel/helper-compilation-targets@npm:7.26.5" - dependencies: - "@babel/compat-data": "npm:^7.26.5" - "@babel/helper-validator-option": "npm:^7.25.9" - browserslist: "npm:^4.24.0" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/9da5c77e5722f1a2fcb3e893049a01d414124522bbf51323bb1a0c9dcd326f15279836450fc36f83c9e8a846f3c40e88be032ed939c5a9840922bed6073edfb4 - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-module-imports@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helper-module-transforms@npm:7.26.0" - dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-string-parser@npm:7.25.9" - checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-identifier@npm:7.25.9" - checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-option@npm:7.25.9" - checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helpers@npm:7.26.0" - dependencies: - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.26.0" - checksum: 10c0/343333cced6946fe46617690a1d0789346960910225ce359021a88a60a65bc0d791f0c5d240c0ed46cf8cc63b5fd7df52734ff14e43b9c32feae2b61b1647097 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/parser@npm:7.26.5" - dependencies: - "@babel/types": "npm:^7.26.5" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/2e77dd99ee028ee3c10fa03517ae1169f2432751adf71315e4dc0d90b61639d51760d622f418f6ac665ae4ea65f8485232a112ea0e76f18e5900225d3d19a61e - languageName: node - linkType: hard - -"@babel/template@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/template@npm:7.25.9" - dependencies: - "@babel/code-frame": "npm:^7.25.9" - "@babel/parser": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/ebe677273f96a36c92cc15b7aa7b11cc8bc8a3bb7a01d55b2125baca8f19cae94ff3ce15f1b1880fb8437f3a690d9f89d4e91f16fc1dc4d3eb66226d128983ab - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.25.9": - version: 7.26.5 - resolution: "@babel/traverse@npm:7.26.5" - dependencies: - "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.5" - "@babel/parser": "npm:^7.26.5" - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.26.5" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/0779059ecf63e31446564cf31adf170e701e8017ef02c819c57924a9a83d6b2ce41dbff3ef295589da9410497a3e575655bb8084ca470e0ab1bc193128afa9fe - languageName: node - linkType: hard - -"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/types@npm:7.26.5" - dependencies: - "@babel/helper-string-parser": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10c0/0278053b69d7c2b8573aa36dc5242cad95f0d965e1c0ed21ccacac6330092e59ba5949753448f6d6eccf6ad59baaef270295cc05218352e060ea8c68388638c4 - languageName: node - linkType: hard - -"@colors/colors@npm:1.5.0": - version: 1.5.0 - resolution: "@colors/colors@npm:1.5.0" - checksum: 10c0/eb42729851adca56d19a08e48d5a1e95efd2a32c55ae0323de8119052be0510d4b7a1611f2abcbf28c044a6c11e6b7d38f99fccdad7429300c37a8ea5fb95b44 - languageName: node - linkType: hard - -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": "npm:0.3.9" - checksum: 10c0/05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 - languageName: node - linkType: hard - -"@discoveryjs/json-ext@npm:^0.6.1": - version: 0.6.3 - resolution: "@discoveryjs/json-ext@npm:0.6.3" - checksum: 10c0/778a9f9d5c3696da3c1f9fa4186613db95a1090abbfb6c2601430645c0d0158cd5e4ba4f32c05904e2dd2747d57710f6aab22bd2f8aa3c4e8feab9b247c65d85 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e - languageName: node - linkType: hard - -"@isaacs/fs-minipass@npm:^4.0.0": - version: 4.0.1 - resolution: "@isaacs/fs-minipass@npm:4.0.1" - dependencies: - minipass: "npm:^7.0.4" - checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 - languageName: node - linkType: hard - -"@istanbuljs/schema@npm:^0.1.2": - version: 0.1.3 - resolution: "@istanbuljs/schema@npm:0.1.3" - checksum: 10c0/61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.8 - resolution: "@jridgewell/gen-mapping@npm:0.3.8" - dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 - languageName: node - linkType: hard - -"@jridgewell/source-map@npm:^0.3.3": - version: 0.3.6 - resolution: "@jridgewell/source-map@npm:0.3.6" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.0.3" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - checksum: 10c0/fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 - languageName: node - linkType: hard - -"@jsonjoy.com/base64@npm:^1.1.1": - version: 1.1.2 - resolution: "@jsonjoy.com/base64@npm:1.1.2" - peerDependencies: - tslib: 2 - checksum: 10c0/88717945f66dc89bf58ce75624c99fe6a5c9a0c8614e26d03e406447b28abff80c69fb37dabe5aafef1862cf315071ae66e5c85f6018b437d95f8d13d235e6eb - languageName: node - linkType: hard - -"@jsonjoy.com/json-pack@npm:^1.0.3": - version: 1.1.1 - resolution: "@jsonjoy.com/json-pack@npm:1.1.1" - dependencies: - "@jsonjoy.com/base64": "npm:^1.1.1" - "@jsonjoy.com/util": "npm:^1.1.2" - hyperdyperid: "npm:^1.2.0" - thingies: "npm:^1.20.0" - peerDependencies: - tslib: 2 - checksum: 10c0/fd0d8baa0c8eba536924540717901e0d7eed742576991033cceeb32dcce801ee0a4318cf6eb40b444c9e78f69ddbd4f38b9eb0041e9e54c17e7b6d1219b12e1d - languageName: node - linkType: hard - -"@jsonjoy.com/util@npm:^1.1.2, @jsonjoy.com/util@npm:^1.3.0": - version: 1.5.0 - resolution: "@jsonjoy.com/util@npm:1.5.0" - peerDependencies: - tslib: 2 - checksum: 10c0/0065ae12c4108d8aede01a479c8d2b5a39bce99e9a449d235befc753f57e8385d9c1115720529f26597840b7398d512898155423d9859fd638319fb0c827365d - languageName: node - linkType: hard - -"@leichtgewicht/ip-codec@npm:^2.0.1": - version: 2.0.5 - resolution: "@leichtgewicht/ip-codec@npm:2.0.5" - checksum: 10c0/14a0112bd59615eef9e3446fea018045720cd3da85a98f801a685a818b0d96ef2a1f7227e8d271def546b2e2a0fe91ef915ba9dc912ab7967d2317b1a051d66b - languageName: node - linkType: hard - -"@npmcli/agent@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/agent@npm:3.0.0" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/fs@npm:4.0.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-gnu@npm:4.9.5": - version: 4.9.5 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.9.5" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@socket.io/component-emitter@npm:~3.1.0": - version: 3.1.2 - resolution: "@socket.io/component-emitter@npm:3.1.2" - checksum: 10c0/c4242bad66f67e6f7b712733d25b43cbb9e19a595c8701c3ad99cbeb5901555f78b095e24852f862fffb43e96f1d8552e62def885ca82ae1bb05da3668fd87d7 - languageName: node - linkType: hard - -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node10@npm:1.0.11" - checksum: 10c0/28a0710e5d039e0de484bdf85fee883bfd3f6a8980601f4d44066b0a6bcd821d31c4e231d1117731c4e24268bd4cf2a788a6787c12fc7f8d11014c07d582783c - languageName: node - linkType: hard - -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 - languageName: node - linkType: hard - -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 - languageName: node - linkType: hard - -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.4 - resolution: "@tsconfig/node16@npm:1.0.4" - checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb - languageName: node - linkType: hard - -"@types/body-parser@npm:*": - version: 1.19.5 - resolution: "@types/body-parser@npm:1.19.5" - dependencies: - "@types/connect": "npm:*" - "@types/node": "npm:*" - checksum: 10c0/aebeb200f25e8818d8cf39cd0209026750d77c9b85381cdd8deeb50913e4d18a1ebe4b74ca9b0b4d21952511eeaba5e9fbbf739b52731a2061e206ec60d568df - languageName: node - linkType: hard - -"@types/bonjour@npm:^3.5.13": - version: 3.5.13 - resolution: "@types/bonjour@npm:3.5.13" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/eebedbca185ac3c39dd5992ef18d9e2a9f99e7f3c2f52f5561f90e9ed482c5d224c7962db95362712f580ed5713264e777a98d8f0bd8747f4eadf62937baed16 - languageName: node - linkType: hard - -"@types/connect-history-api-fallback@npm:^1.5.4": - version: 1.5.4 - resolution: "@types/connect-history-api-fallback@npm:1.5.4" - dependencies: - "@types/express-serve-static-core": "npm:*" - "@types/node": "npm:*" - checksum: 10c0/1b4035b627dcd714b05a22557f942e24a57ca48e7377dde0d2f86313fe685bc0a6566512a73257a55b5665b96c3041fb29228ac93331d8133011716215de8244 - languageName: node - linkType: hard - -"@types/connect@npm:*": - version: 3.4.38 - resolution: "@types/connect@npm:3.4.38" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c - languageName: node - linkType: hard - -"@types/cookie@npm:^0.4.1": - version: 0.4.1 - resolution: "@types/cookie@npm:0.4.1" - checksum: 10c0/f96afe12bd51be1ec61410b0641243d93fa3a494702407c787a4c872b5c8bcd39b224471452055e44a9ce42af1a636e87d161994226eaf4c2be9c30f60418409 - languageName: node - linkType: hard - -"@types/cors@npm:^2.8.12": - version: 2.8.17 - resolution: "@types/cors@npm:2.8.17" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/457364c28c89f3d9ed34800e1de5c6eaaf344d1bb39af122f013322a50bc606eb2aa6f63de4e41a7a08ba7ef454473926c94a830636723da45bf786df032696d - languageName: node - linkType: hard - -"@types/eslint-scope@npm:^3.7.7": - version: 3.7.7 - resolution: "@types/eslint-scope@npm:3.7.7" - dependencies: - "@types/eslint": "npm:*" - "@types/estree": "npm:*" - checksum: 10c0/a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc - languageName: node - linkType: hard - -"@types/eslint@npm:*": - version: 9.6.1 - resolution: "@types/eslint@npm:9.6.1" - dependencies: - "@types/estree": "npm:*" - "@types/json-schema": "npm:*" - checksum: 10c0/69ba24fee600d1e4c5abe0df086c1a4d798abf13792d8cfab912d76817fe1a894359a1518557d21237fbaf6eda93c5ab9309143dee4c59ef54336d1b3570420e - languageName: node - linkType: hard - -"@types/estree@npm:*, @types/estree@npm:^1.0.6": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a - languageName: node - linkType: hard - -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0": - version: 5.0.5 - resolution: "@types/express-serve-static-core@npm:5.0.5" - dependencies: - "@types/node": "npm:*" - "@types/qs": "npm:*" - "@types/range-parser": "npm:*" - "@types/send": "npm:*" - checksum: 10c0/0b27f62835f55d061a41718c9eae5caf533f08a4d1f23107f15f929c64013e8ba43afc110a198bd70196ed2925932bdbd9da2cca802c7be8fc6ec0cc4292833d - languageName: node - linkType: hard - -"@types/express-serve-static-core@npm:^4.17.33": - version: 4.19.6 - resolution: "@types/express-serve-static-core@npm:4.19.6" - dependencies: - "@types/node": "npm:*" - "@types/qs": "npm:*" - "@types/range-parser": "npm:*" - "@types/send": "npm:*" - checksum: 10c0/4281f4ead71723f376b3ddf64868ae26244d434d9906c101cf8d436d4b5c779d01bd046e4ea0ed1a394d3e402216fabfa22b1fa4dba501061cd7c81c54045983 - languageName: node - linkType: hard - -"@types/express@npm:*": - version: 5.0.0 - resolution: "@types/express@npm:5.0.0" - dependencies: - "@types/body-parser": "npm:*" - "@types/express-serve-static-core": "npm:^5.0.0" - "@types/qs": "npm:*" - "@types/serve-static": "npm:*" - checksum: 10c0/0d74b53aefa69c3b3817ee9b5145fd50d7dbac52a8986afc2d7500085c446656d0b6dc13158c04e2d9f18f4324d4d93b0452337c5ff73dd086dca3e4ff11f47b - languageName: node - linkType: hard - -"@types/express@npm:^4.17.21": - version: 4.17.21 - resolution: "@types/express@npm:4.17.21" - dependencies: - "@types/body-parser": "npm:*" - "@types/express-serve-static-core": "npm:^4.17.33" - "@types/qs": "npm:*" - "@types/serve-static": "npm:*" - checksum: 10c0/12e562c4571da50c7d239e117e688dc434db1bac8be55613294762f84fd77fbd0658ccd553c7d3ab02408f385bc93980992369dd30e2ecd2c68c358e6af8fabf - languageName: node - linkType: hard - -"@types/http-errors@npm:*": - version: 2.0.4 - resolution: "@types/http-errors@npm:2.0.4" - checksum: 10c0/494670a57ad4062fee6c575047ad5782506dd35a6b9ed3894cea65830a94367bd84ba302eb3dde331871f6d70ca287bfedb1b2cf658e6132cd2cbd427ab56836 - languageName: node - linkType: hard - -"@types/http-proxy@npm:^1.17.8": - version: 1.17.15 - resolution: "@types/http-proxy@npm:1.17.15" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/e2bf2fcdf23c88141b8d2c85ed5e5418b62ef78285884a2b5a717af55f4d9062136aa475489d10292093343df58fb81975f34bebd6b9df322288fd9821cbee07 - languageName: node - linkType: hard - -"@types/jasmine@npm:^5.1.5": - version: 5.1.5 - resolution: "@types/jasmine@npm:5.1.5" - checksum: 10c0/904a2a6bfe7478478ec73d502708dc4b4cc46fa554c459cee3e0be01efda96fba7d26ef8bec2f246d9163cc517407b135acabcf6f076c11aa514ed9b79bc67e5 - languageName: node - linkType: hard - -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.15 - resolution: "@types/json-schema@npm:7.0.15" - checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db - languageName: node - linkType: hard - -"@types/mime@npm:^1": - version: 1.3.5 - resolution: "@types/mime@npm:1.3.5" - checksum: 10c0/c2ee31cd9b993804df33a694d5aa3fa536511a49f2e06eeab0b484fef59b4483777dbb9e42a4198a0809ffbf698081fdbca1e5c2218b82b91603dfab10a10fbc - languageName: node - linkType: hard - -"@types/node-forge@npm:^1.3.0": - version: 1.3.11 - resolution: "@types/node-forge@npm:1.3.11" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/3d7d23ca0ba38ac0cf74028393bd70f31169ab9aba43f21deb787840170d307d662644bac07287495effe2812ddd7ac8a14dbd43f16c2936bbb06312e96fc3b9 - languageName: node - linkType: hard - -"@types/node@npm:*, @types/node@npm:>=10.0.0": - version: 22.10.7 - resolution: "@types/node@npm:22.10.7" - dependencies: - undici-types: "npm:~6.20.0" - checksum: 10c0/c941b4689dfc4044b64a5f601306cbcb0c7210be853ba378a5dd44137898c45accedd796ee002ad9407024cac7ecaf5049304951cb1d80ce3d7cebbbae56f20e - languageName: node - linkType: hard - -"@types/qs@npm:*": - version: 6.9.18 - resolution: "@types/qs@npm:6.9.18" - checksum: 10c0/790b9091348e06dde2c8e4118b5771ab386a8c22a952139a2eb0675360a2070d0b155663bf6f75b23f258fd0a1f7ffc0ba0f059d99a719332c03c40d9e9cd63b - languageName: node - linkType: hard - -"@types/range-parser@npm:*": - version: 1.2.7 - resolution: "@types/range-parser@npm:1.2.7" - checksum: 10c0/361bb3e964ec5133fa40644a0b942279ed5df1949f21321d77de79f48b728d39253e5ce0408c9c17e4e0fd95ca7899da36841686393b9f7a1e209916e9381a3c - languageName: node - linkType: hard - -"@types/retry@npm:0.12.2": - version: 0.12.2 - resolution: "@types/retry@npm:0.12.2" - checksum: 10c0/07481551a988cc90b423351919928b9ddcd14e3f5591cac3ab950851bb20646e55a10e89141b38bc3093d2056d4df73700b22ff2612976ac86a6367862381884 - languageName: node - linkType: hard - -"@types/send@npm:*": - version: 0.17.4 - resolution: "@types/send@npm:0.17.4" - dependencies: - "@types/mime": "npm:^1" - "@types/node": "npm:*" - checksum: 10c0/7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c - languageName: node - linkType: hard - -"@types/serve-index@npm:^1.9.4": - version: 1.9.4 - resolution: "@types/serve-index@npm:1.9.4" - dependencies: - "@types/express": "npm:*" - checksum: 10c0/94c1b9e8f1ea36a229e098e1643d5665d9371f8c2658521718e259130a237c447059b903bac0dcc96ee2c15fd63f49aa647099b7d0d437a67a6946527a837438 - languageName: node - linkType: hard - -"@types/serve-static@npm:*, @types/serve-static@npm:^1.15.5": - version: 1.15.7 - resolution: "@types/serve-static@npm:1.15.7" - dependencies: - "@types/http-errors": "npm:*" - "@types/node": "npm:*" - "@types/send": "npm:*" - checksum: 10c0/26ec864d3a626ea627f8b09c122b623499d2221bbf2f470127f4c9ebfe92bd8a6bb5157001372d4c4bd0dd37a1691620217d9dc4df5aa8f779f3fd996b1c60ae - languageName: node - linkType: hard - -"@types/sockjs@npm:^0.3.36": - version: 0.3.36 - resolution: "@types/sockjs@npm:0.3.36" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/b20b7820ee813f22de4f2ce98bdd12c68c930e016a8912b1ed967595ac0d8a4cbbff44f4d486dd97f77f5927e7b5725bdac7472c9ec5b27f53a5a13179f0612f - languageName: node - linkType: hard - -"@types/ws@npm:^8.5.10": - version: 8.5.13 - resolution: "@types/ws@npm:8.5.13" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/a5430aa479bde588e69cb9175518d72f9338b6999e3b2ae16fc03d3bdcff8347e486dc031e4ed14601260463c07e1f9a0d7511dfc653712b047c439c680b0b34 - languageName: node - linkType: hard - -"@wasm-tool/wasm-pack-plugin@npm:^1.6.0": - version: 1.7.0 - resolution: "@wasm-tool/wasm-pack-plugin@npm:1.7.0" - dependencies: - chalk: "npm:^2.4.1" - command-exists: "npm:^1.2.7" - watchpack: "npm:^2.1.1" - which: "npm:^2.0.2" - checksum: 10c0/657942706a742d914914ecf390ac498a44f556f296f54407813b9e9562bbbbd54360b598b72057d441de7f56f1a4f5d2d5edc9dc1b69772000bacb39d9ca39bc - languageName: node - linkType: hard - -"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/ast@npm:1.14.1" - dependencies: - "@webassemblyjs/helper-numbers": "npm:1.13.2" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" - checksum: 10c0/67a59be8ed50ddd33fbb2e09daa5193ac215bf7f40a9371be9a0d9797a114d0d1196316d2f3943efdb923a3d809175e1563a3cb80c814fb8edccd1e77494972b - languageName: node - linkType: hard - -"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" - checksum: 10c0/0e88bdb8b50507d9938be64df0867f00396b55eba9df7d3546eb5dc0ca64d62e06f8d881ec4a6153f2127d0f4c11d102b6e7d17aec2f26bb5ff95a5e60652412 - languageName: node - linkType: hard - -"@webassemblyjs/helper-api-error@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" - checksum: 10c0/31be497f996ed30aae4c08cac3cce50c8dcd5b29660383c0155fce1753804fc55d47fcba74e10141c7dd2899033164e117b3bcfcda23a6b043e4ded4f1003dfb - languageName: node - linkType: hard - -"@webassemblyjs/helper-buffer@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" - checksum: 10c0/0d54105dc373c0fe6287f1091e41e3a02e36cdc05e8cf8533cdc16c59ff05a646355415893449d3768cda588af451c274f13263300a251dc11a575bc4c9bd210 - languageName: node - linkType: hard - -"@webassemblyjs/helper-numbers@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" - dependencies: - "@webassemblyjs/floating-point-hex-parser": "npm:1.13.2" - "@webassemblyjs/helper-api-error": "npm:1.13.2" - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/9c46852f31b234a8fb5a5a9d3f027bc542392a0d4de32f1a9c0075d5e8684aa073cb5929b56df565500b3f9cc0a2ab983b650314295b9bf208d1a1651bfc825a - languageName: node - linkType: hard - -"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" - checksum: 10c0/c4355d14f369b30cf3cbdd3acfafc7d0488e086be6d578e3c9780bd1b512932352246be96e034e2a7fcfba4f540ec813352f312bfcbbfe5bcfbf694f82ccc682 - languageName: node - linkType: hard - -"@webassemblyjs/helper-wasm-section@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": "npm:1.14.1" - "@webassemblyjs/helper-buffer": "npm:1.14.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" - "@webassemblyjs/wasm-gen": "npm:1.14.1" - checksum: 10c0/1f9b33731c3c6dbac3a9c483269562fa00d1b6a4e7133217f40e83e975e636fd0f8736e53abd9a47b06b66082ecc976c7384391ab0a68e12d509ea4e4b948d64 - languageName: node - linkType: hard - -"@webassemblyjs/ieee754@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/ieee754@npm:1.13.2" - dependencies: - "@xtuc/ieee754": "npm:^1.2.0" - checksum: 10c0/2e732ca78c6fbae3c9b112f4915d85caecdab285c0b337954b180460290ccd0fb00d2b1dc4bb69df3504abead5191e0d28d0d17dfd6c9d2f30acac8c4961c8a7 - languageName: node - linkType: hard - -"@webassemblyjs/leb128@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/leb128@npm:1.13.2" - dependencies: - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/dad5ef9e383c8ab523ce432dfd80098384bf01c45f70eb179d594f85ce5db2f80fa8c9cba03adafd85684e6d6310f0d3969a882538975989919329ac4c984659 - languageName: node - linkType: hard - -"@webassemblyjs/utf8@npm:1.13.2": - version: 1.13.2 - resolution: "@webassemblyjs/utf8@npm:1.13.2" - checksum: 10c0/d3fac9130b0e3e5a1a7f2886124a278e9323827c87a2b971e6d0da22a2ba1278ac9f66a4f2e363ecd9fac8da42e6941b22df061a119e5c0335f81006de9ee799 - languageName: node - linkType: hard - -"@webassemblyjs/wasm-edit@npm:^1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": "npm:1.14.1" - "@webassemblyjs/helper-buffer": "npm:1.14.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" - "@webassemblyjs/helper-wasm-section": "npm:1.14.1" - "@webassemblyjs/wasm-gen": "npm:1.14.1" - "@webassemblyjs/wasm-opt": "npm:1.14.1" - "@webassemblyjs/wasm-parser": "npm:1.14.1" - "@webassemblyjs/wast-printer": "npm:1.14.1" - checksum: 10c0/5ac4781086a2ca4b320bdbfd965a209655fe8a208ca38d89197148f8597e587c9a2c94fb6bd6f1a7dbd4527c49c6844fcdc2af981f8d793a97bf63a016aa86d2 - languageName: node - linkType: hard - -"@webassemblyjs/wasm-gen@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": "npm:1.14.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" - "@webassemblyjs/ieee754": "npm:1.13.2" - "@webassemblyjs/leb128": "npm:1.13.2" - "@webassemblyjs/utf8": "npm:1.13.2" - checksum: 10c0/d678810d7f3f8fecb2e2bdadfb9afad2ec1d2bc79f59e4711ab49c81cec578371e22732d4966f59067abe5fba8e9c54923b57060a729d28d408e608beef67b10 - languageName: node - linkType: hard - -"@webassemblyjs/wasm-opt@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": "npm:1.14.1" - "@webassemblyjs/helper-buffer": "npm:1.14.1" - "@webassemblyjs/wasm-gen": "npm:1.14.1" - "@webassemblyjs/wasm-parser": "npm:1.14.1" - checksum: 10c0/515bfb15277ee99ba6b11d2232ddbf22aed32aad6d0956fe8a0a0a004a1b5a3a277a71d9a3a38365d0538ac40d1b7b7243b1a244ad6cd6dece1c1bb2eb5de7ee - languageName: node - linkType: hard - -"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": "npm:1.14.1" - "@webassemblyjs/helper-api-error": "npm:1.13.2" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" - "@webassemblyjs/ieee754": "npm:1.13.2" - "@webassemblyjs/leb128": "npm:1.13.2" - "@webassemblyjs/utf8": "npm:1.13.2" - checksum: 10c0/95427b9e5addbd0f647939bd28e3e06b8deefdbdadcf892385b5edc70091bf9b92fa5faac3fce8333554437c5d85835afef8c8a7d9d27ab6ba01ffab954db8c6 - languageName: node - linkType: hard - -"@webassemblyjs/wast-printer@npm:1.14.1": - version: 1.14.1 - resolution: "@webassemblyjs/wast-printer@npm:1.14.1" - dependencies: - "@webassemblyjs/ast": "npm:1.14.1" - "@xtuc/long": "npm:4.2.2" - checksum: 10c0/8d7768608996a052545251e896eac079c98e0401842af8dd4de78fba8d90bd505efb6c537e909cd6dae96e09db3fa2e765a6f26492553a675da56e2db51f9d24 - languageName: node - linkType: hard - -"@webpack-cli/configtest@npm:^3.0.1": - version: 3.0.1 - resolution: "@webpack-cli/configtest@npm:3.0.1" - peerDependencies: - webpack: ^5.82.0 - webpack-cli: 6.x.x - checksum: 10c0/edd24ecfc429298fe86446f7d7daedfe82d72e7f6236c81420605484fdadade5d59c6bcef3d76bd724e11d9727f74e75de183223ae62d3a568b2d54199688cbe - languageName: node - linkType: hard - -"@webpack-cli/info@npm:^3.0.1": - version: 3.0.1 - resolution: "@webpack-cli/info@npm:3.0.1" - peerDependencies: - webpack: ^5.82.0 - webpack-cli: 6.x.x - checksum: 10c0/b23b94e7dc8c93e79248f20d5f1bd0fbb7b9ba4b012803e2fdc5440b8f2ee1f3eca7f4933bbca346c8168673bf572b1858169a3cb2c17d9b8bcd833d480c2170 - languageName: node - linkType: hard - -"@webpack-cli/serve@npm:^3.0.1": - version: 3.0.1 - resolution: "@webpack-cli/serve@npm:3.0.1" - peerDependencies: - webpack: ^5.82.0 - webpack-cli: 6.x.x - peerDependenciesMeta: - webpack-dev-server: - optional: true - checksum: 10c0/65245e45bfa35e11a5b30631b99cfed0c1b39b2cc8320fa2d2a4185264535618827d349ec032c58af4201d6236cbc43bec894fcb840fdd06314611537a80e210 - languageName: node - linkType: hard - -"@xtuc/ieee754@npm:^1.2.0": - version: 1.2.0 - resolution: "@xtuc/ieee754@npm:1.2.0" - checksum: 10c0/a8565d29d135039bd99ae4b2220d3e167d22cf53f867e491ed479b3f84f895742d0097f935b19aab90265a23d5d46711e4204f14c479ae3637fbf06c4666882f - languageName: node - linkType: hard - -"@xtuc/long@npm:4.2.2": - version: 4.2.2 - resolution: "@xtuc/long@npm:4.2.2" - checksum: 10c0/8582cbc69c79ad2d31568c412129bf23d2b1210a1dfb60c82d5a1df93334da4ee51f3057051658569e2c196d8dc33bc05ae6b974a711d0d16e801e1d0647ccd1 - languageName: node - linkType: hard - -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 - languageName: node - linkType: hard - -"accepts@npm:~1.3.4, accepts@npm:~1.3.8": - version: 1.3.8 - resolution: "accepts@npm:1.3.8" - dependencies: - mime-types: "npm:~2.1.34" - negotiator: "npm:0.6.3" - checksum: 10c0/3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 - languageName: node - linkType: hard - -"acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1": - version: 8.3.4 - resolution: "acorn-walk@npm:8.3.4" - dependencies: - acorn: "npm:^8.11.0" - checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 - languageName: node - linkType: hard - -"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.8.2": - version: 8.14.0 - resolution: "acorn@npm:8.14.0" - bin: - acorn: bin/acorn - checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 - languageName: node - linkType: hard - -"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.3 - resolution: "agent-base@npm:7.1.3" - checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 - languageName: node - linkType: hard - -"ajv-formats@npm:^2.1.1": - version: 2.1.1 - resolution: "ajv-formats@npm:2.1.1" - dependencies: - ajv: "npm:^8.0.0" - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - checksum: 10c0/e43ba22e91b6a48d96224b83d260d3a3a561b42d391f8d3c6d2c1559f9aa5b253bfb306bc94bbeca1d967c014e15a6efe9a207309e95b3eaae07fcbcdc2af662 - languageName: node - linkType: hard - -"ajv-keywords@npm:^3.5.2": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" - peerDependencies: - ajv: ^6.9.1 - checksum: 10c0/0c57a47cbd656e8cdfd99d7c2264de5868918ffa207c8d7a72a7f63379d4333254b2ba03d69e3c035e996a3fd3eb6d5725d7a1597cca10694296e32510546360 - languageName: node - linkType: hard - -"ajv-keywords@npm:^5.1.0": - version: 5.1.0 - resolution: "ajv-keywords@npm:5.1.0" - dependencies: - fast-deep-equal: "npm:^3.1.3" - peerDependencies: - ajv: ^8.8.2 - checksum: 10c0/18bec51f0171b83123ba1d8883c126e60c6f420cef885250898bf77a8d3e65e3bfb9e8564f497e30bdbe762a83e0d144a36931328616a973ee669dc74d4a9590 - languageName: node - linkType: hard - -"ajv@npm:^6.12.5": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 - languageName: node - linkType: hard - -"ajv@npm:^8.0.0, ajv@npm:^8.9.0": - version: 8.17.1 - resolution: "ajv@npm:8.17.1" - dependencies: - fast-deep-equal: "npm:^3.1.3" - fast-uri: "npm:^3.0.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - checksum: 10c0/ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 - languageName: node - linkType: hard - -"ansi-html-community@npm:^0.0.8": - version: 0.0.8 - resolution: "ansi-html-community@npm:0.0.8" - bin: - ansi-html: bin/ansi-html - checksum: 10c0/45d3a6f0b4f10b04fdd44bef62972e2470bfd917bf00439471fa7473d92d7cbe31369c73db863cc45dda115cb42527f39e232e9256115534b8ee5806b0caeed4 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10c0/ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: "npm:^2.0.1" - checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c - languageName: node - linkType: hard - -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: "npm:^3.0.0" - picomatch: "npm:^2.0.4" - checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a - languageName: node - linkType: hard - -"array-flatten@npm:1.1.1": - version: 1.1.1 - resolution: "array-flatten@npm:1.1.1" - checksum: 10c0/806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 - languageName: node - linkType: hard - -"asn1.js@npm:^4.10.1": - version: 4.10.1 - resolution: "asn1.js@npm:4.10.1" - dependencies: - bn.js: "npm:^4.0.0" - inherits: "npm:^2.0.1" - minimalistic-assert: "npm:^1.0.0" - checksum: 10c0/afa7f3ab9e31566c80175a75b182e5dba50589dcc738aa485be42bdd787e2a07246a4b034d481861123cbe646a7656f318f4f1cad2e9e5e808a210d5d6feaa88 - languageName: node - linkType: hard - -"assert@npm:^2.0.0": - version: 2.1.0 - resolution: "assert@npm:2.1.0" - dependencies: - call-bind: "npm:^1.0.2" - is-nan: "npm:^1.3.2" - object-is: "npm:^1.1.5" - object.assign: "npm:^4.1.4" - util: "npm:^0.12.5" - checksum: 10c0/7271a5da883c256a1fa690677bf1dd9d6aa882139f2bed1cd15da4f9e7459683e1da8e32a203d6cc6767e5e0f730c77a9532a87b896b4b0af0dd535f668775f0 - languageName: node - linkType: hard - -"async@npm:^3.0.1": - version: 3.2.6 - resolution: "async@npm:3.2.6" - checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 - languageName: node - linkType: hard - -"available-typed-arrays@npm:^1.0.7": - version: 1.0.7 - resolution: "available-typed-arrays@npm:1.0.7" - dependencies: - possible-typed-array-names: "npm:^1.0.0" - checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee - languageName: node - linkType: hard - -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - -"base64id@npm:2.0.0, base64id@npm:~2.0.0": - version: 2.0.0 - resolution: "base64id@npm:2.0.0" - checksum: 10c0/6919efd237ed44b9988cbfc33eca6f173a10e810ce50292b271a1a421aac7748ef232a64d1e6032b08f19aae48dce6ee8f66c5ae2c9e5066c82b884861d4d453 - languageName: node - linkType: hard - -"batch@npm:0.6.1": - version: 0.6.1 - resolution: "batch@npm:0.6.1" - checksum: 10c0/925a13897b4db80d4211082fe287bcf96d297af38e26448c857cee3e095c9792e3b8f26b37d268812e7f38a589f694609de8534a018b1937d7dc9f84e6b387c5 - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.3.0 - resolution: "binary-extensions@npm:2.3.0" - checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5 - languageName: node - linkType: hard - -"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.9": - version: 4.12.1 - resolution: "bn.js@npm:4.12.1" - checksum: 10c0/b7f37a0cd5e4b79142b6f4292d518b416be34ae55d6dd6b0f66f96550c8083a50ffbbf8bda8d0ab471158cb81aa74ea4ee58fe33c7802e4a30b13810e98df116 - languageName: node - linkType: hard - -"bn.js@npm:^5.2.1": - version: 5.2.1 - resolution: "bn.js@npm:5.2.1" - checksum: 10c0/bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa - languageName: node - linkType: hard - -"body-parser@npm:1.20.3, body-parser@npm:^1.19.0": - version: 1.20.3 - resolution: "body-parser@npm:1.20.3" - dependencies: - bytes: "npm:3.1.2" - content-type: "npm:~1.0.5" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - on-finished: "npm:2.4.1" - qs: "npm:6.13.0" - raw-body: "npm:2.5.2" - type-is: "npm:~1.6.18" - unpipe: "npm:1.0.0" - checksum: 10c0/0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 - languageName: node - linkType: hard - -"bonjour-service@npm:^1.2.1": - version: 1.3.0 - resolution: "bonjour-service@npm:1.3.0" - dependencies: - fast-deep-equal: "npm:^3.1.3" - multicast-dns: "npm:^7.2.5" - checksum: 10c0/5721fd9f9bb968e9cc16c1e8116d770863dd2329cb1f753231de1515870648c225142b7eefa71f14a5c22bc7b37ddd7fdeb018700f28a8c936d50d4162d433c7 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f - languageName: node - linkType: hard - -"braces@npm:^3.0.2, braces@npm:^3.0.3, braces@npm:~3.0.2": - version: 3.0.3 - resolution: "braces@npm:3.0.3" - dependencies: - fill-range: "npm:^7.1.1" - checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 - languageName: node - linkType: hard - -"brorand@npm:^1.0.1, brorand@npm:^1.1.0": - version: 1.1.0 - resolution: "brorand@npm:1.1.0" - checksum: 10c0/6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 - languageName: node - linkType: hard - -"browser-resolve@npm:^2.0.0": - version: 2.0.0 - resolution: "browser-resolve@npm:2.0.0" - dependencies: - resolve: "npm:^1.17.0" - checksum: 10c0/06c43adf3cb1939825ab9a4ac355b23272820ee421a20d04f62e0dabd9ea305e497b97f3ac027f87d53c366483aafe8673bbe1aaa5e41cd69eeafa65ac5fda6e - languageName: node - linkType: hard - -"browserify-aes@npm:^1.0.4, browserify-aes@npm:^1.2.0": - version: 1.2.0 - resolution: "browserify-aes@npm:1.2.0" - dependencies: - buffer-xor: "npm:^1.0.3" - cipher-base: "npm:^1.0.0" - create-hash: "npm:^1.1.0" - evp_bytestokey: "npm:^1.0.3" - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/967f2ae60d610b7b252a4cbb55a7a3331c78293c94b4dd9c264d384ca93354c089b3af9c0dd023534efdc74ffbc82510f7ad4399cf82bc37bc07052eea485f18 - languageName: node - linkType: hard - -"browserify-cipher@npm:^1.0.1": - version: 1.0.1 - resolution: "browserify-cipher@npm:1.0.1" - dependencies: - browserify-aes: "npm:^1.0.4" - browserify-des: "npm:^1.0.0" - evp_bytestokey: "npm:^1.0.0" - checksum: 10c0/aa256dcb42bc53a67168bbc94ab85d243b0a3b56109dee3b51230b7d010d9b78985ffc1fb36e145c6e4db151f888076c1cfc207baf1525d3e375cbe8187fe27d - languageName: node - linkType: hard - -"browserify-des@npm:^1.0.0": - version: 1.0.2 - resolution: "browserify-des@npm:1.0.2" - dependencies: - cipher-base: "npm:^1.0.1" - des.js: "npm:^1.0.0" - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.1.2" - checksum: 10c0/943eb5d4045eff80a6cde5be4e5fbb1f2d5002126b5a4789c3c1aae3cdddb1eb92b00fb92277f512288e5c6af330730b1dbabcf7ce0923e749e151fcee5a074d - languageName: node - linkType: hard - -"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.1.0": - version: 4.1.1 - resolution: "browserify-rsa@npm:4.1.1" - dependencies: - bn.js: "npm:^5.2.1" - randombytes: "npm:^2.1.0" - safe-buffer: "npm:^5.2.1" - checksum: 10c0/b650ee1192e3d7f3d779edc06dd96ed8720362e72ac310c367b9d7fe35f7e8dbb983c1829142b2b3215458be8bf17c38adc7224920843024ed8cf39e19c513c0 - languageName: node - linkType: hard - -"browserify-sign@npm:^4.2.3": - version: 4.2.3 - resolution: "browserify-sign@npm:4.2.3" - dependencies: - bn.js: "npm:^5.2.1" - browserify-rsa: "npm:^4.1.0" - create-hash: "npm:^1.2.0" - create-hmac: "npm:^1.1.7" - elliptic: "npm:^6.5.5" - hash-base: "npm:~3.0" - inherits: "npm:^2.0.4" - parse-asn1: "npm:^5.1.7" - readable-stream: "npm:^2.3.8" - safe-buffer: "npm:^5.2.1" - checksum: 10c0/30c0eba3f5970a20866a4d3fbba2c5bd1928cd24f47faf995f913f1499214c6f3be14bb4d6ec1ab5c6cafb1eca9cb76ba1c2e1c04ed018370634d4e659c77216 - languageName: node - linkType: hard - -"browserify-zlib@npm:^0.2.0": - version: 0.2.0 - resolution: "browserify-zlib@npm:0.2.0" - dependencies: - pako: "npm:~1.0.5" - checksum: 10c0/9ab10b6dc732c6c5ec8ebcbe5cb7fe1467f97402c9b2140113f47b5f187b9438f93a8e065d8baf8b929323c18324fbf1105af479ee86d9d36cab7d7ef3424ad9 - languageName: node - linkType: hard - -"browserslist@npm:^4.24.0": - version: 4.24.4 - resolution: "browserslist@npm:4.24.4" - dependencies: - caniuse-lite: "npm:^1.0.30001688" - electron-to-chromium: "npm:^1.5.73" - node-releases: "npm:^2.0.19" - update-browserslist-db: "npm:^1.1.1" - bin: - browserslist: cli.js - checksum: 10c0/db7ebc1733cf471e0b490b4f47e3e2ea2947ce417192c9246644e92c667dd56a71406cc58f62ca7587caf828364892e9952904a02b7aead752bc65b62a37cfe9 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 - languageName: node - linkType: hard - -"buffer-xor@npm:^1.0.3": - version: 1.0.3 - resolution: "buffer-xor@npm:1.0.3" - checksum: 10c0/fd269d0e0bf71ecac3146187cfc79edc9dbb054e2ee69b4d97dfb857c6d997c33de391696d04bdd669272751fa48e7872a22f3a6c7b07d6c0bc31dbe02a4075c - languageName: node - linkType: hard - -"buffer@npm:^5.4.3": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.1.13" - checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e - languageName: node - linkType: hard - -"builtin-status-codes@npm:^3.0.0": - version: 3.0.0 - resolution: "builtin-status-codes@npm:3.0.0" - checksum: 10c0/c37bbba11a34c4431e56bd681b175512e99147defbe2358318d8152b3a01df7bf25e0305873947e5b350073d5ef41a364a22b37e48f1fb6d2fe6d5286a0f348c - languageName: node - linkType: hard - -"bundle-name@npm:^4.1.0": - version: 4.1.0 - resolution: "bundle-name@npm:4.1.0" - dependencies: - run-applescript: "npm:^7.0.0" - checksum: 10c0/8e575981e79c2bcf14d8b1c027a3775c095d362d1382312f444a7c861b0e21513c0bd8db5bd2b16e50ba0709fa622d4eab6b53192d222120305e68359daece29 - languageName: node - linkType: hard - -"bytes@npm:3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e - languageName: node - linkType: hard - -"cacache@npm:^19.0.1": - version: 19.0.1 - resolution: "cacache@npm:19.0.1" - dependencies: - "@npmcli/fs": "npm:^4.0.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^7.0.2" - ssri: "npm:^12.0.0" - tar: "npm:^7.4.3" - unique-filename: "npm:^4.0.0" - checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c - languageName: node - linkType: hard - -"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1": - version: 1.0.1 - resolution: "call-bind-apply-helpers@npm:1.0.1" - dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - checksum: 10c0/acb2ab68bf2718e68a3e895f0d0b73ccc9e45b9b6f210f163512ba76f91dab409eb8792f6dae188356f9095747512a3101646b3dea9d37fb8c7c6bf37796d18c - languageName: node - linkType: hard - -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": - version: 1.0.8 - resolution: "call-bind@npm:1.0.8" - dependencies: - call-bind-apply-helpers: "npm:^1.0.0" - es-define-property: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.2" - checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4 - languageName: node - linkType: hard - -"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3": - version: 1.0.3 - resolution: "call-bound@npm:1.0.3" - dependencies: - call-bind-apply-helpers: "npm:^1.0.1" - get-intrinsic: "npm:^1.2.6" - checksum: 10c0/45257b8e7621067304b30dbd638e856cac913d31e8e00a80d6cf172911acd057846572d0b256b45e652d515db6601e2974a1b1a040e91b4fc36fb3dd86fa69cf - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001692 - resolution: "caniuse-lite@npm:1.0.30001692" - checksum: 10c0/fca5105561ea12f3de593f3b0f062af82f7d07519e8dbcb97f34e7fd23349bcef1b1622a9a6cd2164d98e3d2f20059ef7e271edae46567aef88caf4c16c7708a - languageName: node - linkType: hard - -"chalk@npm:^2.4.1": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10c0/e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 - languageName: node - linkType: hard - -"chalk@npm:^4.1.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 - languageName: node - linkType: hard - -"chokidar@npm:^3.5.1, chokidar@npm:^3.6.0": - version: 3.6.0 - resolution: "chokidar@npm:3.6.0" - dependencies: - anymatch: "npm:~3.1.2" - braces: "npm:~3.0.2" - fsevents: "npm:~2.3.2" - glob-parent: "npm:~5.1.2" - is-binary-path: "npm:~2.1.0" - is-glob: "npm:~4.0.1" - normalize-path: "npm:~3.0.0" - readdirp: "npm:~3.6.0" - dependenciesMeta: - fsevents: - optional: true - checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462 - languageName: node - linkType: hard - -"chownr@npm:^3.0.0": - version: 3.0.0 - resolution: "chownr@npm:3.0.0" - checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 - languageName: node - linkType: hard - -"chrome-trace-event@npm:^1.0.2": - version: 1.0.4 - resolution: "chrome-trace-event@npm:1.0.4" - checksum: 10c0/3058da7a5f4934b87cf6a90ef5fb68ebc5f7d06f143ed5a4650208e5d7acae47bc03ec844b29fbf5ba7e46e8daa6acecc878f7983a4f4bb7271593da91e61ff5 - languageName: node - linkType: hard - -"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": - version: 1.0.6 - resolution: "cipher-base@npm:1.0.6" - dependencies: - inherits: "npm:^2.0.4" - safe-buffer: "npm:^5.2.1" - checksum: 10c0/f73268e0ee6585800875d9748f2a2377ae7c2c3375cba346f75598ac6f6bc3a25dec56e984a168ced1a862529ffffe615363f750c40349039d96bd30fba0fca8 - languageName: node - linkType: hard - -"cliui@npm:^7.0.2": - version: 7.0.4 - resolution: "cliui@npm:7.0.4" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.0" - wrap-ansi: "npm:^7.0.0" - checksum: 10c0/6035f5daf7383470cef82b3d3db00bec70afb3423538c50394386ffbbab135e26c3689c41791f911fa71b62d13d3863c712fdd70f0fbdffd938a1e6fd09aac00 - languageName: node - linkType: hard - -"clone-deep@npm:^4.0.1": - version: 4.0.1 - resolution: "clone-deep@npm:4.0.1" - dependencies: - is-plain-object: "npm:^2.0.4" - kind-of: "npm:^6.0.2" - shallow-clone: "npm:^3.0.0" - checksum: 10c0/637753615aa24adf0f2d505947a1bb75e63964309034a1cf56ba4b1f30af155201edd38d26ffe26911adaae267a3c138b344a4947d39f5fc1b6d6108125aa758 - languageName: node - linkType: hard - -"clone@npm:^1.0.2": - version: 1.0.4 - resolution: "clone@npm:1.0.4" - checksum: 10c0/2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: "npm:~1.1.4" - checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 - languageName: node - linkType: hard - -"colorette@npm:^2.0.10, colorette@npm:^2.0.14": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 - languageName: node - linkType: hard - -"colors@npm:1.4.0": - version: 1.4.0 - resolution: "colors@npm:1.4.0" - checksum: 10c0/9af357c019da3c5a098a301cf64e3799d27549d8f185d86f79af23069e4f4303110d115da98483519331f6fb71c8568d5688fa1c6523600044fd4a54e97c4efb - languageName: node - linkType: hard - -"combine-source-map@npm:^0.8.0": - version: 0.8.0 - resolution: "combine-source-map@npm:0.8.0" - dependencies: - convert-source-map: "npm:~1.1.0" - inline-source-map: "npm:~0.6.0" - lodash.memoize: "npm:~3.0.3" - source-map: "npm:~0.5.3" - checksum: 10c0/5f6a743b9fa59f3a51d14162c96d685ddaa1f0c9307d1e6cb864ae1649882138a776b77d8135b616258aa72716052b2f4d3655b10c3d75ea2405d8eb2c7afd1a - languageName: node - linkType: hard - -"command-exists@npm:^1.2.7": - version: 1.2.9 - resolution: "command-exists@npm:1.2.9" - checksum: 10c0/75040240062de46cd6cd43e6b3032a8b0494525c89d3962e280dde665103f8cc304a8b313a5aa541b91da2f5a9af75c5959dc3a77893a2726407a5e9a0234c16 - languageName: node - linkType: hard - -"commander@npm:^12.1.0": - version: 12.1.0 - resolution: "commander@npm:12.1.0" - checksum: 10c0/6e1996680c083b3b897bfc1cfe1c58dfbcd9842fd43e1aaf8a795fbc237f65efcc860a3ef457b318e73f29a4f4a28f6403c3d653d021d960e4632dd45bde54a9 - languageName: node - linkType: hard - -"commander@npm:^2.20.0": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 - languageName: node - linkType: hard - -"compressible@npm:~2.0.18": - version: 2.0.18 - resolution: "compressible@npm:2.0.18" - dependencies: - mime-db: "npm:>= 1.43.0 < 2" - checksum: 10c0/8a03712bc9f5b9fe530cc5a79e164e665550d5171a64575d7dcf3e0395d7b4afa2d79ab176c61b5b596e28228b350dd07c1a2a6ead12fd81d1b6cd632af2fef7 - languageName: node - linkType: hard - -"compression@npm:^1.7.4": - version: 1.7.5 - resolution: "compression@npm:1.7.5" - dependencies: - bytes: "npm:3.1.2" - compressible: "npm:~2.0.18" - debug: "npm:2.6.9" - negotiator: "npm:~0.6.4" - on-headers: "npm:~1.0.2" - safe-buffer: "npm:5.2.1" - vary: "npm:~1.1.2" - checksum: 10c0/35c9d2d57c86d8107eab5e637f2146fcefec8475a2ff3e162f5eb0982ff856d385fb5d8c9823c3d50e075f2d9304bc622dac3df27bfef0355309c0a5307861c5 - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - -"connect-history-api-fallback@npm:^2.0.0": - version: 2.0.0 - resolution: "connect-history-api-fallback@npm:2.0.0" - checksum: 10c0/90fa8b16ab76e9531646cc70b010b1dbd078153730c510d3142f6cf07479ae8a812c5a3c0e40a28528dd1681a62395d0cfdef67da9e914c4772ac85d69a3ed87 - languageName: node - linkType: hard - -"connect@npm:^3.7.0": - version: 3.7.0 - resolution: "connect@npm:3.7.0" - dependencies: - debug: "npm:2.6.9" - finalhandler: "npm:1.1.2" - parseurl: "npm:~1.3.3" - utils-merge: "npm:1.0.1" - checksum: 10c0/f120c6116bb16a0a7d2703c0b4a0cd7ed787dc5ec91978097bf62aa967289020a9f41a9cd3c3276a7b92aaa36f382d2cd35fed7138fd466a55c8e9fdbed11ca8 - languageName: node - linkType: hard - -"console-browserify@npm:^1.2.0": - version: 1.2.0 - resolution: "console-browserify@npm:1.2.0" - checksum: 10c0/89b99a53b7d6cee54e1e64fa6b1f7ac24b844b4019c5d39db298637e55c1f4ffa5c165457ad984864de1379df2c8e1886cbbdac85d9dbb6876a9f26c3106f226 - languageName: node - linkType: hard - -"constants-browserify@npm:^1.0.0": - version: 1.0.0 - resolution: "constants-browserify@npm:1.0.0" - checksum: 10c0/ab49b1d59a433ed77c964d90d19e08b2f77213fb823da4729c0baead55e3c597f8f97ebccfdfc47bd896d43854a117d114c849a6f659d9986420e97da0f83ac5 - languageName: node - linkType: hard - -"content-disposition@npm:0.5.4": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" - dependencies: - safe-buffer: "npm:5.2.1" - checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb - languageName: node - linkType: hard - -"content-type@npm:~1.0.4, content-type@npm:~1.0.5": - version: 1.0.5 - resolution: "content-type@npm:1.0.5" - checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af - languageName: node - linkType: hard - -"convert-source-map@npm:^1.7.0": - version: 1.9.0 - resolution: "convert-source-map@npm:1.9.0" - checksum: 10c0/281da55454bf8126cbc6625385928c43479f2060984180c42f3a86c8b8c12720a24eac260624a7d1e090004028d2dee78602330578ceec1a08e27cb8bb0a8a5b - languageName: node - linkType: hard - -"convert-source-map@npm:^2.0.0": - version: 2.0.0 - resolution: "convert-source-map@npm:2.0.0" - checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b - languageName: node - linkType: hard - -"convert-source-map@npm:~1.1.0": - version: 1.1.3 - resolution: "convert-source-map@npm:1.1.3" - checksum: 10c0/7e32f97b18eb4db09d4b3927bd813e9ae69484e060356cfcbfae3b25b90185f947aa203a3d3c6a3de7c5cdf7d9f29436baa292a4dea87817a57e43e51268bde6 - languageName: node - linkType: hard - -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: 10c0/b36fd0d4e3fef8456915fcf7742e58fbfcc12a17a018e0eb9501c9d5ef6893b596466f03b0564b81af29ff2538fd0aa4b9d54fe5ccbfb4c90ea50ad29fe2d221 - languageName: node - linkType: hard - -"cookie@npm:0.7.1": - version: 0.7.1 - resolution: "cookie@npm:0.7.1" - checksum: 10c0/5de60c67a410e7c8dc8a46a4b72eb0fe925871d057c9a5d2c0e8145c4270a4f81076de83410c4d397179744b478e33cd80ccbcc457abf40a9409ad27dcd21dde - languageName: node - linkType: hard - -"cookie@npm:~0.7.2": - version: 0.7.2 - resolution: "cookie@npm:0.7.2" - checksum: 10c0/9596e8ccdbf1a3a88ae02cf5ee80c1c50959423e1022e4e60b91dd87c622af1da309253d8abdb258fb5e3eacb4f08e579dc58b4897b8087574eee0fd35dfa5d2 - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 - languageName: node - linkType: hard - -"cors@npm:~2.8.5": - version: 2.8.5 - resolution: "cors@npm:2.8.5" - dependencies: - object-assign: "npm:^4" - vary: "npm:^1" - checksum: 10c0/373702b7999409922da80de4a61938aabba6929aea5b6fd9096fefb9e8342f626c0ebd7507b0e8b0b311380744cc985f27edebc0a26e0ddb784b54e1085de761 - languageName: node - linkType: hard - -"create-ecdh@npm:^4.0.4": - version: 4.0.4 - resolution: "create-ecdh@npm:4.0.4" - dependencies: - bn.js: "npm:^4.1.0" - elliptic: "npm:^6.5.3" - checksum: 10c0/77b11a51360fec9c3bce7a76288fc0deba4b9c838d5fb354b3e40c59194d23d66efe6355fd4b81df7580da0661e1334a235a2a5c040b7569ba97db428d466e7f - languageName: node - linkType: hard - -"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": - version: 1.2.0 - resolution: "create-hash@npm:1.2.0" - dependencies: - cipher-base: "npm:^1.0.1" - inherits: "npm:^2.0.1" - md5.js: "npm:^1.3.4" - ripemd160: "npm:^2.0.1" - sha.js: "npm:^2.4.0" - checksum: 10c0/d402e60e65e70e5083cb57af96d89567954d0669e90550d7cec58b56d49c4b193d35c43cec8338bc72358198b8cbf2f0cac14775b651e99238e1cf411490f915 - languageName: node - linkType: hard - -"create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": - version: 1.1.7 - resolution: "create-hmac@npm:1.1.7" - dependencies: - cipher-base: "npm:^1.0.3" - create-hash: "npm:^1.1.0" - inherits: "npm:^2.0.1" - ripemd160: "npm:^2.0.0" - safe-buffer: "npm:^5.0.1" - sha.js: "npm:^2.4.8" - checksum: 10c0/24332bab51011652a9a0a6d160eed1e8caa091b802335324ae056b0dcb5acbc9fcf173cf10d128eba8548c3ce98dfa4eadaa01bd02f44a34414baee26b651835 - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": - version: 7.0.6 - resolution: "cross-spawn@npm:7.0.6" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 - languageName: node - linkType: hard - -"crypto-browserify@npm:^3.12.0": - version: 3.12.1 - resolution: "crypto-browserify@npm:3.12.1" - dependencies: - browserify-cipher: "npm:^1.0.1" - browserify-sign: "npm:^4.2.3" - create-ecdh: "npm:^4.0.4" - create-hash: "npm:^1.2.0" - create-hmac: "npm:^1.1.7" - diffie-hellman: "npm:^5.0.3" - hash-base: "npm:~3.0.4" - inherits: "npm:^2.0.4" - pbkdf2: "npm:^3.1.2" - public-encrypt: "npm:^4.0.3" - randombytes: "npm:^2.1.0" - randomfill: "npm:^1.0.4" - checksum: 10c0/184a2def7b16628e79841243232ab5497f18d8e158ac21b7ce90ab172427d0a892a561280adc08f9d4d517bce8db2a5b335dc21abb970f787f8e874bd7b9db7d - languageName: node - linkType: hard - -"custom-event@npm:~1.0.0": - version: 1.0.1 - resolution: "custom-event@npm:1.0.1" - checksum: 10c0/86cd8497328b1e17dcda894c8df34a73b7a99f915123940d39b33c709482b2d3a2e689cd5e79e4775eb4167227689f57a2ae2f99a3f0bc9c54c0ac1b06853bd5 - languageName: node - linkType: hard - -"date-format@npm:^4.0.14": - version: 4.0.14 - resolution: "date-format@npm:4.0.14" - checksum: 10c0/1c67a4d77c677bb880328c81d81f5b9ed7fbf672bdaff74e5a0f7314b21188f3a829b06acf120c70cc1df876a7724e3e5c23d511e86d64656a3035a76ac3930b - languageName: node - linkType: hard - -"debug@npm:2.6.9": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: "npm:2.0.0" - checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4": - version: 4.4.0 - resolution: "debug@npm:4.4.0" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de - languageName: node - linkType: hard - -"debug@npm:~4.3.1, debug@npm:~4.3.2, debug@npm:~4.3.4": - version: 4.3.7 - resolution: "debug@npm:4.3.7" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b - languageName: node - linkType: hard - -"default-browser-id@npm:^5.0.0": - version: 5.0.0 - resolution: "default-browser-id@npm:5.0.0" - checksum: 10c0/957fb886502594c8e645e812dfe93dba30ed82e8460d20ce39c53c5b0f3e2afb6ceaec2249083b90bdfbb4cb0f34e1f73fde3d68cac00becdbcfd894156b5ead - languageName: node - linkType: hard - -"default-browser@npm:^5.2.1": - version: 5.2.1 - resolution: "default-browser@npm:5.2.1" - dependencies: - bundle-name: "npm:^4.1.0" - default-browser-id: "npm:^5.0.0" - checksum: 10c0/73f17dc3c58026c55bb5538749597db31f9561c0193cd98604144b704a981c95a466f8ecc3c2db63d8bfd04fb0d426904834cfc91ae510c6aeb97e13c5167c4d - languageName: node - linkType: hard - -"defaults@npm:^1.0.3": - version: 1.0.4 - resolution: "defaults@npm:1.0.4" - dependencies: - clone: "npm:^1.0.2" - checksum: 10c0/9cfbe498f5c8ed733775db62dfd585780387d93c17477949e1670bfcfb9346e0281ce8c4bf9f4ac1fc0f9b851113bd6dc9e41182ea1644ccd97de639fa13c35a - languageName: node - linkType: hard - -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.0.1" - checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 - languageName: node - linkType: hard - -"define-lazy-prop@npm:^3.0.0": - version: 3.0.0 - resolution: "define-lazy-prop@npm:3.0.0" - checksum: 10c0/5ab0b2bf3fa58b3a443140bbd4cd3db1f91b985cc8a246d330b9ac3fc0b6a325a6d82bddc0b055123d745b3f9931afeea74a5ec545439a1630b9c8512b0eeb49 - languageName: node - linkType: hard - -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": - version: 1.2.1 - resolution: "define-properties@npm:1.2.1" - dependencies: - define-data-property: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - object-keys: "npm:^1.1.1" - checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 - languageName: node - linkType: hard - -"depd@npm:2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c - languageName: node - linkType: hard - -"depd@npm:~1.1.2": - version: 1.1.2 - resolution: "depd@npm:1.1.2" - checksum: 10c0/acb24aaf936ef9a227b6be6d495f0d2eb20108a9a6ad40585c5bda1a897031512fef6484e4fdbb80bd249fdaa82841fa1039f416ece03188e677ba11bcfda249 - languageName: node - linkType: hard - -"des.js@npm:^1.0.0": - version: 1.1.0 - resolution: "des.js@npm:1.1.0" - dependencies: - inherits: "npm:^2.0.1" - minimalistic-assert: "npm:^1.0.0" - checksum: 10c0/671354943ad67493e49eb4c555480ab153edd7cee3a51c658082fcde539d2690ed2a4a0b5d1f401f9cde822edf3939a6afb2585f32c091f2d3a1b1665cd45236 - languageName: node - linkType: hard - -"destroy@npm:1.2.0": - version: 1.2.0 - resolution: "destroy@npm:1.2.0" - checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 - languageName: node - linkType: hard - -"detect-node@npm:^2.0.4": - version: 2.1.0 - resolution: "detect-node@npm:2.1.0" - checksum: 10c0/f039f601790f2e9d4654e499913259a798b1f5246ae24f86ab5e8bd4aaf3bce50484234c494f11fb00aecb0c6e2733aa7b1cf3f530865640b65fbbd65b2c4e09 - languageName: node - linkType: hard - -"di@npm:^0.0.1": - version: 0.0.1 - resolution: "di@npm:0.0.1" - checksum: 10c0/fbca4cc93e8c493d50f82df3a9ecaa5d8b2935674aabddeb8f68db3ab03c942c201f9c3d920de094407392ee6f488eac16b96f500c0ea6b408634864b7b939d1 - languageName: node - linkType: hard - -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 - languageName: node - linkType: hard - -"diffie-hellman@npm:^5.0.3": - version: 5.0.3 - resolution: "diffie-hellman@npm:5.0.3" - dependencies: - bn.js: "npm:^4.1.0" - miller-rabin: "npm:^4.0.0" - randombytes: "npm:^2.0.0" - checksum: 10c0/ce53ccafa9ca544b7fc29b08a626e23a9b6562efc2a98559a0c97b4718937cebaa9b5d7d0a05032cc9c1435e9b3c1532b9e9bf2e0ede868525922807ad6e1ecf - languageName: node - linkType: hard - -"dns-packet@npm:^5.2.2": - version: 5.6.1 - resolution: "dns-packet@npm:5.6.1" - dependencies: - "@leichtgewicht/ip-codec": "npm:^2.0.1" - checksum: 10c0/8948d3d03063fb68e04a1e386875f8c3bcc398fc375f535f2b438fad8f41bf1afa6f5e70893ba44f4ae884c089247e0a31045722fa6ff0f01d228da103f1811d - languageName: node - linkType: hard - -"dom-serialize@npm:^2.2.1": - version: 2.2.1 - resolution: "dom-serialize@npm:2.2.1" - dependencies: - custom-event: "npm:~1.0.0" - ent: "npm:~2.2.0" - extend: "npm:^3.0.0" - void-elements: "npm:^2.0.0" - checksum: 10c0/ceb6e62b73c658986ca4c9b8b2fae358d8ae914eb06712d137da595a327c3bbca45a762f412a6d181f892ce5e3cffb855c2db2b64c53ad0534b2a0ad8e65b05e - languageName: node - linkType: hard - -"domain-browser@npm:^4.16.0": - version: 4.23.0 - resolution: "domain-browser@npm:4.23.0" - checksum: 10c0/dfcc6ba070a2c968a4d922e7d99ef440d1076812af0d983404aadf64729f746bb4a0ad2c5e73ccd5d9cf41bc79037f2a1e4a915bdf33d07e0d77f487b635b5b2 - languageName: node - linkType: hard - -"dunder-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "dunder-proto@npm:1.0.1" - dependencies: - call-bind-apply-helpers: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.2.0" - checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 - languageName: node - linkType: hard - -"ee-first@npm:1.1.1": - version: 1.1.1 - resolution: "ee-first@npm:1.1.1" - checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.5.73": - version: 1.5.83 - resolution: "electron-to-chromium@npm:1.5.83" - checksum: 10c0/12380962d057c4679add1047cdddb18b909904614272da0527e505a3859eaffde2022dd0688ce7f230582de96405c3d33b667680614475cdafd3f629caa2fee1 - languageName: node - linkType: hard - -"elliptic@npm:^6.5.3, elliptic@npm:^6.5.5": - version: 6.6.1 - resolution: "elliptic@npm:6.6.1" - dependencies: - bn.js: "npm:^4.11.9" - brorand: "npm:^1.1.0" - hash.js: "npm:^1.0.0" - hmac-drbg: "npm:^1.0.1" - inherits: "npm:^2.0.4" - minimalistic-assert: "npm:^1.0.1" - minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/8b24ef782eec8b472053793ea1e91ae6bee41afffdfcb78a81c0a53b191e715cbe1292aa07165958a9bbe675bd0955142560b1a007ffce7d6c765bcaf951a867 - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 - languageName: node - linkType: hard - -"encodeurl@npm:~1.0.2": - version: 1.0.2 - resolution: "encodeurl@npm:1.0.2" - checksum: 10c0/f6c2387379a9e7c1156c1c3d4f9cb7bb11cf16dd4c1682e1f6746512564b053df5781029b6061296832b59fb22f459dbe250386d217c2f6e203601abb2ee0bec - languageName: node - linkType: hard - -"encodeurl@npm:~2.0.0": - version: 2.0.0 - resolution: "encodeurl@npm:2.0.0" - checksum: 10c0/5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 - languageName: node - linkType: hard - -"engine.io-parser@npm:~5.2.1": - version: 5.2.3 - resolution: "engine.io-parser@npm:5.2.3" - checksum: 10c0/ed4900d8dbef470ab3839ccf3bfa79ee518ea8277c7f1f2759e8c22a48f64e687ea5e474291394d0c94f84054749fd93f3ef0acb51fa2f5f234cc9d9d8e7c536 - languageName: node - linkType: hard - -"engine.io@npm:~6.6.0": - version: 6.6.2 - resolution: "engine.io@npm:6.6.2" - dependencies: - "@types/cookie": "npm:^0.4.1" - "@types/cors": "npm:^2.8.12" - "@types/node": "npm:>=10.0.0" - accepts: "npm:~1.3.4" - base64id: "npm:2.0.0" - cookie: "npm:~0.7.2" - cors: "npm:~2.8.5" - debug: "npm:~4.3.1" - engine.io-parser: "npm:~5.2.1" - ws: "npm:~8.17.1" - checksum: 10c0/e9ac3cba49badb6905259df3b019fbcbe53e2a389c930fb9fbc10eebc8839554b189706206bba2509a4a3a7d78a32f7e027f73230f31662c7efd215276432dad - languageName: node - linkType: hard - -"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.17.1": - version: 5.18.0 - resolution: "enhanced-resolve@npm:5.18.0" - dependencies: - graceful-fs: "npm:^4.2.4" - tapable: "npm:^2.2.0" - checksum: 10c0/5fcc264a6040754ab5b349628cac2bb5f89cee475cbe340804e657a5b9565f70e6aafb338d5895554eb0ced9f66c50f38a255274a0591dcb64ee17c549c459ce - languageName: node - linkType: hard - -"ent@npm:~2.2.0": - version: 2.2.2 - resolution: "ent@npm:2.2.2" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - punycode: "npm:^1.4.1" - safe-regex-test: "npm:^1.1.0" - checksum: 10c0/83673cc952bb1ca01473460eb4f1289448d887ef2bfcdd142bfe83cd20a794a4393b6bca543922bf1eb913d1ae0ab69ca2d2f1f6a5e9f3de6e68464b3a3b9096 - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 - languageName: node - linkType: hard - -"envinfo@npm:^7.14.0": - version: 7.14.0 - resolution: "envinfo@npm:7.14.0" - bin: - envinfo: dist/cli.js - checksum: 10c0/059a031eee101e056bd9cc5cbfe25c2fab433fe1780e86cf0a82d24a000c6931e327da6a8ffb3dce528a24f83f256e7efc0b36813113eff8fdc6839018efe327 - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": - version: 1.0.1 - resolution: "es-define-property@npm:1.0.1" - checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 - languageName: node - linkType: hard - -"es-module-lexer@npm:^1.2.1": - version: 1.6.0 - resolution: "es-module-lexer@npm:1.6.0" - checksum: 10c0/667309454411c0b95c476025929881e71400d74a746ffa1ff4cb450bd87f8e33e8eef7854d68e401895039ac0bac64e7809acbebb6253e055dd49ea9e3ea9212 - languageName: node - linkType: hard - -"es-object-atoms@npm:^1.0.0": - version: 1.1.1 - resolution: "es-object-atoms@npm:1.1.1" - dependencies: - es-errors: "npm:^1.3.0" - checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c - languageName: node - linkType: hard - -"escalade@npm:^3.1.1, escalade@npm:^3.2.0": - version: 3.2.0 - resolution: "escalade@npm:3.2.0" - checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 - languageName: node - linkType: hard - -"escape-html@npm:~1.0.3": - version: 1.0.3 - resolution: "escape-html@npm:1.0.3" - checksum: 10c0/524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 - languageName: node - linkType: hard - -"eslint-scope@npm:5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^4.1.1" - checksum: 10c0/d30ef9dc1c1cbdece34db1539a4933fe3f9b14e1ffb27ecc85987902ee663ad7c9473bbd49a9a03195a373741e62e2f807c4938992e019b511993d163450e70a - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: "npm:^5.2.0" - checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d - languageName: node - linkType: hard - -"estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 - languageName: node - linkType: hard - -"etag@npm:~1.8.1": - version: 1.8.1 - resolution: "etag@npm:1.8.1" - checksum: 10c0/12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 - languageName: node - linkType: hard - -"eventemitter3@npm:^4.0.0": - version: 4.0.7 - resolution: "eventemitter3@npm:4.0.7" - checksum: 10c0/5f6d97cbcbac47be798e6355e3a7639a84ee1f7d9b199a07017f1d2f1e2fe236004d14fa5dfaeba661f94ea57805385e326236a6debbc7145c8877fbc0297c6b - languageName: node - linkType: hard - -"events@npm:^3.2.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 - languageName: node - linkType: hard - -"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": - version: 1.0.3 - resolution: "evp_bytestokey@npm:1.0.3" - dependencies: - md5.js: "npm:^1.3.4" - node-gyp: "npm:latest" - safe-buffer: "npm:^5.1.1" - checksum: 10c0/77fbe2d94a902a80e9b8f5a73dcd695d9c14899c5e82967a61b1fc6cbbb28c46552d9b127cff47c45fcf684748bdbcfa0a50410349109de87ceb4b199ef6ee99 - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 - languageName: node - linkType: hard - -"express@npm:^4.21.2": - version: 4.21.2 - resolution: "express@npm:4.21.2" - dependencies: - accepts: "npm:~1.3.8" - array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.3" - content-disposition: "npm:0.5.4" - content-type: "npm:~1.0.4" - cookie: "npm:0.7.1" - cookie-signature: "npm:1.0.6" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - encodeurl: "npm:~2.0.0" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - finalhandler: "npm:1.3.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.3" - methods: "npm:~1.1.2" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.12" - proxy-addr: "npm:~2.0.7" - qs: "npm:6.13.0" - range-parser: "npm:~1.2.1" - safe-buffer: "npm:5.2.1" - send: "npm:0.19.0" - serve-static: "npm:1.16.2" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - type-is: "npm:~1.6.18" - utils-merge: "npm:1.0.1" - vary: "npm:~1.1.2" - checksum: 10c0/38168fd0a32756600b56e6214afecf4fc79ec28eca7f7a91c2ab8d50df4f47562ca3f9dee412da7f5cea6b1a1544b33b40f9f8586dbacfbdada0fe90dbb10a1f - languageName: node - linkType: hard - -"extend@npm:^3.0.0": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b - languageName: node - linkType: hard - -"fast-uri@npm:^3.0.1": - version: 3.0.5 - resolution: "fast-uri@npm:3.0.5" - checksum: 10c0/f5501fd849e02f16f1730d2c8628078718c492b5bc00198068bc5c2880363ae948287fdc8cebfff47465229b517dbeaf668866fbabdff829b4138a899e5c2ba3 - languageName: node - linkType: hard - -"fastest-levenshtein@npm:^1.0.12": - version: 1.0.16 - resolution: "fastest-levenshtein@npm:1.0.16" - checksum: 10c0/7e3d8ae812a7f4fdf8cad18e9cde436a39addf266a5986f653ea0d81e0de0900f50c0f27c6d5aff3f686bcb48acbd45be115ae2216f36a6a13a7dbbf5cad878b - languageName: node - linkType: hard - -"faye-websocket@npm:^0.11.3": - version: 0.11.4 - resolution: "faye-websocket@npm:0.11.4" - dependencies: - websocket-driver: "npm:>=0.5.1" - checksum: 10c0/c6052a0bb322778ce9f89af92890f6f4ce00d5ec92418a35e5f4c6864a4fe736fec0bcebd47eac7c0f0e979b01530746b1c85c83cb04bae789271abf19737420 - languageName: node - linkType: hard - -"fill-range@npm:^7.1.1": - version: 7.1.1 - resolution: "fill-range@npm:7.1.1" - dependencies: - to-regex-range: "npm:^5.0.1" - checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 - languageName: node - linkType: hard - -"finalhandler@npm:1.1.2": - version: 1.1.2 - resolution: "finalhandler@npm:1.1.2" - dependencies: - debug: "npm:2.6.9" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - on-finished: "npm:~2.3.0" - parseurl: "npm:~1.3.3" - statuses: "npm:~1.5.0" - unpipe: "npm:~1.0.0" - checksum: 10c0/6a96e1f5caab085628c11d9fdceb82ba608d5e426c6913d4d918409baa271037a47f28fbba73279e8ad614f0b8fa71ea791d265e408d760793829edd8c2f4584 - languageName: node - linkType: hard - -"finalhandler@npm:1.3.1": - version: 1.3.1 - resolution: "finalhandler@npm:1.3.1" - dependencies: - debug: "npm:2.6.9" - encodeurl: "npm:~2.0.0" - escape-html: "npm:~1.0.3" - on-finished: "npm:2.4.1" - parseurl: "npm:~1.3.3" - statuses: "npm:2.0.1" - unpipe: "npm:~1.0.0" - checksum: 10c0/d38035831865a49b5610206a3a9a9aae4e8523cbbcd01175d0480ffbf1278c47f11d89be3ca7f617ae6d94f29cf797546a4619cd84dd109009ef33f12f69019f - languageName: node - linkType: hard - -"find-up@npm:^4.0.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: "npm:^5.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 - languageName: node - linkType: hard - -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" - bin: - flat: cli.js - checksum: 10c0/f178b13482f0cd80c7fede05f4d10585b1f2fdebf26e12edc138e32d3150c6ea6482b7f12813a1091143bad52bb6d3596bca51a162257a21163c0ff438baa5fe - languageName: node - linkType: hard - -"flatted@npm:^3.2.7": - version: 3.3.2 - resolution: "flatted@npm:3.3.2" - checksum: 10c0/24cc735e74d593b6c767fe04f2ef369abe15b62f6906158079b9874bdb3ee5ae7110bb75042e70cd3f99d409d766f357caf78d5ecee9780206f5fdc5edbad334 - languageName: node - linkType: hard - -"follow-redirects@npm:^1.0.0": - version: 1.15.9 - resolution: "follow-redirects@npm:1.15.9" - peerDependenciesMeta: - debug: - optional: true - checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f - languageName: node - linkType: hard - -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" - dependencies: - is-callable: "npm:^1.1.3" - checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.3.0 - resolution: "foreground-child@npm:3.3.0" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^4.0.1" - checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 - languageName: node - linkType: hard - -"forwarded@npm:0.2.0": - version: 0.2.0 - resolution: "forwarded@npm:0.2.0" - checksum: 10c0/9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 - languageName: node - linkType: hard - -"fresh@npm:0.5.2": - version: 0.5.2 - resolution: "fresh@npm:0.5.2" - checksum: 10c0/c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a - languageName: node - linkType: hard - -"fs-extra@npm:^8.1.0": - version: 8.1.0 - resolution: "fs-extra@npm:8.1.0" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^4.0.0" - universalify: "npm:^0.1.0" - checksum: 10c0/259f7b814d9e50d686899550c4f9ded85c46c643f7fe19be69504888e007fcbc08f306fae8ec495b8b998635e997c9e3e175ff2eeed230524ef1c1684cc96423 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 - languageName: node - linkType: hard - -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6": - version: 1.2.7 - resolution: "get-intrinsic@npm:1.2.7" - dependencies: - call-bind-apply-helpers: "npm:^1.0.1" - es-define-property: "npm:^1.0.1" - es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" - function-bind: "npm:^1.1.2" - get-proto: "npm:^1.0.0" - gopd: "npm:^1.2.0" - has-symbols: "npm:^1.1.0" - hasown: "npm:^2.0.2" - math-intrinsics: "npm:^1.1.0" - checksum: 10c0/b475dec9f8bff6f7422f51ff4b7b8d0b68e6776ee83a753c1d627e3008c3442090992788038b37eff72e93e43dceed8c1acbdf2d6751672687ec22127933080d - languageName: node - linkType: hard - -"get-proto@npm:^1.0.0": - version: 1.0.1 - resolution: "get-proto@npm:1.0.1" - dependencies: - dunder-proto: "npm:^1.0.1" - es-object-atoms: "npm:^1.0.0" - checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c - languageName: node - linkType: hard - -"glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: "npm:^4.0.1" - checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee - languageName: node - linkType: hard - -"glob-to-regexp@npm:^0.4.1": - version: 0.4.1 - resolution: "glob-to-regexp@npm:0.4.1" - checksum: 10c0/0486925072d7a916f052842772b61c3e86247f0a80cc0deb9b5a3e8a1a9faad5b04fb6f58986a09f34d3e96cd2a22a24b7e9882fb1cf904c31e9a310de96c429 - languageName: node - linkType: hard - -"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": - version: 10.4.5 - resolution: "glob@npm:10.4.5" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^3.1.2" - minimatch: "npm:^9.0.4" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^1.11.1" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e - languageName: node - linkType: hard - -"glob@npm:^7.1.3, glob@npm:^7.1.6, glob@npm:^7.1.7": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 - languageName: node - linkType: hard - -"gopd@npm:^1.0.1, gopd@npm:^1.2.0": - version: 1.2.0 - resolution: "gopd@npm:1.2.0" - checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - -"handle-thing@npm:^2.0.0": - version: 2.0.1 - resolution: "handle-thing@npm:2.0.1" - checksum: 10c0/7ae34ba286a3434f1993ebd1cc9c9e6b6d8ea672182db28b1afc0a7119229552fa7031e3e5f3cd32a76430ece4e94b7da6f12af2eb39d6239a7693e4bd63a998 - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10c0/1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: "npm:^1.0.0" - checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": - version: 1.1.0 - resolution: "has-symbols@npm:1.1.0" - checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.2": - version: 1.0.2 - resolution: "has-tostringtag@npm:1.0.2" - dependencies: - has-symbols: "npm:^1.0.3" - checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c - languageName: node - linkType: hard - -"hash-base@npm:^3.0.0": - version: 3.1.0 - resolution: "hash-base@npm:3.1.0" - dependencies: - inherits: "npm:^2.0.4" - readable-stream: "npm:^3.6.0" - safe-buffer: "npm:^5.2.0" - checksum: 10c0/663eabcf4173326fbb65a1918a509045590a26cc7e0964b754eef248d281305c6ec9f6b31cb508d02ffca383ab50028180ce5aefe013e942b44a903ac8dc80d0 - languageName: node - linkType: hard - -"hash-base@npm:~3.0, hash-base@npm:~3.0.4": - version: 3.0.5 - resolution: "hash-base@npm:3.0.5" - dependencies: - inherits: "npm:^2.0.4" - safe-buffer: "npm:^5.2.1" - checksum: 10c0/6dc185b79bad9b6d525cd132a588e4215380fdc36fec6f7a8a58c5db8e3b642557d02ad9c367f5e476c7c3ad3ccffa3607f308b124e1ed80e3b80a1b254db61e - languageName: node - linkType: hard - -"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": - version: 1.1.7 - resolution: "hash.js@npm:1.1.7" - dependencies: - inherits: "npm:^2.0.3" - minimalistic-assert: "npm:^1.0.1" - checksum: 10c0/41ada59494eac5332cfc1ce6b7ebdd7b88a3864a6d6b08a3ea8ef261332ed60f37f10877e0c825aaa4bddebf164fbffa618286aeeec5296675e2671cbfa746c4 - languageName: node - linkType: hard - -"hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 - languageName: node - linkType: hard - -"hmac-drbg@npm:^1.0.1": - version: 1.0.1 - resolution: "hmac-drbg@npm:1.0.1" - dependencies: - hash.js: "npm:^1.0.3" - minimalistic-assert: "npm:^1.0.0" - minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10c0/f3d9ba31b40257a573f162176ac5930109816036c59a09f901eb2ffd7e5e705c6832bedfff507957125f2086a0ab8f853c0df225642a88bf1fcaea945f20600d - languageName: node - linkType: hard - -"hpack.js@npm:^2.1.6": - version: 2.1.6 - resolution: "hpack.js@npm:2.1.6" - dependencies: - inherits: "npm:^2.0.1" - obuf: "npm:^1.0.0" - readable-stream: "npm:^2.0.1" - wbuf: "npm:^1.1.0" - checksum: 10c0/55b9e824430bab82a19d079cb6e33042d7d0640325678c9917fcc020c61d8a08ca671b6c942c7f0aae9bb6e4b67ffb50734a72f9e21d66407c3138c1983b70f0 - languageName: node - linkType: hard - -"html-escaper@npm:^2.0.0": - version: 2.0.2 - resolution: "html-escaper@npm:2.0.2" - checksum: 10c0/208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc - languageName: node - linkType: hard - -"http-deceiver@npm:^1.2.7": - version: 1.2.7 - resolution: "http-deceiver@npm:1.2.7" - checksum: 10c0/8bb9b716f5fc55f54a451da7f49b9c695c3e45498a789634daec26b61e4add7c85613a4a9e53726c39d09de7a163891ecd6eb5809adb64500a840fd86fe81d03 - languageName: node - linkType: hard - -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: "npm:2.0.0" - inherits: "npm:2.0.4" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - toidentifier: "npm:1.0.1" - checksum: 10c0/fc6f2715fe188d091274b5ffc8b3657bd85c63e969daa68ccb77afb05b071a4b62841acb7a21e417b5539014dff2ebf9550f0b14a9ff126f2734a7c1387f8e19 - languageName: node - linkType: hard - -"http-errors@npm:~1.6.2": - version: 1.6.3 - resolution: "http-errors@npm:1.6.3" - dependencies: - depd: "npm:~1.1.2" - inherits: "npm:2.0.3" - setprototypeof: "npm:1.1.0" - statuses: "npm:>= 1.4.0 < 2" - checksum: 10c0/17ec4046ee974477778bfdd525936c254b872054703ec2caa4d6f099566b8adade636ae6aeeacb39302c5cd6e28fb407ebd937f500f5010d0b6850750414ff78 - languageName: node - linkType: hard - -"http-parser-js@npm:>=0.5.1": - version: 0.5.9 - resolution: "http-parser-js@npm:0.5.9" - checksum: 10c0/25aac1096b5270e69b1f6c850c8d4363c1e8b5711f97109cf65d44ecf5dfe3438811036a9b4d4f432474a2519ac46e8feb1a7b6be6e292a956e63bdad12583fb - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"http-proxy-middleware@npm:^2.0.7": - version: 2.0.7 - resolution: "http-proxy-middleware@npm:2.0.7" - dependencies: - "@types/http-proxy": "npm:^1.17.8" - http-proxy: "npm:^1.18.1" - is-glob: "npm:^4.0.1" - is-plain-obj: "npm:^3.0.0" - micromatch: "npm:^4.0.2" - peerDependencies: - "@types/express": ^4.17.13 - peerDependenciesMeta: - "@types/express": - optional: true - checksum: 10c0/8d00a61eb215b83826460b07489d8bb095368ec16e02a9d63e228dcf7524e7c20d61561e5476de1391aecd4ec32ea093279cdc972115b311f8e0a95a24c9e47e - languageName: node - linkType: hard - -"http-proxy@npm:^1.18.1": - version: 1.18.1 - resolution: "http-proxy@npm:1.18.1" - dependencies: - eventemitter3: "npm:^4.0.0" - follow-redirects: "npm:^1.0.0" - requires-port: "npm:^1.0.0" - checksum: 10c0/148dfa700a03fb421e383aaaf88ac1d94521dfc34072f6c59770528c65250983c2e4ec996f2f03aa9f3fe46cd1270a593126068319311e3e8d9e610a37533e94 - languageName: node - linkType: hard - -"https-browserify@npm:^1.0.0": - version: 1.0.0 - resolution: "https-browserify@npm:1.0.0" - checksum: 10c0/e17b6943bc24ea9b9a7da5714645d808670af75a425f29baffc3284962626efdc1eb3aa9bbffaa6e64028a6ad98af5b09fabcb454a8f918fb686abfdc9e9b8ae - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.6 - resolution: "https-proxy-agent@npm:7.0.6" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:4" - checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac - languageName: node - linkType: hard - -"hyperdyperid@npm:^1.2.0": - version: 1.2.0 - resolution: "hyperdyperid@npm:1.2.0" - checksum: 10c0/885ba3177c7181d315a856ee9c0005ff8eb5dcb1ce9e9d61be70987895d934d84686c37c981cceeb53216d4c9c15c1cc25f1804e84cc6a74a16993c5d7fd0893 - languageName: node - linkType: hard - -"iconv-lite@npm:0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 - languageName: node - linkType: hard - -"ieee754@npm:^1.1.13": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb - languageName: node - linkType: hard - -"import-local@npm:^3.0.2": - version: 3.2.0 - resolution: "import-local@npm:3.2.0" - dependencies: - pkg-dir: "npm:^4.2.0" - resolve-cwd: "npm:^3.0.0" - bin: - import-local-fixture: fixtures/cli.js - checksum: 10c0/94cd6367a672b7e0cb026970c85b76902d2710a64896fa6de93bd5c571dd03b228c5759308959de205083e3b1c61e799f019c9e36ee8e9c523b993e1057f0433 - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 - languageName: node - linkType: hard - -"inherits@npm:2.0.3": - version: 2.0.3 - resolution: "inherits@npm:2.0.3" - checksum: 10c0/6e56402373149ea076a434072671f9982f5fad030c7662be0332122fe6c0fa490acb3cc1010d90b6eff8d640b1167d77674add52dfd1bb85d545cf29e80e73e7 - languageName: node - linkType: hard - -"inline-source-map@npm:~0.6.0": - version: 0.6.3 - resolution: "inline-source-map@npm:0.6.3" - dependencies: - source-map: "npm:~0.5.3" - checksum: 10c0/9e940e79a385c3f4671754938704c7569757a2a34b15a8e9caf8fe8857746c8a145445d0de8bd7d671466001b54409ed58ff38f17a153f700ddb184acd71df06 - languageName: node - linkType: hard - -"interpret@npm:^3.1.1": - version: 3.1.1 - resolution: "interpret@npm:3.1.1" - checksum: 10c0/6f3c4d0aa6ec1b43a8862375588a249e3c917739895cbe67fe12f0a76260ea632af51e8e2431b50fbcd0145356dc28ca147be08dbe6a523739fd55c0f91dc2a5 - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc - languageName: node - linkType: hard - -"ipaddr.js@npm:1.9.1": - version: 1.9.1 - resolution: "ipaddr.js@npm:1.9.1" - checksum: 10c0/0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a - languageName: node - linkType: hard - -"ipaddr.js@npm:^2.1.0": - version: 2.2.0 - resolution: "ipaddr.js@npm:2.2.0" - checksum: 10c0/e4ee875dc1bd92ac9d27e06cfd87cdb63ca786ff9fd7718f1d4f7a8ef27db6e5d516128f52d2c560408cbb75796ac2f83ead669e73507c86282d45f84c5abbb6 - languageName: node - linkType: hard - -"is-arguments@npm:^1.0.4": - version: 1.2.0 - resolution: "is-arguments@npm:1.2.0" - dependencies: - call-bound: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/6377344b31e9fcb707c6751ee89b11f132f32338e6a782ec2eac9393b0cbd32235dad93052998cda778ee058754860738341d8114910d50ada5615912bb929fc - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: "npm:^2.0.0" - checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 - languageName: node - linkType: hard - -"is-callable@npm:^1.1.3": - version: 1.2.7 - resolution: "is-callable@npm:1.2.7" - checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f - languageName: node - linkType: hard - -"is-core-module@npm:^2.16.0": - version: 2.16.1 - resolution: "is-core-module@npm:2.16.1" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd - languageName: node - linkType: hard - -"is-docker@npm:^3.0.0": - version: 3.0.0 - resolution: "is-docker@npm:3.0.0" - bin: - is-docker: cli.js - checksum: 10c0/d2c4f8e6d3e34df75a5defd44991b6068afad4835bb783b902fa12d13ebdb8f41b2a199dcb0b5ed2cb78bfee9e4c0bbdb69c2d9646f4106464674d3e697a5856 - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc - languageName: node - linkType: hard - -"is-generator-function@npm:^1.0.7": - version: 1.1.0 - resolution: "is-generator-function@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.3" - get-proto: "npm:^1.0.0" - has-tostringtag: "npm:^1.0.2" - safe-regex-test: "npm:^1.1.0" - checksum: 10c0/fdfa96c8087bf36fc4cd514b474ba2ff404219a4dd4cfa6cf5426404a1eed259bdcdb98f082a71029a48d01f27733e3436ecc6690129a7ec09cb0434bee03a2a - languageName: node - linkType: hard - -"is-glob@npm:^4.0.1, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: "npm:^2.1.1" - checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a - languageName: node - linkType: hard - -"is-inside-container@npm:^1.0.0": - version: 1.0.0 - resolution: "is-inside-container@npm:1.0.0" - dependencies: - is-docker: "npm:^3.0.0" - bin: - is-inside-container: cli.js - checksum: 10c0/a8efb0e84f6197e6ff5c64c52890fa9acb49b7b74fed4da7c95383965da6f0fa592b4dbd5e38a79f87fc108196937acdbcd758fcefc9b140e479b39ce1fcd1cd - languageName: node - linkType: hard - -"is-nan@npm:^1.3.2": - version: 1.3.2 - resolution: "is-nan@npm:1.3.2" - dependencies: - call-bind: "npm:^1.0.0" - define-properties: "npm:^1.1.3" - checksum: 10c0/8bfb286f85763f9c2e28ea32e9127702fe980ffd15fa5d63ade3be7786559e6e21355d3625dd364c769c033c5aedf0a2ed3d4025d336abf1b9241e3d9eddc5b0 - languageName: node - linkType: hard - -"is-network-error@npm:^1.0.0": - version: 1.1.0 - resolution: "is-network-error@npm:1.1.0" - checksum: 10c0/89eef83c2a4cf43d853145ce175d1cf43183b7a58d48c7a03e7eed4eb395d0934c1f6d101255cdd8c8c2980ab529bfbe5dd9edb24e1c3c28d2b3c814469b5b7d - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 - languageName: node - linkType: hard - -"is-plain-obj@npm:^3.0.0": - version: 3.0.0 - resolution: "is-plain-obj@npm:3.0.0" - checksum: 10c0/8e6483bfb051d42ec9c704c0ede051a821c6b6f9a6c7a3e3b55aa855e00981b0580c8f3b1f5e2e62649b39179b1abfee35d6f8086d999bfaa32c1908d29b07bc - languageName: node - linkType: hard - -"is-plain-object@npm:^2.0.4": - version: 2.0.4 - resolution: "is-plain-object@npm:2.0.4" - dependencies: - isobject: "npm:^3.0.1" - checksum: 10c0/f050fdd5203d9c81e8c4df1b3ff461c4bc64e8b5ca383bcdde46131361d0a678e80bcf00b5257646f6c636197629644d53bd8e2375aea633de09a82d57e942f4 - languageName: node - linkType: hard - -"is-regex@npm:^1.2.1": - version: 1.2.1 - resolution: "is-regex@npm:1.2.1" - dependencies: - call-bound: "npm:^1.0.2" - gopd: "npm:^1.2.0" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.2" - checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04 - languageName: node - linkType: hard - -"is-typed-array@npm:^1.1.3": - version: 1.1.15 - resolution: "is-typed-array@npm:1.1.15" - dependencies: - which-typed-array: "npm:^1.1.16" - checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4 - languageName: node - linkType: hard - -"is-wsl@npm:^3.1.0": - version: 3.1.0 - resolution: "is-wsl@npm:3.1.0" - dependencies: - is-inside-container: "npm:^1.0.0" - checksum: 10c0/d3317c11995690a32c362100225e22ba793678fe8732660c6de511ae71a0ff05b06980cf21f98a6bf40d7be0e9e9506f859abe00a1118287d63e53d0a3d06947 - languageName: node - linkType: hard - -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d - languageName: node - linkType: hard - -"isbinaryfile@npm:^4.0.8": - version: 4.0.10 - resolution: "isbinaryfile@npm:4.0.10" - checksum: 10c0/0703d8cfeb69ed79e6d173120f327450011a066755150a6bbf97ffecec1069a5f2092777868315b21359098c84b54984871cad1abce877ad9141fb2caf3dcabf - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d - languageName: node - linkType: hard - -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 - languageName: node - linkType: hard - -"isobject@npm:^3.0.1": - version: 3.0.1 - resolution: "isobject@npm:3.0.1" - checksum: 10c0/03344f5064a82f099a0cd1a8a407f4c0d20b7b8485e8e816c39f249e9416b06c322e8dec5b842b6bb8a06de0af9cb48e7bc1b5352f0fadc2f0abac033db3d4db - languageName: node - linkType: hard - -"istanbul-lib-coverage@npm:^3.0.0": - version: 3.2.2 - resolution: "istanbul-lib-coverage@npm:3.2.2" - checksum: 10c0/6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^4.0.0": - version: 4.0.3 - resolution: "istanbul-lib-instrument@npm:4.0.3" - dependencies: - "@babel/core": "npm:^7.7.5" - "@istanbuljs/schema": "npm:^0.1.2" - istanbul-lib-coverage: "npm:^3.0.0" - semver: "npm:^6.3.0" - checksum: 10c0/7f1005566a912e33e847576b2c1072d48a7c556810a54d912f3e2f0bd966171e68b30c40b0c1ce6ee9b8864de422d0c10e2d0dfd2d25b48723950cc78cd437c2 - languageName: node - linkType: hard - -"istanbul-lib-report@npm:^3.0.0": - version: 3.0.1 - resolution: "istanbul-lib-report@npm:3.0.1" - dependencies: - istanbul-lib-coverage: "npm:^3.0.0" - make-dir: "npm:^4.0.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 - languageName: node - linkType: hard - -"istanbul-lib-source-maps@npm:^4.0.0": - version: 4.0.1 - resolution: "istanbul-lib-source-maps@npm:4.0.1" - dependencies: - debug: "npm:^4.1.1" - istanbul-lib-coverage: "npm:^3.0.0" - source-map: "npm:^0.6.1" - checksum: 10c0/19e4cc405016f2c906dff271a76715b3e881fa9faeb3f09a86cb99b8512b3a5ed19cadfe0b54c17ca0e54c1142c9c6de9330d65506e35873994e06634eebeb66 - languageName: node - linkType: hard - -"istanbul-reports@npm:^3.0.0": - version: 3.1.7 - resolution: "istanbul-reports@npm:3.1.7" - dependencies: - html-escaper: "npm:^2.0.0" - istanbul-lib-report: "npm:^3.0.0" - checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51 - languageName: node - linkType: hard - -"jackspeak@npm:^3.1.2": - version: 3.4.3 - resolution: "jackspeak@npm:3.4.3" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 - languageName: node - linkType: hard - -"jasmine-core@npm:^4.1.0": - version: 4.6.1 - resolution: "jasmine-core@npm:4.6.1" - checksum: 10c0/3d038b7f6f6f0d3cb56cdb4d2f0323a9d84f3a64a03746f9329a2d5a5166ec5e0ad3232d72ceb4f357cf2f120fdb86310715eaeb174f325833515fd0792a6860 - languageName: node - linkType: hard - -"jest-worker@npm:^27.4.5": - version: 27.5.1 - resolution: "jest-worker@npm:27.5.1" - dependencies: - "@types/node": "npm:*" - merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.0.0" - checksum: 10c0/8c4737ffd03887b3c6768e4cc3ca0269c0336c1e4b1b120943958ddb035ed2a0fc6acab6dc99631720a3720af4e708ff84fb45382ad1e83c27946adf3623969b - languageName: node - linkType: hard - -"js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 - languageName: node - linkType: hard - -"jsesc@npm:^3.0.2": - version: 3.1.0 - resolution: "jsesc@npm:3.1.0" - bin: - jsesc: bin/jsesc - checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 - languageName: node - linkType: hard - -"json-parse-even-better-errors@npm:^2.3.1": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce - languageName: node - linkType: hard - -"json-schema-traverse@npm:^1.0.0": - version: 1.0.0 - resolution: "json-schema-traverse@npm:1.0.0" - checksum: 10c0/71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 - languageName: node - linkType: hard - -"json-stringify-safe@npm:^5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 10c0/7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 - languageName: node - linkType: hard - -"json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" - bin: - json5: lib/cli.js - checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c - languageName: node - linkType: hard - -"jsonfile@npm:^4.0.0": - version: 4.0.0 - resolution: "jsonfile@npm:4.0.0" - dependencies: - graceful-fs: "npm:^4.1.6" - dependenciesMeta: - graceful-fs: - optional: true - checksum: 10c0/7dc94b628d57a66b71fb1b79510d460d662eb975b5f876d723f81549c2e9cd316d58a2ddf742b2b93a4fa6b17b2accaf1a738a0e2ea114bdfb13a32e5377e480 - languageName: node - linkType: hard - -"karma-chrome-launcher@npm:^3.1.1": - version: 3.2.0 - resolution: "karma-chrome-launcher@npm:3.2.0" - dependencies: - which: "npm:^1.2.1" - checksum: 10c0/0cec1ae7d922110dc29cee36389d597157c82f019c8917259f9fa93d1f5ee8e19141c2eb74bfe30797cdb3adbc51a6b65fd18a9ebc1527c725c4acf62cd46d04 - languageName: node - linkType: hard - -"karma-jasmine@npm:^5.1.0": - version: 5.1.0 - resolution: "karma-jasmine@npm:5.1.0" - dependencies: - jasmine-core: "npm:^4.1.0" - peerDependencies: - karma: ^6.0.0 - checksum: 10c0/827843d2b4af5396c35de6911d15304955bd7376f96527f46285beb0178510aa401ff123a010a9ee3f13aeeeb56f64a9a3e22d7d61fb58ee76a2845b153a9d20 - languageName: node - linkType: hard - -"karma-spec-reporter@npm:^0.0.36": - version: 0.0.36 - resolution: "karma-spec-reporter@npm:0.0.36" - dependencies: - colors: "npm:1.4.0" - peerDependencies: - karma: ">=0.9" - checksum: 10c0/ae2e9cb5e2af74f0d4d8faa752c7c7204c296566906ea0d1a0eb98e76a02224b3aa60fe58c2b7cb40df4161ecd8a89feb0bd3ced5fffcae4fd5a40b72d48db9d - languageName: node - linkType: hard - -"karma-typescript@npm:^5.5.3": - version: 5.5.4 - resolution: "karma-typescript@npm:5.5.4" - dependencies: - acorn: "npm:^8.1.0" - acorn-walk: "npm:^8.0.2" - assert: "npm:^2.0.0" - async: "npm:^3.0.1" - browser-resolve: "npm:^2.0.0" - browserify-zlib: "npm:^0.2.0" - buffer: "npm:^5.4.3" - combine-source-map: "npm:^0.8.0" - console-browserify: "npm:^1.2.0" - constants-browserify: "npm:^1.0.0" - convert-source-map: "npm:^1.7.0" - crypto-browserify: "npm:^3.12.0" - diff: "npm:^4.0.1" - domain-browser: "npm:^4.16.0" - events: "npm:^3.2.0" - glob: "npm:^7.1.6" - https-browserify: "npm:^1.0.0" - istanbul-lib-coverage: "npm:^3.0.0" - istanbul-lib-instrument: "npm:^4.0.0" - istanbul-lib-report: "npm:^3.0.0" - istanbul-lib-source-maps: "npm:^4.0.0" - istanbul-reports: "npm:^3.0.0" - json-stringify-safe: "npm:^5.0.1" - lodash: "npm:^4.17.19" - log4js: "npm:^6.3.0" - minimatch: "npm:^3.0.4" - os-browserify: "npm:^0.3.0" - pad: "npm:^3.2.0" - path-browserify: "npm:^1.0.0" - process: "npm:^0.11.10" - punycode: "npm:^2.1.1" - querystring-es3: "npm:^0.2.1" - readable-stream: "npm:^3.1.1" - source-map: "npm:^0.7.3" - stream-browserify: "npm:^3.0.0" - stream-http: "npm:^3.1.0" - string_decoder: "npm:^1.3.0" - timers-browserify: "npm:^2.0.11" - tmp: "npm:^0.2.1" - tty-browserify: "npm:^0.0.1" - url: "npm:^0.11.0" - util: "npm:^0.12.1" - vm-browserify: "npm:^1.1.2" - peerDependencies: - karma: 1 || 2 || 3 || 4 || 5 || 6 - typescript: 1 || 2 || 3 || 4 || 5 - checksum: 10c0/18b3a4dc19e505e92dfc04bc82b0a608cf743b8cee2f14d1b9b1289116a1cf3eeadc876f1a0358b258ff9a9d8f516a72ca191eb83a84a647b374505c2b40040e - languageName: node - linkType: hard - -"karma-webpack@npm:^5.0.0": - version: 5.0.1 - resolution: "karma-webpack@npm:5.0.1" - dependencies: - glob: "npm:^7.1.3" - minimatch: "npm:^9.0.3" - webpack-merge: "npm:^4.1.5" - peerDependencies: - webpack: ^5.0.0 - checksum: 10c0/ef7208a6b2746819693c654d6da4a1c7794edb72690006181e1c2897ff8415644e6745ca46bdf170e30c2b82d4b9f16284af5e71fcae026b32de0a08adb14c7d - languageName: node - linkType: hard - -"karma@npm:^6.4.0": - version: 6.4.4 - resolution: "karma@npm:6.4.4" - dependencies: - "@colors/colors": "npm:1.5.0" - body-parser: "npm:^1.19.0" - braces: "npm:^3.0.2" - chokidar: "npm:^3.5.1" - connect: "npm:^3.7.0" - di: "npm:^0.0.1" - dom-serialize: "npm:^2.2.1" - glob: "npm:^7.1.7" - graceful-fs: "npm:^4.2.6" - http-proxy: "npm:^1.18.1" - isbinaryfile: "npm:^4.0.8" - lodash: "npm:^4.17.21" - log4js: "npm:^6.4.1" - mime: "npm:^2.5.2" - minimatch: "npm:^3.0.4" - mkdirp: "npm:^0.5.5" - qjobs: "npm:^1.2.0" - range-parser: "npm:^1.2.1" - rimraf: "npm:^3.0.2" - socket.io: "npm:^4.7.2" - source-map: "npm:^0.6.1" - tmp: "npm:^0.2.1" - ua-parser-js: "npm:^0.7.30" - yargs: "npm:^16.1.1" - bin: - karma: bin/karma - checksum: 10c0/1658c4b7396c0edf6f048289182e075b561902e02992e1a3eb72f56f67090ff0c7ad7c91ab099e88a790c60f9500c5a6f974d75f1769e3ea2dfccda52876ec0b - languageName: node - linkType: hard - -"kind-of@npm:^6.0.2": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 - languageName: node - linkType: hard - -"launch-editor@npm:^2.6.1": - version: 2.9.1 - resolution: "launch-editor@npm:2.9.1" - dependencies: - picocolors: "npm:^1.0.0" - shell-quote: "npm:^1.8.1" - checksum: 10c0/891f1d136ed8e4ea12e16c196a0d2e07f23c7b983e3ab532b2be1775fb244909581507cce97c50f9d5ca92680b53e4a75c72ddcf20184aa6c4da6ebbe87703f5 - languageName: node - linkType: hard - -"loader-runner@npm:^4.2.0": - version: 4.3.0 - resolution: "loader-runner@npm:4.3.0" - checksum: 10c0/a44d78aae0907a72f73966fe8b82d1439c8c485238bd5a864b1b9a2a3257832effa858790241e6b37876b5446a78889adf2fcc8dd897ce54c089ecc0a0ce0bf0 - languageName: node - linkType: hard - -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" - dependencies: - p-locate: "npm:^4.1.0" - checksum: 10c0/33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 - languageName: node - linkType: hard - -"lodash.memoize@npm:~3.0.3": - version: 3.0.4 - resolution: "lodash.memoize@npm:3.0.4" - checksum: 10c0/7d3875ed3f0ea2fb5abd1d0f55362ac141f4e173917acc3797f38e67686b5567a7609b3d460db2d0bb2196620a9245b45ecd1b50f51aa77ad486342fbe2e7d76 - languageName: node - linkType: hard - -"lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c - languageName: node - linkType: hard - -"log4js@npm:^6.3.0, log4js@npm:^6.4.1": - version: 6.9.1 - resolution: "log4js@npm:6.9.1" - dependencies: - date-format: "npm:^4.0.14" - debug: "npm:^4.3.4" - flatted: "npm:^3.2.7" - rfdc: "npm:^1.3.0" - streamroller: "npm:^3.1.5" - checksum: 10c0/05846e48f72d662800c8189bd178c42b4aa2f0c574cfc90a1942cf90b76f621c44019e26796c8fd88da1b6f0fe8272cba607cbaad6ae6ede50a7a096b58197ea - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: "npm:^3.0.2" - checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 - languageName: node - linkType: hard - -"make-dir@npm:^4.0.0": - version: 4.0.0 - resolution: "make-dir@npm:4.0.0" - dependencies: - semver: "npm:^7.5.3" - checksum: 10c0/69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68 - languageName: node - linkType: hard - -"make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f - languageName: node - linkType: hard - -"make-fetch-happen@npm:^14.0.3": - version: 14.0.3 - resolution: "make-fetch-happen@npm:14.0.3" - dependencies: - "@npmcli/agent": "npm:^3.0.0" - cacache: "npm:^19.0.1" - http-cache-semantics: "npm:^4.1.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^4.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^1.0.0" - proc-log: "npm:^5.0.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^12.0.0" - checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 - languageName: node - linkType: hard - -"math-intrinsics@npm:^1.1.0": - version: 1.1.0 - resolution: "math-intrinsics@npm:1.1.0" - checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f - languageName: node - linkType: hard - -"md5.js@npm:^1.3.4": - version: 1.3.5 - resolution: "md5.js@npm:1.3.5" - dependencies: - hash-base: "npm:^3.0.0" - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.1.2" - checksum: 10c0/b7bd75077f419c8e013fc4d4dada48be71882e37d69a44af65a2f2804b91e253441eb43a0614423a1c91bb830b8140b0dc906bc797245e2e275759584f4efcc5 - languageName: node - linkType: hard - -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 - languageName: node - linkType: hard - -"memfs@npm:^4.6.0": - version: 4.17.0 - resolution: "memfs@npm:4.17.0" - dependencies: - "@jsonjoy.com/json-pack": "npm:^1.0.3" - "@jsonjoy.com/util": "npm:^1.3.0" - tree-dump: "npm:^1.0.1" - tslib: "npm:^2.0.0" - checksum: 10c0/2901f69e80e1fbefa8aafe994a253fff6f34eb176d8b80d57476311611e516a11ab4dd93f852c8739fe04f2b57d6a4ca7a1828fa0bd401ce631bcac214b3d58b - languageName: node - linkType: hard - -"merge-descriptors@npm:1.0.3": - version: 1.0.3 - resolution: "merge-descriptors@npm:1.0.3" - checksum: 10c0/866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 - languageName: node - linkType: hard - -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 10c0/bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 - languageName: node - linkType: hard - -"micromatch@npm:^4.0.0, micromatch@npm:^4.0.2": - version: 4.0.8 - resolution: "micromatch@npm:4.0.8" - dependencies: - braces: "npm:^3.0.3" - picomatch: "npm:^2.3.1" - checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 - languageName: node - linkType: hard - -"miller-rabin@npm:^4.0.0": - version: 4.0.1 - resolution: "miller-rabin@npm:4.0.1" - dependencies: - bn.js: "npm:^4.0.0" - brorand: "npm:^1.0.1" - bin: - miller-rabin: bin/miller-rabin - checksum: 10c0/26b2b96f6e49dbcff7faebb78708ed2f5f9ae27ac8cbbf1d7c08f83cf39bed3d418c0c11034dce997da70d135cc0ff6f3a4c15dc452f8e114c11986388a64346 - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-db@npm:>= 1.43.0 < 2": - version: 1.53.0 - resolution: "mime-db@npm:1.53.0" - checksum: 10c0/1dcc37ba8ed5d1c179f5c6f0837e8db19371d5f2ea3690c3c2f3fa8c3858f976851d3460b172b4dee78ebd606762cbb407aa398545fbacd539e519f858cd7bf4 - languageName: node - linkType: hard - -"mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - -"mime@npm:1.6.0": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: 10c0/b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 - languageName: node - linkType: hard - -"mime@npm:^2.5.2": - version: 2.6.0 - resolution: "mime@npm:2.6.0" - bin: - mime: cli.js - checksum: 10c0/a7f2589900d9c16e3bdf7672d16a6274df903da958c1643c9c45771f0478f3846dcb1097f31eb9178452570271361e2149310931ec705c037210fc69639c8e6c - languageName: node - linkType: hard - -"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: 10c0/96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd - languageName: node - linkType: hard - -"minimalistic-crypto-utils@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-crypto-utils@npm:1.0.1" - checksum: 10c0/790ecec8c5c73973a4fbf2c663d911033e8494d5fb0960a4500634766ab05d6107d20af896ca2132e7031741f19888154d44b2408ada0852446705441383e9f8 - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.3, minimatch@npm:^9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed - languageName: node - linkType: hard - -"minimist@npm:^1.2.6": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^4.0.0": - version: 4.0.0 - resolution: "minipass-fetch@npm:4.0.0" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^3.0.1" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/7fa30ce7c373fb6f94c086b374fff1589fd7e78451855d2d06c2e2d9df936d131e73e952163063016592ed3081444bd8d1ea608533313b0149156ce23311da4b - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 - languageName: node - linkType: hard - -"minizlib@npm:^3.0.1": - version: 3.0.1 - resolution: "minizlib@npm:3.0.1" - dependencies: - minipass: "npm:^7.0.4" - rimraf: "npm:^5.0.5" - checksum: 10c0/82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 - languageName: node - linkType: hard - -"mkdirp@npm:^0.5.5": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: "npm:^1.2.6" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 - languageName: node - linkType: hard - -"mkdirp@npm:^3.0.1": - version: 3.0.1 - resolution: "mkdirp@npm:3.0.1" - bin: - mkdirp: dist/cjs/src/bin.js - checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d - languageName: node - linkType: hard - -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d - languageName: node - linkType: hard - -"ms@npm:2.1.3, ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"multicast-dns@npm:^7.2.5": - version: 7.2.5 - resolution: "multicast-dns@npm:7.2.5" - dependencies: - dns-packet: "npm:^5.2.2" - thunky: "npm:^1.0.2" - bin: - multicast-dns: cli.js - checksum: 10c0/5120171d4bdb1577764c5afa96e413353bff530d1b37081cb29cccc747f989eb1baf40574fe8e27060fc1aef72b59c042f72b9b208413de33bcf411343c69057 - languageName: node - linkType: hard - -"negotiator@npm:0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 - languageName: node - linkType: hard - -"negotiator@npm:^1.0.0": - version: 1.0.0 - resolution: "negotiator@npm:1.0.0" - checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b - languageName: node - linkType: hard - -"negotiator@npm:~0.6.4": - version: 0.6.4 - resolution: "negotiator@npm:0.6.4" - checksum: 10c0/3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea - languageName: node - linkType: hard - -"neo-async@npm:^2.6.2": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: 10c0/c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d - languageName: node - linkType: hard - -"node-forge@npm:^1": - version: 1.3.1 - resolution: "node-forge@npm:1.3.1" - checksum: 10c0/e882819b251a4321f9fc1d67c85d1501d3004b4ee889af822fd07f64de3d1a8e272ff00b689570af0465d65d6bf5074df9c76e900e0aff23e60b847f2a46fbe8 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 11.0.0 - resolution: "node-gyp@npm:11.0.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^14.0.3" - nopt: "npm:^8.0.0" - proc-log: "npm:^5.0.0" - semver: "npm:^7.3.5" - tar: "npm:^7.4.3" - which: "npm:^5.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/a3b885bbee2d271f1def32ba2e30ffcf4562a3db33af06b8b365e053153e2dd2051b9945783c3c8e852d26a0f20f65b251c7e83361623383a99635c0280ee573 - languageName: node - linkType: hard - -"node-releases@npm:^2.0.19": - version: 2.0.19 - resolution: "node-releases@npm:2.0.19" - checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa - languageName: node - linkType: hard - -"nopt@npm:^8.0.0": - version: 8.0.0 - resolution: "nopt@npm:8.0.0" - dependencies: - abbrev: "npm:^2.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/19cb986f79abaca2d0f0b560021da7b32ee6fcc3de48f3eaeb0c324d36755c17754f886a754c091f01f740c17caf7d6aea8237b7fbaf39f476ae5e30a249f18f - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 - languageName: node - linkType: hard - -"object-assign@npm:^4": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.3": - version: 1.13.3 - resolution: "object-inspect@npm:1.13.3" - checksum: 10c0/cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 - languageName: node - linkType: hard - -"object-is@npm:^1.1.5": - version: 1.1.6 - resolution: "object-is@npm:1.1.6" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - checksum: 10c0/506af444c4dce7f8e31f34fc549e2fb8152d6b9c4a30c6e62852badd7f520b579c679af433e7a072f9d78eb7808d230dc12e1cf58da9154dfbf8813099ea0fe0 - languageName: node - linkType: hard - -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d - languageName: node - linkType: hard - -"object.assign@npm:^4.1.4": - version: 4.1.7 - resolution: "object.assign@npm:4.1.7" - dependencies: - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - define-properties: "npm:^1.2.1" - es-object-atoms: "npm:^1.0.0" - has-symbols: "npm:^1.1.0" - object-keys: "npm:^1.1.1" - checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc - languageName: node - linkType: hard - -"obuf@npm:^1.0.0, obuf@npm:^1.1.2": - version: 1.1.2 - resolution: "obuf@npm:1.1.2" - checksum: 10c0/520aaac7ea701618eacf000fc96ae458e20e13b0569845800fc582f81b386731ab22d55354b4915d58171db00e79cfcd09c1638c02f89577ef092b38c65b7d81 - languageName: node - linkType: hard - -"on-finished@npm:2.4.1, on-finished@npm:^2.4.1": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" - dependencies: - ee-first: "npm:1.1.1" - checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 - languageName: node - linkType: hard - -"on-finished@npm:~2.3.0": - version: 2.3.0 - resolution: "on-finished@npm:2.3.0" - dependencies: - ee-first: "npm:1.1.1" - checksum: 10c0/c904f9e518b11941eb60279a3cbfaf1289bd0001f600a950255b1dede9fe3df8cd74f38483550b3bb9485165166acb5db500c3b4c4337aec2815c88c96fcc2ea - languageName: node - linkType: hard - -"on-headers@npm:~1.0.2": - version: 1.0.2 - resolution: "on-headers@npm:1.0.2" - checksum: 10c0/f649e65c197bf31505a4c0444875db0258e198292f34b884d73c2f751e91792ef96bb5cf89aa0f4fecc2e4dc662461dda606b1274b0e564f539cae5d2f5fc32f - languageName: node - linkType: hard - -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 - languageName: node - linkType: hard - -"open@npm:^10.0.3": - version: 10.1.0 - resolution: "open@npm:10.1.0" - dependencies: - default-browser: "npm:^5.2.1" - define-lazy-prop: "npm:^3.0.0" - is-inside-container: "npm:^1.0.0" - is-wsl: "npm:^3.1.0" - checksum: 10c0/c86d0b94503d5f735f674158d5c5d339c25ec2927562f00ee74590727292ed23e1b8d9336cb41ffa7e1fa4d3641d29b199b4ea37c78cb557d72b511743e90ebb - languageName: node - linkType: hard - -"os-browserify@npm:^0.3.0": - version: 0.3.0 - resolution: "os-browserify@npm:0.3.0" - checksum: 10c0/6ff32cb1efe2bc6930ad0fd4c50e30c38010aee909eba8d65be60af55efd6cbb48f0287e3649b4e3f3a63dce5a667b23c187c4293a75e557f0d5489d735bcf52 - languageName: node - linkType: hard - -"p-limit@npm:^2.2.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: "npm:^2.0.0" - checksum: 10c0/8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 - languageName: node - linkType: hard - -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: "npm:^2.2.0" - checksum: 10c0/1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 - languageName: node - linkType: hard - -"p-map@npm:^7.0.2": - version: 7.0.3 - resolution: "p-map@npm:7.0.3" - checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c - languageName: node - linkType: hard - -"p-retry@npm:^6.2.0": - version: 6.2.1 - resolution: "p-retry@npm:6.2.1" - dependencies: - "@types/retry": "npm:0.12.2" - is-network-error: "npm:^1.0.0" - retry: "npm:^0.13.1" - checksum: 10c0/10d014900107da2c7071ad60fffe4951675f09930b7a91681643ea224ae05649c05001d9e78436d902fe8b116d520dd1f60e72e091de097e2640979d56f3fb60 - languageName: node - linkType: hard - -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: 10c0/c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f - languageName: node - linkType: hard - -"package-json-from-dist@npm:^1.0.0": - version: 1.0.1 - resolution: "package-json-from-dist@npm:1.0.1" - checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b - languageName: node - linkType: hard - -"pad@npm:^3.2.0": - version: 3.3.0 - resolution: "pad@npm:3.3.0" - dependencies: - "@rollup/rollup-linux-x64-gnu": "npm:4.9.5" - wcwidth: "npm:^1.0.1" - dependenciesMeta: - "@rollup/rollup-linux-x64-gnu": - optional: true - checksum: 10c0/1972a9bee3e94fdd14f9b32c42aa56c025bcce59222823086536d5d9e03f33653d9dd8cb88d7535b903dad49bdfbb16b31f5e2809f5ac8287815306eb2a167de - languageName: node - linkType: hard - -"pako@npm:~1.0.5": - version: 1.0.11 - resolution: "pako@npm:1.0.11" - checksum: 10c0/86dd99d8b34c3930345b8bbeb5e1cd8a05f608eeb40967b293f72fe469d0e9c88b783a8777e4cc7dc7c91ce54c5e93d88ff4b4f060e6ff18408fd21030d9ffbe - languageName: node - linkType: hard - -"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.7": - version: 5.1.7 - resolution: "parse-asn1@npm:5.1.7" - dependencies: - asn1.js: "npm:^4.10.1" - browserify-aes: "npm:^1.2.0" - evp_bytestokey: "npm:^1.0.3" - hash-base: "npm:~3.0" - pbkdf2: "npm:^3.1.2" - safe-buffer: "npm:^5.2.1" - checksum: 10c0/05eb5937405c904eb5a7f3633bab1acc11f4ae3478a07ef5c6d81ce88c3c0e505ff51f9c7b935ebc1265c868343793698fc91025755a895d0276f620f95e8a82 - languageName: node - linkType: hard - -"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": - version: 1.3.3 - resolution: "parseurl@npm:1.3.3" - checksum: 10c0/90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 - languageName: node - linkType: hard - -"path-browserify@npm:^1.0.0": - version: 1.0.1 - resolution: "path-browserify@npm:1.0.1" - checksum: 10c0/8b8c3fd5c66bd340272180590ae4ff139769e9ab79522e2eb82e3d571a89b8117c04147f65ad066dccfb42fcad902e5b7d794b3d35e0fd840491a8ddbedf8c66 - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d - languageName: node - linkType: hard - -"path-to-regexp@npm:0.1.12": - version: 0.1.12 - resolution: "path-to-regexp@npm:0.1.12" - checksum: 10c0/1c6ff10ca169b773f3bba943bbc6a07182e332464704572962d277b900aeee81ac6aa5d060ff9e01149636c30b1f63af6e69dd7786ba6e0ddb39d4dee1f0645b - languageName: node - linkType: hard - -"pbkdf2@npm:^3.1.2": - version: 3.1.2 - resolution: "pbkdf2@npm:3.1.2" - dependencies: - create-hash: "npm:^1.1.2" - create-hmac: "npm:^1.1.4" - ripemd160: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - sha.js: "npm:^2.4.8" - checksum: 10c0/5a30374e87d33fa080a92734d778cf172542cc7e41b96198c4c88763997b62d7850de3fbda5c3111ddf79805ee7c1da7046881c90ac4920b5e324204518b05fd - languageName: node - linkType: hard - -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": - version: 1.1.1 - resolution: "picocolors@npm:1.1.1" - checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be - languageName: node - linkType: hard - -"pkg-dir@npm:^4.2.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" - dependencies: - find-up: "npm:^4.0.0" - checksum: 10c0/c56bda7769e04907a88423feb320babaed0711af8c436ce3e56763ab1021ba107c7b0cafb11cde7529f669cfc22bffcaebffb573645cbd63842ea9fb17cd7728 - languageName: node - linkType: hard - -"possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: 10c0/d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd - languageName: node - linkType: hard - -"proc-log@npm:^5.0.0": - version: 5.0.0 - resolution: "proc-log@npm:5.0.0" - checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 - languageName: node - linkType: hard - -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 - languageName: node - linkType: hard - -"process@npm:^0.11.10": - version: 0.11.10 - resolution: "process@npm:0.11.10" - checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 - languageName: node - linkType: hard - -"proxy-addr@npm:~2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: "npm:0.2.0" - ipaddr.js: "npm:1.9.1" - checksum: 10c0/c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 - languageName: node - linkType: hard - -"public-encrypt@npm:^4.0.3": - version: 4.0.3 - resolution: "public-encrypt@npm:4.0.3" - dependencies: - bn.js: "npm:^4.1.0" - browserify-rsa: "npm:^4.0.0" - create-hash: "npm:^1.1.0" - parse-asn1: "npm:^5.0.0" - randombytes: "npm:^2.0.1" - safe-buffer: "npm:^5.1.2" - checksum: 10c0/6c2cc19fbb554449e47f2175065d6b32f828f9b3badbee4c76585ac28ae8641aafb9bb107afc430c33c5edd6b05dbe318df4f7d6d7712b1093407b11c4280700 - languageName: node - linkType: hard - -"punycode@npm:^1.4.1": - version: 1.4.1 - resolution: "punycode@npm:1.4.1" - checksum: 10c0/354b743320518aef36f77013be6e15da4db24c2b4f62c5f1eb0529a6ed02fbaf1cb52925785f6ab85a962f2b590d9cd5ad730b70da72b5f180e2556b8bd3ca08 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 - languageName: node - linkType: hard - -"qjobs@npm:^1.2.0": - version: 1.2.0 - resolution: "qjobs@npm:1.2.0" - checksum: 10c0/772207772b856a3b1ec673b11a6cda074f1b82821644f2d042504b438ea3ea1fe918555547491e717e8694ec105379fe5139fc5ddd7937b21f7712bb648ed01d - languageName: node - linkType: hard - -"qs@npm:6.13.0": - version: 6.13.0 - resolution: "qs@npm:6.13.0" - dependencies: - side-channel: "npm:^1.0.6" - checksum: 10c0/62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860 - languageName: node - linkType: hard - -"qs@npm:^6.12.3": - version: 6.14.0 - resolution: "qs@npm:6.14.0" - dependencies: - side-channel: "npm:^1.1.0" - checksum: 10c0/8ea5d91bf34f440598ee389d4a7d95820e3b837d3fd9f433871f7924801becaa0cd3b3b4628d49a7784d06a8aea9bc4554d2b6d8d584e2d221dc06238a42909c - languageName: node - linkType: hard - -"querystring-es3@npm:^0.2.1": - version: 0.2.1 - resolution: "querystring-es3@npm:0.2.1" - checksum: 10c0/476938c1adb45c141f024fccd2ffd919a3746e79ed444d00e670aad68532977b793889648980e7ca7ff5ffc7bfece623118d0fbadcaf217495eeb7059ae51580 - languageName: node - linkType: hard - -"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: "npm:^5.1.0" - checksum: 10c0/50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 - languageName: node - linkType: hard - -"randomfill@npm:^1.0.4": - version: 1.0.4 - resolution: "randomfill@npm:1.0.4" - dependencies: - randombytes: "npm:^2.0.5" - safe-buffer: "npm:^5.1.0" - checksum: 10c0/11aeed35515872e8f8a2edec306734e6b74c39c46653607f03c68385ab8030e2adcc4215f76b5e4598e028c4750d820afd5c65202527d831d2a5f207fe2bc87c - languageName: node - linkType: hard - -"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1": - version: 1.2.1 - resolution: "range-parser@npm:1.2.1" - checksum: 10c0/96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 - languageName: node - linkType: hard - -"raw-body@npm:2.5.2": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" - dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 - languageName: node - linkType: hard - -"readable-stream@npm:^2.0.1, readable-stream@npm:^2.3.8": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.3" - isarray: "npm:~1.0.0" - process-nextick-args: "npm:~2.0.0" - safe-buffer: "npm:~5.1.1" - string_decoder: "npm:~1.1.1" - util-deprecate: "npm:~1.0.1" - checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa - languageName: node - linkType: hard - -"readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: "npm:^2.0.3" - string_decoder: "npm:^1.1.1" - util-deprecate: "npm:^1.0.1" - checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: "npm:^2.2.1" - checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b - languageName: node - linkType: hard - -"rechoir@npm:^0.8.0": - version: 0.8.0 - resolution: "rechoir@npm:0.8.0" - dependencies: - resolve: "npm:^1.20.0" - checksum: 10c0/1a30074124a22abbd5d44d802dac26407fa72a0a95f162aa5504ba8246bc5452f8b1a027b154d9bdbabcd8764920ff9333d934c46a8f17479c8912e92332f3ff - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 - languageName: node - linkType: hard - -"require-from-string@npm:^2.0.2": - version: 2.0.2 - resolution: "require-from-string@npm:2.0.2" - checksum: 10c0/aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 - languageName: node - linkType: hard - -"requires-port@npm:^1.0.0": - version: 1.0.0 - resolution: "requires-port@npm:1.0.0" - checksum: 10c0/b2bfdd09db16c082c4326e573a82c0771daaf7b53b9ce8ad60ea46aa6e30aaf475fe9b164800b89f93b748d2c234d8abff945d2551ba47bf5698e04cd7713267 - languageName: node - linkType: hard - -"resolve-cwd@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-cwd@npm:3.0.0" - dependencies: - resolve-from: "npm:^5.0.0" - checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 - languageName: node - linkType: hard - -"resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 - languageName: node - linkType: hard - -"resolve@npm:^1.17.0, resolve@npm:^1.20.0": - version: 1.22.10 - resolution: "resolve@npm:1.22.10" - dependencies: - is-core-module: "npm:^2.16.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/8967e1f4e2cc40f79b7e080b4582b9a8c5ee36ffb46041dccb20e6461161adf69f843b43067b4a375de926a2cd669157e29a29578191def399dd5ef89a1b5203 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin": - version: 1.22.10 - resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.16.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939 - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe - languageName: node - linkType: hard - -"retry@npm:^0.13.1": - version: 0.13.1 - resolution: "retry@npm:0.13.1" - checksum: 10c0/9ae822ee19db2163497e074ea919780b1efa00431d197c7afdb950e42bf109196774b92a49fc9821f0b8b328a98eea6017410bfc5e8a0fc19c85c6d11adb3772 - languageName: node - linkType: hard - -"rfdc@npm:^1.3.0": - version: 1.4.1 - resolution: "rfdc@npm:1.4.1" - checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 - languageName: node - linkType: hard - -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: bin.js - checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 - languageName: node - linkType: hard - -"rimraf@npm:^5.0.5": - version: 5.0.10 - resolution: "rimraf@npm:5.0.10" - dependencies: - glob: "npm:^10.3.7" - bin: - rimraf: dist/esm/bin.mjs - checksum: 10c0/7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc - languageName: node - linkType: hard - -"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": - version: 2.0.2 - resolution: "ripemd160@npm:2.0.2" - dependencies: - hash-base: "npm:^3.0.0" - inherits: "npm:^2.0.1" - checksum: 10c0/f6f0df78817e78287c766687aed4d5accbebc308a8e7e673fb085b9977473c1f139f0c5335d353f172a915bb288098430755d2ad3c4f30612f4dd0c901cd2c3a - languageName: node - linkType: hard - -"run-applescript@npm:^7.0.0": - version: 7.0.0 - resolution: "run-applescript@npm:7.0.0" - checksum: 10c0/bd821bbf154b8e6c8ecffeaf0c33cebbb78eb2987476c3f6b420d67ab4c5301faa905dec99ded76ebb3a7042b4e440189ae6d85bbbd3fc6e8d493347ecda8bfe - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 - languageName: node - linkType: hard - -"safe-regex-test@npm:^1.1.0": - version: 1.1.0 - resolution: "safe-regex-test@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - is-regex: "npm:^1.2.1" - checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - -"schema-utils@npm:^3.2.0": - version: 3.3.0 - resolution: "schema-utils@npm:3.3.0" - dependencies: - "@types/json-schema": "npm:^7.0.8" - ajv: "npm:^6.12.5" - ajv-keywords: "npm:^3.5.2" - checksum: 10c0/fafdbde91ad8aa1316bc543d4b61e65ea86970aebbfb750bfb6d8a6c287a23e415e0e926c2498696b242f63af1aab8e585252637fabe811fd37b604351da6500 - languageName: node - linkType: hard - -"schema-utils@npm:^4.0.0, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0": - version: 4.3.0 - resolution: "schema-utils@npm:4.3.0" - dependencies: - "@types/json-schema": "npm:^7.0.9" - ajv: "npm:^8.9.0" - ajv-formats: "npm:^2.1.1" - ajv-keywords: "npm:^5.1.0" - checksum: 10c0/c23f0fa73ef71a01d4a2bb7af4c91e0d356ec640e071aa2d06ea5e67f042962bb7ac7c29a60a295bb0125878801bc3209197a2b8a833dd25bd38e37c3ed21427 - languageName: node - linkType: hard - -"select-hose@npm:^2.0.0": - version: 2.0.0 - resolution: "select-hose@npm:2.0.0" - checksum: 10c0/01cc52edd29feddaf379efb4328aededa633f0ac43c64b11a8abd075ff34f05b0d280882c4fbcbdf1a0658202c9cd2ea8d5985174dcf9a2dac7e3a4996fa9b67 - languageName: node - linkType: hard - -"selfsigned@npm:^2.4.1": - version: 2.4.1 - resolution: "selfsigned@npm:2.4.1" - dependencies: - "@types/node-forge": "npm:^1.3.0" - node-forge: "npm:^1" - checksum: 10c0/521829ec36ea042f7e9963bf1da2ed040a815cf774422544b112ec53b7edc0bc50a0f8cc2ae7aa6cc19afa967c641fd96a15de0fc650c68651e41277d2e1df09 - languageName: node - linkType: hard - -"semver@npm:^6.3.0, semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d - languageName: node - linkType: hard - -"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3": - version: 7.6.3 - resolution: "semver@npm:7.6.3" - bin: - semver: bin/semver.js - checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf - languageName: node - linkType: hard - -"send@npm:0.19.0": - version: 0.19.0 - resolution: "send@npm:0.19.0" - dependencies: - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - encodeurl: "npm:~1.0.2" - escape-html: "npm:~1.0.3" - etag: "npm:~1.8.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" - mime: "npm:1.6.0" - ms: "npm:2.1.3" - on-finished: "npm:2.4.1" - range-parser: "npm:~1.2.1" - statuses: "npm:2.0.1" - checksum: 10c0/ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3 - languageName: node - linkType: hard - -"serialize-javascript@npm:^6.0.2": - version: 6.0.2 - resolution: "serialize-javascript@npm:6.0.2" - dependencies: - randombytes: "npm:^2.1.0" - checksum: 10c0/2dd09ef4b65a1289ba24a788b1423a035581bef60817bea1f01eda8e3bda623f86357665fe7ac1b50f6d4f583f97db9615b3f07b2a2e8cbcb75033965f771dd2 - languageName: node - linkType: hard - -"serve-index@npm:^1.9.1": - version: 1.9.1 - resolution: "serve-index@npm:1.9.1" - dependencies: - accepts: "npm:~1.3.4" - batch: "npm:0.6.1" - debug: "npm:2.6.9" - escape-html: "npm:~1.0.3" - http-errors: "npm:~1.6.2" - mime-types: "npm:~2.1.17" - parseurl: "npm:~1.3.2" - checksum: 10c0/a666471a24196f74371edf2c3c7bcdd82adbac52f600804508754b5296c3567588bf694258b19e0cb23a567acfa20d9721bfdaed3286007b81f9741ada8a3a9c - languageName: node - linkType: hard - -"serve-static@npm:1.16.2": - version: 1.16.2 - resolution: "serve-static@npm:1.16.2" - dependencies: - encodeurl: "npm:~2.0.0" - escape-html: "npm:~1.0.3" - parseurl: "npm:~1.3.3" - send: "npm:0.19.0" - checksum: 10c0/528fff6f5e12d0c5a391229ad893910709bc51b5705962b09404a1d813857578149b8815f35d3ee5752f44cd378d0f31669d4b1d7e2d11f41e08283d5134bd1f - languageName: node - linkType: hard - -"set-function-length@npm:^1.2.2": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c - languageName: node - linkType: hard - -"setimmediate@npm:^1.0.4": - version: 1.0.5 - resolution: "setimmediate@npm:1.0.5" - checksum: 10c0/5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 - languageName: node - linkType: hard - -"setprototypeof@npm:1.1.0": - version: 1.1.0 - resolution: "setprototypeof@npm:1.1.0" - checksum: 10c0/a77b20876689c6a89c3b42f0c3596a9cae02f90fc902570cbd97198e9e8240382086c9303ad043e88cee10f61eae19f1004e51d885395a1e9bf49f9ebed12872 - languageName: node - linkType: hard - -"setprototypeof@npm:1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc - languageName: node - linkType: hard - -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": - version: 2.4.11 - resolution: "sha.js@npm:2.4.11" - dependencies: - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - bin: - sha.js: ./bin.js - checksum: 10c0/b7a371bca8821c9cc98a0aeff67444a03d48d745cb103f17228b96793f455f0eb0a691941b89ea1e60f6359207e36081d9be193252b0f128e0daf9cfea2815a5 - languageName: node - linkType: hard - -"shallow-clone@npm:^3.0.0": - version: 3.0.1 - resolution: "shallow-clone@npm:3.0.1" - dependencies: - kind-of: "npm:^6.0.2" - checksum: 10c0/7bab09613a1b9f480c85a9823aebec533015579fa055ba6634aa56ba1f984380670eaf33b8217502931872aa1401c9fcadaa15f9f604d631536df475b05bcf1e - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 - languageName: node - linkType: hard - -"shell-quote@npm:^1.8.1": - version: 1.8.2 - resolution: "shell-quote@npm:1.8.2" - checksum: 10c0/85fdd44f2ad76e723d34eb72c753f04d847ab64e9f1f10677e3f518d0e5b0752a176fd805297b30bb8c3a1556ebe6e77d2288dbd7b7b0110c7e941e9e9c20ce1 - languageName: node - linkType: hard - -"side-channel-list@npm:^1.0.0": - version: 1.0.0 - resolution: "side-channel-list@npm:1.0.0" - dependencies: - es-errors: "npm:^1.3.0" - object-inspect: "npm:^1.13.3" - checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d - languageName: node - linkType: hard - -"side-channel-map@npm:^1.0.1": - version: 1.0.1 - resolution: "side-channel-map@npm:1.0.1" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.5" - object-inspect: "npm:^1.13.3" - checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672 - languageName: node - linkType: hard - -"side-channel-weakmap@npm:^1.0.2": - version: 1.0.2 - resolution: "side-channel-weakmap@npm:1.0.2" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.5" - object-inspect: "npm:^1.13.3" - side-channel-map: "npm:^1.0.1" - checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185 - languageName: node - linkType: hard - -"side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": - version: 1.1.0 - resolution: "side-channel@npm:1.1.0" - dependencies: - es-errors: "npm:^1.3.0" - object-inspect: "npm:^1.13.3" - side-channel-list: "npm:^1.0.0" - side-channel-map: "npm:^1.0.1" - side-channel-weakmap: "npm:^1.0.2" - checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 - languageName: node - linkType: hard - -"socket.io-adapter@npm:~2.5.2": - version: 2.5.5 - resolution: "socket.io-adapter@npm:2.5.5" - dependencies: - debug: "npm:~4.3.4" - ws: "npm:~8.17.1" - checksum: 10c0/04a5a2a9c4399d1b6597c2afc4492ab1e73430cc124ab02b09e948eabf341180b3866e2b61b5084cb899beb68a4db7c328c29bda5efb9207671b5cb0bc6de44e - languageName: node - linkType: hard - -"socket.io-parser@npm:~4.2.4": - version: 4.2.4 - resolution: "socket.io-parser@npm:4.2.4" - dependencies: - "@socket.io/component-emitter": "npm:~3.1.0" - debug: "npm:~4.3.1" - checksum: 10c0/9383b30358fde4a801ea4ec5e6860915c0389a091321f1c1f41506618b5cf7cd685d0a31c587467a0c4ee99ef98c2b99fb87911f9dfb329716c43b587f29ca48 - languageName: node - linkType: hard - -"socket.io@npm:^4.7.2": - version: 4.8.1 - resolution: "socket.io@npm:4.8.1" - dependencies: - accepts: "npm:~1.3.4" - base64id: "npm:~2.0.0" - cors: "npm:~2.8.5" - debug: "npm:~4.3.2" - engine.io: "npm:~6.6.0" - socket.io-adapter: "npm:~2.5.2" - socket.io-parser: "npm:~4.2.4" - checksum: 10c0/acf931a2bb235be96433b71da3d8addc63eeeaa8acabd33dc8d64e12287390a45f1e9f389a73cf7dc336961cd491679741b7a016048325c596835abbcc017ca9 - languageName: node - linkType: hard - -"sockjs@npm:^0.3.24": - version: 0.3.24 - resolution: "sockjs@npm:0.3.24" - dependencies: - faye-websocket: "npm:^0.11.3" - uuid: "npm:^8.3.2" - websocket-driver: "npm:^0.7.4" - checksum: 10c0/aa102c7d921bf430215754511c81ea7248f2dcdf268fbdb18e4d8183493a86b8793b164c636c52f474a886f747447c962741df2373888823271efdb9d2594f33 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.5 - resolution: "socks-proxy-agent@npm:8.0.5" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:^4.3.4" - socks: "npm:^2.8.3" - checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 - languageName: node - linkType: hard - -"socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" - dependencies: - ip-address: "npm:^9.0.5" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 - languageName: node - linkType: hard - -"source-map-support@npm:~0.5.20": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" - dependencies: - buffer-from: "npm:^1.0.0" - source-map: "npm:^0.6.0" - checksum: 10c0/9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d - languageName: node - linkType: hard - -"source-map@npm:^0.6.0, source-map@npm:^0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 - languageName: node - linkType: hard - -"source-map@npm:^0.7.3, source-map@npm:^0.7.4": - version: 0.7.4 - resolution: "source-map@npm:0.7.4" - checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc - languageName: node - linkType: hard - -"source-map@npm:~0.5.3": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 - languageName: node - linkType: hard - -"spdy-transport@npm:^3.0.0": - version: 3.0.0 - resolution: "spdy-transport@npm:3.0.0" - dependencies: - debug: "npm:^4.1.0" - detect-node: "npm:^2.0.4" - hpack.js: "npm:^2.1.6" - obuf: "npm:^1.1.2" - readable-stream: "npm:^3.0.6" - wbuf: "npm:^1.7.3" - checksum: 10c0/eaf7440fa90724fffc813c386d4a8a7427d967d6e46d7c51d8f8a533d1a6911b9823ea9218703debbae755337e85f110185d7a00ae22ec5c847077b908ce71bb - languageName: node - linkType: hard - -"spdy@npm:^4.0.2": - version: 4.0.2 - resolution: "spdy@npm:4.0.2" - dependencies: - debug: "npm:^4.1.0" - handle-thing: "npm:^2.0.0" - http-deceiver: "npm:^1.2.7" - select-hose: "npm:^2.0.0" - spdy-transport: "npm:^3.0.0" - checksum: 10c0/983509c0be9d06fd00bb9dff713c5b5d35d3ffd720db869acdd5ad7aa6fc0e02c2318b58f75328957d8ff772acdf1f7d19382b6047df342044ff3e2d6805ccdf - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec - languageName: node - linkType: hard - -"ssri@npm:^12.0.0": - version: 12.0.0 - resolution: "ssri@npm:12.0.0" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d - languageName: node - linkType: hard - -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 - languageName: node - linkType: hard - -"statuses@npm:>= 1.4.0 < 2, statuses@npm:~1.5.0": - version: 1.5.0 - resolution: "statuses@npm:1.5.0" - checksum: 10c0/e433900956357b3efd79b1c547da4d291799ac836960c016d10a98f6a810b1b5c0dcc13b5a7aa609a58239b5190e1ea176ad9221c2157d2fd1c747393e6b2940 - languageName: node - linkType: hard - -"stream-browserify@npm:^3.0.0": - version: 3.0.0 - resolution: "stream-browserify@npm:3.0.0" - dependencies: - inherits: "npm:~2.0.4" - readable-stream: "npm:^3.5.0" - checksum: 10c0/ec3b975a4e0aa4b3dc5e70ffae3fc8fd29ac725353a14e72f213dff477b00330140ad014b163a8cbb9922dfe90803f81a5ea2b269e1bbfd8bd71511b88f889ad - languageName: node - linkType: hard - -"stream-http@npm:^3.1.0": - version: 3.2.0 - resolution: "stream-http@npm:3.2.0" - dependencies: - builtin-status-codes: "npm:^3.0.0" - inherits: "npm:^2.0.4" - readable-stream: "npm:^3.6.0" - xtend: "npm:^4.0.2" - checksum: 10c0/f128fb8076d60cd548f229554b6a1a70c08a04b7b2afd4dbe7811d20f27f7d4112562eb8bce86d72a8691df3b50573228afcf1271e55e81f981536c67498bc41 - languageName: node - linkType: hard - -"streamroller@npm:^3.1.5": - version: 3.1.5 - resolution: "streamroller@npm:3.1.5" - dependencies: - date-format: "npm:^4.0.14" - debug: "npm:^4.3.4" - fs-extra: "npm:^8.1.0" - checksum: 10c0/0bdeec34ad37487d959ba908f17067c938f544db88b5bb1669497a67a6b676413229ce5a6145c2812d06959ebeb8842e751076647d4b323ca06be612963b9099 - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: "npm:^8.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^9.2.2" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: "npm:~5.2.0" - checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: "npm:~5.1.0" - checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: "npm:^5.0.1" - checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10c0/6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 - languageName: node - linkType: hard - -"supports-color@npm:^8.0.0": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 - languageName: node - linkType: hard - -"tapable@npm:^2.1.1, tapable@npm:^2.2.0": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 - languageName: node - linkType: hard - -"tar@npm:^7.4.3": - version: 7.4.3 - resolution: "tar@npm:7.4.3" - dependencies: - "@isaacs/fs-minipass": "npm:^4.0.0" - chownr: "npm:^3.0.0" - minipass: "npm:^7.1.2" - minizlib: "npm:^3.0.1" - mkdirp: "npm:^3.0.1" - yallist: "npm:^5.0.0" - checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d - languageName: node - linkType: hard - -"terser-webpack-plugin@npm:^5.3.10": - version: 5.3.11 - resolution: "terser-webpack-plugin@npm:5.3.11" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.25" - jest-worker: "npm:^27.4.5" - schema-utils: "npm:^4.3.0" - serialize-javascript: "npm:^6.0.2" - terser: "npm:^5.31.1" - peerDependencies: - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - checksum: 10c0/4794274f445dc589f4c113c75a55ce51364ccf09bfe8a545cdb462e3f752bf300ea91f072fa28bbed291bbae03274da06fe4eca180e784fb8a43646aa7dbcaef - languageName: node - linkType: hard - -"terser@npm:^5.31.1": - version: 5.37.0 - resolution: "terser@npm:5.37.0" - dependencies: - "@jridgewell/source-map": "npm:^0.3.3" - acorn: "npm:^8.8.2" - commander: "npm:^2.20.0" - source-map-support: "npm:~0.5.20" - bin: - terser: bin/terser - checksum: 10c0/ff0dc79b0a0da821e7f5bf7a047eab6d04e70e88b62339a0f1d71117db3310e255f5c00738fa3b391f56c3571f800a00047720261ba04ced0241c1f9922199f4 - languageName: node - linkType: hard - -"thingies@npm:^1.20.0": - version: 1.21.0 - resolution: "thingies@npm:1.21.0" - peerDependencies: - tslib: ^2 - checksum: 10c0/7570ee855aecb73185a672ecf3eb1c287a6512bf5476449388433b2d4debcf78100bc8bfd439b0edd38d2bc3bfb8341de5ce85b8557dec66d0f27b962c9a8bc1 - languageName: node - linkType: hard - -"thunky@npm:^1.0.2": - version: 1.1.0 - resolution: "thunky@npm:1.1.0" - checksum: 10c0/369764f39de1ce1de2ba2fa922db4a3f92e9c7f33bcc9a713241bc1f4a5238b484c17e0d36d1d533c625efb00e9e82c3e45f80b47586945557b45abb890156d2 - languageName: node - linkType: hard - -"timers-browserify@npm:^2.0.11": - version: 2.0.12 - resolution: "timers-browserify@npm:2.0.12" - dependencies: - setimmediate: "npm:^1.0.4" - checksum: 10c0/98e84db1a685bc8827c117a8bc62aac811ad56a995d07938fc7ed8cdc5bf3777bfe2d4e5da868847194e771aac3749a20f6cdd22091300fe889a76fe214a4641 - languageName: node - linkType: hard - -"tmp@npm:^0.2.1": - version: 0.2.3 - resolution: "tmp@npm:0.2.3" - checksum: 10c0/3e809d9c2f46817475b452725c2aaa5d11985cf18d32a7a970ff25b568438e2c076c2e8609224feef3b7923fa9749b74428e3e634f6b8e520c534eef2fd24125 - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: "npm:^7.0.0" - checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 - languageName: node - linkType: hard - -"toidentifier@npm:1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 - languageName: node - linkType: hard - -"tree-dump@npm:^1.0.1": - version: 1.0.2 - resolution: "tree-dump@npm:1.0.2" - peerDependencies: - tslib: 2 - checksum: 10c0/d1d180764e9c691b28332dbd74226c6b6af361dfb1e134bb11e60e17cb11c215894adee50ffc578da5dcf546006693947be8b6665eb1269b56e2f534926f1c1f - languageName: node - linkType: hard - -"ts-loader@npm:^9.5.2": - version: 9.5.2 - resolution: "ts-loader@npm:9.5.2" - dependencies: - chalk: "npm:^4.1.0" - enhanced-resolve: "npm:^5.0.0" - micromatch: "npm:^4.0.0" - semver: "npm:^7.3.4" - source-map: "npm:^0.7.4" - peerDependencies: - typescript: "*" - webpack: ^5.0.0 - checksum: 10c0/d4f4e67f1365a8c4a929d26148611b6a82a9241bd988863386c9cc0c034eec8b14562206e09540fae38154595e0b3b9520b701b5c83c0e5d743c4016cd91d9f1 - languageName: node - linkType: hard - -"ts-node@npm:^10.8.2": - version: 10.9.2 - resolution: "ts-node@npm:10.9.2" - dependencies: - "@cspotcode/source-map-support": "npm:^0.8.0" - "@tsconfig/node10": "npm:^1.0.7" - "@tsconfig/node12": "npm:^1.0.7" - "@tsconfig/node14": "npm:^1.0.0" - "@tsconfig/node16": "npm:^1.0.2" - acorn: "npm:^8.4.1" - acorn-walk: "npm:^8.1.1" - arg: "npm:^4.1.0" - create-require: "npm:^1.1.0" - diff: "npm:^4.0.1" - make-error: "npm:^1.1.1" - v8-compile-cache-lib: "npm:^3.0.1" - yn: "npm:3.1.1" - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 - languageName: node - linkType: hard - -"tslib@npm:^2.0.0": - version: 2.8.1 - resolution: "tslib@npm:2.8.1" - checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 - languageName: node - linkType: hard - -"tty-browserify@npm:^0.0.1": - version: 0.0.1 - resolution: "tty-browserify@npm:0.0.1" - checksum: 10c0/5e34883388eb5f556234dae75b08e069b9e62de12bd6d87687f7817f5569430a6dfef550b51dbc961715ae0cd0eb5a059e6e3fc34dc127ea164aa0f9b5bb033d - languageName: node - linkType: hard - -"type-is@npm:~1.6.18": - version: 1.6.18 - resolution: "type-is@npm:1.6.18" - dependencies: - media-typer: "npm:0.3.0" - mime-types: "npm:~2.1.24" - checksum: 10c0/a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d - languageName: node - linkType: hard - -"typescript@npm:^5.7.3": - version: 5.7.3 - resolution: "typescript@npm:5.7.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/b7580d716cf1824736cc6e628ab4cd8b51877408ba2be0869d2866da35ef8366dd6ae9eb9d0851470a39be17cbd61df1126f9e211d8799d764ea7431d5435afa - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A^5.7.3#optional!builtin": - version: 5.7.3 - resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=5786d5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/6fd7e0ed3bf23a81246878c613423730c40e8bdbfec4c6e4d7bf1b847cbb39076e56ad5f50aa9d7ebd89877999abaee216002d3f2818885e41c907caaa192cc4 - languageName: node - linkType: hard - -"ua-parser-js@npm:^0.7.30": - version: 0.7.40 - resolution: "ua-parser-js@npm:0.7.40" - bin: - ua-parser-js: script/cli.js - checksum: 10c0/d114f0b71b5b0106dcc0cb7cc26a44690073e886fa1444f8c03131d4f57b3f6645f9fb7b308b0aaaa5a2774461f9e8fe1a2a1c3ff69aa531316fcf14cd44dbe3 - languageName: node - linkType: hard - -"undici-types@npm:~6.20.0": - version: 6.20.0 - resolution: "undici-types@npm:6.20.0" - checksum: 10c0/68e659a98898d6a836a9a59e6adf14a5d799707f5ea629433e025ac90d239f75e408e2e5ff086afc3cace26f8b26ee52155293564593fbb4a2f666af57fc59bf - languageName: node - linkType: hard - -"unique-filename@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-filename@npm:4.0.0" - dependencies: - unique-slug: "npm:^5.0.0" - checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc - languageName: node - linkType: hard - -"unique-slug@npm:^5.0.0": - version: 5.0.0 - resolution: "unique-slug@npm:5.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 - languageName: node - linkType: hard - -"universalify@npm:^0.1.0": - version: 0.1.2 - resolution: "universalify@npm:0.1.2" - checksum: 10c0/e70e0339f6b36f34c9816f6bf9662372bd241714dc77508d231d08386d94f2c4aa1ba1318614f92015f40d45aae1b9075cd30bd490efbe39387b60a76ca3f045 - languageName: node - linkType: hard - -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.1.1": - version: 1.1.2 - resolution: "update-browserslist-db@npm:1.1.2" - dependencies: - escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.1" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10c0/9cb353998d6d7d6ba1e46b8fa3db888822dd972212da4eda609d185eb5c3557a93fd59780ceb757afd4d84240518df08542736969e6a5d6d6ce2d58e9363aac6 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c - languageName: node - linkType: hard - -"url@npm:^0.11.0": - version: 0.11.4 - resolution: "url@npm:0.11.4" - dependencies: - punycode: "npm:^1.4.1" - qs: "npm:^6.12.3" - checksum: 10c0/cc93405ae4a9b97a2aa60ca67f1cb1481c0221cb4725a7341d149be5e2f9cfda26fd432d64dbbec693d16593b68b8a46aad8e5eab21f814932134c9d8620c662 - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 - languageName: node - linkType: hard - -"util@npm:^0.12.1, util@npm:^0.12.5": - version: 0.12.5 - resolution: "util@npm:0.12.5" - dependencies: - inherits: "npm:^2.0.3" - is-arguments: "npm:^1.0.4" - is-generator-function: "npm:^1.0.7" - is-typed-array: "npm:^1.1.3" - which-typed-array: "npm:^1.1.2" - checksum: 10c0/c27054de2cea2229a66c09522d0fa1415fb12d861d08523a8846bf2e4cbf0079d4c3f725f09dcb87493549bcbf05f5798dce1688b53c6c17201a45759e7253f3 - languageName: node - linkType: hard - -"utils-merge@npm:1.0.1": - version: 1.0.1 - resolution: "utils-merge@npm:1.0.1" - checksum: 10c0/02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 - languageName: node - linkType: hard - -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 10c0/bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54 - languageName: node - linkType: hard - -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 - languageName: node - linkType: hard - -"vary@npm:^1, vary@npm:~1.1.2": - version: 1.1.2 - resolution: "vary@npm:1.1.2" - checksum: 10c0/f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f - languageName: node - linkType: hard - -"vm-browserify@npm:^1.1.2": - version: 1.1.2 - resolution: "vm-browserify@npm:1.1.2" - checksum: 10c0/0cc1af6e0d880deb58bc974921320c187f9e0a94f25570fca6b1bd64e798ce454ab87dfd797551b1b0cc1849307421aae0193cedf5f06bdb5680476780ee344b - languageName: node - linkType: hard - -"void-elements@npm:^2.0.0": - version: 2.0.1 - resolution: "void-elements@npm:2.0.1" - checksum: 10c0/23b4f35bbeabcaa5c87a9f638ae80862a9313dccbaa8973b0eada81dbe97488ae11baf4d8aa2846bc397d31456afdfd8d791bb44c542f83735e6d04af6996f4d - languageName: node - linkType: hard - -"wasm-bindings@workspace:.": - version: 0.0.0-use.local - resolution: "wasm-bindings@workspace:." - dependencies: - "@types/jasmine": "npm:^5.1.5" - "@wasm-tool/wasm-pack-plugin": "npm:^1.6.0" - karma: "npm:^6.4.0" - karma-chrome-launcher: "npm:^3.1.1" - karma-jasmine: "npm:^5.1.0" - karma-spec-reporter: "npm:^0.0.36" - karma-typescript: "npm:^5.5.3" - karma-webpack: "npm:^5.0.0" - ts-loader: "npm:^9.5.2" - ts-node: "npm:^10.8.2" - typescript: "npm:^5.7.3" - webpack: "npm:^5.97.1" - webpack-cli: "npm:^6.0.1" - webpack-dev-server: "npm:^5.2.0" - languageName: unknown - linkType: soft - -"watchpack@npm:^2.1.1, watchpack@npm:^2.4.1": - version: 2.4.2 - resolution: "watchpack@npm:2.4.2" - dependencies: - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.1.2" - checksum: 10c0/ec60a5f0e9efaeca0102fd9126346b3b2d523e01c34030d3fddf5813a7125765121ebdc2552981136dcd2c852deb1af0b39340f2fcc235f292db5399d0283577 - languageName: node - linkType: hard - -"wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": - version: 1.7.3 - resolution: "wbuf@npm:1.7.3" - dependencies: - minimalistic-assert: "npm:^1.0.0" - checksum: 10c0/56edcc5ef2b3d30913ba8f1f5cccc364d180670b24d5f3f8849c1e6fb514e5c7e3a87548ae61227a82859eba6269c11393ae24ce12a2ea1ecb9b465718ddced7 - languageName: node - linkType: hard - -"wcwidth@npm:^1.0.1": - version: 1.0.1 - resolution: "wcwidth@npm:1.0.1" - dependencies: - defaults: "npm:^1.0.3" - checksum: 10c0/5b61ca583a95e2dd85d7078400190efd452e05751a64accb8c06ce4db65d7e0b0cde9917d705e826a2e05cc2548f61efde115ffa374c3e436d04be45c889e5b4 - languageName: node - linkType: hard - -"webpack-cli@npm:^6.0.1": - version: 6.0.1 - resolution: "webpack-cli@npm:6.0.1" - dependencies: - "@discoveryjs/json-ext": "npm:^0.6.1" - "@webpack-cli/configtest": "npm:^3.0.1" - "@webpack-cli/info": "npm:^3.0.1" - "@webpack-cli/serve": "npm:^3.0.1" - colorette: "npm:^2.0.14" - commander: "npm:^12.1.0" - cross-spawn: "npm:^7.0.3" - envinfo: "npm:^7.14.0" - fastest-levenshtein: "npm:^1.0.12" - import-local: "npm:^3.0.2" - interpret: "npm:^3.1.1" - rechoir: "npm:^0.8.0" - webpack-merge: "npm:^6.0.1" - peerDependencies: - webpack: ^5.82.0 - peerDependenciesMeta: - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true - bin: - webpack-cli: ./bin/cli.js - checksum: 10c0/2aaca78e277427f03f528602abd707d224696048fb46286ea636c7975592409c4381ca94d68bbbb3900f195ca97f256e619583e8feb34a80da531461323bf3e2 - languageName: node - linkType: hard - -"webpack-dev-middleware@npm:^7.4.2": - version: 7.4.2 - resolution: "webpack-dev-middleware@npm:7.4.2" - dependencies: - colorette: "npm:^2.0.10" - memfs: "npm:^4.6.0" - mime-types: "npm:^2.1.31" - on-finished: "npm:^2.4.1" - range-parser: "npm:^1.2.1" - schema-utils: "npm:^4.0.0" - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true - checksum: 10c0/2aa873ef57a7095d7fba09400737b6066adc3ded229fd6eba89a666f463c2614c68e01ae58f662c9cdd74f0c8da088523d972329bf4a054e470bc94feb8bcad0 - languageName: node - linkType: hard - -"webpack-dev-server@npm:^5.2.0": - version: 5.2.0 - resolution: "webpack-dev-server@npm:5.2.0" - dependencies: - "@types/bonjour": "npm:^3.5.13" - "@types/connect-history-api-fallback": "npm:^1.5.4" - "@types/express": "npm:^4.17.21" - "@types/serve-index": "npm:^1.9.4" - "@types/serve-static": "npm:^1.15.5" - "@types/sockjs": "npm:^0.3.36" - "@types/ws": "npm:^8.5.10" - ansi-html-community: "npm:^0.0.8" - bonjour-service: "npm:^1.2.1" - chokidar: "npm:^3.6.0" - colorette: "npm:^2.0.10" - compression: "npm:^1.7.4" - connect-history-api-fallback: "npm:^2.0.0" - express: "npm:^4.21.2" - graceful-fs: "npm:^4.2.6" - http-proxy-middleware: "npm:^2.0.7" - ipaddr.js: "npm:^2.1.0" - launch-editor: "npm:^2.6.1" - open: "npm:^10.0.3" - p-retry: "npm:^6.2.0" - schema-utils: "npm:^4.2.0" - selfsigned: "npm:^2.4.1" - serve-index: "npm:^1.9.1" - sockjs: "npm:^0.3.24" - spdy: "npm:^4.0.2" - webpack-dev-middleware: "npm:^7.4.2" - ws: "npm:^8.18.0" - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - bin: - webpack-dev-server: bin/webpack-dev-server.js - checksum: 10c0/afb2e51945ac54ef3039e11e377241e1cb97a8d3f526f39f13c3fa924c530fb6063200c2c3ae4e33e6bcc110d4abed777c09ce18e2d261012853d81f3c5820ab - languageName: node - linkType: hard - -"webpack-merge@npm:^4.1.5": - version: 4.2.2 - resolution: "webpack-merge@npm:4.2.2" - dependencies: - lodash: "npm:^4.17.15" - checksum: 10c0/283cb4ffe4d4ae6de23d595154868780126835ded241748da0b070c6cca6974c229493ac0b6b7160c2c92950c950c8e5edf036a192da78e32e22a9c81593ad16 - languageName: node - linkType: hard - -"webpack-merge@npm:^6.0.1": - version: 6.0.1 - resolution: "webpack-merge@npm:6.0.1" - dependencies: - clone-deep: "npm:^4.0.1" - flat: "npm:^5.0.2" - wildcard: "npm:^2.0.1" - checksum: 10c0/bf1429567858b353641801b8a2696ca0aac270fc8c55d4de8a7b586fe07d27fdcfc83099a98ab47e6162383db8dd63bb8cc25b1beb2ec82150422eec843b0dc0 - languageName: node - linkType: hard - -"webpack-sources@npm:^3.2.3": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 10c0/2ef63d77c4fad39de4a6db17323d75eb92897b32674e97d76f0a1e87c003882fc038571266ad0ef581ac734cbe20952912aaa26155f1905e96ce251adbb1eb4e - languageName: node - linkType: hard - -"webpack@npm:^5.97.1": - version: 5.97.1 - resolution: "webpack@npm:5.97.1" - dependencies: - "@types/eslint-scope": "npm:^3.7.7" - "@types/estree": "npm:^1.0.6" - "@webassemblyjs/ast": "npm:^1.14.1" - "@webassemblyjs/wasm-edit": "npm:^1.14.1" - "@webassemblyjs/wasm-parser": "npm:^1.14.1" - acorn: "npm:^8.14.0" - browserslist: "npm:^4.24.0" - chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.17.1" - es-module-lexer: "npm:^1.2.1" - eslint-scope: "npm:5.1.1" - events: "npm:^3.2.0" - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.2.11" - json-parse-even-better-errors: "npm:^2.3.1" - loader-runner: "npm:^4.2.0" - mime-types: "npm:^2.1.27" - neo-async: "npm:^2.6.2" - schema-utils: "npm:^3.2.0" - tapable: "npm:^2.1.1" - terser-webpack-plugin: "npm:^5.3.10" - watchpack: "npm:^2.4.1" - webpack-sources: "npm:^3.2.3" - peerDependenciesMeta: - webpack-cli: - optional: true - bin: - webpack: bin/webpack.js - checksum: 10c0/a12d3dc882ca582075f2c4bd88840be8307427245c90a8a0e0b372d73560df13fcf25a61625c9e7edc964981d16b5a8323640562eb48347cf9dd2f8bd1b39d35 - languageName: node - linkType: hard - -"websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": - version: 0.7.4 - resolution: "websocket-driver@npm:0.7.4" - dependencies: - http-parser-js: "npm:>=0.5.1" - safe-buffer: "npm:>=5.1.0" - websocket-extensions: "npm:>=0.1.1" - checksum: 10c0/5f09547912b27bdc57bac17b7b6527d8993aa4ac8a2d10588bb74aebaf785fdcf64fea034aae0c359b7adff2044dd66f3d03866e4685571f81b13e548f9021f1 - languageName: node - linkType: hard - -"websocket-extensions@npm:>=0.1.1": - version: 0.1.4 - resolution: "websocket-extensions@npm:0.1.4" - checksum: 10c0/bbc8c233388a0eb8a40786ee2e30d35935cacbfe26ab188b3e020987e85d519c2009fe07cfc37b7f718b85afdba7e54654c9153e6697301f72561bfe429177e0 - languageName: node - linkType: hard - -"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.2": - version: 1.1.18 - resolution: "which-typed-array@npm:1.1.18" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - for-each: "npm:^0.3.3" - gopd: "npm:^1.2.0" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/0412f4a91880ca1a2a63056187c2e3de6b129b2b5b6c17bc3729f0f7041047ae48fb7424813e51506addb2c97320003ee18b8c57469d2cde37983ef62126143c - languageName: node - linkType: hard - -"which@npm:^1.2.1": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 - languageName: node - linkType: hard - -"which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: "npm:^2.0.0" - bin: - node-which: ./bin/node-which - checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f - languageName: node - linkType: hard - -"which@npm:^5.0.0": - version: 5.0.0 - resolution: "which@npm:5.0.0" - dependencies: - isexe: "npm:^3.1.1" - bin: - node-which: bin/which.js - checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b - languageName: node - linkType: hard - -"wildcard@npm:^2.0.1": - version: 2.0.1 - resolution: "wildcard@npm:2.0.1" - checksum: 10c0/08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: "npm:^6.1.0" - string-width: "npm:^5.0.1" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 - languageName: node - linkType: hard - -"ws@npm:^8.18.0": - version: 8.18.0 - resolution: "ws@npm:8.18.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/25eb33aff17edcb90721ed6b0eb250976328533ad3cd1a28a274bd263682e7296a6591ff1436d6cbc50fa67463158b062f9d1122013b361cec99a05f84680e06 - languageName: node - linkType: hard - -"ws@npm:~8.17.1": - version: 8.17.1 - resolution: "ws@npm:8.17.1" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10c0/f4a49064afae4500be772abdc2211c8518f39e1c959640457dcee15d4488628620625c783902a52af2dd02f68558da2868fd06e6fd0e67ebcd09e6881b1b5bfe - languageName: node - linkType: hard - -"xtend@npm:^4.0.2": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 - languageName: node - linkType: hard - -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - -"yallist@npm:^5.0.0": - version: 5.0.0 - resolution: "yallist@npm:5.0.0" - checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 - languageName: node - linkType: hard - -"yargs-parser@npm:^20.2.2": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 10c0/0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72 - languageName: node - linkType: hard - -"yargs@npm:^16.1.1": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" - dependencies: - cliui: "npm:^7.0.2" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.0" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^20.2.2" - checksum: 10c0/b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651 - languageName: node - linkType: hard - -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 - languageName: node - linkType: hard diff --git a/application/client/.yarnrc.yml b/application/client/.yarnrc.yml deleted file mode 100644 index 3186f3f079..0000000000 --- a/application/client/.yarnrc.yml +++ /dev/null @@ -1 +0,0 @@ -nodeLinker: node-modules diff --git a/application/client/angular.json b/application/client/angular.json deleted file mode 100644 index cf918df0a2..0000000000 --- a/application/client/angular.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "$schema": "./node_modules/@angular/cli/lib/config/schema.json", - "version": 1, - "newProjectRoot": "projects", - "projects": { - "chipmunk": { - "projectType": "application", - "schematics": { - "@schematics/angular:component": { - "style": "less" - }, - "@schematics/angular:application": { - "strict": true - } - }, - "root": "", - "sourceRoot": "src", - "prefix": "app", - "architect": { - "build": { - "builder": "@angular-devkit/build-angular:browser", - "options": { - "outputPath": "dist/debug", - "index": "src/index.html", - "main": "src/main.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.app.json", - "inlineStyleLanguage": "less", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - "@angular/material/prebuilt-themes/indigo-pink.css", - "src/app/ui/styles/scheme.less", - "src/app/ui/styles/scheme.scss" - ], - "scripts": [] - }, - "configurations": { - "production": { - "outputPath": "dist/release", - "budgets": [ - { - "type": "initial", - "maximumWarning": "8mb", - "maximumError": "8mb" - }, - { - "type": "anyComponentStyle", - "maximumWarning": "100kb", - "maximumError": "100kb" - } - ], - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], - "outputHashing": "all" - }, - "development": { - "buildOptimizer": false, - "optimization": false, - "vendorChunk": true, - "extractLicenses": false, - "sourceMap": true, - "namedChunks": true - } - }, - "defaultConfiguration": "production" - }, - "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "configurations": { - "production": { - "browserTarget": "chipmunk:build:production" - }, - "development": { - "browserTarget": "chipmunk:build:development" - } - }, - "defaultConfiguration": "development" - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "chipmunk:build" - } - }, - "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "src/test.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.spec.json", - "karmaConfig": "karma.conf.js", - "inlineStyleLanguage": "less", - "assets": [ - "src/favicon.ico", - "src/assets" - ], - "styles": [ - "@angular/material/prebuilt-themes/indigo-pink.css", - "src/app/ui/styles/scheme.less", - "src/app/ui/styles/scheme.scss" - ], - "scripts": [] - } - }, - "lint": { - "builder": "@angular-eslint/builder:lint", - "options": { - "lintFilePatterns": [ - "src/**/*.ts", - "src/**/*.html" - ] - } - } - } - } - }, - "cli": { - "schematicCollections": [ - "@angular-eslint/schematics" - ], - "analytics": false - } -} diff --git a/application/client/eslint.config.mjs b/application/client/eslint.config.mjs deleted file mode 100644 index 717e3ceb57..0000000000 --- a/application/client/eslint.config.mjs +++ /dev/null @@ -1,51 +0,0 @@ -import typescriptEslint from "@typescript-eslint/eslint-plugin"; -import globals from "globals"; -import tsParser from "@typescript-eslint/parser"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import js from "@eslint/js"; -import { FlatCompat } from "@eslint/eslintrc"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); -const compat = new FlatCompat({ - baseDirectory: __dirname, - recommendedConfig: js.configs.recommended, - allConfig: js.configs.all -}); - -export default [{ - ignores: ["dist/**/*"], -}, ...compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended"), { - plugins: { - "@typescript-eslint": typescriptEslint, - }, - - languageOptions: { - globals: { - ...globals.browser, - }, - - parser: tsParser, - ecmaVersion: "latest", - sourceType: "module", - }, - - rules: { - "no-control-regex": "off", - - "@typescript-eslint/no-unused-vars": ["error", { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "caughtErrorsIgnorePattern": "^_" - }], - "@typescript-eslint/no-this-alias": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-empty-interface": "off", - "@typescript-eslint/no-inferrable-types": "off", - "@typescript-eslint/no-unsafe-declaration-merging": "off", - "@typescript-eslint/no-unused-expressions": "off", - "@typescript-eslint/no-empty-object-type": "off" - - }, -}]; \ No newline at end of file diff --git a/application/client/package.json b/application/client/package.json deleted file mode 100644 index f6ae5106fd..0000000000 --- a/application/client/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "chipmunk", - "version": "3.19.6", - "description": "Logs analyzer tool", - "author": "Dmitry Astafyev", - "scripts": { - "ng": "node_modules/.bin/ng", - "start": "node_modules/.bin/ng serve", - "build": "node_modules/.bin/ng build --configuration development", - "test": "node_modules/.bin/ng test", - "e2e": "node_modules/.bin/ng e2e", - "prod": "node_modules/.bin/ng build --configuration production", - "lint": "node_modules/.bin/eslint . --max-warnings=0", - "check": "node_modules/.bin/tsc -p tsconfig.json --noemit" - }, - "private": true, - "dependencies": { - "@angular/animations": "^19.0.6", - "@angular/cdk": "^19.0.5", - "@angular/common": "^19.0.6", - "@angular/compiler": "^19.0.6", - "@angular/core": "^19.0.6", - "@angular/forms": "^19.0.6", - "@angular/material": "^19.0.5", - "@angular/platform-browser": "^19.0.6", - "@angular/platform-browser-dynamic": "^19.0.6", - "@angular/router": "^19.0.6", - "globals": "^15.14.0", - "micromark": "^4.0.1", - "moment": "^2.30.1", - "moment-timezone": "^0.5.46", - "rxjs": "^7.8.0", - "tslib": "^2.6.0", - "uuid": "^11.0.5", - "zone.js": "^0.15.0" - }, - "devDependencies": { - "@angular-devkit/build-angular": "^19.0.7", - "@angular-eslint/builder": "^19.0.2", - "@angular-eslint/eslint-plugin": "^19.0.2", - "@angular-eslint/eslint-plugin-template": "^19.0.2", - "@angular-eslint/schematics": "^19.0.2", - "@angular-eslint/template-parser": "^19.0.2", - "@angular/cli": "^19.0.7", - "@angular/compiler-cli": "^19.0.6", - "@types/node": "^22.10.5", - "@types/uuid": "^10.0.0", - "@typescript-eslint/eslint-plugin": "^8.19.1", - "@typescript-eslint/parser": "^8.19.1", - "eslint": "^9.17.0", - "typescript": "5.6.3" - }, - "browserslist": [ - "last 2 Chrome versions" - ], - "browser": { - "fs": false, - "os": false, - "path": false - }, - "packageManager": "yarn@4.6.0" -} diff --git a/application/client/src/app/app.component.html b/application/client/src/app/app.component.html deleted file mode 100644 index 2db4341e72..0000000000 --- a/application/client/src/app/app.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/application/client/src/app/app.component.less b/application/client/src/app/app.component.less deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/application/client/src/app/app.component.ts b/application/client/src/app/app.component.ts deleted file mode 100644 index 7e34189a02..0000000000 --- a/application/client/src/app/app.component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Component, AfterViewInit, ChangeDetectorRef, NgZone, HostBinding } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { DomSanitizer } from '@angular/platform-browser'; -import { setDomSanitizer, setNgZone } from '@ui/env/globals'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.less'], - standalone: false, -}) -@Ilc() -export class AppComponent extends ChangesDetector implements AfterViewInit { - @HostBinding('@.disabled') - public animationsDisabled = false; - - constructor(cdRef: ChangeDetectorRef, sanitizer: DomSanitizer, private ngZone: NgZone) { - super(cdRef); - setDomSanitizer(sanitizer); - } - - public ngAfterViewInit(): void { - setNgZone(this.ngZone); - this.ilc().services.system.state.setClientAsReady(); - this.ilc() - .services.system.changelogs.check() - .catch((err: Error) => { - this.log().error(`Fail to check changelogs; error: ${err.message}`); - }); - } -} -export interface AppComponent extends IlcInterface {} diff --git a/application/client/src/app/app.module.ts b/application/client/src/app/app.module.ts deleted file mode 100644 index 04ed3bbd42..0000000000 --- a/application/client/src/app/app.module.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { LayoutModule } from '@layout/module'; -import { ViewsModule } from '@views/module'; -import { ElementsModule } from '@elements/module'; -import { TabsModule } from '@ui/tabs/module'; - -import { AppComponent } from './app.component'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { MAT_BOTTOM_SHEET_DEFAULT_OPTIONS } from '@angular/material/bottom-sheet'; - -@NgModule({ - declarations: [AppComponent], - imports: [ - BrowserModule, - ElementsModule, - TabsModule, - LayoutModule, - ViewsModule, - BrowserAnimationsModule, - ], - providers: [{ provide: MAT_BOTTOM_SHEET_DEFAULT_OPTIONS, useValue: { hasBackdrop: false } }], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/application/client/src/app/env/decorators/component.ts b/application/client/src/app/env/decorators/component.ts deleted file mode 100644 index 92dcecd5e3..0000000000 --- a/application/client/src/app/env/decorators/component.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { singleDecoratorFactory, DecoratorConstructor } from '@platform/env/decorators'; -import { scope } from '@platform/env/scope'; -import { Logger } from '@platform/log'; -import { getSelector } from '@env/reflect'; -import { - ilc, - Channel, - Emitter, - Declarations, - InternalAPI, - Env, - IlcInterface, - Accessor, - Life, -} from '@service/ilc'; -import { unique } from '@platform/env/sequence'; -import { Subscriber } from '@platform/env/subscription'; -import { Session, UnboundTab } from '@service/session'; - -export { Channel, Emitter, Declarations, IlcInterface, Env }; - -const UUID_KEY = '__ilc_uuid_key___'; -const instances: Map< - string, - { api: InternalAPI; env: Env; access: Accessor; life: Life; distructors: Array<() => void> } -> = new Map(); - -function getIlcInstance( - entity: any, - selector: string, -): { api: InternalAPI; env: Env; access: Accessor; life: Life } { - if (entity[UUID_KEY] === undefined) { - entity[UUID_KEY] = unique(); - } - const uuid = entity[UUID_KEY]; - let instance = instances.get(uuid); - if (instance === undefined) { - const logger = scope.getLogger(`COM: ${selector}`); - const sessions = ilc.services(selector, logger); - instance = { - distructors: [], - api: { - channel: ilc.channel(selector, logger), - emitter: ilc.emitter(selector, logger), - services: sessions, - logger, - }, - env: { - subscriber: new Subscriber(), - }, - access: { - session: (cb: (session: Session) => void): boolean => { - const inside = sessions.system.session.active().session(); - if (inside === undefined) { - return false; - } - cb(inside); - return true; - }, - unbound: (cb: (session: UnboundTab) => void): boolean => { - const inside = sessions.system.session.active().unbound(); - if (inside === undefined) { - return false; - } - cb(inside); - return true; - }, - }, - life: { - destroy: (handler: () => void) => { - const instance = instances.get(uuid); - if (instance === undefined) { - return; - } - instance.distructors.push(handler); - }, - }, - }; - instances.set(uuid, instance); - } - return instance; -} - -function removeIlcInstance(entity: any): void { - const uuid = entity[UUID_KEY]; - if (uuid === undefined) { - return; - } - const instance = instances.get(uuid); - if (instance === undefined) { - return; - } - instance.distructors.forEach((distructor) => distructor()); - instance.api.channel.destroy(); - instance.api.emitter.destroy(); - instance.env.subscriber.unsubscribe(); - instances.delete(uuid); -} - -export const Ilc = singleDecoratorFactory((constructor: DecoratorConstructor) => { - const selector: string | undefined = getSelector(constructor); - if (selector === undefined) { - throw new Error(`Fail to detect selector for angular component`); - } - constructor.prototype.log = function (): Logger { - return getIlcInstance(this, selector).api.logger; - }; - constructor.prototype.ilc = function (): InternalAPI { - return getIlcInstance(this, selector).api; - }; - constructor.prototype.env = function (): Env { - return getIlcInstance(this, selector).env; - }; - constructor.prototype.access = function (): Accessor { - return getIlcInstance(this, selector).access; - }; - constructor.prototype.life = function (): Life { - return getIlcInstance(this, selector).life; - }; - const ngOnDestroy = constructor.prototype.ngOnDestroy; - if (ngOnDestroy === undefined) { - constructor.prototype.ngOnDestroy = function () { - removeIlcInstance(this); - }; - } else { - constructor.prototype.ngOnDestroy = function () { - ngOnDestroy.call(this); - removeIlcInstance(this); - }; - } - return class extends constructor {}; -}); diff --git a/application/client/src/app/env/decorators/initial.ts b/application/client/src/app/env/decorators/initial.ts deleted file mode 100644 index 244a518277..0000000000 --- a/application/client/src/app/env/decorators/initial.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { singleDecoratorFactory, DecoratorConstructor } from '@platform/env/decorators'; -import { getComponentSelector } from '@env/reflect'; -import { scope } from '@platform/env/scope'; - -export class Components { - private _components: Map = new Map(); - - public add(selector: string, constructor: DecoratorConstructor) { - this._components.set(selector, constructor); - } - - public get(selector: string): DecoratorConstructor { - const target = this._components.get(selector); - if (target === undefined) { - throw new Error(`Fail to find initial component "${selector}"`); - } - return target; - } -} - -const components = new Components(); - -function getSelector(constructor: DecoratorConstructor): string { - const selector: string | undefined = getComponentSelector(constructor); - if (selector === undefined) { - console.log(constructor); - throw new Error(`Fail to detect selector for angular component`); - } - return selector; -} -export const Initial = singleDecoratorFactory((constructor: DecoratorConstructor) => { - const selector: string = getSelector(constructor); - components.add(selector, constructor); - scope.getLogger('@Initial').debug(`${selector} has been registered as initial`); - return class extends constructor {}; -}); - -export { components }; diff --git a/application/client/src/app/env/fsstorage.ts b/application/client/src/app/env/fsstorage.ts deleted file mode 100644 index 7c09bd6f22..0000000000 --- a/application/client/src/app/env/fsstorage.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { bridge } from '@service/bridge'; -import { Entry, EntryConvertable } from '@platform/types/storage/entry'; - -export abstract class Storage { - public abstract getStorageKey(): string; - public abstract getStorageEntry(): Entry; - - public storage(): { - save(): Promise; - load(): Promise; - } { - return { - save: (): Promise => { - return bridge - .storage(this.getStorageKey()) - .write(EntryConvertable.asStr(this.getStorageEntry())); - }, - load: (): Promise => { - return new Promise((resolve, reject) => { - bridge - .storage(this.getStorageKey()) - .read() - .then((content: string) => { - if (content.trim() === '') { - return resolve(undefined); - } - const entry = EntryConvertable.from(content); - if (entry instanceof Error) { - return reject(entry); - } - resolve(entry); - }) - .catch(reject); - }); - }, - }; - } -} diff --git a/application/client/src/app/env/logs/index.ts b/application/client/src/app/env/logs/index.ts deleted file mode 100644 index 3c8febc14a..0000000000 --- a/application/client/src/app/env/logs/index.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Logger as Base, Level, utils, state } from '@platform/log'; - -import * as Events from '@platform/ipc/event'; - -const WRITE_TO_BACKEND = [Level.ERROR, Level.WARNING, Level.DEBUG, Level.INFO, Level.VERBOS]; - -export function cutUuid(uuid: string): string { - return uuid.substring(0, 6); -} - -export class Logger extends Base { - public static backendAllowed: boolean = false; - public static backend(): { - allow(): void; - disallow(): void; - } { - return { - allow: (): void => { - Logger.backendAllowed = true; - }, - disallow: (): void => { - Logger.backendAllowed = false; - }, - }; - } - - public override store(message: string, level: Level): void { - if (!Logger.backendAllowed) { - return; - } - if (!WRITE_TO_BACKEND.includes(level)) { - return; - } - if (!state.isWritable(level)) { - return; - } - try { - Events.IpcEvent.emit( - new Events.Logs.Write.Event({ - message, - level, - }), - ); - } catch (e) { - console.error(`Fail to send to backend logs: ${utils.error(e)}`); - } - } -} diff --git a/application/client/src/app/env/reflect.ts b/application/client/src/app/env/reflect.ts deleted file mode 100644 index 1ddfeea2fc..0000000000 --- a/application/client/src/app/env/reflect.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { DecoratorConstructor } from '@platform/env/decorators'; -import { getPropByPath } from '@platform/env/obj'; - -export function getSelector(constructor: DecoratorConstructor): string | undefined { - const component = getComponentSelector(constructor); - if (component !== undefined) { - return component; - } - return getDirectiveSelector(constructor); -} - -export function getComponentSelector(constructor: DecoratorConstructor): string | undefined { - const PATH = 'ɵcmp.selectors'; - const selectors = getPropByPath(constructor, PATH); - if ( - !(selectors instanceof Array) || - selectors.length === 0 || - !(selectors[0] instanceof Array) || - selectors[0].length === 0 || - typeof selectors[0][0] !== 'string' - ) { - return undefined; - } - return selectors[0][0]; -} -export function getDirectiveSelector(constructor: DecoratorConstructor): string | undefined { - const PATH = 'ɵdir.selectors'; - const selectors = getPropByPath(constructor, PATH); - if (!(selectors instanceof Array) || selectors.length === 0) { - return undefined; - } - return selectors.join('_'); -} diff --git a/application/client/src/app/env/storage.ts b/application/client/src/app/env/storage.ts deleted file mode 100644 index 82451b470f..0000000000 --- a/application/client/src/app/env/storage.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Destroy } from '@platform/types/env/types'; - -export class Storage { - private _entities: Map = new Map(); - - public destroy() { - this._entities.forEach((entity: Destroy) => { - entity.destroy(); - }); - } - - public set(uuid: string, entity: Destroy) { - this._entities.set(uuid, entity); - } - - public get(uuid: string): T | undefined { - const entity = this._entities.get(uuid); - if (entity === undefined) { - return undefined; - } else { - return entity as unknown as T; - } - } -} diff --git a/application/client/src/app/env/storages/recent/item.ts b/application/client/src/app/env/storages/recent/item.ts deleted file mode 100644 index 73549ebaee..0000000000 --- a/application/client/src/app/env/storages/recent/item.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { SafeHtml } from '@angular/platform-browser'; -import { getDomSanitizer } from '@ui/env/globals'; -import { Entry, EntryConvertable } from '@platform/types/storage/entry'; -import { error } from '@platform/log/utils'; -import { Matchee } from '@module/matcher'; - -import * as obj from '@platform/env/obj'; -import * as wasm from '@loader/wasm'; - -export class Recent extends Matchee implements EntryConvertable { - public value: string = ''; - public used: number = 0; - - private _htmlValue: string = ''; - - constructor(value: string, matcher: wasm.Matcher) { - super(matcher, value !== '' ? { value: value } : undefined); - this.value = value; - } - - public html(): SafeHtml { - return getDomSanitizer().bypassSecurityTrustHtml(this._htmlValue); - } - - public setFilter() { - const value: string | undefined = this.getHtmlOf('html_value'); - this._htmlValue = value === undefined ? this.value : value; - } - - public get filtered(): boolean { - return this.getScore() > 0; - } - - public entry(): { - to(): Entry; - from(entry: Entry): Error | undefined; - hash(): string; - uuid(): string; - updated(): undefined; - } { - return { - to: (): Entry => { - return { - uuid: this.value, - content: JSON.stringify({ - value: this.value, - used: this.used, - }), - }; - }, - from: (entry: Entry): Error | undefined => { - try { - const def: { - value: string; - used: number; - } = JSON.parse(entry.content); - this.value = obj.getAsNotEmptyString(def, 'value'); - this.used = obj.getAsValidNumber(def, 'used'); - this.setItem({ value: this.value }); - } catch (e) { - return new Error(error(e)); - } - return undefined; - }, - hash: (): string => { - return `${this.value}/${this.used}`; - }, - uuid: (): string => { - return this.value; - }, - updated: (): undefined => { - return undefined; - }, - }; - } -} diff --git a/application/client/src/app/env/storages/recent/list.ts b/application/client/src/app/env/storages/recent/list.ts deleted file mode 100644 index 5143d37e00..0000000000 --- a/application/client/src/app/env/storages/recent/list.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { Observable } from 'rxjs'; -import { map, startWith } from 'rxjs/operators'; -import { UntypedFormControl } from '@angular/forms'; -import { Entry, EntryConvertable } from '@platform/types/storage/entry'; -import { error } from '@platform/log/utils'; -import { Storage } from '@env/fsstorage'; -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Recent } from './item'; - -import * as wasm from '@loader/wasm'; - -@SetupLogger() -export class List extends Storage implements EntryConvertable { - public items: Recent[] = []; - public filter: string = ''; - public observer: Observable; - - protected readonly control: UntypedFormControl; - protected readonly matcher: wasm.Matcher = wasm.getBindings().Matcher.new(); - protected readonly filealias: string; - - constructor(control: UntypedFormControl, name: string, filealias: string) { - super(); - this.filealias = filealias; - this.control = control; - this.observer = control.valueChanges.pipe( - startWith(''), - map(() => []), - ); - this.setLoggerName(name); - this.storage() - .load() - .then((entry: Entry | undefined) => { - if (entry === undefined) { - return; - } - const error = this.entry().from(entry); - if (error instanceof Error) { - this.log().error(`Fail to parse loaded content: ${error.message}`); - } - this.assign(); - }) - .catch((err: Error) => { - this.log().error(`Fail to load: ${err.message}`); - }); - } - - public remove(recent: string) { - this.items = this.items.filter((r) => r.value !== recent); - this.assign(); - this.save(); - } - - public getStorageEntry(): Entry { - return this.entry().to(); - } - - public getStorageKey(): string { - return `${this.filealias}`; - } - - public update(recent: string) { - if (recent.trim() === '') { - return; - } - const item = this.items.find((i) => i.value === recent); - if (item === undefined) { - this.items.push(new Recent(recent, this.matcher)); - } else { - item.used += 1; - } - this.setFilter(''); - this.save(); - } - - public sort(items?: Recent[]) { - (items === undefined ? this.items : items).sort((a, b) => { - return a.used > b.used ? -1 : 1; - }); - } - - public setFilter(filter: string) { - this.matcher.search(filter); - this.items.sort((a: Recent, b: Recent) => b.getScore() - a.getScore()); - this.items.forEach((i) => i.setFilter()); - } - - public entry(): { - to(): Entry; - from(entry: Entry): Error | undefined; - hash(): string; - uuid(): string; - updated(): undefined; - } { - return { - to: (): Entry => { - return { - uuid: this.getStorageKey(), - content: JSON.stringify(this.items.map((r) => r.entry().to())), - }; - }, - from: (entry: Entry): Error | undefined => { - try { - const recent = JSON.parse(entry.content); - if (!(recent instanceof Array)) { - throw new Error( - `Expecting to get an array of recent. Gotten: ${typeof recent} (${recent})`, - ); - } - this.items = recent - .map((r) => { - const item = new Recent('', this.matcher); - const error = item.entry().from(r); - return error instanceof Error ? error : item; - }) - .filter((r) => r instanceof Recent) as Recent[]; - this.sort(); - } catch (e) { - return new Error(error(e)); - } - return undefined; - }, - hash: (): string => { - return this.items.map((r) => r.entry().hash()).join(';'); - }, - uuid: (): string => { - return this.getStorageKey(); - }, - updated: (): undefined => { - return undefined; - }, - }; - } - - protected save() { - this.sort(); - this.storage() - .save() - .catch((err: Error) => { - this.log().error(`Fail to save: ${err.message}`); - }); - } - - protected assign(): void { - this.observer = this.control.valueChanges.pipe( - startWith(''), - map((filter: string) => { - this.setFilter(filter); - const output = this.items.filter((i) => i.filtered); - if (output.length === this.items.length) { - this.sort(output); - } - return output; - }), - ); - } -} -export interface List extends LoggerInterface {} diff --git a/application/client/src/app/env/str.ts b/application/client/src/app/env/str.ts deleted file mode 100644 index d1203450af..0000000000 --- a/application/client/src/app/env/str.ts +++ /dev/null @@ -1,16 +0,0 @@ -export function bytesToStr(bytes: number): string { - if (bytes < 1024) { - return `${bytes} b`; - } - if (bytes < 1024 * 1024) { - return `${(bytes / 1024).toFixed(2)}Kb`; - } - if (bytes < 1024 * 1024 * 1024) { - return `${(bytes / 1024 / 1024).toFixed(2)}Mb`; - } - return `${(bytes / 1024 / 1024 / 1024).toFixed(2)}Gb`; -} - -export function timestampToUTC(ts: number): string { - return new Date(ts).toUTCString(); -} diff --git a/application/client/src/app/env/urlfilereader.ts b/application/client/src/app/env/urlfilereader.ts deleted file mode 100644 index a57340fbbe..0000000000 --- a/application/client/src/app/env/urlfilereader.ts +++ /dev/null @@ -1,49 +0,0 @@ -export class URLFileReader { - protected url: string; - protected readonly request: XMLHttpRequest = new XMLHttpRequest(); - protected done: boolean = false; - - constructor(url: string) { - this.url = url; - } - - public read( - responseType?: 'blob' | 'arraybuffer' | 'document' | 'json' | 'text', - ): Promise { - return new Promise((resolve, reject) => { - this.request.open('GET', this.url, true); - responseType !== undefined && (this.request.responseType = responseType); - this.request.send(null); - this.request.onreadystatechange = () => { - if (this.done) { - return; - } - if (this.request.readyState !== this.request.DONE) { - return; - } - this.done = true; - if (this.request.status !== 200) { - return reject(new Error(`Fail to get response`)); - } - switch (this.request.responseType) { - case 'arraybuffer': - resolve(this.request.response as ArrayBuffer); - break; - case 'blob': - resolve(this.request.response as Blob); - break; - case 'json': - resolve(this.request.response as { [key: string]: any }); - break; - case 'document': - resolve(this.request.response as Document); - break; - case 'text': - case '': - resolve(this.request.responseText); - break; - } - }; - }); - } -} diff --git a/application/client/src/app/loader/controllers.ts b/application/client/src/app/loader/controllers.ts deleted file mode 100644 index 32851cdc44..0000000000 --- a/application/client/src/app/loader/controllers.ts +++ /dev/null @@ -1,4 +0,0 @@ -/** - * @module controller - * @description Module loads all available controllers to declare it - */ diff --git a/application/client/src/app/loader/init.ts b/application/client/src/app/loader/init.ts deleted file mode 100644 index 78f501eddb..0000000000 --- a/application/client/src/app/loader/init.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @module init - * @description Module should be load at veery first place. This module is right place to put any init procedures - */ -import { setUuidGenerator } from '@platform/env/sequence'; -import { scope } from '@platform/env/scope'; -import { v4 } from 'uuid'; -import { Logger } from '@env/logs/index'; - -// Set globals on @platform -// Set uuid getter -setUuidGenerator(v4); -// Set logger getter -scope.setLogger(Logger); - -// Import list of services -import '@register/services'; diff --git a/application/client/src/app/loader/services.ts b/application/client/src/app/loader/services.ts deleted file mode 100644 index 0195eb91b1..0000000000 --- a/application/client/src/app/loader/services.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * @module service - * @description Module loads all available services to declare it and make it init - */ - -import '@service/ilc'; -import '@service/api'; diff --git a/application/client/src/app/loader/system.ts b/application/client/src/app/loader/system.ts deleted file mode 100644 index cbf74be1d7..0000000000 --- a/application/client/src/app/loader/system.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @module system - * @description Module cares about loading of application - */ -import './services'; -import './controllers'; diff --git a/application/client/src/app/loader/wasm.ts b/application/client/src/app/loader/wasm.ts deleted file mode 100644 index 06668de1b2..0000000000 --- a/application/client/src/app/loader/wasm.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { scope } from '@platform/env/scope'; - -import * as wasm_bindings from '@wasm/wasm_bindings'; - -export { Matcher } from '@wasm/wasm_bindings'; - -const wasm: { - bindings: typeof wasm_bindings | undefined; -} = { - bindings: undefined, -}; - -export function load(): Promise { - const logger = scope.getLogger('wasm'); - return Promise.all([ - import('@wasm/wasm_bindings') - .then((module) => { - wasm.bindings = module; - logger.debug(`@wasm/wasm_bindings is loaded`); - }) - .catch((err: Error) => { - logger.error(`fail to load @wasm/wasm_bindings: ${err.message}`); - }), - ]) - .catch((err: Error) => { - logger.error(`Fail to load wasm modules: ${err.message}`); - }) - .then((_) => void 0); -} - -export function getBindings(): typeof wasm_bindings { - if (wasm.bindings === undefined) { - throw new Error(`wasm module "ansi" isn't loaded`); - } - return wasm.bindings; -} diff --git a/application/client/src/app/module/ansi.ts b/application/client/src/app/module/ansi.ts deleted file mode 100644 index aebcff7f38..0000000000 --- a/application/client/src/app/module/ansi.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { error } from '@platform/log/utils'; - -import * as wasm from '@loader/wasm'; - -let mapper: any = undefined; - -export function ansiToHtml(input: string): string | Error { - try { - return wasm.getBindings().convert(input); - } catch (e) { - return new Error(error(e)); - } -} - -export interface Slot { - from: number; - to: number; - color: string | null; - background: string | null; - bold: boolean; - italic: boolean; -} - -export function getAnsiMap(input: string): Slot[] | Error { - if (mapper === undefined) { - mapper = wasm.getBindings().AnsiMapper.new(); - } - try { - return mapper.get_map(input); - } catch (e) { - return new Error(error(e)); - } -} - -export function escapeAnsi(input: string): string | Error { - try { - return wasm.getBindings().escape(input); - } catch (e) { - return new Error(error(e)); - } -} - -export function safeEscapeAnsi(input: string): string { - try { - return wasm.getBindings().escape(input); - } catch (_e) { - return input; - } -} diff --git a/application/client/src/app/module/ipc.ts b/application/client/src/app/module/ipc.ts deleted file mode 100644 index 16b3dab746..0000000000 --- a/application/client/src/app/module/ipc.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { Packed } from '@platform/ipc/transport/index'; - -/** - * Extends the global `window` object with the safe Electron API - * exposed from the preload script. - * - * @remarks - * This API provides a limited, secure surface for the renderer process. - * It includes IPC communication, selected web utilities, and clipboard access. - */ -declare global { - interface Window { - /** - * Namespaced Electron API exposed to the renderer. - */ - electron: { - ipc: IPC; - webUtils: WebUtils; - clipboard: Clipboard; - }; - } -} - -/** - * Checks if the `electron` API is available on the current `window` context. - * - * @returns `true` if the API is defined, otherwise `false`. - */ -export function isAvailable(): boolean { - return window.electron !== undefined && window.electron !== null; -} - -/** - * IPC communication interface exposed to the renderer. - * - * Provides methods for sending messages to the main process and - * subscribing or unsubscribing from IPC channels. - */ -export interface IPC { - /** - * Sends a message to the main process over the specified channel. - * - * @param channel - IPC channel identifier. - * @param msg - Serialized message payload. - */ - send: (channel: string, msg: Packed) => void; - - /** - * Subscribes a callback to events from the specified channel. - * - * @param channel - IPC channel identifier. - * @param callback - Function invoked with event arguments. - */ - subscribe: (channel: string, callback: (...args: any[]) => void) => void; - - /** - * Removes a previously subscribed callback from the specified channel. - * - * @param channel - IPC channel identifier. - * @param callback - Callback to be removed. - */ - unsubscribe: (channel: string, callback: (...args: any[]) => void) => void; - - /** - * Removes all listeners from the specified channel. - * - * @param channel - IPC channel identifier. - */ - unsubscribeAll: (channel: string) => void; -} - -/** - * Utilities exposed from Electron's `webUtils`. - */ -export interface WebUtils { - /** - * Resolves the absolute filesystem path for a given File object. - * - * @param file - A File object obtained in the renderer. - * @returns The absolute filesystem path. - */ - getPathForFile(file: File): string; -} - -/** - * Clipboard interface exposed to the renderer. - * - * Provides write-only access to the system clipboard via IPC. - */ -export interface Clipboard { - /** - * Writes arbitrary data into the system clipboard. - * - * @param mime - MIME type of the data (e.g. `text/plain`, `image/png`). - * @param data - Content as an ArrayBuffer. - */ - write(mime: string | undefined, data: ArrayBuffer): Promise; -} diff --git a/application/client/src/app/module/matcher/holder.ts b/application/client/src/app/module/matcher/holder.ts deleted file mode 100644 index b0c348a742..0000000000 --- a/application/client/src/app/module/matcher/holder.ts +++ /dev/null @@ -1,11 +0,0 @@ -import * as wasm from '@loader/wasm'; - -export type MatcherType = wasm.Matcher; - -export abstract class Holder { - protected readonly matcher: wasm.Matcher; - - constructor() { - this.matcher = wasm.getBindings().Matcher.new(); - } -} diff --git a/application/client/src/app/module/matcher/index.ts b/application/client/src/app/module/matcher/index.ts deleted file mode 100644 index 11f417cd14..0000000000 --- a/application/client/src/app/module/matcher/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { Holder } from './holder'; -export { Matchee, PassiveMatchee, createPassiveMatcheeList } from './matchee'; diff --git a/application/client/src/app/module/matcher/matchee.ts b/application/client/src/app/module/matcher/matchee.ts deleted file mode 100644 index 1d3cafca1d..0000000000 --- a/application/client/src/app/module/matcher/matchee.ts +++ /dev/null @@ -1,73 +0,0 @@ -import * as wasm from '@loader/wasm'; - -export abstract class Matchee { - private _index: number | undefined; - private _matcher: wasm.Matcher; - - constructor(matcher: wasm.Matcher, item: object | undefined) { - this._matcher = matcher; - if (item !== undefined) { - this._index = this._matcher.set_item(item); - } - } - - public getScore(): number { - if (this._index === undefined) { - return 0; - } - return Number(this._matcher.get_score(this._index)); - } - - protected setItem(item: object) { - if (item !== undefined) { - this._index = this._matcher.set_item(item); - } - } - - protected getHtmlOf(key: string): string | undefined { - if (this._index === undefined) { - return undefined; - } - return this._matcher.get_html_of(this._index, key); - } -} - -export abstract class PassiveMatchee { - private _index: number | undefined; - private _matcher: wasm.Matcher; - - constructor(matcher: wasm.Matcher) { - this._matcher = matcher; - } - - public abstract asObj(): object; - - public getScore(): number { - if (this._index === undefined) { - return 0; - } - return Number(this._matcher.get_score(this._index)); - } - - public setIndex(index: number) { - this._index = index; - } - - protected getHtmlOf(key: string): string | undefined { - if (this._index === undefined) { - return undefined; - } - return this._matcher.get_html_of(this._index, key); - } -} - -export function createPassiveMatcheeList( - list: T[], - matcher: wasm.Matcher, -): T[] { - const from: number = matcher.set_items(list.map((i) => i.asObj())); - list.forEach((item, i) => { - item.setIndex(from + i); - }); - return list; -} diff --git a/application/client/src/app/module/util.ts b/application/client/src/app/module/util.ts deleted file mode 100644 index 36693389c2..0000000000 --- a/application/client/src/app/module/util.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as wasm from '@loader/wasm'; - -export function getFilterError( - filter: string, - caseSensitive: boolean, - wholeWord: boolean, - regex: boolean, -): string | undefined { - try { - const result = wasm.getBindings().get_filter_error(filter, caseSensitive, wholeWord, regex); - return typeof result !== 'string' ? undefined : result; - } catch (_e) { - return undefined; - } -} diff --git a/application/client/src/app/register/services.ts b/application/client/src/app/register/services.ts deleted file mode 100644 index 8859530eca..0000000000 --- a/application/client/src/app/register/services.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { v4 } from 'uuid'; -import { Inputs } from '@platform/entity/service'; - -/** - * Central service registration table for the entire system. - * - * @remarks - * Every service in the application **must** be registered in this table with a unique name and UUID. - * The UUID serves as a persistent identity used by the dependency resolver to manage initialization - * order and inter-service communication. - * - * This registry is **mandatory**: it ensures consistent identification of services across the - * application lifecycle and guarantees correct dependency resolution. - * - * Developers must: - * - Assign a **globally unique UUID** to each service (automatically generated here via `v4()`). - * - Use the same registration entry when applying decorators like `@SetupService(...)` or `@DependOn(...)`. - * - * @example Dependency declaration - * ```ts - * @DependOn(api) // Ensures `MyNewService` is initialized after the `api` service - * @SetupService(services['my_new_service']) - * class MyNewService { ... } - * ``` - * - * @warning - * Avoid reusing UUIDs or manually copying them between services. - * UUIDs should remain stable for the life of the service type. - * - * @constant - * @public - */ -export const services: { [key: string]: Inputs } = { - system: { - name: 'System', - uuid: v4(), - }, - env: { - name: 'Env', - uuid: v4(), - }, - api: { - name: 'API', - uuid: v4(), - }, - ilc: { - name: 'ILC', - uuid: v4(), - }, - session: { - name: 'Session', - uuid: v4(), - }, - state: { - name: 'State', - uuid: v4(), - }, - jobs: { - name: 'Jobs', - uuid: v4(), - }, - files: { - name: 'Files', - uuid: v4(), - }, - bridge: { - name: 'Bridge', - uuid: v4(), - }, - recent: { - name: 'Recent', - uuid: v4(), - }, - tabs: { - name: 'Tabs', - uuid: v4(), - }, - hotkeys: { - name: 'Hotkeys', - uuid: v4(), - }, - history: { - name: 'History', - uuid: v4(), - }, - cli: { - name: 'Cli', - uuid: v4(), - }, - actions: { - name: 'Actions', - uuid: v4(), - }, - settings: { - name: 'Settings', - uuid: v4(), - }, - sys: { - name: 'Sys', - uuid: v4(), - }, - favorites: { - name: 'Favorites', - uuid: v4(), - }, - changelogs: { - name: 'Changelogs', - uuid: v4(), - }, - plugins: { - name: 'Plugins', - uuid: v4(), - }, -}; - -export const ui: { [key: string]: Inputs } = { - popup: { - name: 'Popup', - uuid: v4(), - }, - notifications: { - name: 'Notifications', - uuid: v4(), - }, - contextmenu: { - name: 'Context Menu', - uuid: v4(), - }, - layout: { - name: 'Layout state', - uuid: v4(), - }, - tabs: { - name: 'Tabs', - uuid: v4(), - }, - toolbar: { - name: 'Toolbar', - uuid: v4(), - }, - sidebar: { - name: 'Sidebar', - uuid: v4(), - }, - styles: { - name: 'Styles', - uuid: v4(), - }, - bottomsheet: { - name: 'BottomSheet', - uuid: v4(), - }, - listener: { - name: `Listener`, - uuid: v4(), - }, - lockers: { - name: `Lockers`, - uuid: v4(), - }, - filters: { - name: 'Filters', - uuid: v4(), - }, - dropfiles: { - name: 'DragAndDropFiles', - uuid: v4(), - }, -}; diff --git a/application/client/src/app/schema/content/row.ts b/application/client/src/app/schema/content/row.ts deleted file mode 100644 index e7c9767d7c..0000000000 --- a/application/client/src/app/schema/content/row.ts +++ /dev/null @@ -1,396 +0,0 @@ -import { Session } from '@service/session/session'; -import { Subject, Subscriber } from '@platform/env/subscription'; -import { Nature } from '@platform/types/content'; -import { EAlias } from '@service/session/dependencies/search/highlights/modifier'; -import { GrabbedElement } from '@platform/types/bindings/miscellaneous'; - -/** - * Declares the visual "owner" or container context in which a `Row` is rendered. - * - * @remarks - * The `Owner` enum is used to distinguish between multiple visual log consumers, - * such as the main output, search results, bookmarks, charts, and others. - * - * The concept of an "owner" is introduced to resolve event loop issues in UI logic: - * for instance, a click on a log row in the main output window should not trigger - * reactions within that same window. Instead, other views (like search results) - * can react to such events and adjust their own state accordingly. - * - * This enables synchronized behavior between components while avoiding unintended recursive updates. - * - * @enum {string} - * @public - */ -export enum Owner { - /** - * Main log output window. - */ - Output = 'Output', - - /** - * Search results view. - */ - Search = 'Search', - - /** - * Bookmark view containing marked rows. - */ - Bookmark = 'Bookmark', - - /** - * Charting window or graph view. - */ - Chart = 'Chart', - - /** - * Attachment container (e.g., linked file or artifact). - */ - Attachment = 'Attachment', - - /** - * Comment container (e.g., user-annotated row or discussion thread). - */ - Comment = 'Comment', - - /** - * Result of a nested search operation. - */ - NestedSearch = 'NestedSearch', -} - -export interface RowSrc { - content: string; - position: number; - owner: Owner; - source: number; - session: Session; - nature: Nature; -} - -const MAX_ROW_LENGTH_LIMIT = 10000; - -export interface IRow { - content: string; - position: number; - owner: Owner; - source: number; - cropped: boolean; - html: string; - color: string | undefined; - background: string | undefined; - columns: string[]; - nature: Nature; - seporator: boolean; -} - -/** - * Represents a single log entry (row) received from the backend and processed for rendering. - * - * @remarks - * Every log line from the backend is transformed into an instance of `Row`. - * This class acts as the fundamental unit for log rendering, encapsulating all required - * metadata and visual formatting attributes. It includes a reference to the owning session, - * original content, display state, highlighting, coloring, column values, and more. - * - * The renderer operates exclusively on instances of this class. - * - * @extends Subscriber - * - * @public - */ -export class Row extends Subscriber { - /** - * Removes special marker symbols (e.g., control characters) from the given string. - * - * @param str - A string potentially containing marker symbols. - * @returns A string without marker symbols. - */ - static removeMarkerSymbols(str: string): string { - return str.replaceAll(/\u0004/gi, '').replaceAll(/\u0005/gi, ''); - } - - /** - * Original raw log content. - */ - public content: string; - - /** - * Absolute position of the row within the session's data stream. - */ - public position: number; - - /** - * Identifies the visual container (e.g., output, search, chart) responsible for rendering this row. - */ - public owner: Owner; - - /** - * Numeric ID of the log source (e.g., channel, stream, or plugin source). - */ - public source: number; - - /** - * The session to which this row belongs. - */ - public session: Session; - - /** - * Indicates whether the row's content was cropped during parsing or rendering. - */ - public cropped: boolean; - - /** - * Emits when the row's rendering state is updated (e.g., bookmarked, highlighted). - * Note: content mutations are not supported and do not trigger this event. - */ - public change: Subject = new Subject(); - - /** - * Parsed and HTML-ready version of the row content, used for direct insertion into DOM. - */ - public html!: string; - - /** - * Optional text color assigned to this row. - */ - public color: string | undefined; - - /** - * Optional background color assigned to this row. - */ - public background: string | undefined; - - /** - * Optional columnar view of the row, if the session content supports tabular formatting. - */ - public columns: string[] = []; - - /** - * Describes the nature or classification of the row: - * e.g., search result, bookmark, or breadcrumb (non-matching row in mixed search output). - */ - public nature: Nature; - - /** - * When `true`, the row is rendered as a visual separator instead of a content line. - * Used primarily in breadcrumb display modes. - */ - public seporator: boolean = false; - - /** - * Flags indicating various match states of the row in relation to active search or filters. - */ - public matches: { - /** - * `true` if the row matches the current active search query. - */ - active: boolean; - - /** - * `true` if the row matches current non-search filters. - */ - filter: boolean; - - /** - * `true` if the row matches filters relevant to chart or metrics views. - */ - chart: boolean; - } = { - active: false, - filter: false, - chart: false, - }; - - protected readonly delimiter: string | undefined; - - private _hash: string = ''; - - constructor(inputs: RowSrc) { - super(); - this.nature = inputs.nature; - this.session = inputs.session; - this.cropped = inputs.content.length > MAX_ROW_LENGTH_LIMIT; - this.content = - inputs.content.length > MAX_ROW_LENGTH_LIMIT - ? `${inputs.content.substring(0, MAX_ROW_LENGTH_LIMIT)}...` - : inputs.content; - this.position = inputs.position; - this.owner = inputs.owner; - this.source = inputs.source; - this.delimiter = this.session.render.delimiter(); - this.update(); - this.register( - this.session.highlights.subjects.get().update.subscribe(() => { - this.softUpdate(); - }), - ); - } - - public destroy() { - this.change.destroy(); - this.unsubscribe(); - } - - public from(inputs: RowSrc) { - this.content !== inputs.content && (this.content = inputs.content); - this.position !== inputs.position && (this.position = inputs.position); - this.owner !== inputs.owner && (this.owner = inputs.owner); - this.source !== inputs.source && (this.source = inputs.source); - this.session.uuid() !== inputs.session.uuid() && (this.session = inputs.session); - this.nature !== inputs.nature && (this.nature = inputs.nature); - this.seporator = this.isSeporator(); - this.softUpdate(); - } - - public as(): { - grabbed(): GrabbedElement; - } { - return { - grabbed: (): GrabbedElement => { - return { - pos: this.position, - source_id: this.source, - content: this.content, - nature: 0, - }; - }, - }; - } - - public bookmark(): { - is(): boolean; - toggle(): void; - } { - return { - is: (): boolean => { - return this.session.bookmarks.has(this.position); - }, - toggle: (): void => { - this.session.bookmarks.bookmark(this); - }, - }; - } - - public select(): { - is(): boolean; - toggle(event: PointerEvent): void; - } { - return { - is: (): boolean => { - return this.session.cursor.isSelected(this.position); - }, - toggle: (event: PointerEvent): void => { - this.session.cursor.select(this.position, this.owner, event, this); - }, - }; - } - - public extending(): { - before(): void; - after(): void; - } { - return { - before: (): void => { - if (!this.nature.seporator) { - return; - } - this.session.indexed.expand(this.position).before(); - }, - after: (): void => { - if (!this.nature.seporator) { - return; - } - this.session.indexed.expand(this.position).after(); - }, - }; - } - - public serialized(): RowSrc { - return { - content: this.content, - position: this.position, - owner: this.owner, - source: this.source, - nature: this.nature, - session: this.session, - }; - } - - protected isSeporator(): boolean { - if (this.owner !== Owner.Search) { - return false; - } - return this.nature.seporator; - } - - protected hash(): string { - if (this.delimiter === undefined) { - return `${this.color};${this.background};${this.html};${this.position};${this.seporator}`; - } else { - return `${this.color};${this.background};${this.columns.join(';')};${this.position};${ - this.seporator - }`; - } - } - - protected update() { - const matches = (injected: { [key: string]: boolean }) => { - this.matches.active = injected[EAlias.Active]; - this.matches.filter = injected[EAlias.Filters]; - this.matches.chart = injected[EAlias.Charts]; - }; - if (this.delimiter === undefined) { - const parsed = this.session.highlights.parse( - this.position, - Row.removeMarkerSymbols(this.content), - this.owner, - false, - ); - matches(parsed.injected); - this.html = parsed.html; - this.color = parsed.color; - this.background = parsed.background; - } else { - this.color = undefined; - this.background = undefined; - const columnsMap: [number, number][] = []; - let cursor = 0; - this.columns = this.content.split(this.delimiter).map((str) => { - columnsMap.push([cursor, str.length]); - cursor += str.length; - return Row.removeMarkerSymbols(str); - }); - const expected = this.session.render.columns(); - if (this.columns.length > expected) { - this.columns.splice(expected - 1, this.columns.length - expected); - } else if (this.columns.length < expected) { - this.columns = this.columns.concat( - Array.from({ length: expected - this.columns.length }, () => ''), - ); - } - this.columns = this.columns.map((col, i) => { - const parsed = this.session.highlights.parse( - this.position, - col, - this.owner, - false, - { column: i, map: columnsMap }, - ); - matches(parsed.injected); - if (this.color === undefined && this.background === undefined) { - this.color = parsed.color; - this.background = parsed.background; - } - return parsed.html; - }); - } - this.seporator = this.isSeporator(); - } - - protected softUpdate() { - this.update(); - const hash = this.hash(); - this._hash !== hash && this.change.emit(); - this._hash = hash; - } -} diff --git a/application/client/src/app/schema/ids.ts b/application/client/src/app/schema/ids.ts deleted file mode 100644 index a71a3786fc..0000000000 --- a/application/client/src/app/schema/ids.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { unique } from '@platform/env/sequence'; - -export const WORKSPACE_TAB_HOME = unique(); - -export const TOOLBAR_TAB_SEARCH = unique(); -export const TOOLBAR_TAB_PRESET = unique(); -export const TOOLBAR_TAB_DETAILS = unique(); -export const TOOLBAR_TAB_CHART = unique(); - -export const SIDEBAR_TAB_OBSERVING = unique(); -export const SIDEBAR_TAB_ATTACHMENTS = unique(); -export const SIDEBAR_TAB_FILTERS = unique(); -export const SIDEBAR_TAB_COMMENTS = unique(); -export const SIDEBAR_TAB_TEAMWORK = unique(); diff --git a/application/client/src/app/schema/render/columns.ts b/application/client/src/app/schema/render/columns.ts deleted file mode 100644 index 5a00f98197..0000000000 --- a/application/client/src/app/schema/render/columns.ts +++ /dev/null @@ -1,339 +0,0 @@ -import { scope } from '@platform/env/scope'; -import { hash } from '@platform/env/str'; -import { Subject, Subjects } from '@platform/env/subscription'; -import { error } from '@platform/log/utils'; -import { bridge } from '@service/bridge'; -import { LimittedValue } from '@ui/env/entities/value.limited'; - -import * as num from '@platform/env/num'; - -export interface Header { - caption: string; - desc: string; - visible: boolean; - width: LimittedValue | undefined; - color: string | undefined; - index: number; -} - -export class Columns { - protected readonly styles: Map = new Map(); - protected readonly logger = scope.getLogger('Columns'); - protected readonly defaults: { - headers: { - caption: string; - desc: string; - }[]; - visability: boolean[] | boolean; - widths: number[]; - min: number[] | number; - max: number[] | number; - }; - protected hash!: string; - - protected setup(): void { - const headersVisability = - this.defaults.visability instanceof Array - ? this.defaults.visability - : Array.from({ length: this.defaults.headers.length }, () => true); - const maxWidths: number[] = - this.defaults.max instanceof Array - ? this.defaults.max - : (Array.from( - { length: this.defaults.headers.length }, - () => this.defaults.max, - ) as number[]); - const minWidths: number[] = - this.defaults.min instanceof Array - ? this.defaults.min - : (Array.from( - { length: this.defaults.headers.length }, - () => this.defaults.min, - ) as number[]); - this.headers.clear(); - this.styles.clear(); - this.defaults.headers.forEach( - ( - desc: { - caption: string; - desc: string; - }, - index: number, - ) => { - const header = { - caption: desc.caption, - desc: desc.desc, - width: - this.defaults.widths[index] === -1 - ? undefined - : new LimittedValue( - `column_width_${index}`, - minWidths[index], - maxWidths[index], - this.defaults.widths[index], - ), - visible: headersVisability[index], - color: undefined, - index, - }; - this.headers.set(index, header); - this.styles.set(index, {}); - }, - ); - this.update().all(); - this.hash = this.getHash(); - } - - protected getHeader(index: number): Header | undefined { - const header = this.headers.get(index); - if (header === undefined) { - this.logger.error(`Fail to find column with index=${index}`); - } - return header; - } - protected getHash(): string { - return hash( - Array.from(this.headers.values()) - .map((header) => header.caption) - .join(';'), - ).toString(); - } - protected storage(): { load(): void; save(): void } { - return { - load: () => { - bridge - .storage(this.hash) - .read() - .then((content: string) => { - if (typeof content !== 'string' || content.trim() === '') { - this.logger.debug( - `No columns data has been saved from previous sessions`, - ); - return; - } - try { - const headers = JSON.parse(content); - if (!(headers instanceof Array)) { - this.logger.error( - `Content from file does not represent Headers as an Array. Gotten: ${typeof headers}`, - ); - return; - } - if (headers.length !== this.headers.size) { - this.logger.error( - `Mismatching header count from last session. Previous: ${headers.length}; current: ${this.headers.size}.`, - ); - return; - } - Array.from(this.headers.values()).forEach( - (header: Header, index: number) => { - if (headers[index].width !== undefined) { - this.width(index).set(headers[index].width); - } - if (headers[index].color !== undefined) { - this.color(index).set(headers[index].color); - } - if (header.visible !== headers[index].visible) { - this.visibility(index).set(headers[index].visible); - } - }, - ); - this.subjects.get().restored.emit(); - } catch (err) { - this.logger.error(`Fail to parse columns data due: ${error(err)}`); - } - }) - .catch((err: Error) => - this.logger.error(`Fail to load columns data due: ${err.message}`), - ); - }, - save: () => { - bridge - .storage(this.hash) - .write( - JSON.stringify( - Array.from(this.headers.values()).map((header) => { - return { - width: - header.width === undefined ? undefined : header.width.value, - color: header.color, - visible: header.visible, - }; - }), - ), - ) - .catch((err: Error) => { - this.logger.error(`Fail to save columns data due: ${err.message}`); - }); - }, - }; - } - - public readonly headers: Map = new Map(); - public subjects: Subjects<{ - resized: Subject; - visibility: Subject; - colorize: Subject; - restored: Subject; - }> = new Subjects({ - resized: new Subject(), - visibility: new Subject(), - colorize: new Subject(), - restored: new Subject(), - }); - - constructor( - headers: { - caption: string; - desc: string; - }[], - visability: boolean[] | boolean, - widths: number[], - min: number[] | number, - max: number[] | number, - ) { - this.defaults = { - headers, - visability, - widths, - min, - max, - }; - this.setup(); - setTimeout(() => { - this.storage().load(); - }, 1000); - } - - public visibility(index: number): { - get(): boolean; - set(value?: boolean): void; - } { - const header = this.getHeader(index); - return { - get: (): boolean => { - return header === undefined ? true : header.visible; - }, - set: (value?: boolean): void => { - if (header === undefined) { - return; - } - header.visible = value === undefined ? !header.visible : value; - this.headers.set(index, header); - this.subjects.get().visibility.emit(index); - this.storage().save(); - }, - }; - } - - public color(index: number): { - get(): string | undefined; - set(color: string | undefined): void; - } { - const header = this.getHeader(index); - return { - get: (): string | undefined => { - return header === undefined ? undefined : header.color; - }, - set: (color: string | undefined): void => { - if (header === undefined) { - return; - } - header.color = color; - this.headers.set(index, header); - this.update().styles(index); - this.subjects.get().colorize.emit(index); - this.storage().save(); - }, - }; - } - - public width(index: number): { - get(): number | undefined; - set(width: number): void; - } { - const header = this.getHeader(index); - return { - get: (): number | undefined => { - return header === undefined ? undefined : header.width?.value; - }, - set: (width: number): void => { - if (header === undefined) { - return; - } - if (!num.isValid(width)) { - this.logger.error(`Fail to set column's width: invalid width (${width})`); - return; - } - header.width !== undefined && header.width.set(width); - this.headers.set(index, header); - this.update().styles(index); - this.subjects.get().resized.emit(index); - this.storage().save(); - }, - }; - } - - public update(): { - all(): void; - styles(index: number): void; - } { - return { - all: (): void => { - this.headers.forEach((_header: Header, index: number) => { - this.update().styles(index); - this.subjects.get().visibility.emit(index); - this.subjects.get().resized.emit(index); - this.subjects.get().colorize.emit(index); - }); - }, - styles: (index: number): void => { - const style = this.styles.get(index); - if (style === undefined) { - this.logger.error(`Fail to find styles of column with index=${index}`); - return; - } - const width = this.width(index).get(); - if (width === undefined) { - style['width'] = ''; - } else { - style['width'] = `${width}px`; - } - const color = this.color(index).get(); - style['color'] = color !== undefined ? color : ''; - }, - }; - } - - public style(index: number): { [key: string]: string } { - const style = this.styles.get(index); - if (style === undefined) { - this.logger.error(`Fail to find styles of column with index=${index}`); - return {}; - } - return style; - } - - public get(): { - all(): Header[]; - visible(): Header[]; - byIndex(index: number): Header | undefined; - } { - return { - all: (): Header[] => { - return Array.from(this.headers.values()); - }, - visible: (): Header[] => { - return Array.from(this.headers.values()).filter((h) => h.visible); - }, - byIndex: (index: number): Header | undefined => { - return this.getHeader(index); - }, - }; - } - - public reset(): void { - this.setup(); - this.storage().save(); - } -} diff --git a/application/client/src/app/schema/render/dlt.ts b/application/client/src/app/schema/render/dlt.ts deleted file mode 100644 index 5ca730c3f7..0000000000 --- a/application/client/src/app/schema/render/dlt.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Render } from './index'; -import { Columns } from './columns'; -import { Protocol } from '@platform/types/observe/parser/index'; - -const MIN_COLUMN_WIDTH = 30; -const MAX_COLUMN_WIDTH = 600; -// public readonly widths: number[] = [150, 80, 80, 80, 80, 80, 80, 80, 80, 80, -1]; - -export class Implementation extends Render { - public static HEADERS = [ - { - caption: 'Datetime', - desc: 'Datetime', - }, - { - caption: 'ECUID', - desc: 'ECU', - }, - { - caption: 'VERS', - desc: 'Dlt Protocol Version (VERS)', - }, - { - caption: 'SID', - desc: 'Session ID (SEID)', - }, - { - caption: 'MCNT', - desc: 'Message counter (MCNT)', - }, - { - caption: 'TMS', - desc: 'Timestamp (TMSP)', - }, - { - caption: 'EID', - desc: 'ECU', - }, - { - caption: 'APID', - desc: 'Application ID (APID)', - }, - { - caption: 'CTID', - desc: 'Context ID (CTID)', - }, - { - caption: 'MSTP', - desc: 'Message Type (MSTP)', - }, - { - caption: 'PAYLOAD', - desc: 'Payload', - }, - ]; - - constructor() { - super(); - this.setBoundEntity( - new Columns( - Implementation.HEADERS, - true, - [150, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1], - MIN_COLUMN_WIDTH, - MAX_COLUMN_WIDTH, - ), - ); - } - - public override protocol(): Protocol { - return Protocol.Dlt; - } - - public override columns(): number { - return Implementation.HEADERS.length; - } - public override delimiter(): string | undefined { - return `\u0004`; - } -} diff --git a/application/client/src/app/schema/render/index.ts b/application/client/src/app/schema/render/index.ts deleted file mode 100644 index eb6013d96e..0000000000 --- a/application/client/src/app/schema/render/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Protocol } from '@platform/types/observe/parser/index'; - -export interface RenderReference { - new (): Render; -} -export abstract class Render { - private _bound: T | undefined; - - abstract protocol(): Protocol; - - public delimiter(): string | undefined { - return undefined; - } - public columns(): number { - return 0; - } - public getBoundEntity(): T | undefined { - return this._bound; - } - public setBoundEntity(entity: T) { - this._bound = entity; - } -} diff --git a/application/client/src/app/schema/render/plugin.ts b/application/client/src/app/schema/render/plugin.ts deleted file mode 100644 index e00e4a2759..0000000000 --- a/application/client/src/app/schema/render/plugin.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { PluginEntity } from '@platform/types/bindings'; -import { Render } from './index'; -import { Columns } from './columns'; -import { Protocol } from '@platform/types/observe/parser'; - -export class Implementation extends Render { - private _columnsCount: number = 0; - - constructor(plugin: PluginEntity) { - super(); - - if ( - typeof plugin.info.render_options === 'object' && - 'Parser' in plugin.info.render_options - ) { - const columns_options = plugin.info.render_options.Parser.columns_options; - - if (columns_options === null) { - // Render options doesn't have columns. - return; - } - - const headers: { - caption: string; - desc: string; - }[] = []; - const widths: number[] = []; - - this._columnsCount = columns_options.columns.length; - - for (const column of columns_options.columns) { - headers.push({ caption: column.caption, desc: column.description }); - widths.push(column.width); - } - - this.setBoundEntity( - new Columns( - headers, - true, - widths, - columns_options.min_width, - columns_options.max_width, - ), - ); - } - } - - override protocol(): Protocol { - return Protocol.Plugin; - } - - public override columns(): number { - return this._columnsCount; - } - - public override delimiter(): string | undefined { - return this._columnsCount > 0 ? `\u0004` : undefined; - } -} diff --git a/application/client/src/app/schema/render/someip.ts b/application/client/src/app/schema/render/someip.ts deleted file mode 100644 index 9fe995d46c..0000000000 --- a/application/client/src/app/schema/render/someip.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Render } from './index'; -import { Columns } from './columns'; -import { Protocol } from '@platform/types/observe/parser/index'; - -const MIN_COLUMN_WIDTH = 30; -const MAX_COLUMN_WIDTH = 600; - -export class Implementation extends Render { - public static HEADERS = [ - { - caption: 'SOME/IP', - desc: 'The Message-Kind.', - }, - { - caption: 'SERV', - desc: 'The Service-ID', - }, - { - caption: 'METH', - desc: 'The Method-ID', - }, - { - caption: 'LENG', - desc: 'The Length-Field', - }, - { - caption: 'CLID', - desc: 'The Client-ID', - }, - { - caption: 'SEID', - desc: 'The Session-ID', - }, - { - caption: 'IVER', - desc: 'The Interface-Version', - }, - { - caption: 'MSTP', - desc: 'The Message-Type', - }, - { - caption: 'RETC', - desc: 'The Return-Code', - }, - { - caption: 'PAYLOAD', - desc: 'Payload', - }, - ]; - - constructor() { - super(); - this.setBoundEntity( - new Columns( - Implementation.HEADERS, - true, - [50, 50, 50, 30, 30, 30, 30, 30, 30, -1], - MIN_COLUMN_WIDTH, - MAX_COLUMN_WIDTH, - ), - ); - } - - public override protocol(): Protocol { - return Protocol.SomeIp; - } - - public override columns(): number { - return Implementation.HEADERS.length; - } - public override delimiter(): string | undefined { - return `\u0004`; - } -} diff --git a/application/client/src/app/schema/render/text.ts b/application/client/src/app/schema/render/text.ts deleted file mode 100644 index 59e8ba6e35..0000000000 --- a/application/client/src/app/schema/render/text.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Render } from './index'; -import { Protocol } from '@platform/types/observe/parser/index'; - -export class Implementation extends Render { - public override protocol(): Protocol { - return Protocol.Text; - } -} diff --git a/application/client/src/app/schema/render/tools.ts b/application/client/src/app/schema/render/tools.ts deleted file mode 100644 index c7df377451..0000000000 --- a/application/client/src/app/schema/render/tools.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Implementation as Dlt } from './dlt'; -import { Implementation as SomeIp } from './someip'; -import { Implementation as Text } from './text'; -import { Implementation as Plugin } from './plugin'; -import { Render, RenderReference } from './index'; -import { Session } from '@service/session/session'; -import { Observe } from '@platform/types/observe'; -import { plugins } from '@service/plugins'; - -import * as Parsers from '@platform/types/observe/parser/index'; - -const RENDERS: { - [key: string]: RenderReference; -} = { - [Parsers.Protocol.Dlt]: Dlt, - [Parsers.Protocol.SomeIp]: SomeIp, - [Parsers.Protocol.Text]: Text, -}; - -export async function getRender(observe: Observe): Promise | Error> { - const protocol = observe.parser.instance.alias(); - // Render options on plugins can't be static because they must be retrieved - // from the plugin itself. - if (protocol === Parsers.Protocol.Plugin) { - const config = observe.parser.as( - Parsers.Plugin.Configuration, - ); - - if (config === undefined) { - return new Error('No parser configurations for plugin.'); - } - - const pluginPath = config.configuration.plugin_path; - const parser = plugins - .list() - .preload() - .find((p) => p.info.wasm_file_path === pluginPath); - - if (parser === undefined) { - return new Error("Selected parser plugin does'n exit"); - } - - return new Plugin(parser); - } - - const Ref = RENDERS[protocol]; - return Ref === undefined ? new Error(`No render has been found for "${protocol}"`) : new Ref(); -} - -export function getLinkedProtocol(smth: Session | Render): Parsers.Protocol | Error { - return smth instanceof Session ? smth.render.protocol() : smth.protocol(); -} - -export function isRenderMatch(session: Session, render: Render): boolean | Error { - const assigned = getLinkedProtocol(session); - return assigned === render.protocol(); -} diff --git a/application/client/src/app/service/actions.ts b/application/client/src/app/service/actions.ts deleted file mode 100644 index 3fc33786c5..0000000000 --- a/application/client/src/app/service/actions.ts +++ /dev/null @@ -1,420 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { services } from '@register/services'; -import { api } from '@service/api'; -import { CancelablePromise } from '@platform/env/promise'; -import { FileType } from '@platform/types/observe/types/file'; -import { Protocol } from '@platform/types/observe/parser'; -import { Source } from '@platform/types/observe/origin/stream/index'; - -import * as Requests from '@platform/ipc/request'; -import * as handlers from '@service/actions/index'; - -@SetupService(services['actions']) -export class Service extends Implementation { - public override ready(): Promise { - this.register( - api - .transport() - .respondent( - this.getName(), - Requests.Actions.OpenFile.Request, - ( - request: Requests.Actions.OpenFile.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - (() => { - switch (request.type) { - case FileType.Text: - return new handlers.FileText.Action().apply(); - case FileType.Binary: - return new handlers.FileDlt.Action().apply(); - case FileType.PcapNG: - return new handlers.FilePcap.Action().apply(); - case FileType.ParserPlugin: - return new handlers.FileParserPlugin.Action().apply(); - default: - return new handlers.FileAny.Action().apply(); - } - })() - .then(() => - resolve( - new Requests.Actions.OpenFile.Response({ - error: undefined, - }), - ), - ) - .catch((err: Error) => { - resolve( - new Requests.Actions.OpenFile.Response({ - error: err.message, - }), - ); - }); - }); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Actions.OpenFolder.Request, - ( - request: Requests.Actions.OpenFolder.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - (() => { - switch (request.type) { - case FileType.Text: - return new handlers.FolderText.Action().apply(); - case FileType.Binary: - return new handlers.FolderDlt.Action().apply(); - case FileType.PcapNG: - return new handlers.FolderPcap.Action().apply(); - case FileType.ParserPlugin: - return new handlers.FolderParserPlugin.Action().apply(); - default: - return Promise.reject( - new Error(`Unsupported format: ${request.type}`), - ); - } - })() - .then(() => - resolve( - new Requests.Actions.OpenFolder.Response({ - error: undefined, - }), - ), - ) - .catch((err: Error) => { - resolve( - new Requests.Actions.OpenFolder.Response({ - error: err.message, - }), - ); - }); - }); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Actions.Stream.Request, - ( - request: Requests.Actions.Stream.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - (() => { - switch (request.protocol) { - case Protocol.Text: - switch (request.source) { - case undefined: - case Source.Process: - return new handlers.StdoutText.Action().apply(); - case Source.Serial: - return new handlers.SerialText.Action().apply(); - default: - return Promise.reject( - new Error( - `Unsupported transport for Text: ${request.source}`, - ), - ); - } - case Protocol.Dlt: - switch (request.source) { - case undefined: - case Source.UDP: - return new handlers.UdpDlt.Action().apply(); - case Source.TCP: - return new handlers.TcpDlt.Action().apply(); - default: - return Promise.reject( - new Error( - `Unsupported transport for DLT: ${request.source}`, - ), - ); - } - case Protocol.Plugin: { - switch (request.source) { - case undefined: - case Source.Process: - return new handlers.StdoutPlugin.Action().apply(); - case Source.Serial: - return new handlers.SerialParserPlugin.Action().apply(); - case Source.UDP: - return new handlers.UdpParserPlugin.Action().apply(); - case Source.TCP: - return new handlers.TcpParserPlugin.Action().apply(); - default: - return Promise.reject( - new Error( - `Unsupported transport for Plugins: ${request.source}`, - ), - ); - } - } - default: - return Promise.reject( - new Error(`Unsupported format: ${request.protocol}`), - ); - } - })() - .then(() => - resolve( - new Requests.Actions.Stream.Response({ - error: undefined, - }), - ), - ) - .catch((err: Error) => { - resolve( - new Requests.Actions.Stream.Response({ - error: err.message, - }), - ); - }); - }); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Actions.About.Request, - ( - _request: Requests.Actions.About.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - new handlers.About.Action() - .apply() - .catch((err: Error) => { - this.log().error(`Fail to call About action: ${err.message}`); - }) - .finally(() => { - resolve(new Requests.Actions.About.Response()); - }); - }); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Actions.ThemeDark.Request, - ( - _request: Requests.Actions.ThemeDark.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - new handlers.ThemeDark.Action() - .apply() - .catch((err: Error) => { - this.log().error( - `Fail to call ThemeDark action: ${err.message}`, - ); - }) - .finally(() => { - resolve(new Requests.Actions.ThemeDark.Response()); - }); - }); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Actions.ThemeLight.Request, - ( - _request: Requests.Actions.ThemeLight.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - new handlers.ThemeLight.Action() - .apply() - .catch((err: Error) => { - this.log().error( - `Fail to call ThemeLight action: ${err.message}`, - ); - }) - .finally(() => { - resolve(new Requests.Actions.ThemeLight.Response()); - }); - }); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Actions.JumpTo.Request, - ( - _request: Requests.Actions.JumpTo.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - new handlers.JumpTo.Action() - .apply() - .catch((err: Error) => { - this.log().error(`Fail to call JumpTo action: ${err.message}`); - }) - .finally(() => { - resolve(new Requests.Actions.About.Response()); - }); - }); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Actions.FindInSearch.Request, - ( - _request: Requests.Actions.FindInSearch.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - new handlers.FindInSearch.Action() - .apply() - .catch((err: Error) => { - this.log().error( - `Fail to call FindInSearch action: ${err.message}`, - ); - }) - .finally(() => { - resolve(new Requests.Actions.About.Response()); - }); - }); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Actions.Updates.Request, - ( - _request: Requests.Actions.Updates.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - new handlers.Updates.Action() - .apply() - .catch((err: Error) => { - this.log().error(`Fail to call Updates action: ${err.message}`); - }) - .finally(() => { - resolve(new Requests.Actions.Updates.Response()); - }); - }); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Actions.Settings.Request, - ( - _request: Requests.Actions.Settings.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - new handlers.Settings.Action() - .apply() - .catch((err: Error) => { - this.log().error( - `Fail to call Settings action: ${err.message}`, - ); - }) - .finally(() => { - resolve(new Requests.Actions.Settings.Response()); - }); - }); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Actions.Help.Request, - ( - _request: Requests.Actions.Help.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - new handlers.Help.Action() - .apply() - .catch((err: Error) => { - this.log().error(`Fail to call Help action: ${err.message}`); - }) - .finally(() => { - resolve(new Requests.Actions.Help.Response()); - }); - }); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Actions.ExportSessionState.Request, - ( - _request: Requests.Actions.ExportSessionState.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - new handlers.ExportSession.Action() - .apply() - .catch((err: Error) => { - this.log().error( - `Fail to call ExportSessionState action: ${err.message}`, - ); - }) - .finally(() => { - resolve(new Requests.Actions.Help.Response()); - }); - }); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Actions.ImportSessionState.Request, - ( - _request: Requests.Actions.ImportSessionState.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - new handlers.ImportSession.Action() - .apply() - .catch((err: Error) => { - this.log().error( - `Fail to call ImportSessionState action: ${err.message}`, - ); - }) - .finally(() => { - resolve(new Requests.Actions.Help.Response()); - }); - }); - }, - ), - ); - this.register( - api - .transport() - .respondent( - this.getName(), - Requests.Actions.PluginsManager.Request, - ( - _request: Requests.Actions.PluginsManager.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - new handlers.PluginsManager.Action() - .apply() - .catch((err: Error) => { - this.log().error( - `Fail to call plugins manager action: ${err.message}`, - ); - }) - .finally(() => { - resolve(new Requests.Actions.PluginsManager.Response()); - }); - }); - }, - ), - ); - return Promise.resolve(); - } -} -export interface Service extends Interface {} -export const actions = register(new Service()); diff --git a/application/client/src/app/service/actions/about.ts b/application/client/src/app/service/actions/about.ts deleted file mode 100644 index 740744cd53..0000000000 --- a/application/client/src/app/service/actions/about.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Base } from './action'; -import { popup, Vertical, Horizontal } from '@ui/service/popup'; -import { components } from '@env/decorators/initial'; - -export const ACTION_UUID = 'open_about_dialog'; - -export class Action extends Base { - public group(): number { - return 4; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'About'; - } - - public async apply(): Promise { - popup.open({ - component: { - factory: components.get('app-dialogs-about'), - inputs: {}, - }, - position: { - vertical: Vertical.center, - horizontal: Horizontal.center, - }, - closeOnKey: '*', - uuid: 'About', - }); - } -} diff --git a/application/client/src/app/service/actions/action.ts b/application/client/src/app/service/actions/action.ts deleted file mode 100644 index ad029d760a..0000000000 --- a/application/client/src/app/service/actions/action.ts +++ /dev/null @@ -1,6 +0,0 @@ -export abstract class Base { - abstract uuid(): string; - abstract caption(): string; - abstract apply(): Promise; - abstract group(): number; -} diff --git a/application/client/src/app/service/actions/exit.ts b/application/client/src/app/service/actions/exit.ts deleted file mode 100644 index 711a218c75..0000000000 --- a/application/client/src/app/service/actions/exit.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Base } from './action'; -import { lockers, Locker } from '@ui/service/lockers'; - -import * as Requests from '@platform/ipc/request/index'; - -export const ACTION_UUID = 'exit_from_application'; - -export class Action extends Base { - public group(): number { - return 4; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Exit'; - } - - public async apply(): Promise { - const message = lockers.lock(new Locker(true, `Closing...`), { - closable: false, - }); - Requests.IpcRequest.send(Requests.System.Exit.Response, new Requests.System.Exit.Request()) - .then((_response) => { - message.popup.close(); - }) - .catch((err: Error) => { - lockers.lock(new Locker(false, err.message), { - closable: true, - }); - }); - } -} diff --git a/application/client/src/app/service/actions/export.session.state.ts b/application/client/src/app/service/actions/export.session.state.ts deleted file mode 100644 index 2a0ab1ba6c..0000000000 --- a/application/client/src/app/service/actions/export.session.state.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; -import { bridge } from '@service/bridge'; -import { Notification, notifications } from '@ui/service/notifications'; - -export const ACTION_UUID = 'export_session_state'; - -export class Action extends Base { - public group(): number { - return 4; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Export Current Filters'; - } - - public async apply(): Promise { - const active = session.active().session(); - if (active === undefined) { - return; - } - const snap = active.snap().get(); - const filename = await bridge.files().select.save('state', undefined); - if (filename === undefined) { - return Promise.resolve(); - } - bridge - .files() - .write(filename, snap, true) - .catch((err: Error) => { - notifications.notify( - new Notification({ - message: `Export failed with: ${err.message}`, - actions: [], - }), - ); - }); - } -} diff --git a/application/client/src/app/service/actions/file.any.ts b/application/client/src/app/service/actions/file.any.ts deleted file mode 100644 index 73d8dee9d5..0000000000 --- a/application/client/src/app/service/actions/file.any.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; -import { File } from '@platform/types/files'; -import { FileType } from '@platform/types/observe/types/file'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_any_file'; - -export class Action extends Base { - public group(): number { - return 1; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Open File(s)'; - } - - public async apply(): Promise { - const files = await bridge.files().select.any(); - if (files.length === 0) { - return Promise.resolve(); - } - if (files.length > 1) { - this.multiple(files); - return Promise.resolve(); - } else { - return this.from(files[0]); - } - } - - public from(file: File): void { - switch (file.type) { - case FileType.Binary: - case FileType.PcapNG: - case FileType.PcapLegacy: - session - .initialize() - .configure( - new Factory.File().type(file.type).file(file.filename).asDlt().get(), - ); - break; - case FileType.Text: - session - .initialize() - .observe( - new Factory.File() - .type(Factory.FileType.Text) - .file(file.filename) - .asText() - .get(), - ); - break; - case FileType.ParserPlugin: - session - .initialize() - .observe( - new Factory.File() - .type(Factory.FileType.ParserPlugin) - .file(file.filename) - .asParserPlugin() - .get(), - ); - break; - } - } - - public multiple(files: File[]) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } -} diff --git a/application/client/src/app/service/actions/file.dlt.ts b/application/client/src/app/service/actions/file.dlt.ts deleted file mode 100644 index fcea279e44..0000000000 --- a/application/client/src/app/service/actions/file.dlt.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_dlt_file'; - -export class Action extends Base { - public group(): number { - return 0; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Open DLT File'; - } - - public async apply(): Promise { - const files = await bridge.files().select.dlt(); - if (files.length === 0) { - return Promise.resolve(); - } - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } else { - session - .initialize() - .configure( - new Factory.File().type(files[0].type).file(files[0].filename).asDlt().get(), - ); - } - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/file.parserPlugin.ts b/application/client/src/app/service/actions/file.parserPlugin.ts deleted file mode 100644 index 527ce7af84..0000000000 --- a/application/client/src/app/service/actions/file.parserPlugin.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_file_parser_plugins'; - -export class Action extends Base { - public override group(): number { - return 0; - } - - public override uuid(): string { - return ACTION_UUID; - } - - public override caption(): string { - return 'Open file with parser plugins'; - } - - public override async apply(): Promise { - const files = await bridge.files().select.parserPlugin(); - if (files.length === 0) { - return Promise.resolve(); - } - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } else { - session - .initialize() - .configure( - new Factory.File() - .type(files[0].type) - .file(files[0].filename) - .asParserPlugin() - .get(), - ); - } - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/file.pcap.ts b/application/client/src/app/service/actions/file.pcap.ts deleted file mode 100644 index 6cc89148de..0000000000 --- a/application/client/src/app/service/actions/file.pcap.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_pcap_legacy_file'; - -export class Action extends Base { - public group(): number { - return 0; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Open Pcap File'; - } - - public async apply(): Promise { - const files = await bridge.files().select.pcap(); - if (files.length === 0) { - return Promise.resolve(); - } - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } else { - session - .initialize() - .configure(new Factory.File().type(files[0].type).file(files[0].filename).get()); - } - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/file.pcapng.ts b/application/client/src/app/service/actions/file.pcapng.ts deleted file mode 100644 index d98dfa224a..0000000000 --- a/application/client/src/app/service/actions/file.pcapng.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_pcap_file'; - -export class Action extends Base { - public group(): number { - return 0; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Open PcapNG File'; - } - - public async apply(): Promise { - const files = await bridge.files().select.pcapng(); - if (files.length === 0) { - return Promise.resolve(); - } - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } else { - session - .initialize() - .configure(new Factory.File().type(files[0].type).file(files[0].filename).get()); - } - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/file.plugins.ts b/application/client/src/app/service/actions/file.plugins.ts deleted file mode 100644 index 527ce7af84..0000000000 --- a/application/client/src/app/service/actions/file.plugins.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_file_parser_plugins'; - -export class Action extends Base { - public override group(): number { - return 0; - } - - public override uuid(): string { - return ACTION_UUID; - } - - public override caption(): string { - return 'Open file with parser plugins'; - } - - public override async apply(): Promise { - const files = await bridge.files().select.parserPlugin(); - if (files.length === 0) { - return Promise.resolve(); - } - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } else { - session - .initialize() - .configure( - new Factory.File() - .type(files[0].type) - .file(files[0].filename) - .asParserPlugin() - .get(), - ); - } - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/file.text.ts b/application/client/src/app/service/actions/file.text.ts deleted file mode 100644 index 5517ab5dcb..0000000000 --- a/application/client/src/app/service/actions/file.text.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_text_file'; - -export class Action extends Base { - public group(): number { - return 0; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Open Text File'; - } - - public async apply(): Promise { - const files = await bridge.files().select.text(); - if (files.length === 0) { - return Promise.resolve(); - } - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } else { - session.initialize().observe(new Factory.File().type(files[0].type).file(files[0].filename).asText().get()); - } - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/find.ts b/application/client/src/app/service/actions/find.ts deleted file mode 100644 index b75359d940..0000000000 --- a/application/client/src/app/service/actions/find.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; - -export const ACTION_UUID = 'open_find_in_search_dialog'; - -export class Action extends Base { - public group(): number { - return 4; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'FindInSearch'; - } - - public async apply(): Promise { - const active = session.active().session(); - if (active === undefined) { - return; - } - active.search.state().nested().toggle(); - } -} diff --git a/application/client/src/app/service/actions/folder.any.ts b/application/client/src/app/service/actions/folder.any.ts deleted file mode 100644 index 9b2cf7cb10..0000000000 --- a/application/client/src/app/service/actions/folder.any.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; -import { FileType } from '@platform/types/observe/types/file'; -import { notifications, Notification } from '@ui/service/notifications'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_any_folder'; - -export class Action extends Base { - public group(): number { - return 1; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Open Folder(s)'; - } - - public async apply(): Promise { - const files = await bridge.folders().any(); - if (files.length === 0) { - notifications.notify( - new Notification({ - message: 'No files has been found', - actions: [], - }), - ); - return Promise.resolve(); - } - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } else { - switch (files[0].type) { - case FileType.Binary: - case FileType.PcapNG: - case FileType.PcapLegacy: - session - .initialize() - .configure( - new Factory.File() - .type(files[0].type) - .file(files[0].filename) - .asDlt() - .get(), - ); - break; - case FileType.Text: - session - .initialize() - .observe( - new Factory.File() - .type(files[0].type) - .file(files[0].filename) - .asText() - .get(), - ); - break; - case FileType.ParserPlugin: - session - .initialize() - .observe( - new Factory.File() - .type(files[0].type) - .file(files[0].filename) - .asParserPlugin() - .get(), - ); - break; - } - } - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/folder.dlt.ts b/application/client/src/app/service/actions/folder.dlt.ts deleted file mode 100644 index 313d34cd89..0000000000 --- a/application/client/src/app/service/actions/folder.dlt.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; -import { notifications, Notification } from '@ui/service/notifications'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_dlt_folder'; - -export class Action extends Base { - public group(): number { - return 0; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Select Folder with DLT'; - } - - public async apply(): Promise { - const files = await bridge.folders().dlt(); - if (files.length === 0) { - notifications.notify( - new Notification({ - message: 'No files has been found', - actions: [], - }), - ); - return Promise.resolve(); - } - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - return Promise.resolve(); - } else { - session - .initialize() - .configure( - new Factory.File().type(files[0].type).file(files[0].filename).asDlt().get(), - ); - } - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/folder.parserPlugin.ts b/application/client/src/app/service/actions/folder.parserPlugin.ts deleted file mode 100644 index afa2fbaedc..0000000000 --- a/application/client/src/app/service/actions/folder.parserPlugin.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { notifications, Notification } from '@ui/service/notifications'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_folder_parser_plugins'; - -export class Action extends Base { - public override group(): number { - return 0; - } - - public override uuid(): string { - return ACTION_UUID; - } - - public override caption(): string { - return 'Select Folder with Plugins'; - } - - public override async apply(): Promise { - const files = await bridge.folders().parserPlugin(); - if (files.length === 0) { - notifications.notify( - new Notification({ - message: 'No files has been found', - actions: [], - }), - ); - return Promise.resolve(); - } - - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } else { - session - .initialize() - .observe( - new Factory.File() - .type(files[0].type) - .file(files[0].filename) - .asParserPlugin() - .get(), - ); - } - - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/folder.pcap.ts b/application/client/src/app/service/actions/folder.pcap.ts deleted file mode 100644 index 2d909ffd14..0000000000 --- a/application/client/src/app/service/actions/folder.pcap.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; -import { notifications, Notification } from '@ui/service/notifications'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_pcap_legacy_folder'; - -export class Action extends Base { - public group(): number { - return 0; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Select Folder with Pcap'; - } - - public async apply(): Promise { - const files = await bridge.folders().pcap(); - if (files.length === 0) { - notifications.notify( - new Notification({ - message: 'No files has been found', - actions: [], - }), - ); - return Promise.resolve(); - } - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } else { - session - .initialize() - .configure(new Factory.File().type(files[0].type).file(files[0].filename).get()); - } - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/folder.pcapng.ts b/application/client/src/app/service/actions/folder.pcapng.ts deleted file mode 100644 index ce8ed13b81..0000000000 --- a/application/client/src/app/service/actions/folder.pcapng.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; -import { notifications, Notification } from '@ui/service/notifications'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_pcap_folder'; - -export class Action extends Base { - public group(): number { - return 0; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Select Folder with PcapNG'; - } - - public async apply(): Promise { - const files = await bridge.folders().pcapng(); - if (files.length === 0) { - notifications.notify( - new Notification({ - message: 'No files has been found', - actions: [], - }), - ); - return Promise.resolve(); - } - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } else { - session - .initialize() - .configure(new Factory.File().type(files[0].type).file(files[0].filename).get()); - } - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/folder.plugins.ts b/application/client/src/app/service/actions/folder.plugins.ts deleted file mode 100644 index afa2fbaedc..0000000000 --- a/application/client/src/app/service/actions/folder.plugins.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { notifications, Notification } from '@ui/service/notifications'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_folder_parser_plugins'; - -export class Action extends Base { - public override group(): number { - return 0; - } - - public override uuid(): string { - return ACTION_UUID; - } - - public override caption(): string { - return 'Select Folder with Plugins'; - } - - public override async apply(): Promise { - const files = await bridge.folders().parserPlugin(); - if (files.length === 0) { - notifications.notify( - new Notification({ - message: 'No files has been found', - actions: [], - }), - ); - return Promise.resolve(); - } - - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } else { - session - .initialize() - .observe( - new Factory.File() - .type(files[0].type) - .file(files[0].filename) - .asParserPlugin() - .get(), - ); - } - - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/folder.text.ts b/application/client/src/app/service/actions/folder.text.ts deleted file mode 100644 index c7b2b1245b..0000000000 --- a/application/client/src/app/service/actions/folder.text.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Base } from './action'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { TabSourceMultipleFiles } from '@ui/tabs/multiplefiles/component'; -import { notifications, Notification } from '@ui/service/notifications'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'open_text_folder'; - -export class Action extends Base { - public group(): number { - return 0; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Select Folder to Concat'; - } - - public async apply(): Promise { - const files = await bridge.folders().text(); - if (files.length === 0) { - notifications.notify( - new Notification({ - message: 'No files has been found', - actions: [], - }), - ); - return Promise.resolve(); - } - if (files.length > 1) { - session.add().tab({ - name: 'Multiple Files', - active: true, - closable: true, - content: { - factory: TabSourceMultipleFiles, - inputs: { files: files }, - }, - }); - } else { - session - .initialize() - .observe( - new Factory.File().type(files[0].type).file(files[0].filename).asText().get(), - ); - } - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/help.ts b/application/client/src/app/service/actions/help.ts deleted file mode 100644 index 7e82cde1b4..0000000000 --- a/application/client/src/app/service/actions/help.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; -import { Help } from '@tabs/help/component'; - -export const ACTION_UUID = 'open_help_tab'; - -export class Action extends Base { - public group(): number { - return 4; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'About'; - } - - public async apply(): Promise { - session.add().tab({ - name: 'Documentation', - active: true, - closable: true, - content: { - factory: Help, - inputs: {}, - }, - uuid: this.uuid(), - }); - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/import.session.state.ts b/application/client/src/app/service/actions/import.session.state.ts deleted file mode 100644 index d54aad273c..0000000000 --- a/application/client/src/app/service/actions/import.session.state.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; -import { bridge } from '@service/bridge'; -import { Notification, notifications } from '@ui/service/notifications'; - -export const ACTION_UUID = 'import_session_state'; - -export class Action extends Base { - public group(): number { - return 4; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Import Filters'; - } - - public async apply(): Promise { - const active = session.active().session(); - if (active === undefined) { - return; - } - const files = await bridge.files().select.any(); - if (files.length !== 1) { - return Promise.resolve(); - } - bridge - .files() - .read(files[0].filename) - .then((content: string) => { - const err = active.snap().load(content); - if (err instanceof Error) { - return Promise.reject(err); - } - return undefined; - }) - .catch((err: Error) => { - notifications.notify( - new Notification({ - message: `Import failed with: ${err.message}`, - actions: [], - }), - ); - }); - } -} diff --git a/application/client/src/app/service/actions/index.ts b/application/client/src/app/service/actions/index.ts deleted file mode 100644 index d44640ea2d..0000000000 --- a/application/client/src/app/service/actions/index.ts +++ /dev/null @@ -1,109 +0,0 @@ -import * as FileDlt from './file.dlt'; -import * as FileText from './file.text'; -import * as FilePcap from './file.pcapng'; -import * as FilePcapLegacy from './file.pcap'; -import * as FileParserPlugin from './file.parserPlugin'; -import * as FileAny from './file.any'; -import * as FolderDlt from './folder.dlt'; -import * as FolderText from './folder.text'; -import * as FolderPcap from './folder.pcapng'; -import * as FolderPcapLegacy from './folder.pcap'; -import * as FolderParserPlugin from './folder.parserPlugin'; -import * as FolderAny from './folder.any'; -import * as UdpDlt from './udp.dlt'; -import * as UdpParserPlugin from './udp.parserPlugin'; -import * as TcpDlt from './tcp.dlt'; -import * as TcpParserPlugin from './tcp.parserPlugin'; -import * as SerialText from './serial.text'; -import * as SerialParserPlugin from './serial.parserPlugin'; -import * as StdoutText from './stdout.text'; -import * as About from './about'; -import * as JumpTo from './jumpto'; -import * as FindInSearch from './find'; -import * as Updates from './updates'; -import * as Settings from './settings'; -import * as Exit from './exit'; -import * as Help from './help'; -import * as ExportSession from './export.session.state'; -import * as ImportSession from './import.session.state'; -import * as ThemeDark from './theme.dark'; -import * as ThemeLight from './theme.light'; -import * as PluginsManager from './plugins_manager'; -import * as StdoutPlugin from './stdout.plugin'; - -import { Base } from './action'; - -export * as FileDlt from './file.dlt'; -export * as FileText from './file.text'; -export * as FilePcap from './file.pcapng'; -export * as FilePcapLegacy from './file.pcap'; -export * as FileParserPlugin from './file.parserPlugin'; -export * as FileAny from './file.any'; -export * as FolderDlt from './folder.dlt'; -export * as FolderText from './folder.text'; -export * as FolderPcap from './folder.pcapng'; -export * as FolderPcapLegacy from './folder.pcap'; -export * as FolderParserPlugin from './folder.parserPlugin'; -export * as FolderAny from './folder.any'; -export * as UdpDlt from './udp.dlt'; -export * as UdpParserPlugin from './udp.parserPlugin'; -export * as TcpDlt from './tcp.dlt'; -export * as TcpParserPlugin from './tcp.parserPlugin'; -export * as SerialText from './serial.text'; -export * as SerialParserPlugin from './serial.parserPlugin'; -export * as StdoutText from './stdout.text'; -export * as About from './about'; -export * as JumpTo from './jumpto'; -export * as FindInSearch from './find'; -export * as Updates from './updates'; -export * as Settings from './settings'; -export * as Exit from './exit'; -export * as Help from './help'; -export * as ExportSession from './export.session.state'; -export * as ImportSession from './import.session.state'; -export * as ThemeDark from './theme.dark'; -export * as ThemeLight from './theme.light'; -export * as PluginsManager from './plugins_manager'; -export * as StdoutPlugin from './stdout.plugin'; - -export { Base } from './action'; - -export const all = [ - [FileDlt.ACTION_UUID, FileDlt.Action], - [FileText.ACTION_UUID, FileText.Action], - [FilePcap.ACTION_UUID, FilePcap.Action], - [FilePcapLegacy.ACTION_UUID, FilePcapLegacy.Action], - [FileParserPlugin.ACTION_UUID, FileParserPlugin.Action], - [FileAny.ACTION_UUID, FileAny.Action], - [FolderDlt.ACTION_UUID, FolderDlt.Action], - [FolderText.ACTION_UUID, FolderText.Action], - [FolderPcap.ACTION_UUID, FolderPcap.Action], - [FolderPcapLegacy.ACTION_UUID, FolderPcapLegacy.Action], - [FolderParserPlugin.ACTION_UUID, FolderParserPlugin.Action], - [FolderAny.ACTION_UUID, FolderAny.Action], - [UdpDlt.ACTION_UUID, UdpDlt.Action], - [UdpParserPlugin.ACTION_UUID, UdpParserPlugin.Action], - [TcpDlt.ACTION_UUID, TcpDlt.Action], - [TcpParserPlugin.ACTION_UUID, TcpParserPlugin.Action], - [SerialText.ACTION_UUID, SerialText.Action], - [SerialParserPlugin.ACTION_UUID, SerialParserPlugin.Action], - [StdoutText.ACTION_UUID, StdoutText.Action], - [About.ACTION_UUID, About.Action], - [JumpTo.ACTION_UUID, JumpTo.Action], - [FindInSearch.ACTION_UUID, FindInSearch.Action], - [Updates.ACTION_UUID, Updates.Action], - [Settings.ACTION_UUID, Settings.Action], - [Help.ACTION_UUID, Help.Action], - [Exit.ACTION_UUID, Exit.Action], - [ExportSession.ACTION_UUID, ExportSession.Action], - [ImportSession.ACTION_UUID, ImportSession.Action], - [ThemeDark.ACTION_UUID, ThemeDark.Action], - [ThemeLight.ACTION_UUID, ThemeLight.Action], - [PluginsManager.ACTION_UUID, PluginsManager.Action], - [StdoutPlugin.ACTION_UUID, StdoutPlugin.Action], -]; - -export function getActionByUuid(uuid: string): Base | undefined { - const action = all.find((d) => d[0] === uuid); - return action === undefined ? undefined : new (action[1] as { new (): Base })(); -} diff --git a/application/client/src/app/service/actions/jumpto.ts b/application/client/src/app/service/actions/jumpto.ts deleted file mode 100644 index 7c3835be90..0000000000 --- a/application/client/src/app/service/actions/jumpto.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Base } from './action'; -import { popup, Vertical, Horizontal } from '@ui/service/popup'; -import { components } from '@env/decorators/initial'; -import { session } from '@service/session'; - -export const ACTION_UUID = 'open_jumpto_dialog'; - -export class Action extends Base { - public group(): number { - return 4; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'JumpTo'; - } - - public async apply(): Promise { - if (session.active().session() === undefined) { - return; - } - popup.open({ - component: { - factory: components.get('app-dialogs-jumpto'), - inputs: {}, - }, - position: { - vertical: Vertical.top, - horizontal: Horizontal.center, - }, - closeOnKey: 'Escape', - width: 350, - uuid: 'Ctrl + G', - blur: false, - }); - } -} diff --git a/application/client/src/app/service/actions/plugins_manager.ts b/application/client/src/app/service/actions/plugins_manager.ts deleted file mode 100644 index 27dbb832f8..0000000000 --- a/application/client/src/app/service/actions/plugins_manager.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; -import { PluginsManager } from '@tabs/plugins/component'; - -export const ACTION_UUID = 'open_plugins_manager_tab'; - -export class Action extends Base { - override uuid(): string { - return ACTION_UUID; - } - override caption(): string { - return 'Plugins Manager'; - } - override group(): number { - return 0; - } - - override apply(): Promise { - session.add().tab({ - name: 'Plugins Manager', - active: true, - closable: true, - content: { - factory: PluginsManager, - inputs: {}, - }, - uuid: this.uuid(), - }); - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/serial.parserPlugin.ts b/application/client/src/app/service/actions/serial.parserPlugin.ts deleted file mode 100644 index 2035e76b6d..0000000000 --- a/application/client/src/app/service/actions/serial.parserPlugin.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'stream_parser_plugin_on_serial'; - -export class Action extends Base { - public group(): number { - return 3; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Plain text on parser plugin'; - } - - public async apply(): Promise { - session.initialize().configure(new Factory.Stream().asParserPlugin().serial().get()); - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/serial.text.ts b/application/client/src/app/service/actions/serial.text.ts deleted file mode 100644 index a956150c14..0000000000 --- a/application/client/src/app/service/actions/serial.text.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'stream_text_on_serial'; - -export class Action extends Base { - public group(): number { - return 3; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Plain text on Serial Port'; - } - - public async apply(): Promise { - session.initialize().configure(new Factory.Stream().asText().serial().get()); - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/settings.ts b/application/client/src/app/service/actions/settings.ts deleted file mode 100644 index fb20422908..0000000000 --- a/application/client/src/app/service/actions/settings.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; -import { Settings } from '@tabs/settings/component'; - -export const ACTION_UUID = 'open_settings_tab'; - -export class Action extends Base { - public group(): number { - return 0; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Settings'; - } - - public async apply(): Promise { - session.add().tab({ - name: 'Settings', - active: true, - closable: true, - content: { - factory: Settings, - inputs: {}, - }, - uuid: this.uuid(), - }); - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/stdout.plugin.ts b/application/client/src/app/service/actions/stdout.plugin.ts deleted file mode 100644 index 4b43679912..0000000000 --- a/application/client/src/app/service/actions/stdout.plugin.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'stream_text_on_plugin'; - -export class Action extends Base { - public override group(): number { - return 3; - } - - public override uuid(): string { - return ACTION_UUID; - } - public override caption(): string { - return 'Execute command with plugins'; - } - public override apply(): Promise { - session.initialize().configure(new Factory.Stream().process().asParserPlugin().get()); - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/stdout.text.ts b/application/client/src/app/service/actions/stdout.text.ts deleted file mode 100644 index b1e31c4c0b..0000000000 --- a/application/client/src/app/service/actions/stdout.text.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'stream_text_on_stdout'; - -export class Action extends Base { - public group(): number { - return 3; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Execute command'; - } - - public async apply(): Promise { - session.initialize().configure(new Factory.Stream().asText().process().get()); - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/storage.ts b/application/client/src/app/service/actions/storage.ts deleted file mode 100644 index 999bc74807..0000000000 --- a/application/client/src/app/service/actions/storage.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { EntryConvertable, Entry } from '@platform/types/storage/entry'; -import { Subject } from '@platform/env/subscription'; -import { error } from '@platform/log/utils'; -import { bridge } from '@service/bridge'; -import { getActionByUuid, Base } from './index'; - -import * as obj from '@platform/env/obj'; - -export class Storage extends EntryConvertable { - static STORAGE_KEY = 'pinned_actions'; - static ENTITY_UUID = 'actions'; - - public pinned: string[] = []; - public updated: Subject = new Subject(); - - public destroy() { - this.updated.destroy(); - } - - public isPinned(uuid: string): boolean { - return this.pinned.includes(uuid); - } - - public get(): Base[] { - return this.pinned - .map((uuid) => getActionByUuid(uuid)) - .filter((i) => i !== undefined) as Base[]; - } - - public toggle(uuid: string) { - const index = this.pinned.indexOf(uuid); - if (index === -1) { - this.pinned.push(uuid); - } else { - this.pinned.splice(index, 1); - } - this.save(); - this.updated.emit(); - } - - public load() { - bridge - .entries({ key: Storage.STORAGE_KEY }) - .get() - .then((entry: Entry[]) => { - if (entry.length !== 1) { - return; - } - const error = this.entry().from(entry[0]); - if (error instanceof Error) { - console.error(error); - } else { - this.updated.emit(); - } - }) - .catch((err: Error) => { - console.error(err); - }); - } - - public save() { - bridge - .entries({ key: Storage.STORAGE_KEY }) - .overwrite([this.entry().to()]) - .catch((err: Error) => { - console.error(err); - }); - } - - public entry(): { - to(): Entry; - from(entry: Entry): Error | undefined; - hash(): string; - uuid(): string; - updated(): Subject | undefined; - } { - return { - to: (): Entry => { - return { - uuid: Storage.ENTITY_UUID, - content: JSON.stringify({ - value: this.pinned, - used: 0, - }), - }; - }, - from: (entry: Entry): Error | undefined => { - try { - const def: { - value: string; - used: number; - } = JSON.parse(entry.content); - this.pinned = obj.getAsArray(def, 'value'); - } catch (e) { - return new Error(error(e)); - } - return undefined; - }, - hash: (): string => { - return this.pinned.join(','); - }, - uuid: (): string => { - return Storage.ENTITY_UUID; - }, - updated: (): undefined => { - return undefined; - }, - }; - } -} diff --git a/application/client/src/app/service/actions/tcp.dlt.ts b/application/client/src/app/service/actions/tcp.dlt.ts deleted file mode 100644 index 24ff06a942..0000000000 --- a/application/client/src/app/service/actions/tcp.dlt.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'stream_dlt_on_tcp'; - -export class Action extends Base { - public group(): number { - return 3; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'DLT on TCP'; - } - - public async apply(): Promise { - session.initialize().configure(new Factory.Stream().tcp().asDlt().get()); - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/tcp.parserPlugin.ts b/application/client/src/app/service/actions/tcp.parserPlugin.ts deleted file mode 100644 index b46f13412c..0000000000 --- a/application/client/src/app/service/actions/tcp.parserPlugin.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'stream_parser_plugin_on_tcp'; - -export class Action extends Base { - public group(): number { - return 3; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Parser plugin on TCP'; - } - - public async apply(): Promise { - session.initialize().configure(new Factory.Stream().tcp().asParserPlugin().get()); - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/theme.dark.ts b/application/client/src/app/service/actions/theme.dark.ts deleted file mode 100644 index b129d46014..0000000000 --- a/application/client/src/app/service/actions/theme.dark.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Base } from './action'; -import { styles } from '@ui/service/styles'; - -export const ACTION_UUID = 'switch_to_dark_theme'; - -export class Action extends Base { - public group(): number { - return 4; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Dark Theme'; - } - - public async apply(): Promise { - styles.theme().dark(); - } -} diff --git a/application/client/src/app/service/actions/theme.light.ts b/application/client/src/app/service/actions/theme.light.ts deleted file mode 100644 index 456115c967..0000000000 --- a/application/client/src/app/service/actions/theme.light.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Base } from './action'; -import { styles } from '@ui/service/styles'; - -export const ACTION_UUID = 'switch_to_light_theme'; - -export class Action extends Base { - public group(): number { - return 4; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Light Theme'; - } - - public async apply(): Promise { - styles.theme().light(); - } -} diff --git a/application/client/src/app/service/actions/udp.dlt.ts b/application/client/src/app/service/actions/udp.dlt.ts deleted file mode 100644 index a62a086c3b..0000000000 --- a/application/client/src/app/service/actions/udp.dlt.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'stream_dlt_on_udp'; - -export class Action extends Base { - public group(): number { - return 3; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'DLT on UDP'; - } - - public async apply(): Promise { - session.initialize().configure(new Factory.Stream().udp().asDlt().get()); - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/udp.parserPlugin.ts b/application/client/src/app/service/actions/udp.parserPlugin.ts deleted file mode 100644 index 44f0faba6b..0000000000 --- a/application/client/src/app/service/actions/udp.parserPlugin.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Base } from './action'; -import { session } from '@service/session'; - -import * as Factory from '@platform/types/observe/factory'; - -export const ACTION_UUID = 'stream_parser_plugin_on_udp'; - -export class Action extends Base { - public group(): number { - return 3; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Parser Plugin on UDP'; - } - - public async apply(): Promise { - session.initialize().configure(new Factory.Stream().udp().asParserPlugin().get()); - return Promise.resolve(); - } -} diff --git a/application/client/src/app/service/actions/updates.ts b/application/client/src/app/service/actions/updates.ts deleted file mode 100644 index ed83b69906..0000000000 --- a/application/client/src/app/service/actions/updates.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Base } from './action'; -import { lockers, Locker } from '@ui/service/lockers'; - -import * as Requests from '@platform/ipc/request/index'; - -export const ACTION_UUID = 'check_updates_dialog'; - -export class Action extends Base { - public group(): number { - return 4; - } - public uuid(): string { - return ACTION_UUID; - } - - public caption(): string { - return 'Check for Updates'; - } - - public async apply(): Promise { - const message = lockers.lock(new Locker(true, `Checking for updates...`), { - closable: false, - }); - Requests.IpcRequest.send( - Requests.System.CheckUpdates.Response, - new Requests.System.CheckUpdates.Request(), - ) - .then((response) => { - message.popup.close(); - lockers.lock( - new Locker( - false, - response.report !== undefined ? response.report : response.error, - ), - { - closable: true, - }, - ); - }) - .catch((err: Error) => { - lockers.lock(new Locker(false, err.message), { - closable: true, - }); - }); - } -} diff --git a/application/client/src/app/service/api.ts b/application/client/src/app/service/api.ts deleted file mode 100644 index c73657489f..0000000000 --- a/application/client/src/app/service/api.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { Transport } from '@platform/ipc/transport/index'; -import { Implementation as ElectronTransport } from './api/transport/electron'; -import { services } from '@register/services'; -import { scope } from '@platform/env/scope'; -import { Logger } from '@env/logs/index'; - -@SetupService(services['api']) -export class Service extends Implementation { - private _transport: Transport = new ElectronTransport(); - - public override init(): Promise { - scope.setTransport(this._transport); - Logger.backend().allow(); - return Promise.resolve(); - } - - public override destroy(): Promise { - Logger.backend().disallow(); - this._transport.destroy(); - return Promise.resolve(); - } - - public transport(): Transport { - return this._transport; - } -} -export interface Service extends Interface {} -export const api = register(new Service()); diff --git a/application/client/src/app/service/api/transport/electron.ts b/application/client/src/app/service/api/transport/electron.ts deleted file mode 100644 index f33c988dc9..0000000000 --- a/application/client/src/app/service/api/transport/electron.ts +++ /dev/null @@ -1,516 +0,0 @@ -/** - * Provides the IPC transport implementation for duplex communication - * between the frontend and the Electron backend. - * - * This transport supports the following interaction modes: - * - Sending requests to the backend and awaiting a response. - * - Sending fire-and-forget events to the backend (without delivery confirmation). - * - Subscribing to events emitted by the backend. - * - Subscribing to requests initiated by the backend. - * - * @remarks - * Fire-and-forget events do not generate any acknowledgment - neither the client - * nor the backend confirms their receipt. However, the logging system is designed - * to detect and warn about the following cases: - * - The backend sends a request, but no corresponding request handler exists on the client. - * - The backend emits an event, but there are no listeners registered on the client. - * - Likewise, if the client sends events or requests without registered consumers on the backend. - * - * Since all event subscriptions and request handlers are registered during the application - * initialization phase, developers should carefully monitor these warnings in logs. Such messages - * may indicate: - * - An initialization order issue where some components are not yet ready when communication starts. - * - A partially completed refactoring in which obsolete events or requests are still being sent. - * - * All events, requests, and responses between the client and backend are defined in a central location: - * `application/platform/ipc`. To introduce a new message type, it must first be declared there. - * - * @module - * @internal - */ -import { - Transport, - EntityConstructor, - Respond, - ISignatureRequirement, - Package, - Packed, - Errors, -} from '@platform/ipc/transport/index'; -import { error } from '@platform/log/utils'; -import { Subject, Subscription } from '@platform/env/subscription'; -import { IPC, isAvailable } from '@module/ipc'; -import { Logger } from '@log/index'; -import { getNgZoneSafly } from '@ui/env/globals'; - -import * as events from '@platform/ipc/setup/channels'; - -// If some request takes more than LONG_REQUEST_ALERT (ms), -// warn message will be logged -const LONG_REQUEST_ALERT = 2000; - -/** - * Returns the implementation of the IPC transport or throws an error if it is not available. - * - * @remarks - * This error is considered critical and is treated as a client-side panic, - * since the application cannot function without a working IPC layer. - * This typically indicates a misconfigured or missing integration with the Electron backend. - * - * @throws {Error} Thrown if no IPC transport is found on the `window.electron` object. - * - * @returns {IPC} The IPC transport implementation. - * - * @internal - */ -function ipc(): IPC { - if (isAvailable()) { - return window.electron.ipc; - } else { - throw new Error(`No IPC transport has been found`); - } -} - -interface IEventDesc { - subject: Subject; - ref: EntityConstructor & ISignatureRequirement; -} - -interface PendingEntity { - resolver: (...args: any[]) => void; - rejector: (error: Error | Errors.RustNativeError) => void; - ref: EntityConstructor & ISignatureRequirement; - sent: number; -} - -/** - * IPC transport wrapper around the native Electron IPC interface. - * - * @remarks - * This class is responsible for: - * - Tracking pending request–response pairs using an internal queue. - * - Dispatching received messages to the appropriate subscribers. - * - Logging warnings about unhandled events or unmatched request handlers. - * - * It extends a base `Transport` class and serves as the main implementation - * for communication with the Electron backend in duplex mode. - * - * @internal - */ -export class Implementation extends Transport { - /** - * A registry of known event types and their metadata. - * Used to validate and route incoming messages. - */ - private _subjects: Map = new Map(); - - /** - * Internal logger instance scoped to this transport. - */ - private _log: Logger = new Logger('ElectronAPITransport'); - - /** - * Sequence number used to uniquely identify outgoing requests. - */ - private _sequence = 0; - - /** - * Tracks all pending requests waiting for responses. - * Maps sequence numbers to their associated state and handlers. - */ - private _requests: Map = new Map(); - - /** - * Handlers for backend-initiated requests. - * Each entry includes the owning module, a responder function, - * and a reference to the expected request signature. - */ - private _respondents: Map< - string, - { - owner: string; - respond: Respond; - ref: EntityConstructor & ISignatureRequirement; - } - > = new Map(); - - /** - * Indicates whether the transport has been destroyed. - * Once destroyed, no further communication is possible. - */ - private _destroyed: boolean = false; - - constructor() { - super(); - this._onHostEvent = this._onHostEvent.bind(this); - this._onHostRequest = this._onHostRequest.bind(this); - this._onHostResponse = this._onHostResponse.bind(this); - ipc().subscribe(events.HOST_EVENT_NAME, this._onHostEvent); - ipc().subscribe(events.HOST_REQUEST_NAME, this._onHostRequest); - ipc().subscribe(events.HOST_RESPONSE_NAME, this._onHostResponse); - } - - public destroy(): void { - ipc().unsubscribeAll(events.HOST_EVENT_NAME); - ipc().unsubscribeAll(events.HOST_REQUEST_NAME); - ipc().unsubscribeAll(events.HOST_RESPONSE_NAME); - this._requests.forEach((request) => { - request.rejector(new Error(`Rejected because transport is destroying`)); - }); - this._requests.clear(); - this._respondents.clear(); - } - - /** - * Sends a request to the Electron backend and waits for a corresponding response. - * - * @typeParam Request - The request type. Must implement a signature identifier. - * @typeParam Response - The expected response type. Must implement a signature identifier. - * - * @remarks - * This method initiates a typed request–response cycle between the frontend and the backend. - * It guarantees that the received response matches the expected response type by checking - * an internal signature defined by `ISignatureRequirement`. If a mismatched response is received, - * an error is thrown instead of resolving the promise. - * - * Note, however, that only the structural signature of the response is verified at this level. - * The semantic validity of the response payload is not enforced and must be handled in - * the corresponding implementation within `application/platform/ipc`. - * - * A timeout mechanism is not currently implemented, meaning unresolved requests - * may hang indefinitely if the backend fails to respond. - * - * @param request - The request payload object. Must carry an internal signature for validation. - * @param responseConstructorRef - The constructor of the expected response type, used to validate - * the incoming response against its declared structure. - * - * @returns A promise that resolves with the validated response or rejects with an error - * if the response is invalid, mismatched, or if the transport is already destroyed. - * - * @throws {Error} If the transport has already been destroyed before sending the request. - * - * @public - */ - public request( - request: Request & ISignatureRequirement, - responseConstructorRef: EntityConstructor & ISignatureRequirement, - ): Promise { - if (this._destroyed) { - return Promise.reject(new Error(`Transport is destroyed`)); - } - return new Promise((resolve, reject) => { - const pack = new Package(this._getSequence()).payload(request); - this._requests.set(pack.getSequence(), { - resolver: resolve, - rejector: reject, - ref: responseConstructorRef, - sent: Date.now(), - }); - ipc().send(events.RENDER_REQUEST_NAME, pack.packed()); - // TODO: add timeout - }); - } - - /** - * Registers a handler on the client side for a specific request type sent from the backend. - * - * @typeParam Request - The type of the request to handle. Must implement a signature identifier. - * @typeParam Response - The type of the response to return. Must implement a signature identifier. - * - * @remarks - * This method binds an incoming backend-initiated request to a handler (`respond`) provided by the client. - * The handler is responsible for producing and sending back a valid response of the expected type. - * - * Only one handler can be registered per unique request signature. Attempting to register a second handler - * for the same request type will result in an error, with diagnostic information about the current owner. - * - * The returned `Subscription` object allows the consumer to unregister the handler by calling `.destroy()`, - * which removes the association from the internal registry. - * - * @param owner - A human-readable identifier (e.g. module or service name) used for diagnostics and logging. - * @param request - The request constructor. Its signature is used to uniquely identify the handled request type. - * @param respond - The function that handles the request and returns a response. - * - * @returns A `Subscription` object that can be destroyed to remove the handler. - * - * @throws {Error} If a handler has already been registered for the same request signature. - * - * @public - */ - public respondent( - owner: string, - request: EntityConstructor & ISignatureRequirement, - respond: Respond, - ): Subscription { - const signature: string = request.getSignature(); - const respondent = this._respondents.get(signature); - if (respondent !== undefined) { - throw new Error( - `Respondent has been setup already for "${signature}". Owner: ${respondent.owner}`, - ); - } - this._respondents.set(signature, { - owner, - ref: request, - respond, - }); - return new Subscription(`${owner}:${signature}`, () => { - this._respondents.delete(signature); - }); - } - - /** - * Sends a fire-and-forget event (notification) from the client to the backend. - * - * @typeParam Notification - The type of the event to be sent. Must implement a signature identifier. - * - * @remarks - * This method emits an event to the Electron backend without expecting any response or acknowledgment. - * Delivery is not guaranteed - the client will not be informed whether the backend received or processed the event. - * - * However, if there are no listeners registered on the backend for the emitted event type, a warning will be logged. - * The log entry includes the event signature and diagnostic information to help identify misconfigured or outdated subscriptions. - * - * If the transport has already been destroyed, the method silently returns without sending anything. - * - * @param notification - The event payload to be sent. Must carry a unique signature for type identification. - * - * @returns void - * - * @public - */ - public notify(notification: Notification & ISignatureRequirement): void { - if (this._destroyed) { - return; - } - ipc().send( - events.RENDER_EVENT_NAME, - new Package(this._getSequence()).payload(notification).packed(), - ); - } - - /** - * Internal utility for testing purposes that emulates sending an event, request, or response - * from the backend to the client. - * - * @typeParam Entity - The type of the entity to emulate. Must implement a signature identifier. - * - * @remarks - * This method is intended exclusively for development and testing scenarios. - * It provides mechanisms to simulate backend-originated communication without requiring - * an actual backend process. This is useful for unit tests, mocking, or frontend-only development. - * - * Each returned method sends a synthetic message with the appropriate event name and payload format: - * - `event()` - simulates a backend event. - * - `request()` - simulates a backend-initiated request. - * - `response(sequence)` - simulates a response with a specified sequence ID. - * - * These emulations trigger the same internal dispatch logic as real backend messages. - * - * @param entity - The mock message entity to be sent. Must carry a valid signature for routing. - * - * @returns An object with methods to emulate: - * - `event()` - emit as if it's a backend event. - * - `request()` - emit as if it's a backend request. - * - `response(sequence)` - emit as if it's a response with a given sequence number. - * - * @internal - */ - public emulate(entity: Entity & ISignatureRequirement): { - event(): void; - request(): void; - response(sequence: number): void; - } { - return { - event: () => { - ipc().send( - events.HOST_EVENT_NAME, - new Package(this._getSequence()).payload(entity).packed(), - ); - }, - request: () => { - ipc().send( - events.HOST_REQUEST_NAME, - new Package(this._getSequence()).payload(entity).packed(), - ); - }, - response: (sequence: number) => { - ipc().send( - events.HOST_RESPONSE_NAME, - new Package(sequence).payload(entity).packed(), - ); - }, - }; - } - - /** - * Subscribes to an event emitted by the Electron backend. - * - * @typeParam Event - The expected type of the event payload. Must implement a signature identifier. - * - * @remarks - * This method allows the client to listen for a specific event type originating from the backend. - * If the subscription for the event does not exist yet, a new `Subject` is created and stored - * internally. All future messages with the same event name will be routed through this subject. - * - * The event name must be a non-empty string. An error will be thrown if this constraint is not met. - * - * The returned `Subject` can be used to register callbacks via `.subscribe(...)` and receive - * strongly typed event payloads as defined by the corresponding constructor. - * - * @param event - The name of the backend event to subscribe to. - * @param refEventConstructor - The constructor used to validate and typecast incoming event payloads. - * - * @returns A `Subject` instance used to receive event notifications of the specified type. - * - * @throws {Error} If the provided event name is not a valid non-empty string. - * - * @public - */ - public subscribe( - event: string, - refEventConstructor: EntityConstructor & ISignatureRequirement, - ): Subject { - if (typeof event !== 'string' || event.trim() === '') { - throw new Error(`Event name should be a not-empty string`); - } - let desc: IEventDesc | undefined = this._subjects.get(event); - if (desc === undefined) { - desc = { - subject: new Subject(), - ref: refEventConstructor, - }; - this._subjects.set(event, desc); - } - return desc.subject; - } - - private _getSequence(): number { - return this._sequence++; - } - - private _zone(handler: () => void) { - const ngZone = getNgZoneSafly(); - ngZone === undefined ? handler() : ngZone.run(handler); - } - - private _onHostEvent(_event: unknown, message: Packed) { - const pack = Package.from(message); - if (pack instanceof Error) { - this._log.error(`Fail to parse income event: ${pack.message}`); - return; - } - const signature = pack.getSignature(); - if (signature instanceof Error) { - this._log.error(`Has been gotten event, but signature cannot be detected`); - return; - } - const desc: IEventDesc | undefined = this._subjects.get(signature); - if (desc === undefined) { - this._log.warn(`Event ${signature} has been gotten, but no subscribers has been found`); - return; - } - const payload = pack.getPayload(desc.ref); - if (payload instanceof Error) { - this._log.error(`Error with processing event "${signature}": ${payload.message}`); - return; - } - this._log.verbose(`Event ${signature} has been gotten and successfully constructed.`); - this._zone(() => { - desc.subject.emit(payload); - }); - } - - private _onHostRequest(_event: unknown, message: Packed) { - const pack = Package.from(message); - if (pack instanceof Error) { - this._log.error(`Fail to parse income event: ${pack.message}`); - return; - } - const signature = pack.getSignature(); - if (signature instanceof Error) { - this._log.error(`Has been gotten event, but signature cannot be detected`); - return; - } - const respondent = this._respondents.get(signature); - if (respondent === undefined) { - this._log.error(`No respondent for "${signature}" has been setup`); - return; - } - const payload = pack.getPayload(respondent.ref); - if (payload instanceof Error) { - this._log.error( - `Error with processing host request "${signature}": ${payload.message}`, - ); - return; - } - this._log.verbose( - `Request ${signature} (seq: ${pack.getSequence()}) has been gotten and successfully constructed.`, - ); - this._zone(() => { - respondent - .respond(payload) - .then((response: ISignatureRequirement) => { - ipc().send( - events.RENDER_RESPONSE_NAME, - new Package(pack.getSequence()).payload(response).packed(), - ); - }) - .canceled(() => { - ipc().send( - events.RENDER_RESPONSE_NAME, - new Package(pack.getSequence()).abort().packed(), - ); - }) - .catch((err: Error) => { - ipc().send( - events.RENDER_RESPONSE_NAME, - new Package(pack.getSequence()).error(error(err)).packed(), - ); - }); - }); - } - - private _onHostResponse(_event: unknown, message: Packed) { - const pack = Package.from(message); - if (pack instanceof Error) { - this._log.error(`Fail to parse income event: ${pack.message}`); - return; - } - const desc = this._requests.get(pack.getSequence()); - const signature = pack.getSignature(); - if (desc === undefined) { - this._log.warn( - `Has been gotten response "${ - signature instanceof Error ? 'unknown' : signature - }"; sequence: ${pack.getSequence()}. But pending entity isn't found.`, - ); - return; - } - this._requests.delete(pack.getSequence()); - const error = pack.getError(); - if (error !== undefined) { - desc.rejector(error); - return; - } - if (signature instanceof Error) { - this._log.error(`Has been gotten response, but signature cannot be detected`); - return; - } - const payload = pack.getPayload(desc.ref); - if (payload instanceof Error) { - desc.rejector(payload); - return; - } - if (LONG_REQUEST_ALERT < Date.now() - desc.sent) { - this._log.warn( - `Request ${payload.getSignature()}(${pack.getSequence()}) took too long (${ - Date.now() - desc.sent - }ms)`, - ); - } - this._zone(() => { - desc.resolver(payload); - }); - } -} diff --git a/application/client/src/app/service/bridge.ts b/application/client/src/app/service/bridge.ts deleted file mode 100644 index a37cc3d95d..0000000000 --- a/application/client/src/app/service/bridge.ts +++ /dev/null @@ -1,793 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { services } from '@register/services'; -import { File, Entity, ParsedPath } from '@platform/types/files'; -import { FolderEntity } from '@platform/types/bindings'; -import { FileType } from '@platform/types/observe/types/file'; -import { DltStatisticInfo, ShellProfile } from '@platform/types/bindings'; -import { Entry } from '@platform/types/storage/entry'; -import { error } from '@platform/log/utils'; - -import * as Requests from '@platform/ipc/request/index'; - -@SetupService(services['bridge']) -export class Service extends Implementation { - protected cache: { - shells: ShellProfile[] | undefined; - files: Map; - checksums: Map; - } = { - shells: undefined, - files: new Map(), - checksums: new Map(), - }; - protected queue: { - shells: Array<{ - resolve: (profiles: ShellProfile[]) => void; - reject: (err: Error) => void; - }>; - } = { - shells: [], - }; - - public override ready(): Promise { - this.os() - .shells() - .then(() => { - this.log().debug(`List of shell's profiles is cached`); - }) - .catch((err: Error) => { - this.log().error(`Fail to get list of shell's profiles: ${err.message}`); - }); - return Promise.resolve(); - } - - public files(): { - getByPath(filenames: string[]): Promise; - getByPathWithCache(filenames: string[]): Promise; - ls(options: { - paths: string[]; - depth: number; - max: number; - include?: { files: boolean; folders: boolean }; - }): Promise<{ entities: FolderEntity[]; max: boolean }>; - stat(path: string): Promise; - checksum(filename: string): Promise; - isBinary(file: string): Promise; - checksumWithCache(filename: string): Promise; - exists(path: string): Promise; - name(path: string): Promise; - cp(src: string, dest: string): Promise; - copy(files: string[], dest: string): Promise; - read(filename: string): Promise; - write(filename: string, content: string, overwrite: true): Promise; - select: { - any(): Promise; - dlt(): Promise; - pcapng(): Promise; - pcap(): Promise; - text(): Promise; - parserPlugin(): Promise; - custom(ext: string): Promise; - save( - ext: string | undefined, - defaultFileName: string | undefined, - ): Promise; - }; - } { - const request = (target: FileType | undefined, ext?: string): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.File.Select.Response, - new Requests.File.Select.Request({ - target, - ext, - }), - ) - .then((response) => { - resolve(response.files); - }) - .catch(reject); - }); - }; - return { - getByPath: (filenames: string[]): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.File.File.Response, - new Requests.File.File.Request({ - filename: filenames, - }), - ) - .then((response) => { - resolve(response.files); - }) - .catch(reject); - }); - }, - getByPathWithCache: (filenames: string[]): Promise => { - return new Promise((resolve, reject) => { - const result: File[] = []; - const toBeRequested: string[] = []; - filenames.forEach((filename) => { - const file = this.cache.files.get(filename); - if (file === undefined) { - toBeRequested.push(filename); - } else { - result.push(file); - } - }); - - if (toBeRequested.length === 0) { - return resolve(result); - } - this.files() - .getByPath(toBeRequested) - .then((files) => { - result.push(...files); - files.forEach((file) => { - this.cache.files.set(file.filename, file); - }); - resolve(result); - }) - .catch(reject); - }); - }, - ls(options: { - paths: string[]; - depth: number; - max: number; - include?: { files: boolean; folders: boolean }; - }): Promise<{ entities: FolderEntity[]; max: boolean }> { - return Requests.IpcRequest.send( - Requests.Os.List.Response, - new Requests.Os.List.Request( - Object.assign( - { - include: - options.include !== undefined - ? options.include - : { files: true, folders: true }, - }, - options, - ), - ), - ); - }, - stat(path: string): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Os.AsFSEntity.Response, - new Requests.Os.AsFSEntity.Request({ - path, - }), - ) - .then((response) => { - if (response.entity !== undefined) { - resolve(response.entity); - } else if (response.error !== undefined) { - reject(new Error(response.error)); - } else { - reject(new Error(`Unknown error`)); - } - }) - .catch(reject); - }); - }, - exists: (path: string): Promise => { - return Requests.IpcRequest.send( - Requests.File.Exists.Response, - new Requests.File.Exists.Request({ - path, - }), - ).then((response) => { - return response.exists; - }); - }, - name: (path: string): Promise => { - return Requests.IpcRequest.send( - Requests.File.Name.Response, - new Requests.File.Name.Request({ - path, - }), - ).then((response) => { - return { - name: response.name, - parent: response.parent, - ext: response.ext, - filename: response.filename, - }; - }); - }, - checksum: (filename: string): Promise => { - return Requests.IpcRequest.send( - Requests.File.Checksum.Response, - new Requests.File.Checksum.Request({ - filename, - }), - ).then((response) => { - if (response.hash !== undefined) { - return response.hash; - } else if (response.error !== undefined) { - return Promise.reject(new Error(response.error)); - } else { - return Promise.reject(new Error(`Unknown error`)); - } - }); - }, - isBinary: (file: string): Promise => { - return Requests.IpcRequest.send( - Requests.File.IsBinary.Response, - new Requests.File.IsBinary.Request({ - file, - }), - ).then((response) => { - if (response.error !== undefined) { - return Promise.reject(new Error(response.error)); - } else { - return Promise.resolve(response.binary); - } - }); - }, - checksumWithCache: (filename: string): Promise => { - const checksum = this.cache.checksums.get(filename); - if (checksum !== undefined) { - return Promise.resolve(checksum); - } - return this.files() - .checksum(filename) - .then((checksum) => { - this.cache.checksums.set(filename, checksum); - return Promise.resolve(checksum); - }); - }, - cp: (src: string, dest: string): Promise => { - return Requests.IpcRequest.send( - Requests.File.CopyFile.Response, - new Requests.File.CopyFile.Request({ - src, - dest, - }), - ).then((response) => { - if (response.error !== undefined) { - return Promise.reject(new Error(response.error)); - } - return Promise.resolve(); - }); - }, - copy: (files: string[], dest: string): Promise => { - return Requests.IpcRequest.send( - Requests.File.Copy.Response, - new Requests.File.Copy.Request({ - files, - dest, - }), - ).then((response) => { - if (response.error !== undefined) { - return Promise.reject(new Error(response.error)); - } - return Promise.resolve(); - }); - }, - read: (filename: string): Promise => { - return Requests.IpcRequest.send( - Requests.File.Read.Response, - new Requests.File.Read.Request({ - file: filename, - }), - ).then((response) => { - if (response.error !== undefined) { - return Promise.reject(new Error(response.error)); - } - return Promise.resolve(response.text as string); - }); - }, - write: (filename: string, content: string, overwrite: true): Promise => { - return Requests.IpcRequest.send( - Requests.File.Write.Response, - new Requests.File.Write.Request({ filename, content, overwrite }), - ).then((response) => { - if (response.error !== undefined) { - return Promise.reject(new Error(response.error)); - } - return undefined; - }); - }, - select: { - any: (): Promise => { - return request(undefined); - }, - dlt: (): Promise => { - return request(FileType.Binary, 'dlt'); - }, - pcap: (): Promise => { - return request(FileType.PcapLegacy, `pcap`); - }, - pcapng: (): Promise => { - return request(FileType.PcapNG, `pcapng`); - }, - text: (): Promise => { - return request(FileType.Text, `txt,log,logs`); - }, - parserPlugin: (): Promise => { - return request(FileType.ParserPlugin, '*'); - }, - custom: (ext: string): Promise => { - return request(undefined, ext); - }, - save: ( - ext: string | undefined, - defaultFileName: string | undefined, - ): Promise => { - return Requests.IpcRequest.send( - Requests.File.Save.Response, - new Requests.File.Save.Request({ - ext, - defaultFileName, - }), - ).then((response) => { - if (response.error !== undefined) { - return Promise.reject(new Error(response.error)); - } - return response.filename; - }); - }, - }, - }; - } - - public folders(): { - any(): Promise; - dlt(): Promise; - pcapng(): Promise; - pcap(): Promise; - text(): Promise; - parserPlugin(): Promise; - custom(ext: string): Promise; - select(): Promise; - ls(paths: string[]): Promise; - delimiter(): Promise; - open(path: string): Promise; - } { - const request = (target: FileType | undefined, ext?: string): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Folder.Select.Response, - new Requests.Folder.Select.Request({ - target, - ext, - }), - ) - .then((response) => { - resolve(response.files); - }) - .catch(reject); - }); - }; - return { - any: (): Promise => { - return request(undefined, `dlt,pcapng,txt,log,logs`); - }, - dlt: (): Promise => { - return request(FileType.Binary, 'dlt'); - }, - pcapng: (): Promise => { - return request(FileType.PcapNG, `pcapng`); - }, - pcap: (): Promise => { - return request(FileType.PcapLegacy, `pcap`); - }, - text: (): Promise => { - return request(FileType.Text, `txt,log,logs`); - }, - parserPlugin: (): Promise => { - return request(FileType.ParserPlugin, '*'); - }, - custom: (ext: string): Promise => { - return request(undefined, ext); - }, - select: (): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Folder.Choose.Response, - new Requests.Folder.Choose.Request(), - ) - .then((response) => { - resolve(response.paths); - }) - .catch(reject); - }); - }, - ls: (paths: string[]): Promise => { - return this.files() - .ls({ paths, depth: 1, max: 500, include: { files: false, folders: true } }) - .then((response) => { - return response.entities.map((e) => e.fullname); - }); - }, - delimiter: (): Promise => { - return Requests.IpcRequest.send( - Requests.Folder.Delimiter.Response, - new Requests.Folder.Delimiter.Request(), - ).then((response) => { - return response.delimiter; - }); - }, - open: (path: string): Promise => { - return Requests.IpcRequest.send( - Requests.Folder.ShellOpen.Response, - new Requests.Folder.ShellOpen.Request({ path }), - ).then((_response) => { - return undefined; - }); - }, - }; - } - - public dlt(): { - stat(files: string[]): Promise; - } { - return { - stat: (files: string[]): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Dlt.Stat.Response, - new Requests.Dlt.Stat.Request({ - files, - }), - ) - .then((response) => { - resolve(response.stat); - }) - .catch(reject); - }); - }, - }; - } - - public storage(key: string): { - write(content: string): Promise; - read(): Promise; - } { - return { - write: (content: string): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Storage.Write.Response, - new Requests.Storage.Write.Request({ - key, - content, - }), - ) - .then(() => { - resolve(undefined); - }) - .catch(reject); - }); - }, - read: (): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Storage.Read.Response, - new Requests.Storage.Read.Request({ - key, - }), - ) - .then((response) => { - resolve(response.content); - }) - .catch(reject); - }); - }, - }; - } - - public ports(): { - list(): Promise; - } { - return { - list: (): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Serial.Ports.Response, - new Requests.Serial.Ports.Request(), - ) - .then((response) => { - resolve(response.ports); - }) - .catch(reject); - }); - }, - }; - } - - public browser(): { - url(url: string): Promise; - } { - return { - url: (url: string): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Actions.UrlInBrowser.Response, - new Requests.Actions.UrlInBrowser.Request({ url }), - ) - .then((_response) => { - resolve(); - }) - .catch(reject); - }); - }, - }; - } - - public cwd(): { - set(uuid: string | undefined, path: string): Promise; - get(uuid: string | undefined): Promise; - } { - return { - set: (uuid: string | undefined, path: string): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Cwd.Set.Response, - new Requests.Cwd.Set.Request({ - uuid, - cwd: path, - }), - ) - .then((response) => { - if (response.error !== undefined) { - return reject(new Error(response.error)); - } - resolve(undefined); - }) - .catch(reject); - }); - }, - get: (uuid: string | undefined): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Cwd.Get.Response, - new Requests.Cwd.Get.Request({ - uuid, - }), - ) - .then((response) => { - resolve(response.cwd); - }) - .catch(reject); - }); - }, - }; - } - - public os(): { - homedir(): Promise; - shells(): Promise; - } { - return { - homedir: (): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Os.HomeDir.Response, - new Requests.Os.HomeDir.Request(), - ) - .then((response) => { - resolve(response.path); - }) - .catch(reject); - }); - }, - shells: (): Promise => { - return new Promise((resolve, reject) => { - if (this.cache.shells !== undefined) { - resolve(this.cache.shells); - } else { - this.queue.shells.push({ resolve, reject }); - this.queue.shells.length === 1 && - Requests.IpcRequest.send( - Requests.Os.Shells.Response, - new Requests.Os.Shells.Request(), - ) - .then((response) => { - this.cache.shells = response.shells; - this.queue.shells - .map((h) => h.resolve) - .forEach((r) => r(this.cache.shells as ShellProfile[])); - }) - .catch((err: Error) => { - this.queue.shells.map((h) => h.reject).forEach((r) => r(err)); - }) - .finally(() => { - this.queue.shells = []; - }); - } - }); - }, - }; - } - - public env(): { - get(): Promise<{ [key: string]: string }>; - } { - return { - get: (): Promise<{ [key: string]: string }> => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Env.Get.Response, - new Requests.Env.Get.Request(), - ) - .then((response) => { - resolve(response.env); - }) - .catch(reject); - }); - }, - }; - } - - public app(): { - version(): Promise; - alphaRelease(): Promise<{ version: string; url: string } | undefined>; - changelogs(version?: string): Promise<{ markdown: string; version: string }>; - } { - return { - version: (): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.App.Version.Response, - new Requests.App.Version.Request(), - ) - .then((response) => { - if (response.error !== undefined) { - return reject(new Error(response.error)); - } - resolve(response.version); - }) - .catch(reject); - }); - }, - alphaRelease: (): Promise<{ version: string; url: string } | undefined> => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.App.AlphaRelease.Response, - new Requests.App.AlphaRelease.Request(), - ) - .then((response) => { - if (response.error !== undefined) { - return reject(new Error(response.error)); - } - if (response.version === undefined || response.url === undefined) { - return resolve(undefined); - } - resolve({ - version: response.version, - url: response.url, - }); - }) - .catch(reject); - }); - }, - changelogs: (version?: string): Promise<{ markdown: string; version: string }> => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.App.Changelogs.Response, - new Requests.App.Changelogs.Request({ version }), - ) - .then((response) => { - if (response.error !== undefined) { - return reject(new Error(response.error)); - } - resolve({ markdown: response.markdown, version: response.version }); - }) - .catch(reject); - }); - }, - }; - } - - public entries(dest: { key?: string; file?: string }): { - get(): Promise; - /** - * Updates existed and inserts new entries - * @param entries entries to be updated or inserted. If entry already exist, it will be updated with given - * @returns - */ - update(entries: Entry[]): Promise; - /** - * Inserts new entries without updating existed - * @param entries entries to be inserted. If entry already exist, it will be ignored - * @returns - */ - append(entries: Entry[]): Promise; - /** - * Clean storage (remove all existed entries) and set with given entries - * @param entries entries to be inserted. - * @returns - */ - overwrite(entries: Entry[]): Promise; - /** - * Removes given entries - * @param uuids list of uuids of entries to be removed - * @returns - */ - delete(uuids: string[]): Promise; - } { - const set = ( - dest: { key?: string; file?: string }, - entries: Entry[], - mode: 'overwrite' | 'update' | 'append', - ): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Storage.EntriesSet.Response, - new Requests.Storage.EntriesSet.Request({ - key: dest.key, - file: dest.file, - entries: JSON.stringify(entries), - mode, - }), - ) - .then(() => { - resolve(undefined); - }) - .catch(reject); - }); - }; - return { - get: (): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Storage.EntriesGet.Response, - new Requests.Storage.EntriesGet.Request({ - key: dest.key, - file: dest.file, - }), - ) - .then((response) => { - try { - const entries: Entry[] = JSON.parse(response.entries); - if (!(entries instanceof Array)) { - throw new Error(`Expecting entries will be {Entry[]}`); - } - resolve(entries); - } catch (e) { - reject(new Error(this.log().error(error(e)))); - } - }) - .catch(reject); - }); - }, - update: (entries: Entry[]): Promise => { - return set(dest, entries, 'update'); - }, - overwrite: (entries: Entry[]): Promise => { - return set(dest, entries, 'overwrite'); - }, - append: (entries: Entry[]): Promise => { - return set(dest, entries, 'append'); - }, - delete: (uuids: string[]): Promise => { - if (dest.key === undefined) { - return Promise.reject( - new Error(`Delete functionality is available only for internal storages`), - ); - } - const key = dest.key; - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Storage.EntriesDelete.Response, - new Requests.Storage.EntriesDelete.Request({ - key, - uuids, - }), - ) - .then(() => { - resolve(undefined); - }) - .catch(reject); - }); - }, - }; - } -} -export interface Service extends Interface {} -export const bridge = register(new Service()); diff --git a/application/client/src/app/service/changelogs.ts b/application/client/src/app/service/changelogs.ts deleted file mode 100644 index a60d523738..0000000000 --- a/application/client/src/app/service/changelogs.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { services } from '@register/services'; -import { bridge } from '@service/bridge'; -import { session } from '@service/session'; -import { Changelog } from '@tabs/changelogs/component'; -import { unique } from '@platform/env/sequence'; - -const STORAGE_KEY = 'changelog_checks_state'; - -@SetupService(services['changelogs']) -export class Service extends Implementation { - public async check(): Promise { - const current = await bridge.app().version(); - const checked = await bridge.storage(STORAGE_KEY).read(); - if (checked === current) { - return; - } - const data = await bridge.app().changelogs(current); - if (data.markdown.trim() === '') { - return; - } - await bridge.storage(STORAGE_KEY).write(current); - session.add().tab({ - name: `Release Notes ${data.version}`, - active: true, - closable: true, - content: { - factory: Changelog, - inputs: { - markdown: data.markdown, - version: data.version, - }, - }, - uuid: unique(), - }); - } -} -export interface Service extends Interface {} -export const changelogs = register(new Service()); diff --git a/application/client/src/app/service/cli.ts b/application/client/src/app/service/cli.ts deleted file mode 100644 index 2d4602baf1..0000000000 --- a/application/client/src/app/service/cli.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { - SetupService, - Interface, - Implementation, - register, - DependOn, -} from '@platform/entity/service'; -import { services } from '@register/services'; -import { api } from '@service/api'; -import { CancelablePromise } from '@platform/env/promise'; - -import * as Requests from '@platform/ipc/request'; -import * as Events from '@platform/ipc/event'; -import * as handlers from './cli/index'; - -@DependOn(api) -@SetupService(services['cli']) -export class Service extends Implementation { - protected filters: Set = new Set(); - - public isFiltersImported(uuid: string): boolean { - return this.filters.has(uuid); - } - public override init(): Promise { - this.register( - api - .transport() - .respondent( - this.getName(), - Requests.Cli.Observe.Request, - ( - request: Requests.Cli.Observe.Request, - ): CancelablePromise => { - return handlers.observe(this, request); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Cli.Search.Request, - ( - request: Requests.Cli.Search.Request, - ): CancelablePromise => { - if (request.filters.length > 0) { - request.sessions.forEach((uuid: string) => this.filters.add(uuid)); - } - return handlers.search(this, request); - }, - ), - api - .transport() - .respondent( - this.getName(), - Requests.Cli.MultiFiles.Request, - ( - request: Requests.Cli.MultiFiles.Request, - ): CancelablePromise => { - return handlers.multiFiles(request); - }, - ), - ); - Events.IpcEvent.subscribe(Events.Cli.Done.Event, (_event: Events.Cli.Done.Event) => { - // TODO: not clear now (after refactoring) - what we should to do now? - // Probably we should lock UI while CLI is processing and here we should - // unlock UI - }); - return Promise.resolve(); - } - public getCommand(): Promise { - return Requests.IpcRequest.send( - Requests.Cli.GetCommand.Response, - new Requests.Cli.GetCommand.Request(), - ).then((response: Requests.Cli.GetCommand.Response) => { - return Promise.resolve(response.command); - }); - } -} -export interface Service extends Interface {} -export const cli = register(new Service()); diff --git a/application/client/src/app/service/cli/index.ts b/application/client/src/app/service/cli/index.ts deleted file mode 100644 index 31468dd6fd..0000000000 --- a/application/client/src/app/service/cli/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { handler as search } from './search'; -export { handler as observe } from './observe'; -export { handler as multiFiles } from './multi_files'; diff --git a/application/client/src/app/service/cli/multi_files.ts b/application/client/src/app/service/cli/multi_files.ts deleted file mode 100644 index d8417350c1..0000000000 --- a/application/client/src/app/service/cli/multi_files.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { CancelablePromise } from '@platform/env/promise'; -import * as Requests from '@platform/ipc/request'; -import { Action as FileAnyAction } from '@service/actions/file.any'; - -export function handler( - request: Requests.Cli.MultiFiles.Request, -): CancelablePromise { - return new CancelablePromise(async (resolve, _reject) => { - action(request); - resolve(new Requests.Cli.MultiFiles.Response()); - }); -} - -export function action(request: Requests.Cli.MultiFiles.Request): void { - if (request.files.length === 0) { - return; - } - const fileAction = new FileAnyAction(); - fileAction.multiple(request.files); -} diff --git a/application/client/src/app/service/cli/observe.ts b/application/client/src/app/service/cli/observe.ts deleted file mode 100644 index 4b58028737..0000000000 --- a/application/client/src/app/service/cli/observe.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { CancelablePromise } from '@platform/env/promise'; -import { Service } from '@service/cli'; -import { session } from '@service/session'; -import { Observe } from '@platform/types/observe'; - -import * as Requests from '@platform/ipc/request'; - -export function handler( - cli: Service, - request: Requests.Cli.Observe.Request, -): CancelablePromise { - return new CancelablePromise(async (resolve, _reject) => { - action(cli, request) - .then((session: string | undefined) => { - resolve(new Requests.Cli.Observe.Response({ session, error: undefined })); - }) - .catch((err: Error) => { - resolve( - new Requests.Cli.Observe.Response({ session: undefined, error: err.message }), - ); - }); - }); -} -export async function action( - cli: Service, - request: Requests.Cli.Observe.Request, -): Promise { - if (request.observe.length === 0) { - return Promise.resolve(undefined); - } - let uuid: string | undefined = undefined; - for (const observe of request.observe) { - if (uuid === undefined) { - uuid = await session - .initialize() - .auto(new Observe(observe).locker().guess()) - .catch((err: Error) => { - cli.log().warn( - `Fail to apply action (Events.Cli.Observe.Event): ${err.message}`, - ); - return undefined; - }); - if (uuid === undefined) { - return Promise.resolve(undefined); - } - } else { - const instance = session.get(uuid); - if (instance === undefined) { - return Promise.resolve(undefined); - } - await session - .initialize() - .auto(new Observe(observe).locker().guess(), instance) - .catch((err: Error) => { - cli.log().warn( - `Fail to apply action (Events.Cli.Observe.Event): ${err.message}`, - ); - return undefined; - }); - } - } - return Promise.resolve(uuid); -} diff --git a/application/client/src/app/service/cli/search.ts b/application/client/src/app/service/cli/search.ts deleted file mode 100644 index e76b369366..0000000000 --- a/application/client/src/app/service/cli/search.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { CancelablePromise } from '@platform/env/promise'; -import { Service } from '@service/cli'; -import { session } from '@service/session'; -import { StoredEntity } from '@service/session/dependencies/search/store'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; - -import * as Requests from '@platform/ipc/request'; - -export function handler( - cli: Service, - request: Requests.Cli.Search.Request, -): CancelablePromise { - return new CancelablePromise(async (resolve, _reject) => { - action(cli, request); - resolve(new Requests.Cli.Search.Response({ error: undefined })); - }); -} -export function action(cli: Service, request: Requests.Cli.Search.Request): void { - if (request.sessions.length === 0) { - return; - } - const filters = request.filters.map((str) => { - return FilterRequest.defaults(str); - }); - request.sessions.forEach((uuid) => { - const instance = session.get(uuid); - if (instance === undefined) { - cli.log().warn(`Cannot apply filter (via CLI): fail to find session: ${uuid}`); - return; - } - instance.search - .store() - .filters() - .overwrite(filters as StoredEntity[]); - }); -} diff --git a/application/client/src/app/service/env.ts b/application/client/src/app/service/env.ts deleted file mode 100644 index 6a98c27ebb..0000000000 --- a/application/client/src/app/service/env.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { services } from '@register/services'; - -export enum Platform { - darwin = 'darwin', - windows = 'windows', - linux = 'linux', -} - -function isMatch(src: string, hooks: string[]): boolean { - return hooks.filter((h) => src.includes(h)).length > 0; -} - -@SetupService(services['env']) -export class Service extends Implementation { - private _platform!: Platform; - - public override ready(): Promise { - const userAgentData = (navigator as any).userAgentData; - if (userAgentData !== undefined && typeof userAgentData.platform === 'string') { - const platform = userAgentData.platform.toLowerCase(); - if (isMatch(platform, ['windows'])) { - this._platform = Platform.windows; - } else if (isMatch(platform, ['darwin', 'macos', 'mac os', 'mac'])) { - this._platform = Platform.darwin; - } else if (isMatch(platform, ['linux'])) { - this._platform = Platform.linux; - } - } - if (this._platform === undefined) { - this.log().warn(`Fail to detect platform on browser level`); - } else { - this.log().debug(`Platform: ${this._platform}`); - } - return Promise.resolve(); - } - - public platform(): { - darwin(): boolean; - windows(): boolean; - linux(): boolean; - } { - return { - darwin: (): boolean => { - return this._platform === Platform.darwin; - }, - windows: (): boolean => { - return this._platform === Platform.windows; - }, - linux: (): boolean => { - return this._platform === Platform.linux; - }, - }; - } -} -export interface Service extends Interface {} -export const env = register(new Service()); diff --git a/application/client/src/app/service/favorites.ts b/application/client/src/app/service/favorites.ts deleted file mode 100644 index e14ca56228..0000000000 --- a/application/client/src/app/service/favorites.ts +++ /dev/null @@ -1,257 +0,0 @@ -import { - SetupService, - Interface, - Implementation, - register, - DependOn, -} from '@platform/entity/service'; -import { services } from '@register/services'; -import { error } from '@platform/log/utils'; -import { bridge } from '@service/bridge'; -import { Subjects, Subject } from '@platform/env/subscription'; - -import * as obj from '@platform/env/obj'; -import { EntityType } from '@platform/types/files'; - -const ROOTS_STORAGE_KEY = 'user_favourites_places'; -const STATE_STORAGE_KEY = 'user_favourites_state'; - -export interface FavoriteState { - path: string; - parent: string; -} - -export interface FavoritePlace { - path: string; - exists: boolean; -} - -@DependOn(bridge) -@SetupService(services['favorites']) -export class Service extends Implementation { - public states: FavoriteState[] = []; - public updates: Subjects<{ - list: Subject; - state: Subject; - }> = new Subjects({ - list: new Subject(), - state: new Subject(), - }); - - protected favorites: FavoritePlace[] = []; - - public override async ready(): Promise { - await Promise.all([ - this.places() - .get() - .then((favorites) => { - this.favorites = favorites; - }) - .catch((err: Error) => { - this.log().error(`Fail to load favorites: ${err.message}`); - }), - this.expanded() - .get() - .then((states) => { - this.states = states; - }) - .catch((err: Error) => { - this.log().error(`Fail to load states: ${err.message}`); - }), - ]); - return Promise.resolve(); - } - - public override destroy(): Promise { - this.updates.destroy(); - return Promise.resolve(); - } - - public places(): { - get(): Promise; - add(paths: string[] | string): Promise; - has(path: string): boolean; - selectAndAdd(): Promise; - remove(path: string): Promise; - } { - return { - get: async (): Promise => { - const favorites: FavoritePlace[] = []; - const paths = await this.storage().get(); - for (const path of paths) { - const exists = await bridge.files().exists(path); - favorites.push({ - path, - exists, - }); - } - return favorites; - }, - add: async (paths: string[] | string): Promise => { - if (!(paths instanceof Array)) { - paths = [paths]; - } - paths = paths.filter((p) => p.trim() !== '' && !this.places().has(p)); - if (paths.length === 0) { - return Promise.resolve(); - } - const accepted: string[] = []; - for (const path of paths) { - const stat = await bridge.files().stat(path); - if (stat.kind === EntityType.Directory) { - accepted.push(path); - } - } - this.favorites = this.favorites.concat( - accepted.map((path) => { - return { path, exists: true }; - }), - ); - return this.storage() - .set(this.favorites) - .then(() => { - this.updates.get().list.emit(); - }) - .catch((err: Error) => { - this.log().error(`Fail to save favorites: ${err.message}`); - }); - }, - has: (path: string): boolean => { - return this.favorites.find((f) => f.path === path) !== undefined; - }, - selectAndAdd: async (): Promise => { - const folders = await bridge.folders().select(); - return this.places().add(folders); - }, - remove: (path: string): Promise => { - if (path.trim().length === 0 || !this.places().has(path)) { - return Promise.resolve(); - } - this.favorites = this.favorites.filter((f) => f.path !== path); - this.expanded() - .remove(path) - .then(() => { - this.updates.get().state.emit(); - }) - .catch((err: Error) => { - this.log().error(`Fail to update state of favorites: ${err.message}`); - }); - return this.storage() - .set(this.favorites) - .then(() => { - this.updates.get().list.emit(); - }) - .catch((err: Error) => { - this.log().error(`Fail to save favorites: ${err.message}`); - }); - }, - }; - } - - protected storage(): { - get(): Promise; - set(value: string[] | FavoritePlace[]): Promise; - } { - return { - get: (): Promise => { - return new Promise((resolve, reject) => { - bridge - .entries({ key: ROOTS_STORAGE_KEY }) - .get() - .then((entries) => { - resolve(entries.map((entry) => entry.content)); - }) - .catch(reject); - }); - }, - set: (value: string[] | FavoritePlace[]): Promise => { - return bridge - .entries({ key: ROOTS_STORAGE_KEY }) - .overwrite( - value.map((favorite: string | FavoritePlace) => { - const path = typeof favorite === 'string' ? favorite : favorite.path; - return { - uuid: path, - content: path, - }; - }), - ) - .finally(() => { - this.updates.get().list.emit(); - }); - }, - }; - } - - public expanded(): { - get(): Promise; - write(): Promise; - add(path: string, parent: string): Promise; - remove(path: string): Promise; - } { - return { - get: (): Promise => { - return new Promise((resolve, reject) => { - bridge - .entries({ key: STATE_STORAGE_KEY }) - .get() - .then((entries) => { - try { - const nodes = entries.map((entry) => { - const node = JSON.parse(entry.content); - return { - path: obj.getAsString(node, 'path'), - parent: obj.getAsString(node, 'parent'), - }; - }); - resolve(nodes); - } catch (e) { - this.log().error(`Fail to parse folder's tree state: ${error(e)}`); - resolve([]); - } - }) - .catch(reject); - }); - }, - write: (): Promise => { - return bridge - .entries({ key: STATE_STORAGE_KEY }) - .overwrite( - this.states.map((node: FavoriteState) => { - return { - uuid: node.path, - content: JSON.stringify(node), - }; - }), - ) - .finally(() => { - this.updates.get().state.emit(); - }); - }, - add: async (path: string, parent: string): Promise => { - if (this.states.find((v) => v.path === path) !== undefined) { - return; - } - this.states.push({ path, parent }); - this.expanded() - .write() - .catch((err: Error) => { - this.log().error(`Fail to write update expanded list: ${err.message}`); - }); - }, - remove: async (path: string): Promise => { - if (this.states.find((value) => value.path === path) === undefined) { - return; - } - this.states = this.states.filter((v) => v.path !== path && v.parent !== path); - this.expanded() - .write() - .catch((err: Error) => { - this.log().error(`Fail to write update expanded list: ${err.message}`); - }); - }, - }; - } -} -export interface Service extends Interface {} -export const favorites = register(new Service()); diff --git a/application/client/src/app/service/history.ts b/application/client/src/app/service/history.ts deleted file mode 100644 index cd4e38f2d1..0000000000 --- a/application/client/src/app/service/history.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { - SetupService, - Interface, - Implementation, - register, - DependOn, -} from '@platform/entity/service'; -import { services } from '@register/services'; -import { bridge } from '@service/bridge'; -import { ilc, Channel } from '@service/ilc'; -import { Session } from './session/session'; -import { HistorySession } from './history/session'; -import { StorageCollections } from './history/storage.collections'; -import { StorageDefinitions } from './history/storage.definitions'; -import { Provider } from './history/provider'; -import { Subjects, Subject } from '@platform/env/subscription'; - -@DependOn(bridge) -@SetupService(services['history']) -export class Service extends Implementation { - protected channel!: Channel; - protected readonly provider: Provider; - - public readonly collections: StorageCollections; - public readonly definitions: StorageDefinitions; - public readonly sessions: Map = new Map(); - public readonly subjects: Subjects<{ - created: Subject; - destroyed: Subject; - }> = new Subjects({ - created: new Subject(), - destroyed: new Subject(), - }); - constructor() { - super(); - this.definitions = new StorageDefinitions(); - this.collections = new StorageCollections(this.definitions); - this.provider = new Provider(this.collections, this.definitions); - } - - public override async ready(): Promise { - await this.collections.load(); - await this.definitions.load(); - this.channel = ilc.channel(`History`, this.log()); - this.channel.session.created((session) => { - this.sessions.set( - session.uuid(), - new HistorySession(session, { - collections: this.collections, - definitions: this.definitions, - }), - ); - this.subjects.get().created.emit(session.uuid()); - }); - this.channel.session.closing((session) => { - if (!(session instanceof Session)) { - return; - } - this.save() - .catch((err) => this.log().error(`Fail to save session state: ${err.message}`)) - .finally(() => { - const history = this.sessions.get(session.uuid()); - if (history === undefined) { - return; - } - history.destroy(); - this.sessions.delete(session.uuid()); - this.subjects.get().destroyed.emit(session.uuid()); - }); - }); - return Promise.resolve(); - } - - public async save(): Promise { - return Promise.all([this.collections.save(), this.definitions.save()]).then( - (_) => undefined, - ); - } - - public get(session: Session | string): HistorySession | undefined { - return this.sessions.get(session instanceof Session ? session.uuid() : session); - } - - public export(uuids: string[], filename: string): Promise { - return this.provider.export(uuids, filename); - } - - public import(filename: string): Promise { - return this.provider.import(filename); - } -} -export interface Service extends Interface {} -export const history = register(new Service()); diff --git a/application/client/src/app/service/history/collection.bookmarks.ts b/application/client/src/app/service/history/collection.bookmarks.ts deleted file mode 100644 index 26f56dab27..0000000000 --- a/application/client/src/app/service/history/collection.bookmarks.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Collection, AfterApplyCallback } from './collection'; -import { Bookmark } from '../session/dependencies/bookmark/bookmark'; -import { Extractor } from '@platform/types/storage/json'; -import { Equal } from '@platform/types/env/types'; -import { Session } from '@service/session/session'; -import { Definition } from './definition'; -import { Subscriber } from '@platform/env/subscription'; - -export class BookmarksCollection - extends Collection - implements Equal -{ - constructor() { - super('BookmarksCollection', []); - } - - public subscribe(subscriber: Subscriber, session: Session): void { - subscriber.register( - session.bookmarks.subjects.get().updated.subscribe(() => { - this.update(session.bookmarks.get()); - this.updated.emit(); - }), - ); - } - - public async applyTo(session: Session, definitions: Definition[]): Promise { - // Bookmarks can be applied only to file - if ( - definitions.length !== 1 || - definitions[0].file === undefined || - session.bookmarks.get().length !== 0 - ) { - return () => { - /* do nothing */ - }; - } - await session.bookmarks.overwrite(this.as().elements()); - return () => { - session.bookmarks.update(); - }; - } - - public isSame(collection: Collection): boolean { - if (this.elements.size !== collection.elements.size) { - return false; - } - let found = 0; - const elements = Array.from(this.elements.values()); - collection.elements.forEach((outside) => { - found += elements.find((f) => f.isSame(outside)) === undefined ? 0 : 1; - }); - return collection.elements.size === found; - } - - public extractor(): Extractor { - return { - from: (json: string): Bookmark | Error => { - return Bookmark.fromJson(json); - }, - key: (): string => { - return Bookmark.KEY; - }, - }; - } - - public applicableOnlyToOrigin(): boolean { - return true; - } -} diff --git a/application/client/src/app/service/history/collection.charts.ts b/application/client/src/app/service/history/collection.charts.ts deleted file mode 100644 index 9df0c6032f..0000000000 --- a/application/client/src/app/service/history/collection.charts.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { Collection, AfterApplyCallback } from './collection'; -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; -import { Extractor } from '@platform/types/storage/json'; -import { Equal } from '@platform/types/env/types'; -import { Session } from '@service/session/session'; -import { Definition } from './definition'; -import { Subscriber } from '@platform/env/subscription'; -import { StoredEntity } from '@service/session/dependencies/search/store'; -import { notifications, Notification } from '@ui/service/notifications'; - -export class ChartsCollection extends Collection implements Equal { - constructor() { - super('ChartsCollection', []); - } - - public subscribe(subscriber: Subscriber, session: Session): void { - subscriber.register( - session.search - .store() - .charts() - .subjects.get() - .any.subscribe(() => { - this.update(session.search.store().charts().get()); - this.updated.emit(); - }), - ); - } - - public applyTo(session: Session, _definitions: Definition[]): Promise { - const charts = this.as().elements() as StoredEntity[]; - const invalid: string[] = charts - .map((chart) => { - if (ChartRequest.getValidationError(chart.definition.filter) !== undefined) { - return chart.definition.filter; - } else { - return undefined; - } - }) - .filter((v) => v !== undefined) as unknown as string[]; - session.search.store().charts().overwrite(charts); - if (invalid.length > 0) { - notifications.notify( - new Notification({ - message: `Next ${ - invalid.length - } chart(s) cannot be applied, because are invalid: ${invalid.join('; ')}`, - actions: [], - pinned: true, - }), - ); - } - return Promise.resolve(() => { - session.search.store().charts().refresh(); - }); - } - - public isSame(collection: Collection): boolean { - if (this.elements.size !== collection.elements.size) { - return false; - } - let found = 0; - const elements = Array.from(this.elements.values()); - collection.elements.forEach((outside) => { - found += elements.find((f) => f.isSame(outside)) === undefined ? 0 : 1; - }); - return collection.elements.size === found; - } - - public extractor(): Extractor { - return { - from: (json: string): ChartRequest | Error => { - return ChartRequest.fromJson(json); - }, - key: (): string => { - return ChartRequest.KEY; - }, - }; - } - - public applicableOnlyToOrigin(): boolean { - return false; - } -} diff --git a/application/client/src/app/service/history/collection.disabled.ts b/application/client/src/app/service/history/collection.disabled.ts deleted file mode 100644 index a9c07f958d..0000000000 --- a/application/client/src/app/service/history/collection.disabled.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Collection, AfterApplyCallback } from './collection'; -import { DisabledRequest } from '../session/dependencies/search/disabled/request'; -import { Extractor } from '@platform/types/storage/json'; -import { Equal } from '@platform/types/env/types'; -import { Session } from '@service/session/session'; -import { Definition } from './definition'; -import { Subscriber } from '@platform/env/subscription'; -import { StoredEntity } from '../session/dependencies/search/store'; - -export class DisabledCollection - extends Collection - implements Equal -{ - constructor() { - super('DisabledCollection', []); - } - - public subscribe(subscriber: Subscriber, session: Session): void { - subscriber.register( - session.search - .store() - .disabled() - .subjects.get() - .any.subscribe(() => { - this.update(session.search.store().disabled().get()); - this.updated.emit(); - }), - ); - } - - public applyTo(session: Session, _definitions: Definition[]): Promise { - session.search - .store() - .disabled() - .overwrite(this.as().elements() as StoredEntity[]); - return Promise.resolve(() => { - session.search.store().disabled().refresh(); - }); - } - - public isSame(collection: Collection): boolean { - if (this.elements.size !== collection.elements.size) { - return false; - } - let found = 0; - const elements = Array.from(this.elements.values()); - collection.elements.forEach((outside) => { - found += elements.find((f) => f.isSame(outside)) === undefined ? 0 : 1; - }); - return collection.elements.size === found; - } - - public extractor(): Extractor { - return { - from: (json: string): DisabledRequest | Error => { - return DisabledRequest.fromJson(json); - }, - key: (): string => { - return DisabledRequest.KEY; - }, - }; - } - - public applicableOnlyToOrigin(): boolean { - return false; - } -} diff --git a/application/client/src/app/service/history/collection.filters.ts b/application/client/src/app/service/history/collection.filters.ts deleted file mode 100644 index 8697309135..0000000000 --- a/application/client/src/app/service/history/collection.filters.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Collection, AfterApplyCallback } from './collection'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; -import { Extractor } from '@platform/types/storage/json'; -import { Equal } from '@platform/types/env/types'; -import { Session } from '@service/session/session'; -import { Definition } from './definition'; -import { Subscriber } from '@platform/env/subscription'; -import { StoredEntity } from '@service/session/dependencies/search/store'; -import { notifications, Notification } from '@ui/service/notifications'; - -export class FiltersCollection - extends Collection - implements Equal -{ - constructor() { - super('FiltersCollection', []); - } - - public subscribe(subscriber: Subscriber, session: Session): void { - subscriber.register( - session.search - .store() - .filters() - .subjects.get() - .any.subscribe(() => { - this.update(session.search.store().filters().get()); - this.updated.emit(); - }), - ); - } - - public applyTo(session: Session, _definitions: Definition[]): Promise { - const filters = this.as().elements() as StoredEntity[]; - const invalid: string[] = filters - .map((filter) => { - if (FilterRequest.getValidationError(filter.definition.filter) !== undefined) { - return filter.definition.filter.filter; - } else { - return undefined; - } - }) - .filter((v) => v !== undefined) as unknown as string[]; - session.search.store().filters().overwrite(filters); - if (invalid.length > 0) { - notifications.notify( - new Notification({ - message: `Next ${ - invalid.length - } filter(s) cannot be applied, because are invalid: ${invalid.join('; ')}`, - actions: [], - pinned: true, - }), - ); - } - return Promise.resolve(() => { - session.search.store().filters().refresh(); - }); - } - - public isSame(collection: Collection): boolean { - if (this.elements.size !== collection.elements.size) { - return false; - } - let found = 0; - const elements = Array.from(this.elements.values()); - collection.elements.forEach((outside) => { - found += elements.find((f) => f.isSame(outside)) === undefined ? 0 : 1; - }); - return collection.elements.size === found; - } - - public extractor(): Extractor { - return { - from: (json: string): FilterRequest | Error => { - return FilterRequest.fromJson(json); - }, - key: (): string => { - return FilterRequest.KEY; - }, - }; - } - - public applicableOnlyToOrigin(): boolean { - return false; - } -} diff --git a/application/client/src/app/service/history/collection.ts b/application/client/src/app/service/history/collection.ts deleted file mode 100644 index 33f4d637ac..0000000000 --- a/application/client/src/app/service/history/collection.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Recognizable } from '@platform/types/storage/entry'; -import { Equal } from '@platform/types/env/types'; -import { Session } from '@service/session/session'; -import { Json, JsonField, JsonSet, Extractor } from '@platform/types/storage/json'; -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Definition } from './definition'; -import { Subscriber, Subject } from '@platform/env/subscription'; - -export type AfterApplyCallback = () => void; -@SetupLogger() -export abstract class Collection & Recognizable & Equal> { - abstract subscribe(subscriber: Subscriber, session: Session): void; - abstract extractor(): Extractor; - abstract isSame(collection: Collection): boolean; - abstract applyTo(session: Session, definitions: Definition[]): Promise; - abstract applicableOnlyToOrigin(): boolean; - - public readonly elements: Map = new Map(); - public readonly updated: Subject = new Subject(); - - constructor(alias: string, entries: JsonSet) { - this.setLoggerName(alias); - this.load(entries); - } - - protected extract(field: JsonField): T | Error | undefined { - if (typeof field !== 'object' || field === null || field === undefined) { - return new Error(`Invalid field`); - } - const json = field[this.extractor().key()]; - if (typeof json !== 'string') { - return undefined; - } - return this.extractor().from(json); - } - - public update(elements: T[]): void { - this.elements.clear(); - elements.forEach((e) => { - this.elements.set(e.uuid(), e); - }); - } - - public load(entries: JsonSet) { - this.elements.clear(); - entries.forEach((entry) => { - const element = this.extract(entry); - if (element instanceof Error) { - this.log().warn(`Fail to extract value: ${element.message}`); - return; - } - if (element === undefined) { - return; - } - this.elements.set(element.uuid(), element); - }); - } - - public as(): { - jsonSet(): JsonSet; - elements(): T[]; - } { - return { - jsonSet: (): JsonSet => { - return Array.from(this.elements.values()).map((f) => { - return { [f.json().key()]: f.json().to() }; - }); - }, - elements: (): T[] => { - return Array.from(this.elements.values()); - }, - }; - } -} -export interface Collection extends LoggerInterface { - _phantom: T; -} diff --git a/application/client/src/app/service/history/collections.ts b/application/client/src/app/service/history/collections.ts deleted file mode 100644 index eac52ae5d5..0000000000 --- a/application/client/src/app/service/history/collections.ts +++ /dev/null @@ -1,404 +0,0 @@ -import { Definition } from './definition'; -import { FiltersCollection } from './collection.filters'; -import { ChartsCollection } from './collection.charts'; -import { DisabledCollection } from './collection.disabled'; -import { BookmarksCollection } from './collection.bookmarks'; -// import { CommentsCollection } from './collection.comments.ts_'; -import { Collection } from './collection'; -import { Session } from '@service/session/session'; -import { EntryConvertable, Entry } from '@platform/types/storage/entry'; -import { JsonSet } from '@platform/types/storage/json'; -import { error } from '@platform/log/utils'; -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Equal, Empty } from '@platform/types/env/types'; -import { Subject, Subscriber } from '@platform/env/subscription'; -import { StorageCollections } from './storage.collections'; -import { unique } from '@platform/env/sequence'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; -import { hash } from '@platform/env/hash'; - -import * as obj from '@platform/env/obj'; - -export interface ICollection { - name: string; - created: number; - last: number; - used: number; - uuid: string; - applied_sessions: Set; - preset: boolean; - relations: string[]; - entries: JsonSet; - origin: string | undefined; -} - -@SetupLogger() -export class Collections implements EntryConvertable, Equal, Empty { - static from(smth: Session | Entry, storage: StorageCollections): Collections { - if (smth instanceof Session) { - const filters = smth.search.store().filters().get(); - const disabled = smth.search.store().disabled().get(); - const bookmarks = smth.bookmarks.get(); - return new Collections( - `Collections:${smth.uuid()}`, - { - name: '-', - last: Date.now(), - created: Date.now(), - used: 1, - uuid: smth.uuid(), - applied_sessions: new Set([smth.uuid()]), - preset: false, - relations: [], - origin: undefined, - entries: filters - .map((f) => f.asJsonField()) - .concat(disabled.map((d) => d.asJsonField())) - .concat(bookmarks.map((b) => b.asJsonField())), - }, - storage, - ); - } else { - const def = Collections.fromMinifiedStr(JSON.parse(smth.content)); - return new Collections( - `Collections:${def.uuid}`, - Collections.fromMinifiedStr(JSON.parse(smth.content)), - storage, - ); - } - } - - static fromV2(smth: { [key: string]: any }, storage: StorageCollections): Collections { - const uuid = unique(); - obj.isObject(smth); - const filters: FilterRequest[] = []; - if (smth['filters'] instanceof Array) { - smth['filters'].forEach((smth) => { - const validFilter = FilterRequest.fromV2(smth); - if (validFilter instanceof Error) { - return; - } - filters.push(validFilter); - }); - } - const charts: ChartRequest[] = []; - if (smth['charts'] instanceof Array) { - smth['charts'].forEach((smth) => { - const validChart = ChartRequest.fromV2(smth); - if (validChart instanceof Error) { - return; - } - charts.push(validChart); - }); - } - return new Collections( - `Collections:${uuid}`, - { - name: '-', - last: Date.now(), - created: Date.now(), - used: 1, - uuid: uuid, - applied_sessions: new Set(), - preset: false, - relations: [], - origin: undefined, - entries: filters - .map((f) => f.asJsonField()) - .concat(charts.map((d) => d.asJsonField())), - }, - storage, - ); - } - - static fromMinifiedStr(src: { [key: string]: number | string }): ICollection { - return { - name: obj.getAsNotEmptyString(src, 'n'), - created: Date.now(), - used: obj.getAsValidNumber(src, 'u'), - last: obj.getAsValidNumber(src, 'l'), - preset: obj.getAsBool(src, 'p'), - uuid: obj.getAsNotEmptyString(src, 'uu'), - applied_sessions: obj.getAsSetOfStringsOrEmpty(src, 'as'), - relations: obj.getAsArray(src, 'r'), - origin: obj.getAsNotEmptyStringOrAsUndefined(src, 'o'), - entries: obj.getAsObj(src, 'e'), - }; - } - - protected readonly storage: StorageCollections; - - public name: string; - public created: number; - public used: number; - public last: number; - public uuid: string; - public applied_sessions: Set; - public preset: boolean; - public relations: string[]; - public origin: string | undefined; - - public readonly collections: { - filters: FiltersCollection; - charts: ChartsCollection; - disabled: DisabledCollection; - bookmarks: BookmarksCollection; - // comments: CommentsCollection; - } = { - filters: new FiltersCollection(), - charts: new ChartsCollection(), - disabled: new DisabledCollection(), - bookmarks: new BookmarksCollection(), - // comments: new CommentsCollection(), - }; - public readonly updated: Subject = new Subject(); - - constructor(alias: string, definition: ICollection, storage: StorageCollections) { - this.setLoggerName(alias); - this.name = definition.name; - this.used = definition.used; - this.last = definition.last; - this.created = definition.created; - this.uuid = definition.uuid; - this.applied_sessions = definition.applied_sessions; - this.relations = definition.relations; - this.origin = definition.origin; - this.preset = definition.preset; - this.storage = storage; - this.load(definition.entries); - } - - public subscribe(subscriber: Subscriber, session: Session): void { - this.asCollectionsArray().forEach((c) => { - subscriber.register( - c.updated.subscribe(() => { - this.updated.emit(); - }), - ); - c.subscribe(subscriber, session); - }); - } - - public clone(): Collections { - return new Collections( - '', - { - name: this.name, - used: this.used, - created: this.created, - uuid: this.uuid, - applied_sessions: this.applied_sessions, - relations: this.relations, - preset: this.preset, - last: this.last, - origin: this.origin, - entries: this.asCollectionsArray() - .map((c) => c.as().jsonSet()) - .flat(), - }, - this.storage, - ); - } - - public delete() { - this.storage.delete(this); - } - - public bind(definition: Definition): void { - if (this.origin === undefined) { - // Origin source - it's first source for collection. - this.origin = definition.uuid; - } - this.relations.indexOf(definition.uuid) === -1 && this.relations.push(definition.uuid); - } - - public async applyTo(session: Session, definitions: Definition[]): Promise { - const origin = (() => { - if (definitions.length === 1 && definitions[0].uuid === this.origin) { - return true; - } - return false; - })(); - const collections = this.asCollectionsArray().filter((c) => - origin ? true : !c.applicableOnlyToOrigin(), - ); - const after = []; - for (const collection of collections) { - const cb = await collection.applyTo(session, definitions); - after.push(cb); - } - after.forEach((cb) => cb()); - } - - public updateUuid(uuid: string | undefined): void { - this.uuid = uuid !== undefined ? uuid : this.uuid; - } - - public setName(name: string) { - if (name.trim() === '' || name.trim() === '-') { - this.name = '-'; - this.preset = false; - } else { - this.name = name; - this.preset = true; - } - this.storage.update(this); - } - - public hasName(): boolean { - return this.name !== '' && this.name !== '-'; - } - - public filterByDateTime(tm: number): boolean { - return this.created > tm; - } - - public updateTimestamp() { - this.created = Date.now(); - } - - public isSame(collections: Collections): boolean { - return ( - this.collections.filters.isSame(collections.collections.filters) && - this.collections.charts.isSame(collections.collections.charts) && - this.collections.disabled.isSame(collections.collections.disabled) - ); - } - - protected load(entries: JsonSet) { - this.asCollectionsArray().forEach((c) => c.load(entries)); - } - - protected overwrite(definition: ICollection) { - this.name = definition.name; - this.used = definition.used; - this.last = definition.last; - this.created = definition.created; - this.uuid = definition.uuid; - this.applied_sessions = definition.applied_sessions; - this.relations = definition.relations; - this.origin = definition.origin; - this.preset = definition.preset; - this.load(definition.entries); - } - - protected asCollectionsArray(): Collection[] { - return Object.keys(this.collections).map( - (key) => (this.collections as { [key: string]: Collection })[key], - ); - } - - public getInnerHash(): string { - const representation = - this.collections.filters - .as() - .elements() - .map((request) => { - const def = request.definition; - return `${def.filter.filter}${def.filter.flags.cases}${def.filter.flags.word}${def.filter.flags.reg}${def.colors.color}${def.colors.background}${def.active}`; - }) - .join(';') + - this.collections.charts - .as() - .elements() - .map((request) => { - const def = request.definition; - return `${def.filter}${def.color}${def.active}`; - }) - .join(';') + - ( - this.collections.disabled - .as() - .elements() - .map((entity) => entity.as().filter()) - .filter((entity) => entity !== undefined) as unknown as FilterRequest[] - ) - .map((request: FilterRequest) => { - const def = request.definition; - return `${def.filter.filter}${def.filter.flags.cases}${def.filter.flags.word}${def.filter.flags.reg}${def.colors.color}${def.colors.background}${def.active}`; - }) - .join(';') + - ( - this.collections.disabled - .as() - .elements() - .map((entity) => entity.as().chart()) - .filter((entity) => entity !== undefined) as unknown as ChartRequest[] - ) - .map((request) => { - const def = request.definition; - return `${def.filter}${def.color}${def.active}`; - }) - .join(';'); - return hash(representation).toString(); - } - - public isEmpty(): boolean { - return ( - this.asCollectionsArray() - .map((c) => c.elements.size) - .reduce((prev, curr) => prev + curr, 0) === 0 - ); - } - - public minify(): { - [key: string]: - | number - | string - | { [key: string]: string | number } - | string[] - | JsonSet - | boolean - | undefined; - } { - return { - n: this.name, - c: this.created, - u: this.used, - l: this.last, - uu: this.uuid, - r: this.relations, - o: this.origin, - e: this.asCollectionsArray() - .map((c) => c.as().jsonSet()) - .flat(), - p: this.preset, - }; - } - - public entry(): { - to(): Entry; - from(entry: Entry): Error | undefined; - hash(): string; - uuid(): string; - updated(): Subject | undefined; - } { - return { - to: (): Entry => { - return { - uuid: this.uuid, - content: JSON.stringify(this.minify()), - }; - }, - from: (entry: Entry): Error | undefined => { - try { - this.overwrite(Collections.fromMinifiedStr(JSON.parse(entry.content))); - } catch (e) { - return new Error(error(e)); - } - return undefined; - }, - hash: (): string => { - return this.uuid; - }, - uuid: (): string => { - return this.uuid; - }, - updated: (): Subject | undefined => { - return undefined; - }, - }; - } -} -export interface Collections extends LoggerInterface {} diff --git a/application/client/src/app/service/history/definition.concat.ts b/application/client/src/app/service/history/definition.concat.ts deleted file mode 100644 index bd6443de15..0000000000 --- a/application/client/src/app/service/history/definition.concat.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { IFileDesc, FileDesc } from './definition.file'; -import * as $ from '@platform/types/observe'; - -export class ConcatDesc { - static async fromDataSource(source: $.Observe): Promise { - const concat = source.origin.as<$.Origin.Concat.Configuration>( - $.Origin.Concat.Configuration, - ); - if (concat === undefined) { - return undefined; - } - const list: IFileDesc[] = []; - for (const filename of concat.files()) { - const desc = await FileDesc.fromFilename(filename); - if (desc !== undefined) { - list.push(desc); - } - } - return list; - } - static fromMinifiedStr( - src: Array<{ [key: string]: number | string }> | undefined, - ): ConcatDesc | undefined { - const files: IFileDesc[] = []; - if (src === undefined) { - return undefined; - } - src.forEach((src) => { - const file = FileDesc.fromMinifiedStr(src); - if (file === undefined) { - return; - } - files.push(file.asDesc()); - }); - return src === undefined ? undefined : new ConcatDesc(files); - } - - public files: IFileDesc[] = []; - - constructor(files: IFileDesc[]) { - this.files = files; - } - - public isSame(collection: ConcatDesc): boolean { - if (this.files.length !== collection.files.length) { - return false; - } - const targets = collection.files.map((f) => f.checksum); - let matches: number = 0; - this.files.forEach((f) => { - matches += targets.includes(f.checksum) ? 1 : 0; - }); - return matches === this.files.length; - } - - public minify(): Array<{ [key: string]: number | string }> { - return this.files.map((f) => new FileDesc(f).minify()); - } -} diff --git a/application/client/src/app/service/history/definition.file.ts b/application/client/src/app/service/history/definition.file.ts deleted file mode 100644 index 911819f9bb..0000000000 --- a/application/client/src/app/service/history/definition.file.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { getParentFolder } from '@platform/types/files'; -import { bridge } from '@service/bridge'; - -import * as obj from '@platform/env/obj'; -import * as $ from '@platform/types/observe'; - -export interface IFileDesc { - extention: string; - checksum: string; - filename: string; - parent: string; - size: number; - created: number; -} - -export class FileDesc implements IFileDesc { - static async fromDataSource(source: $.Observe): Promise { - const file = source.origin.as<$.Origin.File.Configuration>($.Origin.File.Configuration); - if (file === undefined) { - return undefined; - } - return FileDesc.fromFilename(file.filename()); - } - static async fromFilename(filename: string): Promise { - const file = (await bridge.files().getByPathWithCache([filename]))[0]; - if (file === undefined) { - throw new Error(`Fail to get file(s) stat info`); - } - return { - checksum: await bridge.files().checksumWithCache(file.filename), - extention: file.ext.toLowerCase(), - filename: file.name.toLowerCase(), - parent: getParentFolder(file.filename).toLowerCase(), - created: file.stat.ctimeMs, - size: file.stat.size, - }; - } - static fromMinifiedStr( - src: { [key: string]: number | string } | undefined, - ): FileDesc | undefined { - return src === undefined - ? undefined - : new FileDesc({ - checksum: obj.getAsString(src, 'h'), - extention: obj.getAsString(src, 'e'), - filename: obj.getAsNotEmptyString(src, 'n'), - parent: obj.getAsString(src, 'p'), - size: obj.getAsValidNumber(src, 's'), - created: obj.getAsValidNumber(src, 'c'), - }); - } - - public extention: string; - public filename: string; - public parent: string; - public size: number; - public created: number; - public checksum: string; - - constructor(definition: IFileDesc) { - this.extention = definition.extention; - this.filename = definition.filename; - this.parent = definition.parent; - this.size = definition.size; - this.created = definition.created; - this.checksum = definition.checksum; - } - - public isSame(file: FileDesc): boolean { - return file.checksum === this.checksum; - } - - public asDesc(): IFileDesc { - return { - checksum: this.checksum, - extention: this.extention, - filename: this.filename, - parent: this.parent, - size: this.size, - created: this.created, - }; - } - - public minify(): { [key: string]: number | string } { - return { - e: this.extention, - n: this.filename, - p: this.parent, - s: this.size, - c: this.created, - h: this.checksum, - }; - } -} diff --git a/application/client/src/app/service/history/definition.stream.ts b/application/client/src/app/service/history/definition.stream.ts deleted file mode 100644 index 37d0e4b940..0000000000 --- a/application/client/src/app/service/history/definition.stream.ts +++ /dev/null @@ -1,59 +0,0 @@ -import * as $ from '@platform/types/observe'; -import * as obj from '@platform/env/obj'; - -export interface IStreamDesc { - source: $.Origin.Stream.Stream.Source; - major: string; - minor: string; -} - -export class StreamDesc implements IStreamDesc { - static async fromDataSource(source: $.Observe): Promise { - const stream = source.origin.as<$.Origin.Stream.Configuration>( - $.Origin.Stream.Configuration, - ); - if (stream === undefined) { - return undefined; - } - const def = stream.desc(); - return { - major: def.major, - minor: def.minor, - source: stream.instance.instance.alias(), - }; - } - - static fromMinifiedStr( - src: { [key: string]: number | string } | undefined, - ): StreamDesc | undefined { - return src === undefined - ? undefined - : new StreamDesc({ - source: obj.getAsNotEmptyString(src, 's') as $.Origin.Stream.Stream.Source, - major: obj.getAsString(src, 'ma'), - minor: obj.getAsString(src, 'mi'), - }); - } - - public source: $.Origin.Stream.Stream.Source; - public major: string; - public minor: string; - - constructor(definition: IStreamDesc) { - this.source = definition.source; - this.major = definition.major; - this.minor = definition.minor; - } - - public isSame(stream: StreamDesc): boolean { - return stream.source === this.source && this.major === stream.major; - } - - public minify(): { [key: string]: number | string } { - return { - s: this.source, - mi: this.minor, - ma: this.major, - }; - } -} diff --git a/application/client/src/app/service/history/definition.ts b/application/client/src/app/service/history/definition.ts deleted file mode 100644 index 5044000e4d..0000000000 --- a/application/client/src/app/service/history/definition.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { FileDesc, IFileDesc } from './definition.file'; -import { StreamDesc, IStreamDesc } from './definition.stream'; -import { ConcatDesc } from './definition.concat'; -import { unique } from '@platform/env/sequence'; -import { EntryConvertable, Entry } from '@platform/types/storage/entry'; -import { error } from '@platform/log/utils'; -import { Subject } from '@platform/env/subscription'; -import { Equal } from '@platform/types/env/types'; -import { Collections } from './collections'; - -import * as obj from '@platform/env/obj'; -import * as $ from '@platform/types/observe'; - -export interface IDefinition { - stream?: IStreamDesc; - file?: IFileDesc; - concat?: IFileDesc[]; - parser: $.Parser.Protocol; - uuid: string; -} - -export interface GroupRelations { - rank: number; - caption?: string; -} -export class Definition implements EntryConvertable, Equal { - static from(entry: Entry): Definition { - return Definition.fromMinifiedStr(JSON.parse(entry.content)); - } - static async fromDataSource(source: $.Observe): Promise { - const parser = source.parser.instance.alias(); - const file = await FileDesc.fromDataSource(source); - const concat = await ConcatDesc.fromDataSource(source); - const stream = await StreamDesc.fromDataSource(source); - if (file !== undefined) { - return new Definition({ - file, - stream: undefined, - concat: undefined, - parser, - uuid: unique(), - }); - } else if (concat !== undefined) { - return new Definition({ - file: undefined, - stream: undefined, - concat, - parser, - uuid: unique(), - }); - } else if (stream !== undefined) { - return new Definition({ - file: undefined, - concat: undefined, - stream, - parser, - uuid: unique(), - }); - } else { - throw new Error(`Cannot detect a source of data. Not File, not Stream aren't defined`); - } - } - static fromMinifiedStr(src: { [key: string]: number | string }): Definition { - const def = new Definition({ - file: FileDesc.fromMinifiedStr(obj.getAsObjOrUndefined(src, 'f')), - stream: StreamDesc.fromMinifiedStr(obj.getAsObjOrUndefined(src, 's')), - concat: ConcatDesc.fromMinifiedStr(obj.getAsObjOrUndefined(src, 'c'))?.files, - parser: obj.getAsNotEmptyString(src, 'p') as $.Parser.Protocol, - uuid: obj.getAsNotEmptyString(src, 'u'), - }); - if (def.file === undefined && def.stream === undefined && def.concat === undefined) { - throw new Error(`Definition doesn't have description not for stream, not for file`); - } - return def; - } - - public stream?: StreamDesc; - public file?: FileDesc; - public concat?: ConcatDesc; - public parser: $.Parser.Protocol; - public uuid: string; - - constructor(definition: IDefinition) { - this.stream = - definition.stream === undefined ? undefined : new StreamDesc(definition.stream); - this.file = definition.file === undefined ? undefined : new FileDesc(definition.file); - this.concat = - definition.concat === undefined ? undefined : new ConcatDesc(definition.concat); - this.parser = definition.parser; - this.uuid = definition.uuid; - } - - public overwrite(definition: Definition) { - this.stream = definition.stream; - this.file = definition.file; - this.concat = definition.concat; - this.parser = definition.parser; - this.uuid = definition.uuid; - } - - public isSame(definition: Definition): boolean { - if (this.parser !== definition.parser) { - return false; - } - if (definition.stream !== undefined && this.stream !== undefined) { - return this.stream.isSame(definition.stream); - } - if (definition.file !== undefined && this.file !== undefined) { - return this.file.isSame(definition.file); - } - if (definition.concat !== undefined && this.concat !== undefined) { - return this.concat.isSame(definition.concat); - } - return false; - } - - public check(): { - related(collections: Collections): boolean; - suitable(definition: Definition): GroupRelations | undefined; - } { - return { - related: (collections: Collections): boolean => { - return collections.relations.indexOf(this.uuid) !== -1; - }, - suitable: (definition: Definition): GroupRelations | undefined => { - if (this.parser !== definition.parser) { - return undefined; - } - if (this.file !== undefined && definition.file !== undefined) { - if ( - (this.file.extention === definition.file.extention && - this.file.filename === definition.file.filename) || - this.file.checksum === definition.file.checksum - ) { - return { rank: 1, caption: 'Same file' }; - } - if (this.file.extention === definition.file.extention) { - return { rank: 2, caption: 'Same file format' }; - } - if (this.file.parent === definition.file.parent) { - return { rank: 3, caption: 'Same file location' }; - } - return undefined; - } - if (this.stream !== undefined && definition.stream !== undefined) { - if ( - this.stream.major === definition.stream.major && - this.stream.minor === definition.stream.minor - ) { - return { rank: 1 }; - } - if (this.stream.major === definition.stream.major) { - return { rank: 2 }; - } - if (this.stream.minor === definition.stream.minor) { - return { rank: 3 }; - } - return undefined; - } - return undefined; - }, - }; - } - - public toExport(): Definition { - const def = { - stream: this.stream, - file: this.file, - concat: this.concat === undefined ? undefined : this.concat.files, - parser: this.parser, - uuid: this.uuid, - }; - if (def.file !== undefined) { - def.file.filename = unique(); - def.file.parent = unique(); - } - return new Definition(def); - } - - public getCollectionName(): string { - if (this.file !== undefined) { - return `files *.${this.file.extention}`; - } else if (this.stream !== undefined) { - return `${this.stream.major}`; - } else { - return '-'; - } - } - - public minify(): { - [key: string]: - | number - | string - | { [key: string]: string | number } - | Array<{ [key: string]: string | number }> - | undefined; - } { - return { - s: this.stream?.minify(), - f: this.file?.minify(), - c: this.concat?.minify(), - p: this.parser, - u: this.uuid, - }; - } - - public entry(): { - to(): Entry; - from(entry: Entry): Error | undefined; - hash(): string; - uuid(): string; - updated(): Subject | undefined; - } { - return { - to: (): Entry => { - return { - uuid: this.uuid, - content: JSON.stringify(this.minify()), - }; - }, - from: (entry: Entry): Error | undefined => { - try { - this.overwrite(Definition.fromMinifiedStr(JSON.parse(entry.content))); - } catch (e) { - return new Error(error(e)); - } - return undefined; - }, - hash: (): string => { - return this.uuid; - }, - uuid: (): string => { - return this.uuid; - }, - updated: (): Subject | undefined => { - return undefined; - }, - }; - } -} diff --git a/application/client/src/app/service/history/definitions.ts b/application/client/src/app/service/history/definitions.ts deleted file mode 100644 index 40aa4157b1..0000000000 --- a/application/client/src/app/service/history/definitions.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Logger } from '@platform/log'; -import { scope } from '@platform/env/scope'; -import { Definition } from './definition'; - -export class Definitions { - static UUID = 'history_definitions_holder'; - protected readonly definitions: Map = new Map(); - protected readonly logger: Logger; - - constructor() { - this.logger = scope.getLogger(`Definitions holder (history)`); - } - - public add(definition: Definition): void { - this.definitions.set(definition.uuid, definition); - } - - public list(): Definition[] { - return Array.from(this.definitions.values()); - } -} diff --git a/application/client/src/app/service/history/provider.ts b/application/client/src/app/service/history/provider.ts deleted file mode 100644 index 26c662e44c..0000000000 --- a/application/client/src/app/service/history/provider.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { StorageCollections } from './storage.collections'; -import { StorageDefinitions } from './storage.definitions'; -import { Collections } from './collections'; -import { Definition } from './definition'; -import { EntryConvertable, Entry } from '@platform/types/storage/entry'; -import { Subject } from '@platform/env/subscription'; -import { unique } from '@platform/env/sequence'; -import { error } from '@platform/log/utils'; -import { bridge } from '@service/bridge'; -import { lockers, Locker } from '@ui/service/lockers'; -import { scope } from '@platform/env/scope'; - -import * as obj from '@platform/env/obj'; - -export class Provider implements EntryConvertable { - protected collections: Collections[] = []; - protected definitions: Definition[] = []; - protected readonly uuid: string = unique(); - protected readonly storage: { - collections: StorageCollections; - definitions: StorageDefinitions; - }; - protected importFromC2Version(filename: string, err: Error): Promise { - const logger = scope.getLogger('ImporterFiltersFromV2'); - return new Promise((resolve, reject) => { - const message = lockers.lock( - new Locker( - false, - `Fail to read from file due error: ${err.message.split(/[\n\r]/gi)[0]}`, - ) - .set() - .buttons([ - { - caption: `Try read as Chipmunk v2 filters`, - handler: () => { - message.popup.close(); - bridge - .files() - .read(filename) - .then((text: string) => { - try { - const parsed = JSON.parse(text); - obj.isObject(parsed); - this.collections = [ - Collections.fromV2( - parsed, - this.storage.collections, - ), - ]; - this.definitions = []; - resolve(this.orderAfterImport()); - } catch (e) { - logger.error(error(e)); - reject(new Error(error(e))); - } - }) - .catch((err: Error) => { - logger.error(err.message); - reject(err); - }); - }, - }, - { - caption: `Cancel`, - handler: () => { - message.popup.close(); - resolve([]); - }, - }, - ]) - .end(), - { - closable: false, - }, - ); - }); - } - - protected orderAfterImport(): string[] { - this.collections = this.collections.map((col) => { - // Reassign uuids of definitions as soon as it will be diffrent in case - // if both users have same source - col.relations = col.relations.map((uuid) => { - let target = this.definitions.find((d) => d.uuid === uuid); - if (target === undefined) { - return uuid; - } - target = this.storage.definitions.update(target); - return target.uuid; - }); - return col; - }); - - this.storage.definitions.add(this.definitions); - const uuids: string[] = this.storage.collections.add(this.collections); - this.collections = []; - this.definitions = []; - return uuids; - } - - constructor(collections: StorageCollections, definitions: StorageDefinitions) { - this.storage = { - collections, - definitions, - }; - } - - public export(uuids: string[], filename: string): Promise { - this.collections = ( - uuids - .map((uuid) => { - return this.storage.collections.get(uuid); - }) - .filter((c) => c !== undefined) as Collections[] - ).map((c) => c.clone()); - this.definitions = []; - const names: { [key: string]: number } = {}; - this.collections = this.collections.map((col) => { - const related: Definition[] = ( - col.relations - .map((uuid) => this.storage.definitions.get(uuid)) - .filter((d) => d !== undefined) as Definition[] - ).map((d) => d.toExport()); - if (related.length > 0) { - this.definitions = this.definitions.concat(related); - const name = related[0].getCollectionName(); - if (!col.hasName() && name !== '-') { - names[name] = names[name] === undefined ? 0 : names[name]; - if (names[name] === 0) { - col.name = name; - } else { - col.name = `${name}:${names[name] + 1}`; - } - names[name] += 1; - } - } - return col; - }); - return bridge.entries({ file: filename }).overwrite([this.entry().to()]); - } - - public import(filename: string): Promise { - return bridge - .entries({ file: filename }) - .get() - .then((entries) => { - if (entries.length !== 1) { - return Promise.reject(new Error(`Invalid format of file`)); - } - const error = this.entry().from(entries[0]); - if (error instanceof Error) { - return Promise.reject(error); - } - return this.orderAfterImport(); - }) - .catch((err: Error) => { - return this.importFromC2Version(filename, err); - }); - } - - public minify(): { [key: string]: Entry[] } { - return { - c: this.collections.map((c) => c.entry().to()), - d: this.definitions.map((d) => d.entry().to()), - }; - } - - public entry(): { - to(): Entry; - from(entry: Entry): Error | undefined; - hash(): string; - uuid(): string; - updated(): Subject | undefined; - } { - return { - to: (): Entry => { - return { - uuid: this.uuid, - content: JSON.stringify(this.minify()), - }; - }, - from: (entry: Entry): Error | undefined => { - try { - const minified: { [key: string]: Entry[] } = JSON.parse(entry.content); - this.collections = minified['c'].map((entry) => - Collections.from(entry, this.storage.collections), - ); - this.definitions = minified['d'].map((entry) => Definition.from(entry)); - } catch (e) { - return new Error(error(e)); - } - return undefined; - }, - hash: (): string => { - return this.uuid; - }, - uuid: (): string => { - return this.uuid; - }, - updated: (): Subject | undefined => { - return undefined; - }, - }; - } -} diff --git a/application/client/src/app/service/history/session.ts b/application/client/src/app/service/history/session.ts deleted file mode 100644 index c74466b84a..0000000000 --- a/application/client/src/app/service/history/session.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { Collections } from './collections'; -import { Definitions } from './definitions'; -import { Definition } from './definition'; -import { Session } from '../session/session'; -import { StorageCollections } from './storage.collections'; -import { StorageDefinitions } from './storage.definitions'; -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Subscriber } from '@platform/env/subscription'; -import { Subjects, Subject } from '@platform/env/subscription'; -import { Suitable, SuitableGroup } from './suitable'; -import { LockToken } from '@platform/env/lock.token'; -import { cli } from '@service/cli'; - -import * as $ from '@platform/types/observe'; - -export { Suitable, SuitableGroup }; - -@SetupLogger() -export class HistorySession extends Subscriber { - protected readonly storage: { - collections: StorageCollections; - definitions: StorageDefinitions; - }; - protected readonly session: Session; - protected readonly sources: string[] = []; - protected readonly globals: Subscriber = new Subscriber(); - protected readonly locker: LockToken = new LockToken(true); - protected readonly pendings: $.Observe[] = []; - protected checked: boolean = false; - - public readonly definitions: Definitions; - public collections: Collections; - public readonly subjects: Subjects<{ - suitable: Subject; - checked: Subject; - }> = new Subjects({ - suitable: new Subject(), - checked: new Subject(), - }); - - constructor( - session: Session, - storage: { - collections: StorageCollections; - definitions: StorageDefinitions; - }, - ) { - super(); - this.definitions = new Definitions(); - this.storage = storage; - this.session = session; - this.setLoggerName(`History: ${this.session.uuid()}`); - this.collections = this.setCollection(Collections.from(session, storage.collections)); - this.globals.register( - this.session.stream.subjects.get().started.subscribe(this.handleNewSource.bind(this)), - this.session.stream.subjects.get().readable.subscribe(() => { - this.locker.unlock(); - this.pendings - .splice(0, this.pendings.length) - .forEach(this.handleNewSource.bind(this)); - }), - ); - } - - protected handleNewSource(source: $.Observe) { - if (this.locker.isLocked()) { - this.pendings.push(source); - return; - } - Definition.fromDataSource(source) - .then((definition) => { - definition = this.storage.definitions.update(definition); - this.definitions.add(definition); - this.collections.bind(definition); - if (cli.isFiltersImported(this.session.uuid())) { - // Filters are imported from CLI. Recent filters/charts should not - // be applied - return; - } - this.save(); - this.check().all(); - }) - .catch((err: Error) => { - this.log().error(`Fail to get definition of source: ${err.message}`); - }); - } - - protected save() { - if (this.collections.isEmpty()) { - this.storage.collections.clean().catch((err: Error) => { - this.log().error(`Fail to save collections storage: ${err.message}`); - }); - } else { - Promise.all([ - this.storage.collections.save().catch((err: Error) => { - this.log().error(`Fail to save collections storage: ${err.message}`); - }), - this.storage.definitions.save().catch((err: Error) => { - this.log().error(`Fail to save definitions storage: ${err.message}`); - }), - ]).catch((err: Error) => { - this.log().error(`Fail to save history storage: ${err.message}`); - }); - } - } - - public check(): { - related(): boolean; - suitable(): void; - all(): void; - done(): boolean; - confirm(): void; - } { - return { - related: (): boolean => { - const related = this.find().related(); - if (related !== undefined) { - this.setCollection(related); - this.collections - .applyTo(this.session, this.definitions.list()) - .catch((err: Error) => { - this.log().warn(`Fail to apply collection: ${err.message}`); - }) - .finally(() => { - this.check().confirm(); - }); - } else { - this.subjects.get().suitable.emit(new Suitable()); - } - return related !== undefined; - }, - suitable: (): void => { - this.subjects.get().suitable.emit(this.find().suitable()); - this.check().confirm(); - }, - all: (): void => { - if (this.check().related()) { - return; - } - this.check().suitable(); - }, - done: (): boolean => { - return this.checked; - }, - confirm: (): void => { - this.checked = true; - this.subjects.get().checked.emit(); - }, - }; - } - - protected setCollection(collections: Collections): Collections { - this.unsubscribe(); - this.collections = collections; - this.collections.subscribe(this, this.session); - this.storage.collections.clearSession(this.session.uuid()); - this.collections.applied_sessions.add(this.session.uuid()); - this.register( - this.collections.updated.subscribe(() => { - this.collections.updateUuid(this.storage.collections.update(this.collections)); - this.save(); - }), - ); - return collections; - } - - public destroy() { - this.collections.applied_sessions.delete(this.session.uuid()); - this.unsubscribe(); - this.globals.unsubscribe(); - this.subjects.destroy(); - } - - public find(): { - related(): Collections | undefined; - suitable(): Suitable; - all(): Collections[]; - named(): Collections[]; - byTimeStamp(tm: number): Collections[]; - } { - return { - related: (): Collections | undefined => { - const related = this.storage.collections.find(this.definitions.list()).related(); - related.sort((a, b) => (a.last < b.last ? 1 : -1)); - return related.length === 0 ? undefined : related[0]; - }, - suitable: (): Suitable => { - return this.storage.collections.find(this.definitions.list()).suitable(); - }, - all: (): Collections[] => { - return this.storage.collections.find().all(); - }, - named: (): Collections[] => { - return this.storage.collections.find().named(); - }, - byTimeStamp: (tm: number): Collections[] => { - return this.storage.collections.find().byTimeStamp(tm); - }, - }; - } - - public apply(collection: Collections) { - if (this.storage.collections.get(collection.uuid) === undefined) { - this.storage.collections.insert(collection); - } else { - this.storage.collections.used(collection.uuid); - } - this.setCollection(collection); - this.definitions.list().forEach((def) => { - this.collections.bind(def); - }); - this.collections.applyTo(this.session, this.definitions.list()).catch((err: Error) => { - this.log().warn(`Fail to apply collection: ${err.message}`); - }); - } - - public clear() { - this.storage.collections.clear(); - } -} -export interface HistorySession extends LoggerInterface {} diff --git a/application/client/src/app/service/history/storage.collections.ts b/application/client/src/app/service/history/storage.collections.ts deleted file mode 100644 index b2dcd66920..0000000000 --- a/application/client/src/app/service/history/storage.collections.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { bridge } from '@service/bridge'; -import { Collections } from './collections'; -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { error } from '@platform/log/utils'; -import { Definition } from './definition'; -import { StorageDefinitions } from './storage.definitions'; -import { Suitable } from './suitable'; -import { Subject } from '@platform/env/subscription'; - -@SetupLogger() -export class StorageCollections { - static UUID = 'history_collections_storage'; - - protected collections: Map = new Map(); - protected definitions: StorageDefinitions; - - public saved: Subject = new Subject(); - - constructor(definitions: StorageDefinitions) { - this.setLoggerName(`StorageCollections`); - this.definitions = definitions; - } - - public async load(): Promise { - this.collections.clear(); - await bridge - .entries({ key: StorageCollections.UUID }) - .get() - .then((entries) => { - entries.forEach((entry) => { - try { - const collections = Collections.from(entry, this); - this.collections.set(collections.uuid, collections); - } catch (e) { - this.log().error(`Fail parse collection: ${error(e)}`); - } - }); - }) - .catch((err: Error) => { - this.log().warn(`Fail to read history collections: ${err.message}`); - }); - } - - public async save(): Promise { - setTimeout(() => { - bridge - .entries({ key: StorageCollections.UUID }) - .overwrite(Array.from(this.collections.values()).map((c) => c.entry().to())) - .then(() => { - this.saved.emit(); - }) - .catch((err: Error) => { - this.log().warn(`Fail to write history collections: ${err.message}`); - }); - }); - } - - public async clean(): Promise { - this.collections.forEach((collections: Collections, key: string) => { - if (collections.isEmpty()) { - this.collections.delete(key); - } - }); - await this.save(); - } - - public clearSession(session_id: string): void { - this.collections.forEach((collection, _key, _map) => { - collection.applied_sessions.delete(session_id); - }); - } - - public update(collections: Collections): string { - const existed = Array.from(this.collections.values()).find((c) => c.isSame(collections)); - if (this.collections.has(collections.uuid) || existed === undefined) { - this.collections.set(collections.uuid, collections); - return collections.uuid; - } else { - existed.updateTimestamp(); - } - return existed.uuid; - } - - public insert(collections: Collections): string[] { - if (this.collections.has(collections.uuid)) { - return this.add([collections]); - } else { - this.collections.set(collections.uuid, collections); - this.save(); - return [collections.uuid]; - } - } - - public add(collections: Collections[]): string[] { - const uuids = collections.map((col) => this.update(col)); - this.save(); - return uuids; - } - - public overwrite(collections: Collections[]): void { - this.collections.clear(); - collections.forEach((c) => this.collections.set(c.uuid, c)); - this.save(); - } - - public get(uuid: string): Collections | undefined { - return this.collections.get(uuid); - } - - public delete(collections: Collections) { - this.collections.delete(collections.uuid); - this.save(); - } - - public clear() { - this.collections.clear(); - this.save(); - } - - public find(definitions?: Definition[]): { - related(): Collections[]; - suitable(): Suitable; - named(): Collections[]; - all(): Collections[]; - byTimeStamp(tm: number): Collections[]; - } { - return { - related: (): Collections[] => { - if (definitions === undefined) { - return []; - } - return Array.from(this.collections.values()).filter((collections) => { - return definitions.filter((def) => def.check().related(collections)).length > 0; - }); - }, - suitable: (): Suitable => { - if (definitions === undefined) { - return new Suitable(); - } - const suitable: Suitable = new Suitable(); - Array.from(this.collections.values()).forEach((collections) => { - collections.relations.forEach((uuid) => { - const definition = this.definitions.get(uuid); - if (definition === undefined) { - return; - } - definitions.forEach((def) => { - suitable.add(collections, def.check().suitable(definition)); - }); - }); - }); - return suitable; - }, - named: (): Collections[] => { - return Array.from(this.collections.values()).filter((c) => c.hasName()); - }, - all: (): Collections[] => { - return Array.from(this.collections.values()); - }, - byTimeStamp: (tm: number): Collections[] => { - return Array.from(this.collections.values()).filter((c) => c.filterByDateTime(tm)); - }, - }; - } - - public used(uuid: string) { - const collection = this.collections.get(uuid); - if (collection === undefined) { - return; - } - collection.used += 1; - collection.last = Date.now(); - } -} -export interface StorageCollections extends LoggerInterface {} diff --git a/application/client/src/app/service/history/storage.definitions.ts b/application/client/src/app/service/history/storage.definitions.ts deleted file mode 100644 index 2d2513f1e4..0000000000 --- a/application/client/src/app/service/history/storage.definitions.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { bridge } from '@service/bridge'; -import { Definition } from './definition'; -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { error } from '@platform/log/utils'; - -@SetupLogger() -export class StorageDefinitions { - static UUID = 'history_definitions_storage'; - protected definitions: Map = new Map(); - - constructor() { - this.setLoggerName(`StorageDefinitions`); - } - - public async load(): Promise { - this.definitions.clear(); - await bridge - .entries({ key: StorageDefinitions.UUID }) - .get() - .then((entries) => { - entries.forEach((entry) => { - try { - const definition = Definition.from(entry); - this.definitions.set(definition.uuid, definition); - } catch (e) { - this.log().error(`Fail parse definition: ${error(e)}`); - } - }); - }) - .catch((err: Error) => { - this.log().warn(`Fail to read history definition: ${err.message}`); - }); - } - - public async save(): Promise { - await bridge - .entries({ key: StorageDefinitions.UUID }) - .update(Array.from(this.definitions.values()).map((d) => d.entry().to())) - .catch((err: Error) => { - this.log().warn(`Fail to write history definition: ${err.message}`); - }); - } - - public update(definition: Definition): Definition { - const existed = Array.from(this.definitions.values()).find((d) => d.isSame(definition)); - if (existed === undefined) { - this.definitions.set(definition.uuid, definition); - return definition; - } - return existed; - } - - public add(definitions: Definition[]): void { - definitions.forEach((def) => this.update(def)); - this.save(); - } - - public get(uuid: string): Definition | undefined { - return this.definitions.get(uuid); - } -} -export interface StorageDefinitions extends LoggerInterface {} diff --git a/application/client/src/app/service/history/suitable.ts b/application/client/src/app/service/history/suitable.ts deleted file mode 100644 index 7aff718ef9..0000000000 --- a/application/client/src/app/service/history/suitable.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { Collections } from './collections'; -import { GroupRelations } from './definition'; - -export interface SuitableGroup { - caption?: string; - rank: number; - collections: Collections[]; -} - -export interface SuitableCollections { - [key: number]: { caption?: string; collections: Collections[] }; -} - -export class Suitable { - public suitable: SuitableCollections = {}; - - protected collections: string[] = []; - - public asGroups(): SuitableGroup[] { - const list: SuitableGroup[] = []; - Object.keys(this.suitable).forEach((key: string | number) => { - const rank = typeof key === 'string' ? parseInt(key, 10) : key; - const index = list.findIndex((g) => g.rank === rank); - if (index === -1) { - list.push({ - caption: this.suitable[rank].caption, - rank, - collections: this.suitable[rank].collections, - }); - } else { - list[index].collections = list[index].collections.concat( - this.suitable[rank].collections, - ); - } - }); - list.sort((a, b) => { - return a.rank > b.rank ? 1 : -1; - }); - list.forEach((group: SuitableGroup) => { - const unique: string[] = []; - group.collections = group.collections.filter((collection) => { - const hash = collection.getInnerHash(); - if (unique.includes(hash)) { - return false; - } else { - unique.push(hash); - return true; - } - }); - }); - return list; - } - - public add(collections: Collections, group: GroupRelations | undefined): boolean { - if (group === undefined) { - return false; - } - if (this.collections.indexOf(collections.uuid) !== -1) { - return false; - } else { - this.collections.push(collections.uuid); - } - if (this.suitable[group.rank] === undefined) { - this.suitable[group.rank] = { caption: group.caption, collections: [] }; - } - this.suitable[group.rank].collections.push(collections); - return true; - } -} diff --git a/application/client/src/app/service/hotkeys.ts b/application/client/src/app/service/hotkeys.ts deleted file mode 100644 index b0de1258ee..0000000000 --- a/application/client/src/app/service/hotkeys.ts +++ /dev/null @@ -1,328 +0,0 @@ -import { - SetupService, - Interface, - Implementation, - register, - DependOn, -} from '@platform/entity/service'; -import { services } from '@register/services'; -import { Listener } from './hotkeys/listener'; -import { KeysMap, getKeyByUuid, Requirement, getKeyByAlias } from '@platform/types/hotkeys/map'; -import { Subscription } from '@platform/env/subscription'; -import { listener } from '@ui/service/listener'; -import { ilc, Services } from '@service/ilc'; -import { unique } from '@platform/env/sequence'; -import { components } from '@env/decorators/initial'; -import { Vertical, Horizontal } from '@ui/service/popup'; -import { env } from '@service/env'; -import { Action as FileAnyAction } from '@service/actions/file.any'; -import { Action as SettingsAction } from '@service/actions/settings'; -import { Action as ExitAction } from '@service/actions/exit'; - -import * as Events from '@platform/ipc/event/index'; -import * as Requests from '@platform/ipc/request'; - -enum BindingState { - Bound, - Bounding, - Unbound, - Unbounding, - NotInited, -} - -@DependOn(env) -@SetupService(services['hotkeys']) -export class Service extends Implementation { - private _listener!: Listener; - private _services!: Services; - private _handlers: Map void>> = new Map(); - private _recent: { - inputsUpdateState: number; - remoteBinding: BindingState; - } = { - inputsUpdateState: -1, - remoteBinding: BindingState.NotInited, - }; - - public override ready(): Promise { - const channel = ilc.channel(this.getName(), this.log()); - this._services = ilc.services(this.getName(), this.log()); - this._listener = new Listener(KeysMap); - this.register( - channel.session.change(() => { - this.check().session(); - }), - ); - this.register( - Events.IpcEvent.subscribe( - Events.Hotkey.Emit.Event, - (event) => { - const target = getKeyByAlias(event.code); - if (target === undefined) { - this.log().warn(`Recieved unknown hotkey: ${event.code}`); - return; - } - this._listener.emit(target.uuid); - }, - ), - ); - this.register( - this._listener.subject.subscribe((uuid: string) => { - const key = getKeyByUuid(uuid); - if (key === undefined) { - return; - } - const handlers = this._handlers.get(key.alias); - if (handlers === undefined) { - return; - } - handlers.forEach((handler) => handler()); - }), - ); - this.register( - listener.listen('focus', window, () => { - this.check().inputs(); - return true; - }), - ); - this.register( - listener.listen('blur', window, () => { - this.remote().unbind(); - return true; - }), - ); - this.register( - listener.listen( - 'keyup', - window, - (event: KeyboardEvent) => { - return this._listener.emit(event); - }, - { - priority: 100, - }, - ), - ); - this.register( - listener.listen('keydown', window, () => { - this.check().inputs(); - return true; - }), - ); - this.register( - listener.listen('mouseup', window, () => { - this.check().inputs(); - return true; - }), - ); - this.register( - this.listen('?', () => { - this._services.ui.popup.open({ - component: { - factory: components.get('app-dialogs-hotkeys'), - inputs: {}, - }, - closeOnKey: '*', - uuid: '?', - width: 500, - }); - }), - ); - this.register( - this.listen('Ctrl + G', () => { - if (this._services.system.session.active().session() === undefined) { - return; - } - this._services.ui.popup.open({ - component: { - factory: components.get('app-dialogs-jumpto'), - inputs: {}, - }, - position: { - vertical: Vertical.top, - horizontal: Horizontal.center, - }, - closeOnKey: 'Escape', - width: 350, - uuid: 'Ctrl + G', - blur: false, - }); - }), - ); - this.register( - this.listen('Ctrl + P', () => { - this._services.ui.popup.open({ - component: { - factory: components.get('app-navigator'), - inputs: {}, - }, - position: { - vertical: Vertical.top, - horizontal: Horizontal.center, - }, - closeOnKey: 'Escape', - width: 450, - uuid: 'Ctrl + P', - }); - }), - ); - this.register( - this.listen('Ctrl + O', () => { - new FileAnyAction().apply().catch((err: Error) => { - this.log().error(`Fail to call action FileAnyAction; error: ${err.message}`); - }); - }), - ); - this.register( - this.listen('Ctrl + ,', () => { - new SettingsAction().apply().catch((err: Error) => { - this.log().error(`Fail to call action SettingsAction; error: ${err.message}`); - }); - }), - ); - this.register( - this.listen('Ctrl + Q', () => { - new ExitAction().apply().catch((err: Error) => { - this.log().error(`Fail to call action ExitAction; error: ${err.message}`); - }); - }), - ); - this.check().all(); - return Promise.resolve(); - } - - public override destroy(): Promise { - this.unsubscribe(); - this._listener.destroy(); - return Promise.resolve(); - } - - public listen(alias: string, handler: () => void): Subscription { - const key = getKeyByAlias(alias); - if (key === undefined) { - throw new Error(`Hotkey ${alias} isn't found`); - } - let handlers = this._handlers.get(alias); - if (handlers === undefined) { - handlers = new Map void>(); - } - const uuid = unique(); - handlers.set(uuid, handler); - this._handlers.set(alias, handlers); - return new Subscription(alias, () => { - const handlers = this._handlers.get(alias); - if (handlers === undefined) { - return; - } - handlers.delete(uuid); - }); - } - - protected check(): { - inputs(): void; - session(): void; - all(): void; - } { - return { - inputs: (): void => { - // We have to use here litle delay, because some angular material components makes changes - // asynch. To catch last state of components we have to let "them" update itselfs - clearTimeout(this._recent.inputsUpdateState); - this._recent.inputsUpdateState = setTimeout(() => { - this._recent.inputsUpdateState = -1; - if (document.activeElement === null) { - return; - } - const tag: string = document.activeElement.tagName.toLowerCase(); - if (['input', 'textarea'].indexOf(tag) !== -1) { - this._listener.requirement(Requirement.NoInput).deactivate(); - this.remote().unbind(); - } else { - this._listener.requirement(Requirement.NoInput).activate(); - this.remote().bind(); - } - }, 150) as unknown as number; - }, - session: (): void => { - const active = this._services.system.session.active().session(); - if (active === undefined) { - this._listener.requirement(Requirement.Session).deactivate(); - } else { - this._listener.requirement(Requirement.Session).activate(); - } - }, - all: (): void => { - this.check().inputs(); - this.check().session(); - }, - }; - } - - protected remote(): { - bind(): void; - unbind(): void; - } { - return { - bind: (): void => { - if ( - [BindingState.Bound, BindingState.Bounding].includes(this._recent.remoteBinding) - ) { - return; - } - this._recent.remoteBinding = BindingState.Bounding; - Requests.IpcRequest.send( - Requests.Hotkey.On.Response, - new Requests.Hotkey.On.Request(), - ) - .then((response) => { - if (response.error !== undefined && response.error !== '') { - this.log().error( - `Fail to activate listener of hotkeys: ${response.error}`, - ); - this._recent.remoteBinding = BindingState.NotInited; - } else { - this._recent.remoteBinding = BindingState.Bound; - } - }) - .catch((err: Error) => { - this.log().error( - `Fail send request to activate listener of hotkeys: ${err.message}`, - ); - this._recent.remoteBinding = BindingState.NotInited; - }); - }, - unbind: (): void => { - if ( - [BindingState.Unbound, BindingState.Unbounding].includes( - this._recent.remoteBinding, - ) - ) { - return; - } - this._recent.remoteBinding = BindingState.Unbounding; - Requests.IpcRequest.send( - Requests.Hotkey.Off.Response, - new Requests.Hotkey.Off.Request(), - ) - .then((response) => { - if (response.error !== undefined && response.error !== '') { - this.log().error( - `Fail to deactivate listener of hotkeys: ${response.error}`, - ); - this._recent.remoteBinding = BindingState.NotInited; - } else { - this._recent.remoteBinding = BindingState.Unbound; - } - }) - .catch((err: Error) => { - this.log().error( - `Fail send request to deactivate listener of hotkeys: ${err.message}`, - ); - this._recent.remoteBinding = BindingState.NotInited; - }); - }, - }; - } -} -export interface Service extends Interface {} -export const hotkeys = register(new Service()); diff --git a/application/client/src/app/service/hotkeys/emitter.ts b/application/client/src/app/service/hotkeys/emitter.ts deleted file mode 100644 index 346f7d3e2a..0000000000 --- a/application/client/src/app/service/hotkeys/emitter.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { Binding, Requirement } from '@platform/types/hotkeys/map'; - -export class Emitter { - static TIMEOUT = 250; - - private _ctrl: boolean = false; - private _shift: boolean = false; - private _alt: boolean = false; - private _key: boolean = false; - private _collected: string = ''; - private _targets: string[] = []; - private _timeout: unknown; - private readonly _binding: Binding[]; - private readonly _uuid: string; - private readonly _requirements: Requirement[]; - - constructor( - uuid: string, - binding: Binding | Binding[] | undefined, - requirements: Requirement[], - ) { - this._uuid = uuid; - this._binding = binding === undefined ? [] : binding instanceof Array ? binding : [binding]; - this._requirements = requirements; - this._targets = this._binding.map((binding) => { - return binding.key instanceof Array - ? binding.key.map((k) => k.toLowerCase()).join('') - : binding.key.toLowerCase(); - }); - } - - public destroy() { - this._timeout !== undefined && clearTimeout(this._timeout as number); - } - - public isTracking(): boolean { - return this._binding.length > 0; - } - - public ctrl(value: boolean): Emitter { - this._ctrl = this._binding.filter((b) => b.ctrl === true).length > 0 ? value : true; - return this; - } - - public shift(value: boolean): Emitter { - this._shift = this._binding.filter((b) => b.shift === true).length > 0 ? value : true; - return this; - } - - public alt(value: boolean): Emitter { - this._alt = this._binding.filter((b) => b.alt === true).length > 0 ? value : true; - return this; - } - - public key(key: string): Emitter { - this._collected += key.toLowerCase(); - this._key = this._targets.filter((t) => t === this._collected).length > 0; - return this; - } - - public emitted(): boolean { - const emitted = this._alt && this._ctrl && this._shift && this._key; - if (this.isCollectable() && !emitted) { - this._timeout = setTimeout(() => { - this.drop(); - }, Emitter.TIMEOUT); - } else { - this.drop(); - } - return emitted; - } - - public postponed(): boolean { - return this._binding.filter((b) => b.postponed === true).length > 0; - } - - public uuid(): string { - return this._uuid; - } - - public allowed(requirements: Requirement[]): boolean { - let allowed = true; - this._requirements.forEach((req) => { - allowed = !allowed ? false : requirements.includes(req); - }); - return allowed; - } - - protected drop(): Emitter { - this._alt = false; - this._ctrl = false; - this._shift = false; - this._key = false; - this._collected = ''; - this._timeout = undefined; - return this; - } - - protected isCollectable(): boolean { - return this._binding.filter((b) => b.key instanceof Array).length > 0; - } -} diff --git a/application/client/src/app/service/hotkeys/listener.ts b/application/client/src/app/service/hotkeys/listener.ts deleted file mode 100644 index e73878a56d..0000000000 --- a/application/client/src/app/service/hotkeys/listener.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { KeyDescription, Requirement } from '@platform/types/hotkeys/map'; -import { Emitter } from './emitter'; -import { Subject } from '@platform/env/subscription'; -import { env } from '@service/env'; - -export class Listener { - static CONCLUSION_TIMEOUT = 200; - - public subject: Subject = new Subject(); - - protected readonly emitters: Map = new Map(); - protected readonly iteration: { - timer: unknown; - emitted: string[]; - } = { - timer: undefined, - emitted: [], - }; - protected requirements: Requirement[] = []; - - constructor(descs: KeyDescription[]) { - descs.forEach((desc: KeyDescription) => { - this.emitters.set(desc.uuid, new Emitter(desc.uuid, desc.client, desc.required)); - }); - } - - public destroy(): void { - this.iteration.timer !== undefined && clearTimeout(this.iteration.timer as number); - this.emitters.forEach((emitter: Emitter) => { - emitter.destroy(); - }); - } - - public emit(event: KeyboardEvent | string): boolean { - let postponed = false; - if (typeof event === 'string') { - const emitter = this.emitters.get(event); - if (emitter === undefined) { - return false; - } - this.iteration.emitted.indexOf(emitter.uuid()) === -1 && - this.iteration.emitted.push(emitter.uuid()); - } else { - if (this.iteration.timer === undefined) { - this.iteration.emitted = []; - this.iteration.timer = setTimeout(() => { - this._accept(); - }, Listener.CONCLUSION_TIMEOUT); - } - this.emitters.forEach((emitter: Emitter) => { - if (!emitter.isTracking() || !emitter.allowed(this.requirements)) { - return; - } - if ( - emitter - .ctrl(env.platform().darwin() ? event.metaKey : event.ctrlKey) - .alt(event.altKey) - .shift(event.shiftKey) - .key(event.key) - .emitted() - ) { - this.iteration.emitted.indexOf(emitter.uuid()) === -1 && - this.iteration.emitted.push(emitter.uuid()); - postponed = emitter.postponed(); - } - }); - } - if (!postponed) { - return this._accept(); - } else { - return true; - } - } - - public requirement(requirement: Requirement): { - activate(): void; - deactivate(): void; - } { - return { - activate: (): void => { - if (this.requirements.includes(requirement)) { - return; - } - this.requirements.push(requirement); - }, - deactivate: (): void => { - this.requirements = this.requirements.filter((r) => r !== requirement); - }, - }; - } - - private _accept(): boolean { - const emitted = this.iteration.emitted; - this.iteration.timer !== undefined && clearTimeout(this.iteration.timer as number); - this.iteration.timer = undefined; - this.iteration.emitted = []; - if (emitted.length === 0) { - return true; - } - this.subject.emit(emitted[emitted.length - 1]); - return false; - } -} diff --git a/application/client/src/app/service/ilc.ts b/application/client/src/app/service/ilc.ts deleted file mode 100644 index c37fd2092c..0000000000 --- a/application/client/src/app/service/ilc.ts +++ /dev/null @@ -1,234 +0,0 @@ -/** - * Declares and documents the global ILC (Internal Life Cycle) service, which can be injected - * into any Angular service or component to provide standardized infrastructure utilities. - * - * @remarks - * The `ILC` service serves as a central lifecycle-aware utility provider. Its key responsibilities include: - * - * - Automatic delivery of the logging system via `this.ilc().log()`, ensuring consistent logging access across services and components. - * - Managed subscription registration via `this.ilc().env()`, with automatic cleanup: - * - Particularly useful in Angular components, where any subscriptions registered through `ilc` are automatically unsubscribed - * when the component is destroyed. - * - This removes the need for manual cleanup in `ngOnDestroy` and protects against memory leaks or zombie callbacks. - * - Access to globally available application services through a unified interface. - * - Safe event subscription mechanism for internal service events: - * - Works similarly to the Angular lifecycle-aware subscription model. - * - If a service or component is destroyed, the associated subscriptions are automatically removed. - * - * @recommendation - * It is highly recommended to register **all** event subscriptions through the `ILC` system to prevent: - * - Memory leaks caused by unreleased handlers. - * - Logic executing on components or services that have already been destroyed. - * - * @example Angular Component Injection - * ```ts - * @Component({ - * selector: 'app-views-attachments-list', - * templateUrl: './template.html', - * styleUrls: ['./styles.less'], - * standalone: false, - * }) - * @Ilc() // Injects the ILC instance - * export class Attachments extends ChangesDetector implements AfterContentInit { - * public method() { - * this.ilc().log().error('Hello, Ilc!'); - * } - * } - * ``` - * - * @module - * @public - */ -import { - SetupService, - Interface, - Implementation, - register, - DependOn, -} from '@platform/entity/service'; -import { services } from '@register/services'; -import { Events, Declarations } from '@service/ilc/events'; -import { Channel } from '@service/ilc/events.channel'; -import { Emitter } from '@service/ilc/events.emitter'; -import { Services } from '@service/ilc/services'; -import { Logger } from '@platform/log'; -import { session, Session, UnboundTab } from '@service/session'; -import { state } from '@service/state'; -import { jobs } from '@service/jobs'; -import { popup } from '@ui/service/popup'; -import { notifications } from '@ui/service/notifications'; -import { contextmenu } from '@ui/service/contextmenu'; -import { layout } from '@ui/service/layout'; -import { toolbar } from '@ui/service/toolbar'; -import { sidebar } from '@ui/service/sidebar'; -import { bridge } from '@service/bridge'; -import { hotkeys } from '@service/hotkeys'; -import { cli } from '@service/cli'; -import { actions } from '@service/actions'; -import { favorites } from '@service/favorites'; -import { sys } from '@service/sys'; -import { plugins } from './plugins'; - -import { Subscriber } from '@platform/env/subscription'; - -export { Channel, Emitter, Declarations, Services }; - -/** - * Defines the internal ILC API used to expose core services and event infrastructure. - * - * @interface InternalAPI - * @internal - */ -export interface InternalAPI { - /** - * Provides access to the internal communication channel. - */ - channel: Channel; - - /** - * Event emitter used for publishing events across the system. - */ - emitter: Emitter; - - /** - * Collection of globally available application services. - */ - services: Services; - - /** - * Logger instance scoped to the current component or service. - */ - logger: Logger; -} - -/** - * Defines the environment-scoped subscription system. - * Used for automatic cleanup of event listeners tied to component lifecycle. - * - * @interface Env - * @internal - */ -export interface Env { - /** - * Subscription manager for registering lifecycle-aware event handlers. - */ - subscriber: Subscriber; -} - -/** - * Provides access to session-related data within the component or service. - * - * @interface Accessor - * @internal - */ -export interface Accessor { - /** - * Grants access to the current bound session. - * The callback is invoked with the session instance, if available. - * - * @param cb - A callback to handle the current session. - * @returns `true` if the session was available and the callback was called, otherwise `false`. - */ - session: (cb: (session: Session) => void) => boolean; - - /** - * Grants access to the unbound tab state. - * The callback is invoked if the tab is not associated with a session. - * - * @param cb - A callback to handle the unbound tab state. - * @returns `true` if unbound state was available and the callback was called, otherwise `false`. - */ - unbound: (cb: (session: UnboundTab) => void) => boolean; -} - -/** - * Manages lifecycle hooks for cleanup logic. - * - * @interface Life - * @internal - */ -export interface Life { - /** - * Registers a handler to be called automatically when the component or service is destroyed. - * - * @param handler - A cleanup function. - */ - destroy: (handler: () => void) => void; -} - -/** - * The main public ILC interface available to Angular components and services via `this.ilc()`. - * - * @interface IlcInterface - * @public - */ -export interface IlcInterface { - /** - * Returns a logger instance scoped to the current context. - */ - log(): Logger; - - /** - * Exposes internal ILC APIs: communication channels, emitter, services, and logger. - * Use with caution - intended mostly for internal integration. - */ - ilc(): InternalAPI; - - /** - * Provides access to environment-level features, such as auto-cleanup subscriptions. - */ - env(): Env; - - /** - * Grants access to session state and unbound tab context. - */ - access(): Accessor; - - /** - * Registers destruction hooks for performing cleanup when the owning - * component or service is destroyed. - */ - life(): Life; -} - -// System services -@DependOn(session) -@DependOn(state) -@DependOn(jobs) -@DependOn(bridge) -@DependOn(hotkeys) -@DependOn(cli) -@DependOn(actions) -@DependOn(favorites) -@DependOn(sys) -@DependOn(plugins) -// UI services -@DependOn(sidebar) -@DependOn(toolbar) -@DependOn(layout) -@DependOn(popup) -@DependOn(notifications) -@DependOn(contextmenu) -@SetupService(services['ilc']) -export class Service extends Implementation { - private readonly _events: Events = new Events(); - - public override destroy(): Promise { - this._events.destroy(); - return Promise.resolve(); - } - - public channel(owner: string, logger: Logger): Channel { - return new Channel(owner, this._events, logger); - } - - public emitter(owner: string, logger: Logger): Emitter { - return new Emitter(owner, this._events, logger); - } - - public services(owner: string, logger: Logger): Services { - return new Services(owner, logger); - } -} -export interface Service extends Interface {} -export const ilc = register(new Service()); diff --git a/application/client/src/app/service/ilc/declarations/backend/job.ts b/application/client/src/app/service/ilc/declarations/backend/job.ts deleted file mode 100644 index d3e2480d7c..0000000000 --- a/application/client/src/app/service/ilc/declarations/backend/job.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface JobEvent { - uuid: string; - progress: number; - session?: string; - desc?: string; -} diff --git a/application/client/src/app/service/ilc/declarations/backend/state.ts b/application/client/src/app/service/ilc/declarations/backend/state.ts deleted file mode 100644 index 30a5e305f1..0000000000 --- a/application/client/src/app/service/ilc/declarations/backend/state.ts +++ /dev/null @@ -1,9 +0,0 @@ -export enum BackendState { - Ready = 'Ready', - Locked = 'Locked', -} - -export interface BackendStateEvent { - state: BackendState; - job: string; -} diff --git a/application/client/src/app/service/ilc/declarations/contextmenu.ts b/application/client/src/app/service/ilc/declarations/contextmenu.ts deleted file mode 100644 index 52f4e9dd0e..0000000000 --- a/application/client/src/app/service/ilc/declarations/contextmenu.ts +++ /dev/null @@ -1 +0,0 @@ -export { IMenu, IMenuItem } from '@ui/service/contextmenu'; diff --git a/application/client/src/app/service/ilc/declarations/hotkey.ts b/application/client/src/app/service/ilc/declarations/hotkey.ts deleted file mode 100644 index 6894e9aeaf..0000000000 --- a/application/client/src/app/service/ilc/declarations/hotkey.ts +++ /dev/null @@ -1,27 +0,0 @@ -export enum Hotkey { - newTab = 'newTab', - closeTab = 'closeTab', - openLocalFile = 'openLocalFile', - focusSearchInput = 'focusSearchInput', - openSearchFiltersTab = 'openSearchFiltersTab', - selectNextRow = 'selectNextRow', - selectPrevRow = 'selectPrevRow', - scrollToBegin = 'scrollToBegin', - scrollToEnd = 'scrollToEnd', - focusMainView = 'focusMainView', - focusSearchView = 'focusSearchView', - showHotkeysMapDialog = 'showHotkeysMapDialog', - sidebarToggle = 'sidebarToggle', - toolbarToggle = 'toolbarToggle', - recentFiles = 'recentFiles', - recentFilters = 'recentFilters', - settings = 'settings', - nextTab = 'nextTab', - prevTab = 'prevTab', - storeFilter = 'storeFilter', - storeChart = 'storeChart', - selectAllSearchResult = 'selectAllSearchResult', -} -export interface HotkeyEvent { - key: Hotkey; -} diff --git a/application/client/src/app/service/ilc/declarations/index.ts b/application/client/src/app/service/ilc/declarations/index.ts deleted file mode 100644 index a1b6b18814..0000000000 --- a/application/client/src/app/service/ilc/declarations/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { Hotkey, HotkeyEvent } from './hotkey'; -export { Popup } from './popup'; -export { IMenu, IMenuItem } from './contextmenu'; -export { AvailableSidebarTabs } from './sidebar'; -export { AvailableToolbarTabs } from './toolbar'; -export { BackendState, BackendStateEvent } from './backend/state'; -export { JobEvent } from './backend/job'; - -export * as UI from './ui'; diff --git a/application/client/src/app/service/ilc/declarations/popup.ts b/application/client/src/app/service/ilc/declarations/popup.ts deleted file mode 100644 index 1285142800..0000000000 --- a/application/client/src/app/service/ilc/declarations/popup.ts +++ /dev/null @@ -1 +0,0 @@ -export { Popup } from '@ui/service/popup'; diff --git a/application/client/src/app/service/ilc/declarations/sidebar.ts b/application/client/src/app/service/ilc/declarations/sidebar.ts deleted file mode 100644 index fb3269add5..0000000000 --- a/application/client/src/app/service/ilc/declarations/sidebar.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { Available as AvailableSidebarTabs } from '@ui/service/sidebar/register'; -export { AvailableSidebarTabs }; diff --git a/application/client/src/app/service/ilc/declarations/toolbar.ts b/application/client/src/app/service/ilc/declarations/toolbar.ts deleted file mode 100644 index 7c050c518c..0000000000 --- a/application/client/src/app/service/ilc/declarations/toolbar.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { Available as AvailableToolbarTabs } from '@ui/service/toolbar/register'; -export { AvailableToolbarTabs }; diff --git a/application/client/src/app/service/ilc/declarations/ui/index.ts b/application/client/src/app/service/ilc/declarations/ui/index.ts deleted file mode 100644 index 22999087a0..0000000000 --- a/application/client/src/app/service/ilc/declarations/ui/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { Rank } from './rank'; diff --git a/application/client/src/app/service/ilc/declarations/ui/rank.ts b/application/client/src/app/service/ilc/declarations/ui/rank.ts deleted file mode 100644 index 8ae95cfde2..0000000000 --- a/application/client/src/app/service/ilc/declarations/ui/rank.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface Rank { - len: number; - session: string; -} diff --git a/application/client/src/app/service/ilc/events.channel.ts b/application/client/src/app/service/ilc/events.channel.ts deleted file mode 100644 index 39bd1ec28f..0000000000 --- a/application/client/src/app/service/ilc/events.channel.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { Subject, Subscription } from '@platform/env/subscription'; -import { Events } from './events'; -import { Logger } from '@platform/log'; -import { Row } from '@schema/content/row'; -import { Base } from '../session/base'; -import { Session } from '../session/session'; - -import * as Declarations from './declarations'; - -export { Declarations }; - -export type Handler = (event: T) => void; -export type Subscriber = (handler: Handler) => Subscription; - -export class Channel { - public readonly system: { - init: (handler: Handler) => Subscription; - ready: (handler: Handler) => Subscription; - }; - public readonly backend: { - state: (handler: Handler) => Subscription; - job: (handler: Handler) => Subscription; - }; - public readonly session: { - closed: (handler: Handler) => Subscription; - open: (handler: Handler) => Subscription; - created: (handler: Handler) => Subscription; - change: (handler: Handler) => Subscription; - closing: (handler: Handler) => Subscription; - }; - public readonly ux: { - hotkey: (handler: Handler) => Subscription; - }; - public readonly ui: { - contextmenu: { - open: (handler: Handler) => Subscription; - close: (handler: Handler) => Subscription; - }; - popup: { - open: (handler: Handler) => Subscription; - close: (handler: Handler) => Subscription; - updated: (handler: Handler) => Subscription; - }; - toolbar: { - min: (handler: Handler) => Subscription; - max: (handler: Handler) => Subscription; - occupy: (handler: Handler) => Subscription; - state: ( - handler: Handler< - (state: { min: boolean; max: boolean; occupied: boolean; size: number }) => void - >, - ) => Subscription; - resize: (handler: Handler) => Subscription; - view: (handler: Handler) => Subscription; - }; - sidebar: { - min: (handler: Handler) => Subscription; - max: (handler: Handler) => Subscription; - resize: (handler: Handler) => Subscription; - view: (handler: Handler) => Subscription; - }; - window: { - resize: (handler: Handler) => Subscription; - }; - layout: { - resize: (handler: Handler) => Subscription; - }; - row: { - hover: (handler: Handler) => Subscription; - }; - input: { - focused: (handler: Handler) => Subscription; - blur: (handler: Handler) => Subscription; - }; - }; - private readonly _events: Events; - private readonly _owner: string; - private readonly _logger: Logger; - - private _subscriptions: Subscription[] = []; - - constructor(owner: string, events: Events, logger: Logger) { - this._owner = owner; - this._events = events; - this._logger = logger; - this.system = { - init: this._add(this._events.system.init), - ready: this._add(this._events.system.ready), - }; - this.backend = { - state: this._add(this._events.backend.state), - job: this._add(this._events.backend.job), - }; - this.session = { - closed: this._add(this._events.session.closed), - open: this._add(this._events.session.open), - created: this._add(this._events.session.created), - change: this._add(this._events.session.change), - closing: this._add(this._events.session.closing), - }; - this.ux = { - hotkey: this._add(this._events.ux.hotkey), - }; - this.ui = { - contextmenu: { - open: this._add(this._events.ui.contextmenu.open), - close: this._add(this._events.ui.contextmenu.close), - }, - popup: { - open: this._add(this._events.ui.popup.open), - close: this._add(this._events.ui.popup.close), - updated: this._add(this._events.ui.popup.updated), - }, - toolbar: { - min: this._add(this._events.ui.toolbar.min), - max: this._add(this._events.ui.toolbar.max), - occupy: this._add(this._events.ui.toolbar.occupy), - state: this._add< - (state: { min: boolean; max: boolean; occupied: boolean; size: number }) => void - >(this._events.ui.toolbar.state), - resize: this._add(this._events.ui.toolbar.resize), - view: this._add(this._events.ui.toolbar.view), - }, - sidebar: { - min: this._add(this._events.ui.sidebar.min), - max: this._add(this._events.ui.sidebar.max), - resize: this._add(this._events.ui.sidebar.resize), - view: this._add(this._events.ui.sidebar.view), - }, - window: { - resize: this._add(this._events.ui.window.resize), - }, - layout: { - resize: this._add(this._events.ui.layout.resize), - }, - row: { - hover: this._add(this._events.ui.row.hover), - }, - input: { - focused: this._add(this._events.ui.input.focused), - blur: this._add(this._events.ui.input.blur), - }, - }; - } - - public destroy() { - this._subscriptions.forEach((subscription) => { - subscription.destroy(); - }); - this._logger.verbose(`All subscription has beed destroyed`); - } - - private _add(subject: Subject): Subscriber { - const subscriptions = this._subscriptions; - return function (handler: Handler): Subscription { - const subscription = subject.subscribe(handler); - subscriptions.push(subscription); - return subscription; - }; - } -} diff --git a/application/client/src/app/service/ilc/events.emitter.ts b/application/client/src/app/service/ilc/events.emitter.ts deleted file mode 100644 index 255ac8ace6..0000000000 --- a/application/client/src/app/service/ilc/events.emitter.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { Subject, Subscription } from '@platform/env/subscription'; -import { Events } from './events'; -import { Logger } from '@platform/log'; -import { Row } from '@schema/content/row'; -import { Base } from '../session/base'; -import { Session } from '../session/session'; - -import * as Declarations from './declarations'; - -export { Declarations }; - -export type Handler = (event: T) => void; - -export class Emitter { - public readonly system: { - init: Handler; - ready: Handler; - }; - public readonly backend: { - state: Handler; - job: Handler; - }; - public readonly session: { - closed: Handler; - open: Handler; - created: Handler; - change: Handler; - closing: Handler; - }; - public readonly ux: { - hotkey: Handler; - }; - public readonly ui: { - contextmenu: { - open: Handler; - close: Handler; - }; - popup: { - open: Handler; - close: Handler; - updated: Handler; - }; - toolbar: { - min: Handler; - max: Handler; - occupy: Handler; - state: Handler< - (state: { min: boolean; max: boolean; occupied: boolean; size: number }) => void - >; - resize: Handler; - view: Handler; - }; - sidebar: { - min: Handler; - max: Handler; - resize: Handler; - view: Handler; - }; - window: { - resize: Handler; - }; - layout: { - resize: Handler; - }; - row: { - hover: Handler; - }; - input: { - focused: Handler; - blur: Handler; - }; - }; - private readonly _events: Events; - private readonly _owner: string; - private readonly _logger: Logger; - - private _subscriptions: Subscription[] = []; - - constructor(owner: string, events: Events, logger: Logger) { - this._owner = owner; - this._events = events; - this._logger = logger; - this.system = { - init: this._add(this._events.system.init), - ready: this._add(this._events.system.ready), - }; - this.backend = { - state: this._add(this._events.backend.state), - job: this._add(this._events.backend.job), - }; - this.session = { - closed: this._add(this._events.session.closed), - open: this._add(this._events.session.open), - created: this._add(this._events.session.created), - change: this._add(this._events.session.change), - closing: this._add(this._events.session.closing), - }; - this.ux = { - hotkey: this._add(this._events.ux.hotkey), - }; - this.ui = { - contextmenu: { - open: this._add(this._events.ui.contextmenu.open), - close: this._add(this._events.ui.contextmenu.close), - }, - popup: { - open: this._add(this._events.ui.popup.open), - close: this._add(this._events.ui.popup.close), - updated: this._add(this._events.ui.popup.updated), - }, - toolbar: { - min: this._add(this._events.ui.toolbar.min), - max: this._add(this._events.ui.toolbar.max), - occupy: this._add(this._events.ui.toolbar.occupy), - state: this._add< - (state: { min: boolean; max: boolean; occupied: boolean; size: number }) => void - >(this._events.ui.toolbar.state), - resize: this._add(this._events.ui.toolbar.resize), - view: this._add(this._events.ui.toolbar.view), - }, - sidebar: { - min: this._add(this._events.ui.sidebar.min), - max: this._add(this._events.ui.sidebar.max), - resize: this._add(this._events.ui.sidebar.resize), - view: this._add(this._events.ui.sidebar.view), - }, - window: { - resize: this._add(this._events.ui.window.resize), - }, - layout: { - resize: this._add(this._events.ui.layout.resize), - }, - row: { - hover: this._add(this._events.ui.row.hover), - }, - input: { - focused: this._add(this._events.ui.input.focused), - blur: this._add(this._events.ui.input.blur), - }, - }; - } - - public destroy() { - this._subscriptions.forEach((subscription) => { - subscription.destroy(); - }); - this._logger.verbose(`All subscription has beed destroyed`); - } - - private _add(subject: Subject): Handler { - return function (event: T): void { - subject.emit(event); - }; - } -} diff --git a/application/client/src/app/service/ilc/events.ts b/application/client/src/app/service/ilc/events.ts deleted file mode 100644 index 9425b53f44..0000000000 --- a/application/client/src/app/service/ilc/events.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { Subject } from '@platform/env/subscription'; -import { Row } from '@schema/content/row'; -import { Base } from '../session/base'; -import { Session } from '../session/session'; - -import * as Declarations from './declarations'; - -export { Declarations }; - -export class Events { - public readonly system: { - init: Subject; - ready: Subject; - }; - public readonly backend: { - state: Subject; - job: Subject; - }; - public readonly session: { - closed: Subject; - open: Subject; - created: Subject; - change: Subject; - closing: Subject; - }; - public readonly ux: { - hotkey: Subject; - }; - public readonly ui: { - contextmenu: { - open: Subject; - close: Subject; - }; - popup: { - open: Subject; - close: Subject; - updated: Subject; - }; - toolbar: { - min: Subject; - max: Subject; - occupy: Subject; - state: Subject< - (state: { min: boolean; max: boolean; occupied: boolean; size: number }) => void - >; - resize: Subject; - view: Subject; - }; - sidebar: { - min: Subject; - max: Subject; - resize: Subject; - view: Subject; - }; - window: { - resize: Subject; - }; - layout: { - resize: Subject; - }; - row: { - hover: Subject; - }; - input: { - focused: Subject; - blur: Subject; - }; - }; - - private _subjects: Subject[] = []; - - constructor() { - this.system = { - init: this._add(new Subject()), - ready: this._add(new Subject()), - }; - this.backend = { - state: this._add( - new Subject(), - ), - job: this._add(new Subject()), - }; - this.ux = { - hotkey: this._add(new Subject()), - }; - this.session = { - closed: this._add(new Subject()), - open: this._add(new Subject()), - created: this._add(new Subject()), - change: this._add(new Subject()), - closing: this._add(new Subject()), - }; - this.ui = { - contextmenu: { - open: this._add(new Subject()), - close: this._add(new Subject()), - }, - popup: { - open: this._add(new Subject()), - close: this._add(new Subject()), - updated: this._add(new Subject()), - }, - toolbar: { - min: this._add(new Subject()), - max: this._add(new Subject()), - occupy: this._add(new Subject()), - state: this._add< - (state: { min: boolean; max: boolean; occupied: boolean; size: number }) => void - >( - new Subject< - (state: { - min: boolean; - max: boolean; - occupied: boolean; - size: number; - }) => void - >(), - ), - resize: this._add(new Subject()).balanced(25), - view: this._add( - new Subject(), - ), - }, - sidebar: { - min: this._add(new Subject()), - max: this._add(new Subject()), - resize: this._add(new Subject()).balanced(25), - view: this._add( - new Subject(), - ), - }, - window: { - resize: this._add(new Subject().balanced(25)), - }, - layout: { - resize: this._add(new Subject()), - }, - input: { - focused: this._add(new Subject()), - blur: this._add(new Subject()), - }, - row: { - hover: this._add(new Subject()), - }, - }; - } - - public destroy() { - this._subjects.forEach((subject) => { - subject.destroy(); - }); - } - - private _add(subject: Subject): Subject { - this._subjects.push(subject as Subject); - return subject; - } -} diff --git a/application/client/src/app/service/ilc/services.ts b/application/client/src/app/service/ilc/services.ts deleted file mode 100644 index e1596d73d3..0000000000 --- a/application/client/src/app/service/ilc/services.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { popup, Service as UIPopupService } from '@ui/service/popup'; -import { notifications, Service as UINotificationsService } from '@ui/service/notifications'; -import { contextmenu, Service as UIContextmenuService } from '@ui/service/contextmenu'; -import { layout, Service as UILayoutService } from '@ui/service/layout'; -import { toolbar, Service as UIToolbarService } from '@ui/service/toolbar'; -import { sidebar, Service as UISidebarService } from '@ui/service/sidebar'; -import { styles, Service as UIStylesService } from '@ui/service/styles'; -import { session, Service as SessionService } from '@service/session'; -import { jobs, Service as JobsService } from '@service/jobs'; -import { state, Service as StateService } from '@service/state'; -import { bridge, Service as BridgeService } from '@service/bridge'; -import { recent, Service as RecentService } from '@service/recent'; -import { hotkeys, Service as HotkeysService } from '@service/hotkeys'; -import { history, Service as HistoryService } from '@service/history'; -import { listener, Service as ListenerService } from '@ui/service/listener'; -import { lockers, Service as LockersService } from '@ui/service/lockers'; -import { dropfiles, Service as DragAndDropFilesService } from '@ui/service/dropfiles'; -import { env, Service as EnvService } from '@service/env'; -import { actions, Service as ActionsService } from '@service/actions'; -import { settings, Service as Settings } from '@service/settings'; -import { favorites, Service as Favorites } from '@service/favorites'; -import { sys, Service as Sys } from '@service/sys'; -import { changelogs, Service as Changelogs } from '@service/changelogs'; -import { plugins, Service as Plugins } from '@service/plugins'; - -import { Logger } from '@platform/log'; - -export class Services { - public readonly system: { - session: SessionService; - state: StateService; - jobs: JobsService; - bridge: BridgeService; - recent: RecentService; - hotkeys: HotkeysService; - history: HistoryService; - env: EnvService; - actions: ActionsService; - settings: Settings; - favorites: Favorites; - sys: Sys; - changelogs: Changelogs; - plugins: Plugins; - }; - public readonly ui: { - popup: UIPopupService; - notifications: UINotificationsService; - contextmenu: UIContextmenuService; - layout: UILayoutService; - toolbar: UIToolbarService; - sidebar: UISidebarService; - styles: UIStylesService; - listener: ListenerService; - lockers: LockersService; - dropfiles: DragAndDropFilesService; - }; - - private readonly _owner: string; - private readonly _logger: Logger; - - constructor(owner: string, logger: Logger) { - this._owner = owner; - this._logger = logger; - this.system = { - session, - state, - jobs, - bridge, - recent, - hotkeys, - history, - env, - actions, - settings, - favorites, - sys, - changelogs, - plugins, - }; - this.ui = { - popup, - notifications, - contextmenu, - layout, - toolbar, - sidebar, - styles, - listener, - lockers, - dropfiles, - }; - } -} diff --git a/application/client/src/app/service/jobs.ts b/application/client/src/app/service/jobs.ts deleted file mode 100644 index 1278745bf6..0000000000 --- a/application/client/src/app/service/jobs.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { Job } from './jobs/job'; -import { services } from '@register/services'; -import { ilc, Emitter } from '@service/ilc'; - -import * as Events from '@platform/ipc/event/index'; - -export { Job }; - -@SetupService(services['jobs']) -export class Service extends Implementation { - private _emitter!: Emitter; - private _jobs: Map> = new Map(); - - public override ready(): Promise { - this._emitter = ilc.emitter(this.getName(), this.log()); - this.register( - Events.IpcEvent.subscribe(Events.State.Job.Event, (event) => { - let job = this.find(event.uuid); - if (job === undefined) { - job = new Job({ - session: event.session, - uuid: event.uuid, - name: event.name, - desc: event.desc, - progress: event.progress, - spinner: event.spinner, - }); - } else { - job.update(event); - } - let jobs = this._jobs.get(job.session); - if (jobs === undefined) { - jobs = new Map(); - } - jobs.set(job.uuid, job); - this._jobs.set(job.session, jobs); - this._emitter.backend.job(job); - }), - ); - return Promise.resolve(); - } - - public override destroy(): Promise { - this.unsubscribe(); - return Promise.resolve(); - } - - public find(uuid: string): Job | undefined { - let target: Job | undefined; - Array.from(this._jobs.values()).forEach((jobs) => { - if (target !== undefined) { - return; - } - target = Array.from(jobs.values()).find((j) => j.uuid === uuid); - }); - return target; - } - - public session(session: string): Job[] { - const jobs = this._jobs.get(session); - if (jobs === undefined) { - return []; - } else { - return Array.from(jobs.values()); - } - } - - public globals(): Job[] { - const jobs = this._jobs.get(Job.GLOBAL_JOBS); - if (jobs === undefined) { - return []; - } else { - return Array.from(jobs.values()); - } - } -} -export interface Service extends Interface {} -export const jobs = register(new Service()); diff --git a/application/client/src/app/service/jobs/job.ts b/application/client/src/app/service/jobs/job.ts deleted file mode 100644 index 3633e1c66f..0000000000 --- a/application/client/src/app/service/jobs/job.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { unique } from '@platform/env/sequence'; -import * as validator from '@platform/env/obj'; - -export interface IJob { - uuid: string; - progress: number; - session?: string; - desc?: string; -} - -export class Job { - static GLOBAL_JOBS = `___global_jobs___`; - - public uuid: string; - public progress = 0; - public spinner: boolean; - public session: string; - public name?: string; - public desc?: string; - public icon?: string; - - constructor(job: { - uuid?: string; - session?: string; - name?: string; - desc?: string; - progress?: number; - icon?: string; - spinner?: boolean; - }) { - this.uuid = job.uuid !== undefined ? job.uuid : unique(); - this.session = validator.getAsNotEmptyStringOrAsUndefined(job, 'session'); - this.name = validator.getAsNotEmptyStringOrAsUndefined(job, 'name'); - this.desc = validator.getAsNotEmptyStringOrAsUndefined(job, 'desc'); - this.icon = validator.getAsNotEmptyStringOrAsUndefined(job, 'icon'); - this.progress = validator.getAsValidNumber(job, 'progress', { - defaults: 0, - max: 100, - min: 0, - }); - this.spinner = typeof job.spinner === 'boolean' ? job.spinner : false; - this.session = this.session === undefined ? Job.GLOBAL_JOBS : this.session; - } - - public update(job: { name?: string; desc?: string; progress?: number; icon?: string }) { - this.desc = job.desc !== undefined ? job.desc : this.desc; - this.name = job.name !== undefined ? job.name : this.name; - this.progress = job.progress !== undefined ? job.progress : this.progress; - this.icon = job.icon !== undefined ? job.icon : this.icon; - } - - public isDone(): boolean { - return this.progress === 100; - } -} diff --git a/application/client/src/app/service/plugins.ts b/application/client/src/app/service/plugins.ts deleted file mode 100644 index e83e18a183..0000000000 --- a/application/client/src/app/service/plugins.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { services } from '@register/services'; -import { InvalidPluginEntity, PluginEntity, PluginRunData } from '@platform/types/bindings/plugins'; - -import * as Requests from '@platform/ipc/request/index'; - -@SetupService(services['plugins']) -export class Service extends Implementation { - protected preload: PluginEntity[] = []; - - public override ready(): Promise { - return this.list() - .installed() - .then((plugins) => { - this.preload = plugins; - }) - .catch((err: Error) => { - this.log().error(`Fail load installed plugins list: ${err.message}`); - }); - } - - public list(): { - installed(): Promise; - invalid(): Promise; - preload(): PluginEntity[]; - } { - return { - installed: (): Promise => { - return new Promise((reslove, reject) => { - Requests.IpcRequest.send( - Requests.Plugins.ListInstalled.Response, - new Requests.Plugins.ListInstalled.Request(), - ) - .then((response: Requests.Plugins.ListInstalled.Response) => { - reslove(response.plugins); - }) - .catch(reject); - }); - }, - invalid: (): Promise => { - return new Promise((reslove, reject) => { - Requests.IpcRequest.send( - Requests.Plugins.ListInvalid.Response, - new Requests.Plugins.ListInvalid.Request(), - ) - .then((response: Requests.Plugins.ListInvalid.Response) => { - reslove(response.invalidPlugins); - }) - .catch(reject); - }); - }, - preload: (): PluginEntity[] => { - return this.preload; - }, - }; - } - - public listInstalledPaths(): Promise { - return new Promise((reslove, reject) => { - Requests.IpcRequest.send( - Requests.Plugins.ListInstalledPaths.Response, - new Requests.Plugins.ListInstalledPaths.Request(), - ) - .then((response: Requests.Plugins.ListInstalledPaths.Response) => { - reslove(response.paths); - }) - .catch(reject); - }); - } - - public listInvalidPaths(): Promise { - return new Promise((reslove, reject) => { - Requests.IpcRequest.send( - Requests.Plugins.ListInvalidPaths.Response, - new Requests.Plugins.ListInvalidPaths.Request(), - ) - .then((response: Requests.Plugins.ListInvalidPaths.Response) => { - reslove(response.paths); - }) - .catch(reject); - }); - } - - public installedPluginInfo(pluginPath: string): Promise { - return new Promise((reslove, reject) => { - Requests.IpcRequest.send( - Requests.Plugins.InstalledPluginInfo.Response, - new Requests.Plugins.InstalledPluginInfo.Request({ pluginPath }), - ) - .then((response: Requests.Plugins.InstalledPluginInfo.Response) => { - reslove(response.plugin); - }) - .catch(reject); - }); - } - - public invalidPluginInfo(pluginPath: string): Promise { - return new Promise((reslove, reject) => { - Requests.IpcRequest.send( - Requests.Plugins.InvalidPluginInfo.Response, - new Requests.Plugins.InvalidPluginInfo.Request({ pluginPath }), - ) - .then((response: Requests.Plugins.InvalidPluginInfo.Response) => { - reslove(response.invalidPlugin); - }) - .catch(reject); - }); - } - - public getPluginRunData(pluginPath: string): Promise { - return new Promise((reslove, reject) => { - Requests.IpcRequest.send( - Requests.Plugins.PluginRunData.Response, - new Requests.Plugins.PluginRunData.Request({ pluginPath }), - ) - .then((response: Requests.Plugins.PluginRunData.Response) => { - reslove(response.data); - }) - .catch(reject); - }); - } - - public reloadPlugins(): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Plugins.Reload.Response, - new Requests.Plugins.Reload.Request(), - ) - .then(() => { - // To drop a cache to updated list - this.ready().catch(reject).finally(resolve); - }) - .catch(reject); - }); - } - - public addPlugin(pluginPath: string): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Plugins.AddPlugin.Response, - new Requests.Plugins.AddPlugin.Request({ pluginPath }), - ) - .then(() => { - // To drop a cache to update list. - this.ready().catch(reject).finally(resolve); - }) - .catch(reject); - }); - } - - public removePlugin(pluginPath: string): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Plugins.RemovePlugin.Response, - new Requests.Plugins.RemovePlugin.Request({ pluginPath }), - ) - .then(() => { - // To drop a cache to update list. - this.ready().catch(reject).finally(resolve); - }) - .catch(reject); - }); - } -} - -export interface Service extends Interface {} -export const plugins = register(new Service()); diff --git a/application/client/src/app/service/recent.ts b/application/client/src/app/service/recent.ts deleted file mode 100644 index 07116f3e53..0000000000 --- a/application/client/src/app/service/recent.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { - SetupService, - Interface, - Implementation, - register, - DependOn, -} from '@platform/entity/service'; -import { services } from '@register/services'; -import { bridge } from '@service/bridge'; -import { Action } from './recent/action'; -import { error } from '@platform/log/utils'; -import { Subject } from '@platform/env/subscription'; - -import * as $ from '@platform/types/observe'; - -const STORAGE_KEY = 'user_recent_actions'; - -@DependOn(bridge) -@SetupService(services['recent']) -export class Service extends Implementation { - public readonly updated: Subject = new Subject(); - - public override destroy(): Promise { - this.updated.destroy(); - return super.destroy(); - } - - public async get(): Promise { - const entries = await bridge.entries({ key: STORAGE_KEY }).get(); - const actions = entries - .map((entry) => { - const action = Action.from(entry); - if (action instanceof Error) { - this.log().error(`Fail to read action: ${error(action)}`); - return undefined; - } else { - return action; - } - }) - .filter((a) => a !== undefined) as Action[]; - const invalid = actions.filter((a) => a.compatibility.invalidUuid !== undefined); - if (invalid.length > 0) { - await this.delete(invalid.map((a) => a.compatibility.invalidUuid as string)) - .then(() => { - this.log().debug( - `${invalid.length} actions with invalid UUIDs has been removed`, - ); - }) - .catch((err: Error) => { - this.log().error( - `Fail to remove recent actions with invalid uuid: ${err.message}`, - ); - }); - } - const converted = actions.filter((a) => a.compatibility.converted); - if (converted.length > 0) { - await this.update(converted) - .then(() => { - this.log().debug(`${converted.length} converted actions has been updated`); - }) - .catch((err: Error) => { - this.log().error(`Fail to update converted recent actions: ${err.message}`); - }); - } - return actions; - } - - public async update(actions: Action[]): Promise { - if (actions.length === 0) { - return; - } - const stored = await this.get(); - actions.forEach((action) => { - const found = stored.find((a) => a.uuid === action.uuid); - if (found === undefined) { - return; - } - action.merge(found); - }); - return bridge - .entries({ key: STORAGE_KEY }) - .update(actions.map((a) => a.entry().to())) - .then(() => { - this.updated.emit(); - }) - .catch((err: Error) => { - this.log().error(`Fail to update recent storage: ${err.message}`); - }); - } - - public delete(uuids: string[]): Promise { - return new Promise((resolve, reject) => { - bridge - .entries({ key: STORAGE_KEY }) - .delete(uuids) - .then(() => { - this.updated.emit(); - resolve(); - }) - .catch((err: Error) => { - reject(err); - }); - }); - } - - public add(observe: $.Observe): Promise { - const action = new Action(observe); - return this.update([action]); - } -} -export interface Service extends Interface {} -export const recent = register(new Service()); diff --git a/application/client/src/app/service/recent/action.ts b/application/client/src/app/service/recent/action.ts deleted file mode 100644 index f7965aa74a..0000000000 --- a/application/client/src/app/service/recent/action.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { Entry } from '@platform/types/storage/entry'; -import { error } from '@platform/log/utils'; -import { session } from '@service/session'; -import { lockers, Locker } from '@ui/service/lockers'; -import { Stat, IStat } from './stat'; -import { recent } from '@service/recent'; -import { scope } from '@platform/env/scope'; -import { Logger } from '@platform/log'; - -import * as $ from '@platform/types/observe'; -import * as compatibility from './compatibility'; - -interface IActionContent { - stat: IStat; - observe: $.IObserve; -} - -export class Action { - static from(entry: Entry): Action | Error { - const action = new Action($.Observe.new()); - const error = action.entry().from(entry); - return error instanceof Error ? error : action; - } - - protected logger: Logger; - - public stat: Stat = Stat.defaults(); - public uuid: string; - public compatibility: { - converted: boolean; - invalidUuid: string | undefined; - } = { - converted: false, - invalidUuid: undefined, - }; - - constructor(public observe: $.Observe) { - this.uuid = observe.signature(); - this.logger = scope.getLogger(`Action: ${this.uuid}`); - } - - public isSuitable(observe?: $.Observe): boolean { - if (observe === undefined) { - return true; - } - if (observe.origin.nature().alias() !== this.observe.origin.nature().alias()) { - return false; - } - return this.observe.parser.alias() === observe.parser.alias(); - } - - public description(): $.Description.IOriginDetails { - return this.observe.origin.desc(); - } - - public entry(): { - from(entry: Entry): Error | undefined; - to(): Entry; - } { - return { - from: (entry: Entry): Error | undefined => { - try { - const body: IActionContent = JSON.parse(entry.content); - if (body.observe === undefined) { - // Check previous version (chipmunk <= 3.8.1) - this.observe = compatibility.from_3_8_1(entry); - this.compatibility.converted = true; - } else { - const observe = new $.Observe(body.observe); - this.observe = observe; - } - this.stat = Stat.from(body.stat); - this.uuid = this.observe.signature(); - this.compatibility.invalidUuid = - entry.uuid !== this.uuid ? entry.uuid : undefined; - return undefined; - } catch (err) { - return new Error(`Fail to parse action: ${error(err)}`); - } - }, - to: (): Entry => { - return { - uuid: this.uuid, - content: JSON.stringify({ - stat: this.stat.asObj(), - observe: this.observe.storable(), - } as IActionContent), - }; - }, - }; - } - - public getActions(): { caption?: string; handler?: () => void }[] { - const observe = this.observe; - const configurable = observe.isConfigurable(); - const nature = observe.origin.nature().desc(); - return [ - // **Note**: Recent actions isn't supported yet for plugins. Support of this - // feature will be included with general refactoring of Observe Configuration - // and a way to delivery available parser/source to client - ...(nature.type === $.Description.OriginType.plugin - ? [] - : [ - { - caption: ((): string => { - switch (nature.type) { - case $.Description.OriginType.file: - return 'Open with recent configuration'; - case $.Description.OriginType.net: - case $.Description.OriginType.serial: - return 'Connect with recent configuration'; - case $.Description.OriginType.command: - return 'Execute with recent configuration'; - } - })(), - handler: this.apply.bind(this), - }, - ]), - ...(configurable - ? [ - { - caption: 'Open with new configuration', - handler: () => { - session - .initialize() - .configure(observe) - .catch((err: Error) => { - this.logger.error( - `Fail to configure observe object: ${err.message}`, - ); - }); - }, - }, - ] - : []), - ]; - } - - public remove(): Promise { - return recent.delete([this.uuid]).catch((err: Error) => { - this.logger.error(`Fail to remove recent action: ${err.message}`); - }); - } - - public apply(): Promise { - return session - .initialize() - .auto(this.observe.locker().lock()) - .then(() => { - return undefined; - }) - .catch((err: Error) => { - const message = lockers.lock( - new Locker(false, `Fail to apply action via error: ${err.message}`) - .set() - .buttons([ - { - caption: `Remove`, - handler: () => { - this.remove().finally(() => { - message.popup.close(); - }); - }, - }, - { - caption: `Cancel`, - handler: () => { - message.popup.close(); - }, - }, - ]) - .end(), - { - closable: false, - }, - ); - }); - } - - public merge(action: Action): void { - this.stat = action.stat; - this.stat.update(); - } -} diff --git a/application/client/src/app/service/recent/compatibility.ts b/application/client/src/app/service/recent/compatibility.ts deleted file mode 100644 index 2fe1e9c08c..0000000000 --- a/application/client/src/app/service/recent/compatibility.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Entry } from '@platform/types/storage/entry'; - -import * as $ from '@platform/types/observe'; -import * as Factory from '@platform/types/observe/factory'; - -// Interface belong to >= 3.8.1 -interface IDLTFilters { - app_ids?: string[]; - context_ids?: string[]; - ecu_ids?: string[]; -} - -// Interface belong to >= 3.8.1 -interface IDLTOptions { - logLevel: number; - filters: IDLTFilters; - fibex: string[]; - tz?: string; -} - -export function optionsToParserSettings( - options: IDLTOptions, - with_storage_header: boolean, - app_id_count: number, - context_id_count: number, -): $.Parser.Dlt.IConfiguration { - const filter_config: $.Parser.Dlt.IFilters = { - min_log_level: options.logLevel, - app_ids: options.filters.app_ids, - context_ids: options.filters.context_ids, - ecu_ids: options.filters.ecu_ids, - app_id_count, - context_id_count, - }; - return { - filter_config, - fibex_file_paths: options.fibex.length > 0 ? options.fibex : undefined, - with_storage_header, - tz: undefined, - }; -} - -// This function has to be removed since v 3.9.x or 3.10.x (after a couple of -// update iterations) -export function from_3_8_1(entry: Entry): $.Observe { - const action = JSON.parse(entry.content); - let observe; - if (action['file'] !== undefined) { - if (action['file']['dlt'] !== undefined) { - observe = new Factory.File() - .asDlt(optionsToParserSettings(action['file']['dlt'], true, 0, 0)) - .type($.Types.File.FileType.Binary) - .file(action['file']['filename']) - .get(); - } else if (action['file']['pcap'] !== undefined) { - observe = new Factory.File() - .asDlt(optionsToParserSettings(action['file']['pcap']['dlt'], true, 0, 0)) - .type($.Types.File.FileType.PcapNG) - .file(action['file']['filename']) - .get(); - } else { - observe = new Factory.File() - .asText() - .file(action['file']['filename']) - .type($.Types.File.FileType.Text) - .get(); - } - } else if (action['dlt_stream'] !== undefined) { - const defs = action['dlt_stream']; - const source = defs['source']; - const preconstructed = new Factory.Stream().asDlt( - optionsToParserSettings(defs['options'], false, 0, 0), - ); - if (source['process'] !== undefined) { - preconstructed.process(source['process']); - } else if (source['serial'] !== undefined) { - preconstructed.serial(source['serial']); - } else if (source['tcp'] !== undefined) { - preconstructed.tcp(source['tcp']); - } else if (source['udp'] !== undefined) { - preconstructed.udp(source['udp']); - } else { - throw new Error(`Unknonw type of source for stream.`); - } - observe = preconstructed.get(); - } else if (action['text_stream'] !== undefined) { - const defs = action['text_stream']; - const source = defs['source']; - const preconstructed = new Factory.Stream().asText(); - if (source['process'] !== undefined) { - preconstructed.process(source['process']); - } else if (source['serial'] !== undefined) { - preconstructed.serial(source['serial']); - } else if (source['tcp'] !== undefined) { - preconstructed.tcp(source['tcp']); - } else if (source['udp'] !== undefined) { - preconstructed.udp(source['udp']); - } else { - throw new Error(`Unknonw type of source for stream.`); - } - observe = preconstructed.get(); - } else { - throw new Error(`Unknonw type of action.`); - } - const error = observe.validate(); - if (error instanceof Error) { - throw error; - } - return observe; -} diff --git a/application/client/src/app/service/recent/stat.ts b/application/client/src/app/service/recent/stat.ts deleted file mode 100644 index a1d1274113..0000000000 --- a/application/client/src/app/service/recent/stat.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { error } from '@platform/log/utils'; -import { scope } from '@platform/env/scope'; - -import * as obj from '@platform/env/obj'; - -export interface IStat { - used: number; - last: number; - size: number | undefined; -} - -export class Stat { - public static from(inputs: IStat): Stat { - try { - return new Stat({ - size: obj.getAsValidNumberOrUndefined(inputs, 'size'), - last: obj.getAsValidNumber(inputs, 'last'), - used: obj.getAsValidNumber(inputs, 'used'), - }); - } catch (e) { - scope.getLogger(`RecentStat`).warn(`Stat of recent action parsing error: ${error(e)}`); - return Stat.defaults(); - } - } - - public static defaults(): Stat { - return new Stat({ - size: undefined, - used: 0, - last: Date.now(), - }); - } - - public used: number = 0; - public last: number = Date.now(); - public size: number | undefined; - - constructor(stat: IStat) { - this.size = stat.size; - this.used = stat.used; - this.last = stat.last; - } - - public update(): Stat { - this.used += 1; - this.last = Date.now(); - return this; - } - - public asObj(): IStat { - return { - used: this.used, - last: this.last, - size: this.size, - }; - } - - public score(): { - usage(): number; - recent(): number; - mixed(): number; - } { - return { - usage: (): number => { - return this.used; - }, - recent: (): number => { - return this.last; - }, - mixed: (): number => { - const now = Date.now(); - const days = Math.ceil( - (now - this.last <= 0 ? 1 : now - this.last) / 1000 / 60 / 60 / 24, - ); - return this.used * (1 / days); - }, - }; - } -} diff --git a/application/client/src/app/service/session.ts b/application/client/src/app/service/session.ts deleted file mode 100644 index 56e91b57ca..0000000000 --- a/application/client/src/app/service/session.ts +++ /dev/null @@ -1,395 +0,0 @@ -import { - SetupService, - Interface, - Implementation, - register, - DependOn, -} from '@platform/entity/service'; -import { services } from '@register/services'; -import { ilc, Emitter, Channel } from '@service/ilc'; -import { TabsService, ITab, ITabAPI } from '@elements/tabs/service'; -import { Base } from './session/base'; -import { Session } from './session/session'; -import { UnboundTab } from './session/unbound'; -import { LockToken } from '@platform/env/lock.token'; -import { components } from '@env/decorators/initial'; -import { TabControls } from './session/tab'; -import { unique } from '@platform/env/sequence'; -import { history } from '@service/history'; -import { Render } from '@schema/render'; -import { File } from '@platform/types/files'; -import { Observe } from '@platform/types/observe'; -import { getRender } from '@schema/render/tools'; -import { TabObserve } from '@tabs/observe/component'; -import { recent } from '@service/recent'; -import { bridge } from '@service/bridge'; - -import * as Factory from '@platform/types/observe/factory'; - -export { Session, TabControls, UnboundTab, Base }; - -@DependOn(history) -@SetupService(services['session']) -export class Service extends Implementation { - private _emitter!: Emitter; - private _channel!: Channel; - private _active: Base | undefined; - private _sessions: Map = new Map(); - private _tabs: TabsService = new TabsService(); - private _locker: LockToken = LockToken.simple(true); - - public override ready(): Promise { - this._emitter = ilc.emitter(this.getName(), this.log()); - this._channel = ilc.channel(this.getName(), this.log()); - this._channel.system.ready(() => { - this.log().debug(`Session is unlocked`); - this._locker.unlock(); - }); - this._tabs.subjects.get().active.subscribe((next) => { - this._active = this._sessions.get(next.uuid); - this._emitter.session.change( - this._active === undefined ? undefined : this._active.uuid(), - ); - }); - this._tabs.subjects.get().removed.subscribe(this.kill.bind(this)); - return Promise.resolve(); - } - - public override async destroy(): Promise { - this._emitter.destroy(); - this._channel.destroy(); - await super.destroy(); - if (this._sessions.size > 0) { - throw new Error( - `Destroy is called with existed sessions. Count of opened session ${this._sessions.size}`, - ); - } - } - - public async closeAllSessions(): Promise { - this.log().debug(`All sessions will be closed`); - for (const session of Array.from(this._sessions.values())) { - const uuid = session.uuid(); - await this.kill(uuid).catch((err: Error) => { - this.log().error(`Fail to close session "${uuid}": ${err.message}`); - }); - } - this.log().debug(`All sessions are closed`); - } - - public kill(uuid: string): Promise { - return new Promise((resolve) => { - const session = this._sessions.get(uuid); - if (session === undefined) { - return resolve(); - } - this._emitter.session.closing(session); - session - .destroy() - .catch((err: Error) => { - this.log().error(`Fail to remove session: ${err.message}`); - }) - .finally(() => { - this._sessions.delete(uuid); - this._emitter.session.closed(uuid); - resolve(); - }); - }); - } - - public add(bind = true): { - empty: (render: Render) => Promise; - unbound: (opts: { - tab: ITab; - sidebar?: boolean; - toolbar?: boolean; - uuid?: string; - }) => UnboundTab; - tab: (tab: ITab) => ITabAPI | undefined; - } { - const binding = (uuid: string, session: Session, caption: string) => { - this._sessions.set(uuid, session); - if (!bind) { - return; - } - this.bind(uuid, caption); - this._emitter.session.open(session); - }; - return { - empty: (render: Render): Promise => { - if (this._locker.isLocked()) { - return Promise.reject(new Error(`Sessions aren't available yet`)); - } - return new Promise((resolve, reject) => { - this.create(render) - .then((session: Session) => { - binding(session.uuid(), session, 'Empty'); - resolve(session); - }) - .catch((err: Error) => { - this.log().error(`Fail to add session; error: ${err.message}`); - session - .destroy() - .catch((err) => - this.log().warn(`Fail to destroy session: ${err.message}`), - ); - reject(err); - }); - }); - }, - tab: (tab: ITab): ITabAPI | undefined => { - if (tab.uuid !== undefined && this._tabs.has(tab.uuid)) { - this._tabs.setActive(tab.uuid); - return undefined; - } else { - if (tab.content !== undefined) { - tab.content.inputs = - tab.content.inputs === undefined ? {} : tab.content.inputs; - tab.content.inputs.tab = new TabControls(tab, this._tabs); - } - return this._tabs.add(tab); - } - }, - unbound: (opts: { - tab: ITab; - sidebar?: boolean; - toolbar?: boolean; - uuid?: string; - }): UnboundTab => { - if (opts.uuid !== undefined && this._sessions.has(opts.uuid)) { - throw new Error(this.log().error(`Tab "${opts.uuid}" already exists`)); - } - opts.uuid = opts.uuid !== undefined ? opts.uuid : unique(); - opts.tab.uuid = opts.tab.uuid !== undefined ? opts.tab.uuid : opts.uuid; - const unbound = new UnboundTab(opts); - this._sessions.set(unbound.uuid(), unbound); - unbound.bind(this._tabs.add(opts.tab)); - return unbound; - }, - }; - } - - public bind(uuid: string, caption: string, makeActive = true): Error | undefined { - const session = this._sessions.get(uuid); - if (session === undefined) { - return new Error(`Session doesn't exist`); - } - if (!this._tabs.has(uuid)) { - session.bind( - this._tabs.add({ - uuid: uuid, - content: { - factory: components.get('app-views-workspace'), - inputs: { - session: session, - }, - }, - name: caption, - active: true, - }), - ); - } - makeActive && this._emitter.session.change(uuid); - return undefined; - } - - public getTabsService(): TabsService { - return this._tabs; - } - - public active(): { - base(): Base | undefined; - session(): Session | undefined; - unbound(): UnboundTab | undefined; - is(uuid: string): boolean; - } { - return { - base: (): Base | undefined => { - return this._active; - }, - session: (): Session | undefined => { - return this._active instanceof Session ? this._active : undefined; - }, - unbound: (): UnboundTab | undefined => { - return this._active instanceof UnboundTab ? this._active : undefined; - }, - is: (uuid: string): boolean => { - return this._active === undefined ? false : this._active.uuid() === uuid; - }, - }; - } - - public get(uuid: string): Session | undefined { - const smth = this._sessions.get(uuid); - return smth instanceof Session ? smth : undefined; - } - - public initialize(): { - suggest(filename: string, session?: Session): Promise; - auto(observe: Observe, session?: Session): Promise; - configure(observe: Observe, session?: Session): Promise; - observe(observe: Observe, session?: Session): Promise; - multiple(files: File[]): Promise; - } { - return { - suggest: (filename: string, session?: Session): Promise => { - return bridge - .files() - .isBinary(filename) - .then((binary: boolean) => { - if (!binary) { - return this.initialize().observe( - new Factory.File() - .type(Factory.FileType.Text) - .asText() - .file(filename) - .get(), - session, - ); - } else { - return this.initialize().configure( - new Factory.File() - .type(Factory.FileType.Binary) - .file(filename) - .get(), - session, - ); - } - }); - }, - auto: (observe: Observe, session?: Session): Promise => { - return observe.locker().is() - ? this.initialize().observe(observe, session) - : this.initialize().configure(observe, session); - }, - configure: (observe: Observe, session?: Session): Promise => { - return new Promise((resolve) => { - const api = this.add().tab({ - name: observe.origin.title(), - content: { - factory: TabObserve, - inputs: TabObserve.inputs({ - observe, - api: { - finish: (observe: Observe): Promise => { - return new Promise((success, failed) => { - this.initialize() - .observe(observe, session) - .then((session) => { - success(); - api?.close(); - resolve(session); - }) - .catch((err: Error) => { - failed(err); - }); - }); - }, - cancel: (): void => { - api?.close(); - resolve(undefined); - }, - tab: (): TabControls => { - return api as unknown as TabControls; - }, - }, - }), - }, - active: true, - }); - }); - }, - observe: async (observe: Observe, existed?: Session): Promise => { - const render = await getRender(observe); - if (render instanceof Error) { - throw render; - } - const session = - existed !== undefined ? existed : await this.add(false).empty(render); - return new Promise((resolve, reject) => { - session.stream - .observe() - .start(observe) - .then((uuid: string) => { - if (existed === undefined) { - const error = this.bind( - session.uuid(), - observe.origin.desc().major, - true, - ); - if (error instanceof Error) { - this.log().error(`Fail to bind session: ${error.message}`); - } - recent.add(observe).catch((err: Error) => { - this.log().error( - `Fail to save action as recent: ${err.message}`, - ); - }); - } - resolve(uuid); - }) - .catch((err: Error) => { - if (existed !== undefined) { - return reject(err); - } - this.kill(session.uuid()) - .catch((closeErr: Error) => { - this.log().error(`Fail to close session: ${closeErr.message}`); - }) - .finally(() => { - reject(err); - }); - }); - }); - }, - multiple: (files: File[]): Promise => { - return new Promise((resolve, reject) => { - const api = this.add().tab({ - name: 'Multiple Files', - content: { - factory: components.get('app-tabs-source-multiple-files'), - inputs: { - files, - setTitle: (title: string) => { - api?.setTitle(title); - }, - done: (observe: Observe) => { - this.initialize() - .observe(observe) - .then((session) => { - resolve(session); - }) - .catch((err: Error) => { - this.log().error( - `Fail to setup observe: ${err.message}`, - ); - reject(err); - }) - .finally(() => { - api?.close(); - }); - }, - cancel: () => { - api?.close(); - resolve(undefined); - }, - }, - }, - active: true, - closable: true, - }); - }); - }, - }; - } - - protected create(render: Render): Promise { - const session = new Session(render); - return session.init().then((_uuid: string) => { - this._emitter.session.created(session); - return session; - }); - } -} -export interface Service extends Interface {} -export const session = register(new Service()); diff --git a/application/client/src/app/service/session/base.ts b/application/client/src/app/service/session/base.ts deleted file mode 100644 index 1f5f7bb933..0000000000 --- a/application/client/src/app/service/session/base.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { TabsService, ITabAPI } from '@elements/tabs/service'; -import { Subscriber } from '@platform/env/subscription'; - -export abstract class Base extends Subscriber { - public abstract destroy(): Promise; - public abstract bind(tab: ITabAPI): void; - public abstract uuid(): string; - public abstract sidebar(): TabsService | undefined; - public abstract toolbar(): TabsService | undefined; - public abstract isBound(): boolean; -} diff --git a/application/client/src/app/service/session/dependencies/attachments.ts b/application/client/src/app/service/session/dependencies/attachments.ts deleted file mode 100644 index c58f0a8074..0000000000 --- a/application/client/src/app/service/session/dependencies/attachments.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Subscriber, Subjects, Subject } from '@platform/env/subscription'; -import { cutUuid } from '@log/index'; -import { Attachment } from '@platform/types/content'; -import { getNextColor } from '@ui/styles/colors'; - -// import * as Requests from '@platform/ipc/request'; -import * as Events from '@platform/ipc/event'; - -@SetupLogger() -export class Attachments extends Subscriber { - public readonly subjects: Subjects<{ - updated: Subject; - }> = new Subjects({ - updated: new Subject(), - }); - public readonly attachments: Map = new Map(); - - protected readonly positions: Map = new Map(); - - private _len: number = 0; - private _uuid!: string; - - public init(uuid: string) { - this.setLoggerName(`Attachments: ${cutUuid(uuid)}`); - this._uuid = uuid; - this.register( - Events.IpcEvent.subscribe(Events.Stream.Attachment.Event, (event) => { - if (event.session !== this._uuid) { - return; - } - if (this.attachments.has(event.attachment.uuid)) { - this.log().error( - `Attachment ${event.attachment.uuid} already exist; attachment: ${event.attachment.name}(${event.attachment.filepath})`, - ); - return; - } - const attachment = Attachment.from(event.attachment); - if (attachment instanceof Error) { - this.log().error( - `Fail to parse attachment ${event.attachment.uuid}; attachment: ${event.attachment.name}(${event.attachment.filepath})`, - ); - return; - } - attachment.setColor(getNextColor()); - this.attachments.set(event.attachment.uuid, attachment); - if (this.attachments.size !== event.len) { - this.log().warn( - `Count of attachment on backend dismatch with attachments on frontend`, - ); - } - attachment.messages.forEach((pos) => { - this.positions.set(pos, attachment); - }); - this.subjects.get().updated.emit(this.attachments.size); - }), - ); - } - - public destroy() { - this.unsubscribe(); - this.subjects.destroy(); - } - - public len(): number { - return this._len; - } - - public has(position: number): boolean { - return this.positions.has(position); - } - - public getByPos(position: number): Attachment | undefined { - return this.positions.get(position); - } -} -export interface Attachments extends LoggerInterface {} diff --git a/application/client/src/app/service/session/dependencies/bookmark/bookmark.ts b/application/client/src/app/service/session/dependencies/bookmark/bookmark.ts deleted file mode 100644 index 31d81838fd..0000000000 --- a/application/client/src/app/service/session/dependencies/bookmark/bookmark.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Recognizable } from '@platform/types/storage/entry'; -import { error } from '@platform/log/utils'; -import { Json } from '@platform/types/storage/json'; -import { Equal } from '@platform/types/env/types'; -import { BookmarkDefinition } from '@platform/types/bookmark'; - -import * as obj from '@platform/env/obj'; - -export class Bookmark extends Json implements Recognizable, Equal { - public static KEY: string = 'bookmark'; - - public static fromJson(json: string): Bookmark | Error { - try { - const def: { position: number } = JSON.parse(json); - def.position = obj.getAsValidNumber(def, 'position'); - return new Bookmark(def.position); - } catch (e) { - return new Error(error(e)); - } - } - - public readonly position: number; - - constructor(position?: number) { - super(); - this.position = position === undefined ? -1 : position; - } - - public uuid(): string { - return this.position.toString(); - } - - public asDef(): BookmarkDefinition { - return { position: this.position }; - } - - public isSame(bookmark: Bookmark): boolean { - return bookmark.position === this.position; - } - - public json(): { - to(): string; - from(str: string): Bookmark | Error; - key(): string; - } { - return { - to: (): string => { - return JSON.stringify({ position: this.position }); - }, - from: (json: string): Bookmark | Error => { - return Bookmark.fromJson(json); - }, - key: (): string => { - return Bookmark.KEY; - }, - }; - } -} diff --git a/application/client/src/app/service/session/dependencies/bookmarks.ts b/application/client/src/app/service/session/dependencies/bookmarks.ts deleted file mode 100644 index 0620665792..0000000000 --- a/application/client/src/app/service/session/dependencies/bookmarks.ts +++ /dev/null @@ -1,294 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Subscriber, Subjects, Subject } from '@platform/env/subscription'; -import { Owner, Row } from '@schema/content/row'; -import { cutUuid } from '@log/index'; -import { Bookmark } from './bookmark/bookmark'; -import { Range } from '@platform/types/range'; -import { Cursor } from './cursor'; -import { hotkeys } from '@service/hotkeys'; -import { Stream } from './stream'; -import { BookmarkDefinition } from '@platform/types/bookmark'; -import { unique } from '@platform/env/sequence'; - -import * as Requests from '@platform/ipc/request'; - -@SetupLogger() -export class Bookmarks extends Subscriber { - public readonly subjects: Subjects<{ - updated: Subject; - }> = new Subjects({ - updated: new Subject(), - }); - private _uuid!: string; - protected bookmarks: Bookmark[] = []; - protected pendings: Bookmark[] = []; - protected cursor!: Cursor; - protected stream!: Stream; - - public init(uuid: string, stream: Stream, cursor: Cursor) { - this.setLoggerName(`Bookmarks: ${cutUuid(uuid)}`); - this._uuid = uuid; - this.cursor = cursor; - this.stream = stream; - this.register( - hotkeys.listen('j', () => { - this.move().prev(); - }), - hotkeys.listen('k', () => { - this.move().next(); - }), - stream.subjects.get().updated.subscribe(() => { - this.recheck(); - }), - ); - } - - public destroy() { - this.unsubscribe(); - this.subjects.destroy(); - } - - public overwrite(bookmarks: Bookmark[]): Promise { - const len = this.stream.len(); - this.pendings.push(...bookmarks.filter((b) => b.position >= len)); - const available = bookmarks.filter((b) => b.position < len); - return this.api() - .set(available.map((b) => b.position)) - .then(() => { - this.bookmarks = available; - this.bookmarks.sort((a, b) => { - return a.position < b.position ? -1 : 1; - }); - }) - .catch((err: Error) => { - this.log().error(`Fail set bookmarks: ${err.message}`); - }); - } - - public overwriteFromDefs(bookmarks: BookmarkDefinition[]): Promise { - return this.overwrite(bookmarks.map((def) => new Bookmark(def.position))).catch( - (err: Error) => { - this.log().error(`Fail overwrite bookmarks: ${err.message}`); - }, - ); - } - - public bookmark(row: Row) { - (() => { - const exist = this.bookmarks.find((b) => b.position === row.position); - if (exist) { - return this.api() - .remove(row.position) - .then(() => { - this.bookmarks = this.bookmarks.filter((b) => b.position !== row.position); - }); - } else { - return this.api() - .add(row.position) - .then(() => { - this.bookmarks.push(new Bookmark(row.position)); - }); - } - })() - .then(() => { - this.bookmarks.sort((a, b) => { - return a.position < b.position ? -1 : 1; - }); - this.update(); - }) - .catch((err: Error) => { - this.log().error(`Fail to bookmark: ${err.message}`); - }); - } - - public get(range?: Range): Bookmark[] { - if (range === undefined) { - return this.bookmarks; - } else { - return this.bookmarks.filter((b) => range.in(b.position)); - } - } - - public has(stream: number): boolean { - return this.bookmarks.find((b) => b.position === stream) !== undefined; - } - - public getRowsPositions(): number[] { - return this.bookmarks.map((b) => b.position); - } - - public hash(): string { - return this.getRowsPositions().join(','); - } - - public update(): string { - const sequence = unique(); - this.subjects.get().updated.emit(sequence); - return sequence; - } - - protected recheck() { - if (this.pendings.length === 0) { - return; - } - if (this.pendings.find((b) => b.position < this.stream.len()) === undefined) { - return; - } - const all = [...this.bookmarks, ...this.pendings]; - this.pendings = []; - this.overwrite(all) - .then(() => { - this.update(); - }) - .catch((err: Error) => { - this.log().error(`Fail reset bookmarks: ${err.message}`); - }); - } - - protected move(): { - next(): void; - prev(): void; - } { - const selected: number | undefined = (() => { - if (this.bookmarks.length === 0) { - return undefined; - } - const single = this.cursor.getSingle().position(); - if (single === undefined) { - this.cursor.select( - this.bookmarks[0].position, - Owner.Bookmark, - undefined, - undefined, - ); - return undefined; - } - return this.bookmarks.findIndex((b) => b.position === single); - })(); - return { - next: (): void => { - if (selected === undefined) { - return; - } - if (selected === -1) { - this.cursor.select( - this.bookmarks[0].position, - Owner.Bookmark, - undefined, - undefined, - ); - return; - } - if (selected === this.bookmarks.length - 1) { - return; - } - this.cursor.select( - this.bookmarks[selected + 1].position, - Owner.Bookmark, - undefined, - undefined, - ); - }, - prev: (): void => { - if (selected === undefined) { - return; - } - if (selected === -1) { - this.cursor.select( - this.bookmarks[this.bookmarks.length - 1].position, - Owner.Bookmark, - undefined, - undefined, - ); - return; - } - if (selected === 0) { - return; - } - this.cursor.select( - this.bookmarks[selected - 1].position, - Owner.Bookmark, - undefined, - undefined, - ); - }, - }; - } - - protected api(): { - add(row: number): Promise; - remove(row: number): Promise; - set(rows: number[]): Promise; - } { - return { - add: (row: number): Promise => { - return Requests.IpcRequest.send( - Requests.Stream.AddBookmark.Response, - new Requests.Stream.AddBookmark.Request({ - session: this._uuid, - row, - }), - ) - .then((response: Requests.Stream.AddBookmark.Response) => { - if (typeof response.error === 'string') { - this.log().error( - `Fail to add bookmark to position ${row}: ${response.error}`, - ); - } - }) - .catch((error: Error) => { - this.log().error( - `Fail to add bookmark to position ${row}: ${error.message}`, - ); - }); - }, - remove: (row: number): Promise => { - return Requests.IpcRequest.send( - Requests.Stream.RemoveBookmark.Response, - new Requests.Stream.RemoveBookmark.Request({ - session: this._uuid, - row, - }), - ) - .then((response: Requests.Stream.RemoveBookmark.Response) => { - if (typeof response.error === 'string') { - this.log().error( - `Fail to remove bookmark from position ${row}: ${response.error}`, - ); - } - }) - .catch((error: Error) => { - this.log().error( - `Fail to remove bookmark from position ${row}: ${error.message}`, - ); - }); - }, - set: (rows: number[]): Promise => { - return Requests.IpcRequest.send( - Requests.Stream.SetBookmarks.Response, - new Requests.Stream.SetBookmarks.Request({ - session: this._uuid, - rows, - }), - ) - .then((response: Requests.Stream.SetBookmarks.Response) => { - if (typeof response.error === 'string') { - this.log().error( - `Fail to remove bookmark from positions ${rows.join(', ')}: ${ - response.error - }`, - ); - } - }) - .catch((error: Error) => { - this.log().error( - `Fail to remove bookmark from positions ${rows.join(', ')}: ${ - error.message - }`, - ); - }); - }, - }; - } -} -export interface Bookmarks extends LoggerInterface {} diff --git a/application/client/src/app/service/session/dependencies/charts/cursor.ts b/application/client/src/app/service/session/dependencies/charts/cursor.ts deleted file mode 100644 index e31129d90a..0000000000 --- a/application/client/src/app/service/session/dependencies/charts/cursor.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { IRange } from '@platform/types/range'; -import { Subject, Subjects } from '@platform/env/subscription'; - -export class Cursor { - public from: number = 0; - public to: number = 0; - public width: number = 1; - public visible: boolean = false; - // Length of stream - public stream: number = 0; - public subjects: Subjects<{ - position: Subject; - width: Subject; - visibility: Subject; - }> = new Subjects({ - position: new Subject(), - width: new Subject(), - visibility: new Subject(), - }); - - protected visibility(): { - update(): void; - } { - return { - update: (): void => { - const prev = this.visible; - this.visible = this.width !== 1 && this.width < this.stream; - if (!this.visible) { - this.from = 0; - this.to = this.stream - 1; - } - this.visible !== prev && this.subjects.get().visibility.emit(); - }, - }; - } - - public destroy() { - this.subjects.destroy(); - } - - public setFrame(frame: IRange) { - if (frame.start < 0 || frame.end < 0 || frame.start > frame.end) { - throw new Error(`Invalid cursor`); - } - this.from = frame.start; - this.to = frame.end; - this.subjects.get().position.emit(); - } - - public setStream(len: number) { - this.stream = len; - this.visibility().update(); - } - - public setWidth(width: number) { - if (width < 0) { - throw new Error(`Invalid width`); - } - this.width = width; - this.visibility().update(); - this.subjects.get().width.emit(); - } - - public getFrame(): IRange | undefined { - if (this.from < 0 || this.to < 0 || this.from > this.to) { - return undefined; - } - return { start: this.from, end: this.to }; - } - - public getWidth(): number { - return this.width; - } - - public hash(): string { - return `${this.from};${this.to};${this.width}`; - } -} diff --git a/application/client/src/app/service/session/dependencies/charts/index.ts b/application/client/src/app/service/session/dependencies/charts/index.ts deleted file mode 100644 index 683791ef46..0000000000 --- a/application/client/src/app/service/session/dependencies/charts/index.ts +++ /dev/null @@ -1,365 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Subject, Subjects, Subscriber } from '@platform/env/subscription'; -import { isDevMode } from '@angular/core'; -import { ISearchMap } from '@platform/types/filter'; -import { cutUuid } from '@log/index'; -import { IRange } from '@platform/types/range'; -import { Cursor } from './cursor'; -import { Stream } from '../stream'; -import { Search } from '../search'; -import { FilterRequest } from '../search/filters/request'; -import { ChartRequest } from '../search/charts/request'; -import { ResultSearchValues } from '@platform/types/bindings'; - -import * as Requests from '@platform/ipc/request'; -import * as Events from '@platform/ipc/event'; - -export interface Output { - peaks: Map; - values: ResultSearchValues; - map: ISearchMap; - frame: IRange; - filters: FilterRequest[]; - charts: ChartRequest[]; - // true - if has active search; false - if no active search, but filters - active: boolean; - // Selected chart - selected: number | undefined; -} - -@SetupLogger() -export class Charts extends Subscriber { - public cursor: Cursor = new Cursor(); - public subjects: Subjects<{ - peaks: Subject>; - output: Subject; - summary: Subject; - }> = new Subjects({ - peaks: new Subject>(), - output: new Subject(), - summary: new Subject(), - }); - - protected stream!: Stream; - protected search!: Search; - protected uuid!: string; - protected peaks: Map = new Map(); - protected lengths: { - stream: number; - search: number; - } = { - stream: 0, - search: 0, - }; - protected progress: { - output: string | undefined; - summary: string | undefined; - } = { - output: undefined, - summary: undefined, - }; - protected cache: { - output: Output | undefined; - summary: Output | undefined; - } = { - output: undefined, - summary: undefined, - }; - protected selected: string | undefined; - - protected reload(): { - output(): void; - summary(): void; - both(): void; - cached(): void; - load(frame: IRange): Promise; - defs(output: Output): Output; - validation(output: Output): Output; - requests(): { filters: FilterRequest[]; charts: ChartRequest[]; active: boolean }; - } { - return { - output: (): void => { - const frame = this.cursor.getFrame(); - if (frame === undefined) { - return; - } - if (this.progress.output !== undefined) { - return; - } - this.progress.output = this.cursor.hash(); - this.reload() - .load(frame) - .then((output) => { - this.cache.output = output; - this.subjects.get().output.emit(output); - }) - .catch((err: Error) => { - this.log().error( - `Fail load output frame ${frame.start}-${frame.end}: ${err.message}`, - ); - }) - .finally(() => { - if (this.progress === undefined) { - return; - } - const reload = this.progress.output !== this.cursor.hash(); - this.progress.output = undefined; - if (reload) { - this.reload().output(); - } - }); - }, - summary: (): void => { - const hash = () => { - return `${this.lengths.search};${ - this.lengths.stream - };${this.cursor.getWidth()}`; - }; - if (this.lengths.search === 0 && this.lengths.stream === 0) { - return; - } - if (this.progress.summary !== undefined) { - return; - } - const frame = { start: 0, end: this.lengths.stream - 1 }; - this.progress.summary = hash(); - this.reload() - .load(frame) - .then((output) => { - this.cache.summary = output; - this.subjects.get().summary.emit(output); - }) - .catch((err: Error) => { - this.log().error( - `Fail load summary frame ${frame.start}-${frame.end}: ${err.message}`, - ); - }) - .finally(() => { - if (this.progress === undefined) { - return; - } - const reload = this.progress.summary !== hash(); - this.progress.summary = undefined; - if (reload) { - this.reload().summary(); - } - }); - }, - both: (): void => { - this.reload().output(); - this.reload().summary(); - }, - cached: (): void => { - if (this.cache.output !== undefined) { - this.subjects.get().output.emit(this.reload().defs(this.cache.output)); - } else { - this.reload().output(); - } - if (this.cache.summary !== undefined) { - this.subjects.get().summary.emit(this.reload().defs(this.cache.summary)); - } else { - this.reload().summary(); - } - }, - load: (frame: IRange): Promise => { - return new Promise((resolve, reject) => { - const width = this.cursor.getWidth(); - Promise.all([ - this.scaled(width, frame).values(), - this.scaled(Math.floor(width / 2), frame).matches(), - ]) - .then((results: [ResultSearchValues, ISearchMap]) => { - resolve( - this.reload().defs({ - peaks: this.peaks, - values: results[0], - map: results[1], - frame, - filters: [], - charts: [], - active: false, - selected: undefined, - }), - ); - }) - .catch(reject); - }); - }, - defs: (output: Output): Output => { - const requests = this.reload().requests(); - output.filters = requests.filters; - output.charts = requests.charts; - output.selected = this.selecting().get(); - output.active = requests.active; - return isDevMode() ? this.reload().validation(output) : output; - }, - validation: (output: Output): Output => { - // let invalid: [number, number, number, number][] = []; - // Object.keys(output.values).forEach((k: string) => { - // invalid = invalid.concat( - // output.values[parseInt(k, 10)].filter((d) => typeof d[3] !== 'number'), - // ); - // }); - // if (invalid.length !== 0) { - // this.log().error( - // `Invalid data for charts; found NONE number values on (rows): ${invalid - // .map((d) => d[0]) - // .join(', ')}`, - // ); - // } - return output; - }, - requests: (): { filters: FilterRequest[]; charts: ChartRequest[]; active: boolean } => { - const active = this.search.state().getActive(); - return { - active: active !== undefined, - filters: - active === undefined - ? this.search - .store() - .filters() - .get() - .filter((f) => f.definition.active) - : [FilterRequest.fromDefinition(active)], - charts: this.search - .store() - .charts() - .get() - .filter((f) => f.definition.active), - }; - }, - }; - } - - protected scaled( - datasetLength: number, - range?: IRange, - ): { - values(): Promise; - matches(): Promise; - } { - return { - values: (): Promise => { - return Requests.IpcRequest.send( - Requests.Values.Frame.Response, - new Requests.Values.Frame.Request({ - session: this.uuid, - width: datasetLength, - from: range !== undefined ? range.start : undefined, - to: range !== undefined ? range.end : undefined, - }), - ).then((response) => { - if (typeof response.error === 'string' && response.error.trim().length > 0) { - this.log().error(`Fail to load values: ${response.error}`); - return Promise.reject(new Error(response.error)); - } else { - return response.values; - } - }); - }, - matches: (): Promise => { - return Requests.IpcRequest.send( - Requests.Search.Map.Response, - new Requests.Search.Map.Request({ - session: this.uuid, - len: datasetLength, - from: range ? range.start : undefined, - to: range ? range.end : undefined, - }), - ).then((response) => { - return response.map; - }); - }, - }; - } - - public init(uuid: string, stream: Stream, search: Search) { - this.setLoggerName(`Values: ${cutUuid(uuid)}`); - this.uuid = uuid; - this.stream = stream; - this.search = search; - this.register( - Events.IpcEvent.subscribe(Events.Values.Updated.Event, (event) => { - if (event.session !== this.uuid) { - return; - } - this.peaks = event.map === null ? new Map() : event.map; - this.subjects.get().peaks.emit(this.peaks); - this.reload().both(); - }), - this.stream.subjects.get().updated.subscribe((len) => { - this.lengths.stream = len; - this.cursor.setStream(len); - if (this.cursor.visible) { - this.reload().summary(); - } else { - this.reload().both(); - } - }), - this.search.subjects.get().updated.subscribe((event) => { - this.lengths.search = event.found; - this.reload().both(); - }), - this.cursor.subjects.get().position.subscribe(() => { - this.reload().output(); - }), - this.cursor.subjects.get().width.subscribe(() => { - this.reload().both(); - }), - this.search - .store() - .filters() - .subjects.get() - .highlights.subscribe(() => { - this.reload().cached(); - }), - this.search - .store() - .charts() - .subjects.get() - .highlights.subscribe(() => { - this.reload().cached(); - }), - ); - } - - public destroy(): void { - this.subjects.destroy(); - this.cursor.destroy(); - this.unsubscribe(); - } - - public getPeaks(): Map { - return this.peaks; - } - - public refresh(): void { - this.reload().cached(); - } - - public selecting(): { - set(uuid: string | undefined): void; - get(): number | undefined; - } { - return { - set: (uuid: string | undefined): void => { - this.selected = uuid; - this.reload().cached(); - }, - get: (): number | undefined => { - if (this.selected === undefined) { - return undefined; - } - const requests = this.reload().requests(); - const index = requests.charts.findIndex((f) => f.uuid() === this.selected); - return index === -1 ? undefined : index; - }, - }; - } - - public hasData(): boolean { - const requests = this.reload().requests(); - return requests.charts.length + requests.filters.length > 0; - } -} -export interface Charts extends LoggerInterface {} diff --git a/application/client/src/app/service/session/dependencies/cli.ts b/application/client/src/app/service/session/dependencies/cli.ts deleted file mode 100644 index f48da0d90e..0000000000 --- a/application/client/src/app/service/session/dependencies/cli.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Subscriber } from '@platform/env/subscription'; -import { cutUuid } from '@log/index'; -import { Session } from '@service/session'; -import { getFileName, getParentFolder } from '@platform/types/files'; -import { env } from '@service/env'; -import { cli } from '@service/cli'; - -import * as $ from '@platform/types/observe'; - -@SetupLogger() -export class Cli extends Subscriber { - protected session!: Session; - protected _cmd: string = './chipmunk'; - - protected source(): { - stream(stream: $.Origin.Stream.Configuration): string | undefined; - file(file: $.Origin.File.Configuration): string | undefined; - concat(concat: $.Origin.Concat.Configuration): string | undefined; - from(observed: $.Observe[]): string | undefined; - cx(observed: $.Observe[]): $.Origin.Context | undefined; - } { - return { - stream: (stream: $.Origin.Stream.Configuration): string | undefined => { - const serial = stream.as<$.Origin.Stream.Stream.Serial.Configuration>( - $.Origin.Stream.Stream.Serial.Configuration, - ); - const tcp = stream.as<$.Origin.Stream.Stream.TCP.Configuration>( - $.Origin.Stream.Stream.TCP.Configuration, - ); - const udp = stream.as<$.Origin.Stream.Stream.UDP.Configuration>( - $.Origin.Stream.Stream.UDP.Configuration, - ); - const process = stream.as<$.Origin.Stream.Stream.Process.Configuration>( - $.Origin.Stream.Stream.Process.Configuration, - ); - if (serial !== undefined) { - return `streams --serial "\ -${serial.configuration.path};\ -${serial.configuration.baud_rate};\ -${serial.configuration.data_bits};\ -${serial.configuration.flow_control};\ -${serial.configuration.parity};\ -${serial.configuration.stop_bits}"`; - } else if (tcp !== undefined) { - return `streams --tcp "${tcp.configuration.bind_addr}"`; - } else if (udp !== undefined) { - return `streams --udp "\ -${udp.configuration.bind_addr}|\ -${udp.configuration.multicast[0].multiaddr},\ -${udp.configuration.multicast[0].interface};"`; - } else if (process !== undefined) { - return `streams --stdout "${process.configuration.command}"`; - } else { - return undefined; - } - }, - file: (file: $.Origin.File.Configuration): string | undefined => { - return `-o ${this.filename(file.get().filename())}`; - }, - concat: (concat: $.Origin.Concat.Configuration): string | undefined => { - const relative = - Array.from(new Set(concat.files().map((f) => getParentFolder(f)))).length === 1; - return concat - .files() - .map((f) => `-o ${relative ? this.filename(f) : f}`) - .join(' '); - }, - from: (observed: $.Observe[]): string | undefined => { - const get = (observe: $.Observe): string | undefined => { - const stream = observe.origin.as<$.Origin.Stream.Configuration>( - $.Origin.Stream.Configuration, - ); - const file = observe.origin.as<$.Origin.File.Configuration>( - $.Origin.File.Configuration, - ); - const concat = observe.origin.as<$.Origin.Concat.Configuration>( - $.Origin.Concat.Configuration, - ); - if (stream !== undefined) { - return this.source().stream(stream); - } else if (file !== undefined) { - return this.source().file(file); - } else if (concat !== undefined) { - return this.source().concat(concat); - } else { - return undefined; - } - }; - if (observed.length === 0) { - return undefined; - } - let args = ''; - for (const observe of observed) { - const arg = get(observe); - if (arg === undefined) { - return undefined; - } - args = `${args}${args.length === 0 ? '' : ' '}${arg}`; - } - return args; - }, - cx(observed: $.Observe[]): $.Origin.Context | undefined { - function get(observe: $.Observe): $.Origin.Context | undefined { - if ( - observe.origin.as<$.Origin.Stream.Configuration>( - $.Origin.Stream.Configuration, - ) !== undefined - ) { - return $.Origin.Context.Stream; - } else if ( - observe.origin.as<$.Origin.File.Configuration>( - $.Origin.File.Configuration, - ) !== undefined - ) { - return $.Origin.Context.File; - } else if ( - observe.origin.as<$.Origin.Concat.Configuration>( - $.Origin.Concat.Configuration, - ) !== undefined - ) { - return $.Origin.Context.Concat; - } else { - return undefined; - } - } - if (observed.length === 0 || get(observed[0]) === undefined) { - return undefined; - } - const first: $.Origin.Context = get(observed[0]) as unknown as $.Origin.Context; - for (const observe of observed) { - if (first !== get(observe)) { - return undefined; - } - } - return first; - }, - }; - } - - protected parser(): { - text(parser: $.Parser.Text.Configuration): string | undefined; - dlt(parser: $.Parser.Dlt.Configuration): string | undefined; - someip(parser: $.Parser.SomeIp.Configuration): string | undefined; - from(observe: $.Observe): string | undefined; - } { - return { - text: (_parser: $.Parser.Text.Configuration): string | undefined => { - return `--parser text`; - }, - dlt: (_parser: $.Parser.Dlt.Configuration): string | undefined => { - return `--parser dlt`; - }, - someip: (_parser: $.Parser.SomeIp.Configuration): string | undefined => { - return `--parser someip`; - }, - from: (observe: $.Observe): string | undefined => { - const text = observe.parser.as<$.Parser.Text.Configuration>( - $.Parser.Text.Configuration, - ); - const dlt = observe.parser.as<$.Parser.Dlt.Configuration>( - $.Parser.Dlt.Configuration, - ); - const someip = observe.parser.as<$.Parser.SomeIp.Configuration>( - $.Parser.SomeIp.Configuration, - ); - if (text !== undefined) { - return this.parser().text(text); - } else if (dlt !== undefined) { - return this.parser().dlt(dlt); - } else if (someip !== undefined) { - return this.parser().someip(someip); - } else { - return undefined; - } - }, - }; - } - - protected filters(): string { - const filters = this.session.search.store().filters().get(); - if (filters.length === 0) { - return ''; - } - return `${filters - .map((f) => `-s "${f.as().filter().filter.replaceAll('"', '\\"')}"`) - .join(' ')}`; - } - - protected cmd(): { - update(): Promise; - get(): string; - defaults(): void; - } { - return { - update: (): Promise => { - return cli - .getCommand() - .then((cmd) => { - this._cmd = cmd; - }) - .catch((err: Error) => { - this.log().error(`Fail to get CLI command/executor value: ${err.message}`); - this.cmd().defaults(); - }); - }, - get: (): string => { - return this._cmd; - }, - defaults: (): void => { - if (env.platform().windows()) { - this._cmd = `chipmunk.exe`; - } else { - this._cmd = `./chipmunk`; - } - }, - }; - } - - protected filename(fullpath: string): string { - if (env.platform().windows()) { - return getFileName(fullpath); - } else { - return `./${getFileName(fullpath)}`; - } - } - - protected arguments(): string | undefined { - const observed = this.session.stream - .observe() - .sources() - .map((s) => s.observe); - if (observed.length === 0) { - return undefined; - } - if (this.source().cx(observed) === undefined) { - // Not the same origin - return undefined; - } - const source = this.source().from(observed); - if (source === undefined) { - return undefined; - } - const parser = this.parser().from(observed[0]); - if (parser === undefined) { - return undefined; - } - return `${source} ${parser} ${this.filters()}`; - } - - public init(session: Session) { - this.session = session; - this.setLoggerName(`Cli: ${cutUuid(session.uuid())}`); - } - - public destroy() { - this.unsubscribe(); - } - - public async generate(): Promise { - await this.cmd().update(); - const args = this.arguments(); - if (args === undefined) { - return undefined; - } - return `${this.cmd().get()} ${args}`; - } - - public isSupported(): boolean { - return this.arguments() !== undefined; - } -} -export interface Cli extends LoggerInterface {} diff --git a/application/client/src/app/service/session/dependencies/comments/comment.ts b/application/client/src/app/service/session/dependencies/comments/comment.ts deleted file mode 100644 index 9da37b972d..0000000000 --- a/application/client/src/app/service/session/dependencies/comments/comment.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Recognizable } from '@platform/types/storage/entry'; -import { error } from '@platform/log/utils'; -import { Json } from '@platform/types/storage/json'; -import { Equal } from '@platform/types/env/types'; -import { CommentDefinition } from '@platform/types/comment'; -import * as obj from '@platform/env/obj'; - -export class Comment extends Json implements Recognizable, Equal { - public static KEY: string = 'comment'; - - public static fromJson(json: string): Comment | Error { - try { - const def: CommentDefinition = JSON.parse(json); - def.uuid = obj.getAsString(def, 'uuid'); - def.selection = obj.getAsObj(def, 'selection'); - def.selection.start = obj.getAsObj(def.selection, 'start'); - def.selection.start.offset = obj.getAsValidNumber(def.selection.start, 'offset'); - def.selection.start.position = obj.getAsValidNumber(def.selection.start, 'position'); - def.selection.start.text = obj.getAsString(def.selection.start, 'text'); - def.selection.end = obj.getAsObj(def.selection, 'end'); - def.selection.end.offset = obj.getAsValidNumber(def.selection.end, 'offset'); - def.selection.end.position = obj.getAsValidNumber(def.selection.end, 'position'); - def.selection.end.text = obj.getAsString(def.selection.end, 'text'); - def.responses = obj.getAsArray(def, 'responses'); - for (const response of def.responses) { - response.comment = obj.getAsString(response, 'comment'); - response.created = obj.getAsValidNumber(response, 'created'); - response.modified = obj.getAsValidNumber(response, 'modified'); - response.uuid = obj.getAsString(response, 'uuid'); - } - def.created = obj.getAsValidNumber(def, 'created'); - def.modified = obj.getAsValidNumber(def, 'modified'); - def.color = obj.getAsNotEmptyStringOrAsUndefined(def, 'color'); - def.comment = obj.getAsString(def, 'comment'); - return new Comment(def); - } catch (e) { - return new Error(error(e)); - } - } - - constructor(public readonly definition: CommentDefinition) { - super(); - } - - public uuid(): string { - return this.definition.uuid; - } - - public isSame(comment: Comment): boolean { - return comment.uuid() == this.definition.uuid; - } - - public json(): { - to(): string; - from(str: string): Comment | Error; - key(): string; - } { - return { - to: (): string => { - return JSON.stringify(this.definition); - }, - from: (json: string): Comment | Error => { - return Comment.fromJson(json); - }, - key: (): string => { - return Comment.KEY; - }, - }; - } -} diff --git a/application/client/src/app/service/session/dependencies/comments/index.ts b/application/client/src/app/service/session/dependencies/comments/index.ts deleted file mode 100644 index c0cd9101e7..0000000000 --- a/application/client/src/app/service/session/dependencies/comments/index.ts +++ /dev/null @@ -1,529 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { ISelection } from '@ui/elements/scrollarea/controllers/selection'; -import { Modifier } from '@service/session/dependencies/search/highlights/modifier'; -import { CommentsModifier } from '@service/session/dependencies/search/highlights/modifiers/comments'; -import { CommentDefinition, CommentState } from '@platform/types/comment'; -import { Subscriber, Subject, Subjects } from '@platform/env/subscription'; -import { unique } from '@platform/env/sequence'; -import { popup } from '@ui/service/popup'; -import { components } from '@env/decorators/initial'; -import { Vertical, Horizontal } from '@ui/service/popup'; -import { CShortColors } from '@styles/colors'; -import { Session } from '@service/session/session'; -import { notifications, Notification } from '@ui/service/notifications'; -import { Row } from '@schema/content/row'; -import { safeEscapeAnsi } from '@module/ansi'; - -import * as regex from '@platform/env/regex'; -import * as obj from '@platform/env/obj'; - -export interface ActualSelectionData { - selection: string; - start: number; - end: number; -} - -@SetupLogger() -export class Comments extends Subscriber { - protected readonly comments: Map = new Map(); - protected session!: Session; - - protected getSelectedText(): string | undefined { - const selection = document.getSelection(); - return selection === null ? undefined : selection.toString(); - } - - protected getRelevantComment(position: number): CommentDefinition[] { - const comments: CommentDefinition[] = []; - this.comments.forEach((comment: CommentDefinition) => { - if (position < comment.selection.start.position) { - return; - } - if (position > comment.selection.end.position) { - return; - } - comments.push(comment); - }); - return comments; - } - - protected getActualSelectionData( - original: string, - selected: string, - readFromEnd: boolean, - ): ActualSelectionData | Error { - function getHolder(node: HTMLElement): HTMLElement | Error { - if (node.nodeName.toLowerCase().search('app-scrollarea-row') !== -1) { - return node; - } - if (node.parentNode === null || node.parentNode === undefined) { - return new Error(`No parent node has been found`); - } - return getHolder(node.parentNode as HTMLElement); - } - // Collapse selection to start. We need it because anchor and focus nodes can be in any order (depends - // on how user did selection - const selection = window.getSelection(); - if (selection === undefined || selection === null) { - return new Error(`No active selection`); - } - if (!readFromEnd) { - selection.collapseToStart(); - } else { - selection.collapseToEnd(); - } - const anchorNode = selection.anchorNode; - const anchorOffset = selection.anchorOffset; - if (anchorNode === undefined || anchorNode === null) { - return new Error(`No anchorNode in active selection`); - } - // Looking for root row node - const holder: HTMLElement | Error = getHolder(anchorNode as HTMLElement); - if (holder instanceof Error) { - return holder; - } - // Create new selection: from begining of row to start of user's selection - const range: Range = document.createRange(); - range.setStart(holder, 0); - range.setEnd(anchorNode, anchorOffset); - selection.removeAllRanges(); - selection.addRange(range); - // Now we have text before user selection - const before: string = selection.toString(); - selection.removeAllRanges(); - let selStartOffset: number = 0; - let after: string = original; - if (before.length !== 0) { - const regBefore = regex.serialize(before); - const matchBefore = original.match(regBefore); - if ( - matchBefore === null || - matchBefore.length === 0 || - original.search(regBefore) === -1 - ) { - return new Error(`Fail to catch begining of selection`); - } - selStartOffset = matchBefore[0].length; - after = original.substring(selStartOffset, original.length); - } - if (!readFromEnd) { - const regAfter = regex.serialize(selected); - const matchAfter = after.match(regAfter); - if (matchAfter === null || matchAfter.length === 0 || after.search(regAfter) === -1) { - return new Error(`Fail to catch end of selection`); - } - const selEndOffset = matchAfter[0].length; - return { - selection: original.substring(selStartOffset, selStartOffset + selEndOffset), - start: selStartOffset, - end: selStartOffset + selEndOffset, - }; - } else { - return { - selection: original.substring(0, selStartOffset), - start: 0, - end: selStartOffset, - }; - } - } - - public subjects: Subjects<{ - added: Subject; - updated: Subject; - pending: Subject; - removed: Subject; - selected: Subject; - reload: Subject; - export: Subject; - }> = new Subjects({ - added: new Subject(), - updated: new Subject(), - pending: new Subject(), - removed: new Subject(), - selected: new Subject(), - reload: new Subject(), - export: new Subject(), - }); - - constructor() { - super(); - } - - public destroy(): void { - this.comments.clear(); - } - - public init(session: Session): void { - this.session = session; - } - - public isSelectionVisible(): boolean { - const selected = this.getSelectedText(); - return selected !== undefined; - } - - public async create(selection: ISelection): Promise { - function remember(): - | { anchorNode: Node; anchorOffset: number; focusNode: Node; focusOffset: number } - | undefined { - const winSel = window.getSelection(); - if ( - winSel === undefined || - winSel === null || - winSel.anchorNode === null || - winSel.focusNode === null - ) { - return undefined; - } - const reversed: boolean = - winSel.anchorNode.compareDocumentPosition(winSel.focusNode) === - Node.DOCUMENT_POSITION_PRECEDING; - return { - anchorNode: reversed ? winSel.focusNode : winSel.anchorNode, - anchorOffset: reversed ? winSel.focusOffset : winSel.anchorOffset, - focusNode: reversed ? winSel.anchorNode : winSel.focusNode, - focusOffset: reversed ? winSel.anchorOffset : winSel.focusOffset, - }; - } - function restore(stored: { - anchorNode: Node; - anchorOffset: number; - focusNode: Node; - focusOffset: number; - }) { - const winSel = window.getSelection(); - if (winSel === undefined || winSel === null) { - return; - } - const range: Range = document.createRange(); - range.setStart(stored.anchorNode, stored.anchorOffset); - range.setEnd(stored.focusNode, stored.focusOffset); - winSel.removeAllRanges(); - winSel.addRange(range); - } - const uuid: string = unique(); - const selected = this.getSelectedText(); - if (selected === undefined) { - throw new Error(`No selected text`); - } - const username = this.session.teamwork.user().get(); - if (username === undefined) { - throw new Error(`No username available; github profile should be activated`); - } - const stored = remember(); - const origin = ( - await this.session.stream.grab([ - { start: selection.rows.start, end: selection.rows.start }, - { start: selection.rows.end, end: selection.rows.end }, - ]) - ).map((el) => { - el.content = safeEscapeAnsi(el.content); - return el; - }); - stored !== undefined && restore(stored); - const comment: CommentDefinition | Error = (() => { - if (selection.rows.start === selection.rows.end) { - const sel: ActualSelectionData | Error = this.getActualSelectionData( - Row.removeMarkerSymbols(origin[0].content), - selected, - false, - ); - if (sel instanceof Error) { - return sel; - } - return { - uuid, - state: CommentState.pending, - username, - comment: '', - color: CShortColors[0], - created: Date.now(), - modified: Date.now(), - responses: [], - selection: { - start: { - position: Math.min(selection.rows.start, selection.rows.end), - offset: sel.start, - text: sel.selection, - }, - end: { - position: Math.max(selection.rows.start, selection.rows.end), - offset: sel.end, - text: sel.selection, - }, - text: selected, - }, - }; - } else { - const rows = selected - .split(/[\n\r]/gi) - .filter((r) => r.replace(/\d*\u0006$/gi, '').trim() !== ''); - const stored = remember(); - if (stored === undefined) { - return new Error(`Fail save selection`); - } - if (rows.length < 2) { - return new Error(`Fail split rows correctly`); - } - const selStart: ActualSelectionData | Error = this.getActualSelectionData( - Row.removeMarkerSymbols(origin[0].content), - rows[0], - false, - ); - restore(stored); - const selEnd: ActualSelectionData | Error = this.getActualSelectionData( - Row.removeMarkerSymbols(origin[1].content), - rows[rows.length - 1], - true, - ); - if (selStart instanceof Error) { - return selStart; - } - if (selEnd instanceof Error) { - return selEnd; - } - return { - uuid: uuid, - state: CommentState.pending, - username, - comment: '', - color: CShortColors[0], - created: Date.now(), - modified: Date.now(), - responses: [], - selection: { - start: { - position: Math.min(selection.rows.start, selection.rows.end), - offset: selStart.start, - text: selStart.selection, - }, - end: { - position: Math.max(selection.rows.start, selection.rows.end), - offset: selEnd.end, - text: selEnd.selection, - }, - text: selected, - }, - }; - } - })(); - if (comment instanceof Error) { - throw comment; - } - const crossing: CommentDefinition[] = []; - this.comments.forEach((com: CommentDefinition) => { - if ( - com.selection.start.position === com.selection.end.position && - com.selection.start.position === comment.selection.start.position && - com.selection.end.position === comment.selection.end.position - ) { - if ( - comment.selection.start.offset >= com.selection.start.offset && - comment.selection.start.offset <= com.selection.end.offset - ) { - crossing.push(com); - } else if ( - comment.selection.end.offset >= com.selection.start.offset && - comment.selection.end.offset <= com.selection.end.offset - ) { - crossing.push(com); - } else if ( - comment.selection.start.offset <= com.selection.start.offset && - comment.selection.end.offset >= com.selection.end.offset - ) { - crossing.push(com); - } - } else if ( - comment.selection.start.position >= com.selection.start.position && - comment.selection.start.position <= com.selection.end.position - ) { - crossing.push(com); - } else if ( - comment.selection.end.position >= com.selection.start.position && - comment.selection.end.position <= com.selection.end.position - ) { - crossing.push(com); - } else if ( - comment.selection.start.position <= com.selection.start.position && - comment.selection.end.position >= com.selection.end.position - ) { - crossing.push(com); - } - }); - const toBeStored: { comment: CommentDefinition; recover?: CommentDefinition } | undefined = - (() => { - if ( - crossing.length > 1 || - (crossing.length === 1 && crossing[0].username !== username) - ) { - notifications.notify( - new Notification({ - message: - crossing.length === 1 - ? `Cannot change comment of user "${crossing[0].username}"` - : `Cannot change multiple comments`, - actions: [], - }), - ); - return; - } - if (crossing.length === 1) { - const recover = obj.clone(crossing[0]); - if ( - crossing[0].selection.start.position > comment.selection.start.position || - (crossing[0].selection.start.position >= comment.selection.start.position && - crossing[0].selection.start.offset > comment.selection.start.offset) - ) { - crossing[0].selection.start = obj.clone(comment.selection.start); - } - if ( - crossing[0].selection.end.position < comment.selection.end.position || - (crossing[0].selection.end.position <= comment.selection.end.position && - crossing[0].selection.end.offset < comment.selection.end.offset) - ) { - crossing[0].selection.end = obj.clone(comment.selection.end); - } - crossing[0].state = CommentState.pending; - return { comment: crossing[0], recover }; - } else { - return { comment: comment }; - } - })(); - if (toBeStored === undefined) { - return; - } - this.comments.set(toBeStored.comment.uuid, toBeStored.comment); - this.subjects.get().pending.emit(toBeStored.comment); - this.edit(toBeStored.comment); - return undefined; - } - - public edit(comment: CommentDefinition) { - const creating: boolean = comment.comment === ''; - comment.state = CommentState.pending; - const popupHandle = popup.open({ - component: { - factory: components.get('app-dialogs-comment'), - inputs: { - comment: comment, - accept: (text: string) => { - comment.comment = text; - comment.state = CommentState.done; - comment.modified = Date.now(); - this.comments.set(comment.uuid, comment); - if (creating) { - this.subjects.get().added.emit(comment); - } else { - this.subjects.get().updated.emit(comment); - } - this.session.switch().sidebar.comments(); - this.session.highlights.subjects.get().update.emit(); - popupHandle.close(); - }, - remove: () => { - this.remove(comment.uuid); - popupHandle.close(); - }, - cancel: () => { - popupHandle.close(); - }, - }, - }, - position: { - vertical: Vertical.top, - horizontal: Horizontal.center, - }, - closeOnKey: 'Escape', - width: 450, - uuid: 'add_new_comment', - }); - } - - public remove(uuid: string) { - this.comments.delete(uuid); - this.subjects.get().removed.emit(uuid); - this.session.highlights.subjects.get().update.emit(); - } - - public update(comment: CommentDefinition) { - if (!this.comments.has(comment.uuid)) { - return; - } - comment.modified = Date.now(); - this.comments.set(comment.uuid, comment); - this.subjects.get().updated.emit(comment); - this.session.highlights.subjects.get().update.emit(); - } - - public clear() { - const user = this.session.teamwork.user().get(); - if (user === undefined) { - return; - } - this.comments.forEach((comment: CommentDefinition, uuid: string) => { - if (comment.username !== user) { - return; - } - this.comments.delete(uuid); - this.subjects.get().removed.emit(uuid); - }); - this.session.highlights.subjects.get().update.emit(); - } - - public set(comments: CommentDefinition[]): void { - this.comments.clear(); - comments.forEach((comment: CommentDefinition) => { - this.comments.set(comment.uuid, comment); - }); - this.subjects.get().reload.emit(); - this.session.highlights.subjects.get().update.emit(); - } - - public get(): Map { - return this.comments; - } - - public getAsArray(): CommentDefinition[] { - return Array.from(this.comments.values()); - } - - public isCreatingAvailable(): boolean { - return this.session.teamwork.user().get() !== undefined; - } - - public isEditable(comment: CommentDefinition): boolean { - return ( - this.session.teamwork.user().get() !== undefined && - this.session.teamwork.user().get() === comment.username - ); - } - - public isRowCommented(position: number) { - try { - this.comments.forEach((comment: CommentDefinition) => { - if (position < comment.selection.start.position) { - return; - } - if (position > comment.selection.end.position) { - return; - } - throw true; - }); - } catch (state) { - return typeof state === 'boolean' ? state : false; - } - return false; - } - - public getModifiers( - position: number, - str: string, - columns?: { column: number; map: [number, number][] }, - ): Modifier[] { - const comments: CommentDefinition[] = this.getRelevantComment(position); - return comments.map((comment: CommentDefinition) => { - return new CommentsModifier(comment, position, str, columns); - }); - } -} -export interface Comments extends LoggerInterface {} diff --git a/application/client/src/app/service/session/dependencies/cursor.ts b/application/client/src/app/service/session/dependencies/cursor.ts deleted file mode 100644 index 13f5758a39..0000000000 --- a/application/client/src/app/service/session/dependencies/cursor.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Subscriber, Subjects, Subject } from '@platform/env/subscription'; -import { cutUuid } from '@log/index'; -import { RowSrc, Owner, Row } from '@schema/content/row'; -import { IRange } from '@platform/types/range'; - -export interface SelectEvent { - row: number; - initiator: Owner; -} - -@SetupLogger() -export class Cursor extends Subscriber { - public readonly subjects: Subjects<{ - selected: Subject; - updated: Subject; - loaded: Subject; - frame: Subject; - }> = new Subjects({ - selected: new Subject(), - updated: new Subject(), - loaded: new Subject(), - frame: new Subject(), - }); - private _selected: number[] = []; - private _uuid!: string; - private _last: { - position: number | undefined; - row: RowSrc | undefined; - recent: RowSrc[]; - } = { - position: undefined, - row: undefined, - recent: [], - }; - private _frame: IRange | undefined; - - public init(uuid: string) { - this.setLoggerName(`Cursor: ${cutUuid(uuid)}`); - this._uuid = uuid; - } - - public destroy() { - this.unsubscribe(); - this.subjects.destroy(); - } - - public recent(rows: RowSrc[]) { - this._last.recent = rows; - this.subjects.get().loaded.emit(); - } - - public frame(): { - set(frame: IRange): void; - get(): IRange | undefined; - } { - return { - set: (frame: IRange): void => { - this._frame = frame; - this.subjects.get().frame.emit(frame); - }, - get: (): IRange | undefined => { - return Object.assign({}, this._frame); - }, - }; - } - - public select( - position: number, - initiator: Owner, - event: PointerEvent | undefined, - row: Row | undefined, - ) { - if (event !== undefined && event.shiftKey) { - if (this._selected.length === 0) { - this._selected = [position]; - } else { - const last = this._selected[this._selected.length - 1]; - if (last === position) { - return; - } - this._selected = this._selected.concat( - [...new Array(Math.abs(position - last))].map((_, i) => - position < last ? i + position : last + i + 1, - ), - ); - } - } else if (event !== undefined && (event.ctrlKey || event.metaKey)) { - const target = this._selected.indexOf(position); - if (target === -1) { - this._selected.push(position); - } else { - this._selected.splice(target, 1); - } - } else if (this._selected.length === 1 && this._selected[0] === position) { - this._selected = []; - } else { - this._selected = [position]; - } - this._last.position = position; - this._last.row = row !== undefined ? row.serialized() : undefined; - this.subjects.get().selected.emit({ - row: position, - initiator, - }); - this.subjects.get().updated.emit(); - } - - public mark(row: number): { - selected(): void; - unselected(): void; - } { - return { - selected: (): void => { - if (this.isSelected(row)) { - return; - } - this._selected.push(row); - this.subjects.get().updated.emit(); - }, - unselected: (): void => { - this._selected = this._selected.filter((r) => r !== row); - this.subjects.get().updated.emit(); - }, - }; - } - - public isSelected(row: number): boolean { - return this._selected.find((r) => r === row) !== undefined; - } - - public get(): number[] { - return this._selected; - } - - public getSingle(): { - position(): number | undefined; - row(): RowSrc | undefined; - } { - return { - position: (): number | undefined => { - return this._selected.length === 1 ? this._last.position : undefined; - }, - row: (): RowSrc | undefined => { - if (this._selected.length !== 1) { - return undefined; - } - return this._last.row !== undefined - ? this._last.row - : this._last.recent.find((r) => r.position === this._last.position); - }, - }; - } - - public drop(): Cursor { - this._selected = []; - this.subjects.get().updated.emit(); - return this; - } -} -export interface Cursor extends LoggerInterface {} diff --git a/application/client/src/app/service/session/dependencies/exporter.ts b/application/client/src/app/service/session/dependencies/exporter.ts deleted file mode 100644 index de3f5dfe0c..0000000000 --- a/application/client/src/app/service/session/dependencies/exporter.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { cutUuid } from '@log/index'; -import { Stream } from './stream'; -import { Indexed } from './indexed'; -import { IRange } from '@platform/types/range'; -import { getFileName, getSafeFileName } from '@platform/types/files'; -import { bridge } from '@service/bridge'; -import { TextExportOptions } from '@platform/types/exporting'; - -import * as Requests from '@platform/ipc/request/index'; - -@SetupLogger() -export class Exporter { - private _uuid!: string; - private _stream!: Stream; - private _indexed!: Indexed; - - public init(uuid: string, stream: Stream, indexed: Indexed) { - this.setLoggerName(`Cache: ${cutUuid(uuid)}`); - this._uuid = uuid; - this._stream = stream; - this._indexed = indexed; - } - - public destroy() { - // - } - - public isRawAvailable(): Promise { - return this._stream.export().isRawAvailable(); - } - - public export( - asRaw: boolean, - opt?: TextExportOptions, - ): { - all(): Promise; - stream(ranges: IRange[]): Promise; - search(): Promise; - } { - const uuid = this._uuid; - let defaultFileName = this._stream.observe().getSourceFileName(); - if (defaultFileName === undefined) { - defaultFileName = getSafeFileName( - `export_${new Date().toLocaleDateString()}_${new Date().toLocaleTimeString()}`, - ); - } else { - defaultFileName = getSafeFileName(`${getFileName(defaultFileName)}_export`); - } - if (!asRaw) { - defaultFileName = `${defaultFileName}.txt`; - } - return { - all(): Promise { - return Requests.IpcRequest.send( - Requests.File.ExportSession.Response, - new Requests.File.ExportSession.Request({ - uuid, - }), - ).then(() => { - return Promise.resolve(undefined); - }); - }, - stream: async (ranges: IRange[]): Promise => { - if (ranges.length === 0) { - return undefined; - } - const dest = await bridge.files().select.save(undefined, defaultFileName); - if (dest === undefined) { - return undefined; - } - return asRaw - ? this._stream.export().raw(ranges, dest) - : this._stream.export().text(ranges, dest, opt); - }, - search: async (): Promise => { - if (this._indexed.len() === 0) { - return undefined; - } - const dest = await bridge.files().select.save(undefined, defaultFileName); - if (dest === undefined) { - return undefined; - } - const ranges = await this._indexed.asRanges(); - return asRaw - ? this._stream.export().raw(ranges, dest) - : this._stream.export().text(ranges, dest, opt); - }, - }; - } - - // Clone search results to new file and returns filepath - public async clone(): Promise { - if (this._indexed.len() === 0) { - return undefined; - } - const ranges = await this._indexed.asRanges(); - return (await this.isRawAvailable()) - ? this._stream.export().raw(ranges) - : this._stream.export().text(ranges); - } -} -export interface Exporter extends LoggerInterface {} diff --git a/application/client/src/app/service/session/dependencies/indexed.ts b/application/client/src/app/service/session/dependencies/indexed.ts deleted file mode 100644 index 3a66f8e23d..0000000000 --- a/application/client/src/app/service/session/dependencies/indexed.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Subscriber, Subjects, Subject } from '@platform/env/subscription'; -import { cutUuid } from '@log/index'; -import { IndexingMode } from '@platform/types/content'; -import { Range, IRange } from '@platform/types/range'; -import { GrabbedElement } from '@platform/types/bindings/miscellaneous'; - -import * as Requests from '@platform/ipc/request'; -import * as Events from '@platform/ipc/event'; - -@SetupLogger() -export class Indexed extends Subscriber { - public readonly subjects: Subjects<{ - updated: Subject; - changed: Subject; - }> = new Subjects({ - updated: new Subject(), - changed: new Subject(), - }); - private _len: number = 0; - private _uuid!: string; - private _mode: IndexingMode = IndexingMode.Regular; - - public init(uuid: string) { - this.setLoggerName(`Indexed: ${cutUuid(uuid)}`); - this._uuid = uuid; - this.register( - Events.IpcEvent.subscribe(Events.Stream.IndexedMapUpdated.Event, (event) => { - if (event.session !== this._uuid) { - return; - } - this._len = event.len; - this.subjects.get().updated.emit(this._len); - }), - ); - } - - public destroy() { - this.unsubscribe(); - this.subjects.destroy(); - } - - public len(): number { - return this._len; - } - - public expand(row: number): { - before(): Promise; - after(): Promise; - } { - const request = (row: number, above: boolean): Promise => { - return Requests.IpcRequest.send( - Requests.Stream.Expand.Response, - new Requests.Stream.Expand.Request({ - session: this._uuid, - seporator: row, - offset: 4, - above, - }), - ) - .then((response: Requests.Stream.Expand.Response) => { - if (typeof response.error === 'string') { - this.log().error( - `Fail to expand indexed content on position ${row}: ${response.error}`, - ); - } - }) - .catch((error: Error) => { - this.log().error( - `Fail to expand indexed content on position ${row}: ${error.message}`, - ); - }) - .finally(() => { - this.subjects.get().changed.emit(); - }); - }; - return { - before: (): Promise => { - if (this._len === 0) { - return Promise.resolve(); - } - return request(row, true); - }, - after: (): Promise => { - if (this._len === 0) { - return Promise.resolve(); - } - return request(row, false); - }, - }; - } - - public grab(range: Range | IRange): Promise { - if (this._len === 0) { - // TODO: Grabber is crash session in this case... should be prevented on grabber level - return Promise.resolve([]); - } - return Requests.IpcRequest.send( - Requests.Stream.Indexed.Response, - new Requests.Stream.Indexed.Request({ - session: this._uuid, - from: range.start, - to: range.end, - }), - ) - .then((response: Requests.Stream.Indexed.Response) => { - return response.rows; - }) - .catch((error: Error) => { - if (range.end >= this.len()) { - // It might be, during request search map has been changed already - // For example we requested range, but right after it, a new search - // was created and length of stream became 0 - // In this case we don't need to log any errors, but on backend error - // will be logged in any way. - } else { - this.log().error(`Fail to grab indexed content: ${error.message}`); - } - return []; - }); - } - - public asRanges(): Promise { - if (this._len === 0) { - return Promise.resolve([]); - } - return Requests.IpcRequest.send( - Requests.Stream.IndexesAsRanges.Response, - new Requests.Stream.IndexesAsRanges.Request({ - session: this._uuid, - }), - ).then((response: Requests.Stream.IndexesAsRanges.Response) => { - return response.ranges; - }); - } - - public getIndexesAround( - row: number, - ): Promise<{ before: number | undefined; after: number | undefined }> { - if (this._len === 0) { - return Promise.resolve({ before: undefined, after: undefined }); - } - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Stream.IndexesAround.Response, - new Requests.Stream.IndexesAround.Request({ - session: this._uuid, - row, - }), - ) - .then((response: Requests.Stream.IndexesAround.Response) => { - if (typeof response.error === 'string') { - return reject(new Error(response.error)); - } - resolve({ before: response.before, after: response.after }); - }) - .catch((error: Error) => { - this.log().error(`Fail to get distances around index ${row}: ${error.message}`); - }); - }); - } - - public modes(): { - regular(): boolean; - breadcrumbs(): boolean; - toggle(): { - regular(): Promise; - breadcrumbs(): Promise; - }; - } { - const request = (mode: IndexingMode): Promise => { - return Requests.IpcRequest.send( - Requests.Stream.Mode.Response, - new Requests.Stream.Mode.Request({ - session: this._uuid, - mode, - }), - ) - .then((response: Requests.Stream.Mode.Response) => { - if (response.error !== undefined) { - this.log().warn(`Fail to switch indexing mode: ${response.error}`); - } - }) - .catch((error: Error) => { - this.log().error(`Fail to switch indexing mode: ${error.message}`); - }) - .finally(() => { - this.subjects.get().changed.emit(); - }); - }; - return { - regular: (): boolean => { - return this._mode === IndexingMode.Regular; - }, - breadcrumbs: (): boolean => { - return this._mode === IndexingMode.Breadcrumbs; - }, - toggle: (): { - regular(): Promise; - breadcrumbs(): Promise; - } => { - return { - regular: (): Promise => { - this._mode = IndexingMode.Regular; - return request(this._mode); - }, - breadcrumbs: (): Promise => { - this._mode = - this._mode === IndexingMode.Regular - ? IndexingMode.Breadcrumbs - : IndexingMode.Regular; - return request(this._mode); - }, - }; - }, - }; - } -} -export interface Indexed extends LoggerInterface {} diff --git a/application/client/src/app/service/session/dependencies/info.ts b/application/client/src/app/service/session/dependencies/info.ts deleted file mode 100644 index db00e42c1a..0000000000 --- a/application/client/src/app/service/session/dependencies/info.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Subject } from '@platform/env/subscription'; -import { unique } from '@platform/env/sequence'; -import { Observe } from '@platform/types/observe'; -import { Protocol } from '@platform/types/observe/parser'; -import { getFileName } from '@platform/types/files'; - -export interface IInfoBlock { - caption: string; - tooltip: string; - icon?: string; -} - -export class Info { - protected readonly blocks: Map = new Map(); - - public updated: Subject = new Subject(); - - public destroy(): void { - this.updated.destroy(); - } - - public fromObserveInfo(observe: Observe) { - const uuid = observe.hash().toString(); - if (observe.configuration.parser[Protocol.Dlt] !== undefined) { - const cfg = observe.configuration.parser[Protocol.Dlt]; - if (cfg.fibex_file_paths !== undefined) { - if (cfg.fibex_file_paths.length === 1) { - this.add( - { - caption: `FIBEX: ${getFileName(cfg.fibex_file_paths[0])}`, - tooltip: `Used FIBEX: ${cfg.fibex_file_paths[0]}`, - }, - `fibex_${uuid}`, - ); - } else if (cfg.fibex_file_paths.length > 1) { - this.add( - { - caption: `FIBEX: ${cfg.fibex_file_paths.length} files`, - tooltip: cfg.fibex_file_paths.join('\n'), - }, - `fibex_${uuid}`, - ); - } - } - if (cfg.tz !== undefined) { - this.add( - { - caption: `TZ: ${cfg.tz}`, - tooltip: `Used TimeZone: ${cfg.tz}`, - }, - `tz_${uuid}`, - ); - } - } else if (observe.configuration.parser[Protocol.SomeIp] !== undefined) { - const cfg = observe.configuration.parser[Protocol.SomeIp]; - if (cfg.fibex_file_paths !== undefined) { - if (cfg.fibex_file_paths.length === 1) { - this.add( - { - caption: `FIBEX: ${getFileName(cfg.fibex_file_paths[0])}`, - tooltip: `Used FIBEX: ${cfg.fibex_file_paths[0]}`, - }, - `fibex_${uuid}`, - ); - } else if (cfg.fibex_file_paths.length > 1) { - this.add( - { - caption: `FIBEX: ${cfg.fibex_file_paths.length} files`, - tooltip: cfg.fibex_file_paths.join('\n'), - }, - `fibex_${uuid}`, - ); - } - } - } else if (observe.configuration.parser[Protocol.Text] !== undefined) { - // ignore - } - } - - public add(block: IInfoBlock, uuid?: string): string { - uuid = uuid === undefined ? unique() : uuid; - this.blocks.set(uuid, block); - this.updated.emit(); - return uuid; - } - - public update(uuid: string, block: IInfoBlock): void { - this.blocks.set(uuid, block); - this.updated.emit(); - } - - public remove(uuid: string): void { - this.blocks.delete(uuid); - this.updated.emit(); - } - - public get(): IInfoBlock[] { - return Array.from(this.blocks.values()); - } -} diff --git a/application/client/src/app/service/session/dependencies/observing/implementations/files.ts b/application/client/src/app/service/session/dependencies/observing/implementations/files.ts deleted file mode 100644 index cb25503f4b..0000000000 --- a/application/client/src/app/service/session/dependencies/observing/implementations/files.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { Provider as Base } from '../provider'; -import { ObserveSource } from '@service/session/dependencies/observing/source'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { List } from '@ui/views/sidebar/observe/lists/file/component'; -import { IMenuItem } from '@ui/service/contextmenu'; - -import * as $ from '@platform/types/observe'; - -export class Provider extends Base { - private _sources: ObserveSource[] = []; - private _processed: string[] = []; - - public contextMenu(source: ObserveSource): IMenuItem[] { - const items: IMenuItem[] = []; - const observer = source.observer; - if (observer !== undefined) { - items.push({ - caption: 'Stop tailing', - handler: () => { - observer.abort().catch((err: Error) => { - this.logger.error(`Fail to abort observing (file tailing): ${err.message}`); - }); - }, - }); - } - return items; - } - - public update(sources: ObserveSource[]): Provider { - const added = sources.filter((s) => !this._processed.includes(s.uuid())); - // Add files - this._sources.push( - ...added.filter( - (source) => source.observe.origin.nature() instanceof $.Origin.File.Configuration, - ), - ); - // Add files from concat-container - added.map((source) => { - const concat = source.observe.origin.as<$.Origin.Concat.Configuration>( - $.Origin.Concat.Configuration, - ); - if (concat === undefined) { - return; - } - const origins = concat.asFileOrigins(); - const parser = source.observe.parser.sterilized(); - const files = origins.map((origin) => { - return new ObserveSource(new $.Observe({ origin, parser })).asChild(); - }); - this._sources.push(...files); - }); - this._processed.push(...added.map((a) => a.uuid())); - Base.overwrite(sources, this._sources); - return this; - } - - public sources(): ObserveSource[] { - return this._sources; - } - - public getPanels(): { - list(): { - name(): string; - desc(): string; - comp(): IComponentDesc; - }; - nocontent(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - } { - return { - list: (): { - name(): string; - desc(): string; - comp(): IComponentDesc; - } => { - return { - name: (): string => { - return `Files`; - }, - desc: (): string => { - return this._sources.length > 0 ? this._sources.length.toString() : ''; - }, - comp: (): IComponentDesc => { - return { - factory: List, - inputs: { - provider: this, - }, - }; - }, - }; - }, - - nocontent: (): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - } => { - return { - name: (): string | undefined => { - return undefined; - }, - desc: (): string | undefined => { - return undefined; - }, - comp: (): IComponentDesc | undefined => { - return undefined; - }, - }; - }, - }; - } - - public override getNewSourceError(): Error | undefined { - const active = this._sources.find((s) => s.observer !== undefined); - if (active !== undefined) { - return new Error(`Cannot attach new source while file is tailing`); - } - if (this._sources.length !== 1) { - return undefined; - } - const singleTextFile = this._sources.find((s) => { - const file = s.observe.origin.as<$.Origin.File.Configuration>( - $.Origin.File.Configuration, - ); - if (file === undefined) { - return false; - } - if (file.filetype() === $.Types.File.FileType.Text && !s.child) { - return true; - } - return false; - }); - if (singleTextFile !== undefined) { - return new Error( - `Single file has been opened. In this case you cannot attach new source(s).`, - ); - } - return undefined; - } -} diff --git a/application/client/src/app/service/session/dependencies/observing/implementations/index.ts b/application/client/src/app/service/session/dependencies/observing/implementations/index.ts deleted file mode 100644 index 20d15fb76a..0000000000 --- a/application/client/src/app/service/session/dependencies/observing/implementations/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Provider as Files } from './files'; -import { Provider as Processes } from './processes'; -import { Provider as Serial } from './serial'; -import { Provider as Tcp } from './tcp'; -import { Provider as Udp } from './udp'; - -export const PROVIDERS = [Files, Processes, Serial, Tcp, Udp]; diff --git a/application/client/src/app/service/session/dependencies/observing/implementations/processes.ts b/application/client/src/app/service/session/dependencies/observing/implementations/processes.ts deleted file mode 100644 index bb6dec2e9a..0000000000 --- a/application/client/src/app/service/session/dependencies/observing/implementations/processes.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Provider as Base } from '../provider'; -import { ObserveSource } from '@service/session/dependencies/observing/source'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { List } from '@ui/views/sidebar/observe/lists/process/component'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { session } from '@service/session'; - -import * as $ from '@platform/types/observe'; -import * as Factory from '@platform/types/observe/factory'; - -export class Provider extends Base { - private _sources: ObserveSource[] = []; - - public contextMenu(source: ObserveSource): IMenuItem[] { - const items: IMenuItem[] = []; - const observer = source.observer; - if (observer !== undefined) { - items.push({ - caption: 'Stop', - handler: () => { - observer.abort().catch((err: Error) => { - this.logger.error(`Fail to abort observing (spawning): ${err.message}`); - }); - }, - }); - } else { - items.push({ - caption: 'Repeat Command', - handler: () => { - this.clone(source.observe).catch((err: Error) => { - this.logger.error(`Fail to repeat: ${err.message}`); - }); - }, - }); - } - return items; - } - - public update(sources: ObserveSource[]): Provider { - this._sources = sources.filter( - (source) => - source.observe.origin.nature() instanceof - $.Origin.Stream.Stream.Process.Configuration, - ); - return this; - } - - public openNewSessionOptions() { - session.initialize().configure(new Factory.Stream().process().get()); - } - - public sources(): ObserveSource[] { - return this._sources; - } - - public getPanels(): { - list(): { - name(): string; - desc(): string; - comp(): IComponentDesc; - }; - nocontent(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - } { - return { - list: (): { - name(): string; - desc(): string; - comp(): IComponentDesc; - } => { - return { - name: (): string => { - return `Commands`; - }, - desc: (): string => { - return this._sources.length > 0 ? this._sources.length.toString() : ''; - }, - comp: (): IComponentDesc => { - return { - factory: List, - inputs: { - provider: this, - }, - }; - }, - }; - }, - nocontent: (): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - } => { - return { - name: (): string | undefined => { - return undefined; - }, - desc: (): string | undefined => { - return undefined; - }, - comp: (): IComponentDesc | undefined => { - return undefined; - }, - }; - }, - }; - } -} diff --git a/application/client/src/app/service/session/dependencies/observing/implementations/serial.ts b/application/client/src/app/service/session/dependencies/observing/implementations/serial.ts deleted file mode 100644 index 63c12383a4..0000000000 --- a/application/client/src/app/service/session/dependencies/observing/implementations/serial.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { Provider as Base } from '../provider'; -import { ObserveSource } from '@service/session/dependencies/observing/source'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { List } from '@ui/views/sidebar/observe/lists/serial/component'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { session } from '@service/session'; - -import * as $ from '@platform/types/observe'; -import * as Factory from '@platform/types/observe/factory'; - -export class Provider extends Base { - private _sources: ObserveSource[] = []; - - public contextMenu(source: ObserveSource): IMenuItem[] { - const items: IMenuItem[] = []; - const observer = source.observer; - if (observer !== undefined) { - items.push({ - caption: 'Disconnect', - handler: () => { - observer.abort().catch((err: Error) => { - this.logger.error( - `Fail to abort observing (serial listening): ${err.message}`, - ); - }); - }, - }); - } else { - items.push({ - caption: 'Connect', - handler: () => { - this.clone(source.observe).catch((err: Error) => { - this.logger.error(`Fail to repeat: ${err.message}`); - }); - }, - }); - } - return items; - } - - public openNewSessionOptions() { - session.initialize().configure(new Factory.Stream().serial().get()); - } - - public update(sources: ObserveSource[]): Provider { - this._sources = sources.filter( - (source) => - source.observe.origin.nature() instanceof - $.Origin.Stream.Stream.Serial.Configuration, - ); - return this; - } - - public sources(): ObserveSource[] { - return this._sources; - } - - public getPanels(): { - list(): { - name(): string; - desc(): string; - comp(): IComponentDesc; - }; - nocontent(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - } { - return { - list: (): { - name(): string; - desc(): string; - comp(): IComponentDesc; - } => { - return { - name: (): string => { - return `Serial Connections`; - }, - desc: (): string => { - return this._sources.length > 0 ? this._sources.length.toString() : ''; - }, - comp: (): IComponentDesc => { - return { - factory: List, - inputs: { - provider: this, - }, - }; - }, - }; - }, - nocontent: (): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - } => { - return { - name: (): string | undefined => { - return undefined; - }, - desc: (): string | undefined => { - return undefined; - }, - comp: (): IComponentDesc | undefined => { - return undefined; - }, - }; - }, - }; - } -} diff --git a/application/client/src/app/service/session/dependencies/observing/implementations/tcp.ts b/application/client/src/app/service/session/dependencies/observing/implementations/tcp.ts deleted file mode 100644 index 03c7ae8827..0000000000 --- a/application/client/src/app/service/session/dependencies/observing/implementations/tcp.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { Provider as Base } from '../provider'; -import { ObserveSource } from '@service/session/dependencies/observing/source'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { List } from '@ui/views/sidebar/observe/lists/tcp/component'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { session } from '@service/session'; - -import * as $ from '@platform/types/observe'; -import * as Factory from '@platform/types/observe/factory'; - -export class Provider extends Base { - private _sources: ObserveSource[] = []; - - public contextMenu(source: ObserveSource): IMenuItem[] { - const items: IMenuItem[] = []; - const observer = source.observer; - if (observer !== undefined) { - items.push({ - caption: 'Disconnect', - handler: () => { - observer.abort().catch((err: Error) => { - this.logger.error( - `Fail to abort observing (tcp listening): ${err.message}`, - ); - }); - }, - }); - } else { - items.push({ - caption: 'Connect', - handler: () => { - this.clone(source.observe).catch((err: Error) => { - this.logger.error(`Fail to repeat: ${err.message}`); - }); - }, - }); - } - return items; - } - - public openNewSessionOptions() { - session.initialize().configure(new Factory.Stream().tcp().get()); - } - - public update(sources: ObserveSource[]): Provider { - this._sources = sources.filter( - (source) => - source.observe.origin.nature() instanceof $.Origin.Stream.Stream.TCP.Configuration, - ); - return this; - } - - public sources(): ObserveSource[] { - return this._sources; - } - - public getPanels(): { - list(): { - name(): string; - desc(): string; - comp(): IComponentDesc; - }; - nocontent(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - } { - return { - list: (): { - name(): string; - desc(): string; - comp(): IComponentDesc; - } => { - return { - name: (): string => { - return `TCP Connections`; - }, - desc: (): string => { - return this._sources.length > 0 ? this._sources.length.toString() : ''; - }, - comp: (): IComponentDesc => { - return { - factory: List, - inputs: { - provider: this, - }, - }; - }, - }; - }, - nocontent: (): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - } => { - return { - name: (): string | undefined => { - return undefined; - }, - desc: (): string | undefined => { - return undefined; - }, - comp: (): IComponentDesc | undefined => { - return undefined; - }, - }; - }, - }; - } -} diff --git a/application/client/src/app/service/session/dependencies/observing/implementations/udp.ts b/application/client/src/app/service/session/dependencies/observing/implementations/udp.ts deleted file mode 100644 index 86e974ce2e..0000000000 --- a/application/client/src/app/service/session/dependencies/observing/implementations/udp.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { Provider as Base } from '../provider'; -import { ObserveSource } from '@service/session/dependencies/observing/source'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { List } from '@ui/views/sidebar/observe/lists/udp/component'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { session } from '@service/session'; - -import * as $ from '@platform/types/observe'; -import * as Factory from '@platform/types/observe/factory'; - -export class Provider extends Base { - private _sources: ObserveSource[] = []; - - public contextMenu(source: ObserveSource): IMenuItem[] { - const items: IMenuItem[] = []; - const observer = source.observer; - if (observer !== undefined) { - items.push({ - caption: 'Disconnect', - handler: () => { - observer.abort().catch((err: Error) => { - this.logger.error( - `Fail to abort observing (udp listening): ${err.message}`, - ); - }); - }, - }); - } else { - items.push({ - caption: 'Connect', - handler: () => { - this.clone(source.observe).catch((err: Error) => { - this.logger.error(`Fail to repeat: ${err.message}`); - }); - }, - }); - } - return items; - } - - public openNewSessionOptions() { - session.initialize().configure(new Factory.Stream().udp().get()); - } - - public update(sources: ObserveSource[]): Provider { - this._sources = sources.filter( - (source) => - source.observe.origin.nature() instanceof $.Origin.Stream.Stream.UDP.Configuration, - ); - return this; - } - - public sources(): ObserveSource[] { - return this._sources; - } - - public getPanels(): { - list(): { - name(): string; - desc(): string; - comp(): IComponentDesc; - }; - nocontent(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - } { - return { - list: (): { - name(): string; - desc(): string; - comp(): IComponentDesc; - } => { - return { - name: (): string => { - return `UPD Connections`; - }, - desc: (): string => { - return this._sources.length > 0 ? this._sources.length.toString() : ''; - }, - comp: (): IComponentDesc => { - return { - factory: List, - inputs: { - provider: this, - }, - }; - }, - }; - }, - nocontent: (): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - } => { - return { - name: (): string | undefined => { - return undefined; - }, - desc: (): string | undefined => { - return undefined; - }, - comp: (): IComponentDesc | undefined => { - return undefined; - }, - }; - }, - }; - } -} diff --git a/application/client/src/app/service/session/dependencies/observing/operation.ts b/application/client/src/app/service/session/dependencies/observing/operation.ts deleted file mode 100644 index 2c7089c9d5..0000000000 --- a/application/client/src/app/service/session/dependencies/observing/operation.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Observe } from '@platform/types/observe'; -import { SdeRequest, SdeResponse } from '@platform/types/sde'; - -import * as $ from '@platform/types/observe'; - -export class ObserveOperation { - private _sdeTasksCount: number = 0; - - constructor( - public readonly uuid: string, - protected readonly observe: Observe, - protected readonly sde: (msg: SdeRequest) => Promise, - protected readonly restarting: (observe: Observe) => Promise, - protected readonly cancel: () => Promise, - ) {} - - public abort(): Promise { - return this.cancel(); - } - - public restart(): Promise { - return this.restarting(this.observe); - } - - public asObserve(): Observe { - return this.observe; - } - - public asOrigin(): $.Origin.Configuration { - return this.observe.origin; - } - - public send(): { - text(data: string): Promise; - bytes(data: number[]): Promise; - } { - const send = (request: SdeRequest): Promise => { - this._sdeTasksCount += 1; - return this.sde(request).finally(() => { - this._sdeTasksCount -= 1; - }); - }; - return { - text: (data: string): Promise => { - if (!this.observe.origin.isSdeSupported()) { - return Promise.reject( - new Error(`Observed origin doesn't support SDE protocol`), - ); - } - return send({ - WriteText: `${data}\n\r`, - }); - }, - bytes: (data: number[]): Promise => { - if (!this.observe.origin.isSdeSupported()) { - return Promise.reject( - new Error(`Observed origin doesn't support SDE protocol`), - ); - } - return send({ - WriteBytes: data, - }); - }, - }; - } - - public getSdeTasksCount(): number { - return this._sdeTasksCount; - } -} diff --git a/application/client/src/app/service/session/dependencies/observing/provider.ts b/application/client/src/app/service/session/dependencies/observing/provider.ts deleted file mode 100644 index fb9a4f6e81..0000000000 --- a/application/client/src/app/service/session/dependencies/observing/provider.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { Logger } from '@platform/log'; -import { Session } from '@service/session/session'; -import { ObserveSource } from '@service/session/dependencies/observing/source'; -import { unique } from '@platform/env/sequence'; -import { Subject, Subjects } from '@platform/env/subscription'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { Observe } from '@platform/types/observe'; -import { session } from '@service/session'; -import { components } from '@env/decorators/initial'; -import { popup, Vertical, Horizontal } from '@ui/service/popup'; - -import * as $ from '@platform/types/observe'; - -export interface ProviderConstructor { - new (session: Session, logger: Logger): Provider; -} - -export abstract class Provider { - static overwrite(src: ObserveSource[], dest: ObserveSource[]) { - src.filter((src) => src.observer === undefined).forEach((src) => { - const index = dest.findIndex((s) => s.observe.uuid === src.observe.uuid); - if (index !== -1) { - dest.splice(index, 1, src); - } - }); - } - public readonly session: Session; - public readonly logger: Logger; - public readonly subjects: Subjects<{ - updated: Subject; - }> = new Subjects({ - updated: new Subject(), - }); - public panels!: { - list: { - name: string; - desc: string; - comp: IComponentDesc; - }; - nocontent: { - name: string | undefined; - desc: string | undefined; - comp: IComponentDesc | undefined; - }; - }; - public readonly uuid: string = unique(); - - constructor(session: Session, logger: Logger) { - this.session = session; - this.logger = logger; - } - - public destroy() { - this.subjects.destroy(); - } - - public last(): Observe | undefined { - const sources = this.sources(); - if (sources.length === 0) { - return undefined; - } - const observe = sources[sources.length - 1]; - return observe.observe; - } - - public recent() { - const observe = this.last(); - if (observe === undefined) { - return; - } - popup.open({ - component: { - factory: components.get('app-navigator'), - inputs: { - observe, - }, - }, - position: { - vertical: Vertical.top, - horizontal: Horizontal.center, - }, - closeOnKey: 'Escape', - width: 450, - uuid: 'app-recent-actions-popup-observed', - }); - } - - public clone(observe: Observe): Promise { - if (!(observe.origin.instance instanceof $.Origin.Stream.Configuration)) { - return Promise.reject(new Error(`Only Origin.Stream can be repeated`)); - } - const last = this.last(); - if (last !== undefined) { - observe.parser.change(last.parser.instance); - } - return this.session.stream.observe().start(observe.clone()); - } - - public openAsNewOrigin(observe: Observe): Promise { - const last = this.last(); - if (last !== undefined) { - observe.parser.change(last.parser.instance); - } else { - return Promise.reject(new Error(`No data about current parser`)); - } - return this.session.stream.observe().start(observe.clone()); - } - - public openAsNew(source: ObserveSource | Observe): Promise { - return session - .initialize() - .configure(source instanceof ObserveSource ? source.observe : source); - } - - public setPanels(): Provider { - this.panels = { - list: { - name: this.getPanels().list().name(), - desc: this.getPanels().list().desc(), - comp: this.getPanels().list().comp(), - }, - nocontent: { - name: this.getPanels().nocontent().name(), - desc: this.getPanels().nocontent().desc(), - comp: this.getPanels().nocontent().comp(), - }, - }; - return this; - } - - public isEmpty(): boolean { - return this.sources().length === 0; - } - - public abstract contextMenu(source: ObserveSource): IMenuItem[]; - - public abstract update(sources: ObserveSource[]): Provider; - - public abstract sources(): ObserveSource[]; - - public abstract getPanels(): { - list(): { - name(): string; - desc(): string; - comp(): IComponentDesc; - }; - nocontent(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - }; - - public getNewSourceError(): Error | undefined { - return undefined; - } - - public count(): number { - return this.sources().length; - } -} diff --git a/application/client/src/app/service/session/dependencies/observing/providers.ts b/application/client/src/app/service/session/dependencies/observing/providers.ts deleted file mode 100644 index 894edcee5c..0000000000 --- a/application/client/src/app/service/session/dependencies/observing/providers.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Provider, ProviderConstructor } from './provider'; -import { Session } from '@service/session/session'; -import { Subscriber } from '@platform/env/subscription'; -import { Mutable } from '@platform/types/unity/mutable'; -import { PROVIDERS } from './implementations'; -import { cutUuid } from '@log/index'; - -@SetupLogger() -export class Providers extends Subscriber { - public readonly session!: Session; - - public readonly list: Map = new Map(); - - public init(session: Session) { - this.setLoggerName(`Providers: ${cutUuid(session.uuid())}`); - (this as Mutable).session = session; - PROVIDERS.forEach((providerConstructor: ProviderConstructor) => { - const provider = new providerConstructor(session, this.log()); - this.list.set(provider.uuid, provider.setPanels()); - }); - this.register( - session.stream.subjects.get().sources.subscribe(() => { - this.update(); - }), - session.stream.subjects.get().finished.subscribe(() => { - this.update(); - }), - session.stream.sde.subjects.get().selected.subscribe(() => { - this.update(); - }), - ); - this.update(); - } - - public destroy() { - this.unsubscribe(); - this.list.forEach((provider: Provider) => { - provider.destroy(); - }); - } - - public getNewSourceError(): Error | undefined { - let error: Error | undefined; - this.list.forEach((provider: Provider) => { - if (error !== undefined) { - return; - } - error = provider.getNewSourceError(); - }); - return error; - } - - public count(): number { - let count = 0; - this.list.forEach((provider) => { - count += provider.count(); - }); - return count; - } - - protected update() { - const sources = this.session.stream.observe().sources(); - this.list.forEach((provider, _uuid) => { - provider.update(sources).subjects.get().updated.emit(); - }); - } -} -export interface Providers extends LoggerInterface {} diff --git a/application/client/src/app/service/session/dependencies/observing/sde.ts b/application/client/src/app/service/session/dependencies/observing/sde.ts deleted file mode 100644 index 031afb7fb2..0000000000 --- a/application/client/src/app/service/session/dependencies/observing/sde.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { ObserveOperation } from './operation'; -import { error } from '@platform/log/utils'; -import { SdeRequest, SdeResponse } from '@platform/types/sde'; -import { Subject, Subjects } from '@platform/env/subscription'; - -import * as Requests from '@platform/ipc/request'; - -@SetupLogger() -export class Sde { - public readonly subjects: Subjects<{ - updated: Subject; - visibility: Subject; - selected: Subject; - }> = new Subjects({ - updated: new Subject(), - visibility: new Subject(), - selected: new Subject(), - }); - protected readonly uuid: string; - protected operations: ObserveOperation[] = []; - protected selected: ObserveOperation | undefined; - protected hidden: boolean = false; - - constructor(uuid: string) { - this.uuid = uuid; - } - - public destroy() { - this.subjects.destroy(); - } - - public send(uuid: string, request: SdeRequest): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Observe.SDE.Response, - new Requests.Observe.SDE.Request({ - session: this.uuid, - operation: uuid, - request, - }), - ) - .then((response: Requests.Observe.SDE.Response) => { - if (response.error !== undefined) { - return reject(new Error(response.error)); - } - if (response.result === undefined) { - return reject(new Error(`SDE doesn't return any kind of result`)); - } - try { - resolve(response.result); - } catch (e) { - return reject(new Error(error(e))); - } - }) - .catch((error: Error) => { - this.log().error(`Fail to send SDE into operation: ${error.message}`); - }); - }); - } - - public overwrite(running: Map): void { - this.operations = Array.from(running.values()).filter((s) => s.asOrigin().isSdeSupported()); - this.subjects.get().updated.emit(); - if (this.selected !== undefined) { - const target = this.selected.uuid; - if (this.operations.find((o) => o.uuid === target) === undefined) { - this.selecting().first(); - } - } else { - this.selecting().first(); - } - } - - public isAvailable(): boolean { - return this.operations.length > 0; - } - - public get(): ObserveOperation[] { - return this.operations; - } - - public visibility(): { - show(): void; - hide(): void; - hidden(): boolean; - } { - return { - show: (): void => { - this.hidden = false; - this.subjects.get().visibility.emit(); - }, - hide: (): void => { - this.hidden = true; - this.subjects.get().visibility.emit(); - }, - hidden: (): boolean => { - return this.hidden; - }, - }; - } - - public selecting(): { - is(uuid: string): boolean; - first(): void; - select(uuid: string | undefined): boolean; - get(): ObserveOperation | undefined; - } { - return { - is: (uuid: string): boolean => { - return this.selected === undefined - ? false - : this.selected.uuid === uuid || this.selected.asObserve().uuid === uuid; - }, - first: (): void => { - if (this.operations.length === 0) { - this.selected = undefined; - this.subjects.get().selected.emit(undefined); - return; - } - if (this.selected !== undefined && this.selected.uuid === this.operations[0].uuid) { - return; - } - this.selected = this.operations[0]; - this.subjects.get().selected.emit(this.selected.uuid); - }, - select: (uuid: string | undefined): boolean => { - if (uuid === undefined) { - const changed = this.selected !== undefined; - this.selected = undefined; - changed && this.subjects.get().selected.emit(uuid); - return changed; - } - if (this.selected !== undefined && this.selected.uuid === uuid) { - return false; - } - const candidate = this.operations.find( - (o) => o.uuid === uuid || o.asObserve().uuid === uuid, - ); - if (candidate === undefined) { - return false; - } - this.selected = candidate; - if (this.selected === undefined) { - return false; - } else { - this.subjects.get().selected.emit(uuid); - return true; - } - }, - get: (): ObserveOperation | undefined => { - return this.selected; - }, - }; - } -} -export interface Sde extends LoggerInterface {} diff --git a/application/client/src/app/service/session/dependencies/observing/source.ts b/application/client/src/app/service/session/dependencies/observing/source.ts deleted file mode 100644 index 55ccd622e5..0000000000 --- a/application/client/src/app/service/session/dependencies/observing/source.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ObserveOperation } from './operation'; -import { Observe } from '@platform/types/observe'; -import { Mutable } from '@platform/types/unity/mutable'; - -export class ObserveSource { - public readonly observe: Observe; - public readonly observer: ObserveOperation | undefined; - public readonly child: boolean = false; - - constructor(observe: Observe, observer?: ObserveOperation) { - this.observe = observe; - this.observer = observer; - } - - public uuid(): string { - return this.observe.uuid; - } - - public isSame(source: ObserveSource): boolean { - return this.uuid() === source.uuid(); - } - - public asChild(): ObserveSource { - (this as Mutable).child = true; - return this; - } -} diff --git a/application/client/src/app/service/session/dependencies/rank.ts b/application/client/src/app/service/session/dependencies/rank.ts deleted file mode 100644 index 3f0ef6f80e..0000000000 --- a/application/client/src/app/service/session/dependencies/rank.ts +++ /dev/null @@ -1,22 +0,0 @@ -export class Rank { - static RANK_WIDTH = 8; - static PADDING = 12; - - public len: number = 0; - - public set(length: number): boolean { - if (this.len === length) { - return false; - } - this.len = length; - return true; - } - - public width(): number { - return Rank.RANK_WIDTH * this.len + Rank.PADDING * 2; - } - - public getFiller(position: number): string { - return '0'.repeat(this.len - position.toString().length); - } -} diff --git a/application/client/src/app/service/session/dependencies/search.ts b/application/client/src/app/service/session/dependencies/search.ts deleted file mode 100644 index a795cc66f9..0000000000 --- a/application/client/src/app/service/session/dependencies/search.ts +++ /dev/null @@ -1,229 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Subscriber, Subjects, Subject } from '@platform/env/subscription'; -import { ISearchMap } from '@platform/types/filter'; -import { cutUuid } from '@log/index'; -import { IFilter, ISearchUpdated } from '@platform/types/filter'; -import { IRange } from '@platform/types/range'; -import { FilterRequest, FiltersStore } from './search/filters/store'; -import { DisableStore } from './search/disabled/store'; -import { ChartsStore } from './search/charts/store'; -import { State } from './search/state'; -import { NearestPosition } from '@platform/types/bindings'; - -import * as Requests from '@platform/ipc/request'; -import * as Events from '@platform/ipc/event'; -import { Session } from '@service/session'; - -@SetupLogger() -export class Search extends Subscriber { - public readonly subjects: Subjects<{ - updated: Subject; - map: Subject; - }> = new Subjects({ - updated: new Subject(), - map: new Subject(), - }); - private _len: number = 0; - private _uuid!: string; - private _store!: { - filters: FiltersStore; - charts: ChartsStore; - disabled: DisableStore; - }; - private _state!: State; - - public init(session: Session) { - this.setLoggerName(`Search: ${cutUuid(session.uuid())}`); - this._uuid = session.uuid(); - this.register( - Events.IpcEvent.subscribe(Events.Search.Updated.Event, (event) => { - if (event.session !== this._uuid) { - return; - } - this._len = event.rows; - this.subjects.get().updated.emit({ found: this._len, stat: event.stat }); - }), - ); - this.register( - Events.IpcEvent.subscribe(Events.Search.MapUpdated.Event, (event) => { - if (event.session !== this._uuid) { - return; - } - this.subjects.get().map.emit(); - }), - ); - this._store = { - filters: new FiltersStore(session.uuid()), - charts: new ChartsStore(session.uuid()), - disabled: new DisableStore(session.uuid()), - }; - this.register( - this._store.filters.subjects.get().value.subscribe(() => { - this.state() - .filters() - .catch((err: Error) => { - this.log().error(`Fail to trigger search by filters: ${err.message}`); - }); - }), - ); - this.register( - this._store.charts.subjects.get().value.subscribe(() => { - this.state() - .charts() - .catch((err: Error) => { - this.log().error(`Fail to trigger search by charts: ${err.message}`); - }); - }), - ); - this._state = new State(session); - } - - public destroy() { - this.unsubscribe(); - this._store.filters.destroy(); - this._store.charts.destroy(); - this._store.disabled.destroy(); - this._state.destroy(); - this.subjects.destroy(); - } - - public len(): number { - return this._len; - } - - public search(filters: IFilter[]): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Search.Search.Response, - new Requests.Search.Search.Request({ - session: this._uuid, - filters: filters.filter((f) => FilterRequest.isValid(f)), - }), - ) - .then((response) => { - if (typeof response.error === 'string' && response.error.trim() !== '') { - reject(new Error(response.error)); - } else { - resolve(response.canceled ? 0 : response.found); - } - }) - .catch(reject); - }); - } - - public searchNestedMatch(rev: boolean): Promise<[number, number] | undefined> { - const filter = this.state().nested().get(); - if (filter === undefined) { - return Promise.resolve(undefined); - } - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Search.NextNested.Response, - new Requests.Search.NextNested.Request({ - session: this._uuid, - filter, - from: rev ? this.state().nested().prevPos() : this.state().nested().nextPos(), - rev, - }), - ) - .then((response) => { - resolve(response.pos); - }) - .catch(reject); - }); - } - - public extract(filters: string[]): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Values.Extract.Response, - new Requests.Values.Extract.Request({ - session: this._uuid, - filters, - }), - ) - .then((response) => { - if (typeof response.error === 'string' && response.error.trim() !== '') { - reject(new Error(response.error)); - } else { - resolve(); - } - }) - .catch(reject); - }); - } - - public getScaledMap(len: number, range?: IRange): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Search.Map.Response, - new Requests.Search.Map.Request({ - session: this._uuid, - len, - from: range ? range.start : undefined, - to: range ? range.end : undefined, - }), - ) - .then((response) => { - resolve(response.map); - }) - .catch(reject); - }); - } - - public drop(): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Search.Drop.Response, - new Requests.Search.Drop.Request({ - session: this._uuid, - }), - ) - .then(() => { - resolve(undefined); - }) - .catch(reject); - }); - } - - public nearest(stream: number): Promise { - return new Promise((resolve) => { - Requests.IpcRequest.send( - Requests.Search.Nearest.Response, - new Requests.Search.Nearest.Request({ - session: this._uuid, - row: stream, - }), - ) - .then((response: Requests.Search.Nearest.Response) => { - resolve(response.nearest); - }) - .catch((error: Error) => { - this.log().error(`Fail to get nearest content: ${error.message}`); - }); - }); - } - - public store(): { - filters(): FiltersStore; - charts(): ChartsStore; - disabled(): DisableStore; - } { - return { - filters: (): FiltersStore => { - return this._store.filters; - }, - charts: (): ChartsStore => { - return this._store.charts; - }, - disabled: (): DisableStore => { - return this._store.disabled; - }, - }; - } - - public state(): State { - return this._state; - } -} -export interface Search extends LoggerInterface {} diff --git a/application/client/src/app/service/session/dependencies/search/charts/request.ts b/application/client/src/app/service/session/dependencies/search/charts/request.ts deleted file mode 100644 index ac35ab211a..0000000000 --- a/application/client/src/app/service/session/dependencies/search/charts/request.ts +++ /dev/null @@ -1,331 +0,0 @@ -import { Subject } from '@platform/env/subscription'; -import { getNextColor } from '@styles/colors'; -import { DisableConvertable } from '../disabled/converting'; -import { Hash, Recognizable } from '@platform/types/storage/entry'; -import { ChartDefinition, ChartType } from '@platform/types/chart'; -import { styles } from '@ui/service/styles'; -import { Json } from '@platform/types/storage/json'; -import { unique } from '@platform/env/sequence'; -import { error } from '@platform/log/utils'; -import { Key } from '../store'; -import { Equal } from '@platform/types/env/types'; -import { Updatable } from '../store'; -import { UpdateEvent } from './store.update'; -import { getFilterError } from '@module/util'; -import { serializeHtml } from '@platform/env/str'; -import { settings } from '@service/settings'; - -import * as regexFilters from '@platform/env/filters'; -import * as obj from '@platform/env/obj'; - -export { ChartType }; - -export interface OptionalDefinition { - filter: string; - color?: string; - widths?: { - line: number; - point: number; - }; - active?: boolean; - type?: ChartType; - uuid?: string; -} - -export interface OptionalColors { - color?: string; - background?: string; -} - -export interface UpdateRequest { - filter?: string; - color?: string; - line?: number; - point?: number; - active?: boolean; - type?: ChartType; -} - -export class ChartRequest - extends Json - implements Recognizable, DisableConvertable, Hash, Equal, Updatable -{ - public static KEY: Key = Key.charts; - public static DEFAULT_LINE_WIDTH = 1; - public static DEFAULT_POINT_RADIUS = 0; - - public static fromJson(json: string): ChartRequest | Error { - try { - const def: ChartDefinition = JSON.parse(json); - def.uuid = obj.getAsString(def, 'uuid'); - def.filter = obj.getAsNotEmptyString(def, 'filter'); - def.color = obj.getAsNotEmptyString(def, 'color'); - def.widths = obj.getAsObj(def, 'widths'); - def.widths.line = obj.getAsValidNumber(def.widths, 'line'); - def.widths.point = obj.getAsValidNumber(def.widths, 'point'); - def.active = obj.getAsBool(def, 'active'); - const type = obj.getAsNotEmptyStringOrAsUndefined(def, 'type'); - def.type = type === undefined ? ChartType.Linear : (type as ChartType); - return new ChartRequest(def); - } catch (e) { - return new Error(error(e)); - } - } - - public static fromV2(smth: { [key: string]: unknown }): ChartRequest | Error { - try { - return new ChartRequest({ - uuid: obj.getAsString(smth, 'guid'), - filter: obj.getAsNotEmptyString(smth, 'request'), - color: obj.getAsNotEmptyString(smth, 'color'), - active: obj.getAsBool(smth, 'active'), - }); - } catch (e) { - return new Error(error(e)); - } - } - - public readonly definition: ChartDefinition; - public readonly updated: Subject = new Subject(); - - private _regex!: RegExp; - private _safeRegExp!: RegExp; - private _hash!: string; - - static isValid(filter: string | undefined): boolean { - return filter === undefined - ? false - : getFilterError(filter, false, false, true) === undefined - ? regexFilters.hasGroups(filter) - : false; - } - - static getValidationError(filter: string): string | undefined { - let error: string | undefined = getFilterError(filter, false, false, true); - if (error !== undefined) { - const match: RegExpMatchArray | null = error.match(/error:.+/i); - if (match !== null && match[0] !== undefined) { - error = match[0].trim(); - } - } else if (!regexFilters.hasGroups(filter)) { - error = `No groups`; - } - return error; - } - - static defaults(value: string): ChartRequest { - const color = getNextColor(); - return new ChartRequest({ - filter: value, - color: color, - widths: { - line: ChartRequest.DEFAULT_LINE_WIDTH, - point: ChartRequest.DEFAULT_POINT_RADIUS, - }, - type: ChartType.Linear, - }); - } - - static getHashByDefinition(def: ChartDefinition): string { - return `${def.filter}${def.color}${def.widths.line}${def.widths.point}${def.type}${ - def.active ? '1' : '0' - }`; - } - - constructor(def: OptionalDefinition) { - super(); - const defaultMatchColor = - settings.defaults['general.colors.default_chart'] === undefined - ? styles.colors().scheme_color_match - : settings.defaults['general.colors.default_chart']; - this.definition = { - filter: def.filter, - uuid: def.uuid === undefined ? unique() : def.uuid, - active: def.active === undefined ? true : def.active, - color: def.color === undefined ? defaultMatchColor : def.color, - type: def.type === undefined ? ChartType.Linear : def.type, - widths: - def.widths === undefined - ? { - line: ChartRequest.DEFAULT_LINE_WIDTH, - point: ChartRequest.DEFAULT_POINT_RADIUS, - } - : def.widths, - }; - this.update(); - } - - public destroy() { - this.updated.destroy(); - } - - public uuid(): string { - return this.definition.uuid; - } - - public json(): { - to(): string; - from(str: string): ChartRequest | Error; - key(): string; - } { - return { - to: (): string => { - return JSON.stringify(this.definition); - }, - from: (json: string): ChartRequest | Error => { - return ChartRequest.fromJson(json); - }, - key: (): string => { - return ChartRequest.KEY; - }, - }; - } - - public as(): { - regExp(): RegExp; - serializedRegExp(): RegExp; - filter(): string; - } { - return { - regExp: (): RegExp => { - return this._regex; - }, - serializedRegExp: (): RegExp => { - return this._safeRegExp; - }, - filter: (): string => { - return this.definition.filter; - }, - }; - } - - public alias(): string { - return `${this.definition.filter}`; - } - - public set(silence: boolean = false): { - from(desc: UpdateRequest): boolean; - color(color: string): boolean; - line(width: number): boolean; - point(width: number): boolean; - state(active: boolean): boolean; - filter(filter: string): boolean; - type(type: ChartType): boolean; - } { - return { - from: (desc: UpdateRequest): boolean => { - const event = new UpdateEvent(this); - if (typeof desc.filter === 'string' && this.set(true).filter(desc.filter)) { - event.on().filter(); - } - if (typeof desc.active === 'boolean' && this.set(true).state(desc.active)) { - event.on().state(); - } - if (typeof desc.color === 'string' && this.set(true).color(desc.color)) { - event.on().color(); - } - if (typeof desc.line === 'number' && this.set(true).line(desc.line)) { - event.on().line(); - } - if (typeof desc.point === 'number' && this.set(true).point(desc.point)) { - event.on().point(); - } - if (desc.type !== undefined && this.set(true).type(desc.type)) { - event.on().point(); - } - if (event.changed() && this.update()) { - this.updated.emit(event); - } - return event.changed(); - }, - color: (color: string): boolean => { - this.definition.color = color; - if (!silence && this.update()) { - this.updated.emit(new UpdateEvent(this).on().color()); - } - return true; - }, - line: (width: number): boolean => { - this.definition.widths.line = width; - if (!silence && this.update()) { - this.updated.emit(new UpdateEvent(this).on().line()); - } - return true; - }, - point: (width: number): boolean => { - this.definition.widths.point = width; - if (!silence && this.update()) { - this.updated.emit(new UpdateEvent(this).on().point()); - } - return true; - }, - state: (active: boolean): boolean => { - this.definition.active = active; - if (!silence && this.update()) { - this.updated.emit(new UpdateEvent(this).on().state()); - } - return true; - }, - filter: (filter: string): boolean => { - this.definition.filter = filter; - if (!silence && this.update()) { - this.updated.emit(new UpdateEvent(this).on().filter()); - } - return true; - }, - type: (type: ChartType): boolean => { - this.definition.type = type; - if (!silence && this.update()) { - this.updated.emit(new UpdateEvent(this).on().type()); - } - return true; - }, - }; - } - - public disabled(): { - displayName(): string; - typeRef(): Key; - icon(): string; - } { - return { - displayName: (): string => { - return this.definition.filter; - }, - typeRef: (): Key => { - return Key.charts; - }, - icon: (): string => { - return 'bar_chart'; - }, - }; - } - - public hash(): string { - return this._hash; - } - - public isSame(filter: ChartRequest): boolean { - return filter.definition.filter === this.definition.filter; - } - - protected update(): boolean { - const prev: string = this._hash; - this._regex = regexFilters.getMarkerRegExp(this.definition.filter, { - reg: true, - word: false, - cases: false, - }); - this._safeRegExp = regexFilters.getMarkerRegExp(serializeHtml(this.definition.filter), { - reg: true, - word: false, - cases: false, - }); - this._hash = `${this.definition.filter}${this.definition.color}${ - this.definition.widths.line - }${this.definition.widths.point}${this.definition.type}${ - this.definition.active ? '1' : '0' - }`; - return prev !== this._hash; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/charts/store.ts b/application/client/src/app/service/session/dependencies/search/charts/store.ts deleted file mode 100644 index ba9ce3dfa4..0000000000 --- a/application/client/src/app/service/session/dependencies/search/charts/store.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Key, Store, StoredEntity } from '../store'; -import { ChartRequest } from './request'; -import { IFilter } from '@platform/types/filter'; -import { DisableConvertable } from '../disabled/converting'; -import { FilterRequest } from '../filters/request'; - -import * as regexFilters from '@platform/env/filters'; - -export { ChartRequest } from './request'; - -export class ChartsStore extends Store { - public key(): Key { - return Key.filters; - } - - public addFromFilter(filter: IFilter): void { - const request = new ChartRequest({ filter: filter.filter }); - if (this.has(request)) { - return; - } - this.update([request as StoredEntity]); - } - - public tryRestore(smth: DisableConvertable): boolean { - if (smth instanceof ChartRequest) { - this.update([smth as StoredEntity]); - return true; - } else { - return false; - } - } - - public isConvertableFrom(smth: StoredEntity): boolean { - return ( - smth instanceof FilterRequest && regexFilters.hasGroups(smth.definition.filter.filter) - ); - } - - public tryFromFilter(smth: StoredEntity | FilterRequest): boolean { - if ( - smth instanceof FilterRequest && - regexFilters.hasGroups(smth.definition.filter.filter) - ) { - const def = smth.definition; - this.update([ - new ChartRequest({ - filter: def.filter.filter, - color: def.colors.background, - active: true, - }) as StoredEntity, - ]); - return true; - } else { - return false; - } - } - - public getActiveCount(): number { - return this.get().filter((request) => request.definition.active).length; - } - - public has(request: ChartRequest): boolean { - return this.get().find((entity) => entity.isSame(request)) !== undefined; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/charts/store.update.ts b/application/client/src/app/service/session/dependencies/search/charts/store.update.ts deleted file mode 100644 index 28f0c83a42..0000000000 --- a/application/client/src/app/service/session/dependencies/search/charts/store.update.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { EntityUpdateEvent } from '../store.update'; -import { ChartRequest } from './request'; - -export interface UpdateEventInner { - filter: boolean; - state: boolean; - color: boolean; - line: boolean; - point: boolean; - stat: boolean; - type: boolean; -} - -export class UpdateEvent extends EntityUpdateEvent { - protected request: ChartRequest; - protected event: UpdateEventInner = { - filter: false, - state: false, - color: false, - line: false, - point: false, - stat: false, - type: false, - }; - - constructor(request: ChartRequest) { - super(); - this.request = request; - } - - public on(): { - filter(): UpdateEvent; - state(): UpdateEvent; - color(): UpdateEvent; - line(): UpdateEvent; - point(): UpdateEvent; - stat(): UpdateEvent; - type(): UpdateEvent; - } { - return { - filter: (): UpdateEvent => { - this.event.filter = true; - return this; - }, - state: (): UpdateEvent => { - this.event.state = true; - return this; - }, - color: (): UpdateEvent => { - this.event.color = true; - return this; - }, - line: (): UpdateEvent => { - this.event.line = true; - return this; - }, - point: (): UpdateEvent => { - this.event.point = true; - return this; - }, - stat: (): UpdateEvent => { - this.event.stat = true; - return this; - }, - type: (): UpdateEvent => { - this.event.type = true; - return this; - }, - }; - } - - public changed(): boolean { - return ( - this.event.line || - this.event.point || - this.event.color || - this.event.filter || - this.event.stat || - this.event.state - ); - } - - public consequence(): { - highlights: boolean; - value: boolean; - inner: boolean; - storable: boolean; - } { - return { - highlights: this.event.line || this.event.point || this.event.color || this.event.type, - value: this.event.state || this.event.filter, - inner: - this.event.line || - this.event.point || - this.event.color || - this.event.filter || - this.event.stat || - this.event.state || - this.event.type, - storable: - this.event.line || - this.event.point || - this.event.color || - this.event.filter || - this.event.state || - this.event.type, - }; - } - public inner(): UpdateEventInner { - return this.event; - } - public entity(): ChartRequest { - return this.request; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/disabled/converting.ts b/application/client/src/app/service/session/dependencies/search/disabled/converting.ts deleted file mode 100644 index 630ddc1ff8..0000000000 --- a/application/client/src/app/service/session/dependencies/search/disabled/converting.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Recognizable, Hash } from '@platform/types/storage/entry'; -import { Json } from '@platform/types/storage/json'; -import { Key } from '../store'; -import { FilterRequest } from '../filters/request'; -import { ChartRequest } from '../charts/request'; - -export interface DisableConvertable extends Recognizable, Json, Hash { - disabled(): { - displayName(): string; - typeRef(): Key; - icon(): string; - }; -} diff --git a/application/client/src/app/service/session/dependencies/search/disabled/request.ts b/application/client/src/app/service/session/dependencies/search/disabled/request.ts deleted file mode 100644 index 047ce32547..0000000000 --- a/application/client/src/app/service/session/dependencies/search/disabled/request.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { FilterRequest } from '../filters/request'; -import { ChartRequest } from '../charts/request'; -import { DisableConvertable } from './converting'; -import { Hash, Recognizable } from '@platform/types/storage/entry'; -import { Key } from '../store'; -import { error } from '@platform/log/utils'; -import { Json } from '@platform/types/storage/json'; -import { Equal } from '@platform/types/env/types'; -import { Updatable } from '../store'; -import { Subject } from '@platform/env/subscription'; - -export interface IDesc { - type: string; - desc: any; -} - -export class DisabledRequest - extends Json - implements Recognizable, Hash, Equal, Updatable -{ - public static KEY: Key = Key.disabled; - public static fromJson(json: string): DisabledRequest | Error { - try { - const def: { - key: Key; - value: string; - } = JSON.parse(json); - let entity; - if (def.key === Key.filters) { - entity = FilterRequest.fromJson(def.value); - if (entity instanceof Error) { - return entity; - } - return new DisabledRequest(entity); - } else if (def.key === Key.charts) { - entity = ChartRequest.fromJson(def.value); - if (entity instanceof Error) { - return entity; - } - return new DisabledRequest(entity); - } else { - return new Error(`Unsupportable content for Disabled; key = ${def.key}`); - } - } catch (e) { - return new Error(error(e)); - } - } - private _entity: DisableConvertable; - private _key: Key; - public readonly updated: Subject | undefined; - - constructor(entity: DisableConvertable) { - super(); - let key: Key | undefined; - [FilterRequest, ChartRequest].forEach((classRef) => { - if (key !== undefined) { - return; - } - if (entity instanceof classRef) { - key = classRef.KEY; - } - }); - if (key === undefined) { - throw new Error(`Fail to find a class for entity: ${typeof entity}`); - } - this._entity = entity; - this._key = key; - } - - public isSame(disabled: DisabledRequest): boolean { - const getFilterHash = (f: FilterRequest) => { - return `${f.definition.filter.filter}|${f.definition.filter.flags.cases}|${f.definition.filter.flags.reg}|${f.definition.filter.flags.word}`; - }; - const left = disabled.entity(); - const right = this.entity(); - if (left instanceof FilterRequest && right instanceof FilterRequest) { - return getFilterHash(left) === getFilterHash(right); - } - if (left instanceof ChartRequest && right instanceof ChartRequest) { - return left.definition.filter === right.definition.filter; - } - return false; - } - - public uuid(): string { - return this._entity.uuid(); - } - - public entity(): DisableConvertable { - return this._entity; - } - - public as(): { - filter(): FilterRequest | undefined; - chart(): ChartRequest | undefined; - } { - return { - filter: (): FilterRequest | undefined => { - return this._entity instanceof FilterRequest ? this._entity : undefined; - }, - chart: (): ChartRequest | undefined => { - return this._entity instanceof ChartRequest ? this._entity : undefined; - }, - }; - } - - public json(): { - to(): string; - from(str: string): DisabledRequest | Error; - key(): string; - } { - return { - to: (): string => { - return JSON.stringify({ - key: this._key, - value: this._entity.json().to(), - }); - }, - from: (json: string): DisabledRequest | Error => { - return DisabledRequest.fromJson(json); - }, - key: (): string => { - return DisabledRequest.KEY; - }, - }; - } - - public hash(): string { - return this._entity.hash(); - } -} diff --git a/application/client/src/app/service/session/dependencies/search/disabled/store.ts b/application/client/src/app/service/session/dependencies/search/disabled/store.ts deleted file mode 100644 index 9e58145861..0000000000 --- a/application/client/src/app/service/session/dependencies/search/disabled/store.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Key, Store, StoredEntity } from '../store'; -import { DisabledRequest } from './request'; -import { DisableConvertable } from './converting'; - -export { DisabledRequest } from './request'; - -export class DisableStore extends Store { - public key(): Key { - return Key.filters; - } - - public addFromEntity(entities: DisableConvertable[]) { - return this.update( - entities.map((en) => new DisabledRequest(en) as StoredEntity), - ); - } - - public has(request: DisabledRequest): boolean { - return this.get().find((entity) => entity.isSame(request)) !== undefined; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/filters/request.ts b/application/client/src/app/service/session/dependencies/search/filters/request.ts deleted file mode 100644 index a7f197cd30..0000000000 --- a/application/client/src/app/service/session/dependencies/search/filters/request.ts +++ /dev/null @@ -1,360 +0,0 @@ -import { Subject } from '@platform/env/subscription'; -import { getContrastColor, getNextColor } from '@styles/colors'; -import { DisableConvertable } from '../disabled/converting'; -import { IFilter, IFilterFlags, FilterDefinition, FilterStyle } from '@platform/types/filter'; -import { Hash, Recognizable } from '@platform/types/storage/entry'; -import { Json } from '@platform/types/storage/json'; -import { unique } from '@platform/env/sequence'; -import { error } from '@platform/log/utils'; -import { Key } from '../store'; -import { Equal } from '@platform/types/env/types'; -import { Updatable } from '../store'; -import { UpdateEvent } from './store.update'; -import { getFilterError } from '@module/util'; -import { serializeHtml } from '@platform/env/str'; -import { settings } from '@service/settings'; -import { styles } from '@ui/service/styles'; - -import * as regexFilters from '@platform/env/filters'; -import * as obj from '@platform/env/obj'; - -export interface OptionalDefinition { - filter: IFilter; - colors?: FilterStyle; - active?: boolean; - uuid?: string; -} - -export interface OptionalColors { - color?: string; - background?: string; -} - -export interface UpdateRequest { - filter?: string; - flags?: IFilterFlags; - color?: string; - background?: string; - active?: boolean; -} - -export class FilterRequest - extends Json - implements Recognizable, DisableConvertable, Hash, Equal, Updatable -{ - public static KEY: Key = Key.filters; - - public static fromDefinition(def: IFilter): FilterRequest { - return new FilterRequest({ - filter: def, - }); - } - - public static fromJson(json: string): FilterRequest | Error { - try { - const def: FilterDefinition = JSON.parse(json); - def.uuid = obj.getAsString(def, 'uuid'); - def.filter = obj.getAsObj(def, 'filter'); - def.filter.flags = obj.getAsObj(def.filter, 'flags'); - def.filter.filter = obj.getAsNotEmptyString(def.filter, 'filter'); - def.colors = obj.getAsObj(def, 'colors'); - def.colors.color = obj.getAsNotEmptyString(def.colors, 'color'); - def.colors.background = obj.getAsNotEmptyString(def.colors, 'background'); - def.active = obj.getAsBool(def, 'active'); - return new FilterRequest(def); - } catch (e) { - return new Error(error(e)); - } - } - - public static fromV2(smth: { [key: string]: unknown }): FilterRequest | Error { - try { - const flags = obj.getAsObj(smth, 'flags'); - return new FilterRequest({ - uuid: obj.getAsString(smth, 'guid'), - filter: { - filter: obj.getAsNotEmptyString(smth, 'request'), - flags: { - cases: obj.getAsBool(flags, 'casesensitive'), - word: obj.getAsBool(flags, 'wholeword'), - reg: obj.getAsBool(flags, 'regexp'), - }, - }, - colors: { - color: obj.getAsNotEmptyString(smth, 'color'), - background: obj.getAsNotEmptyString(smth, 'background'), - }, - active: obj.getAsBool(smth, 'active'), - }); - } catch (e) { - return new Error(error(e)); - } - } - - static isValid(filter: IFilter): boolean { - return ( - getFilterError( - filter.filter, - filter.flags.cases, - filter.flags.word, - filter.flags.reg, - ) === undefined - ); - } - - static getValidationError(filter: IFilter): string | undefined { - let error: string | undefined = getFilterError( - filter.filter, - filter.flags.cases, - filter.flags.word, - filter.flags.reg, - ); - if (error !== undefined) { - const match: RegExpMatchArray | null = error.match(/error:.+/i); - if (match !== null && match[0] !== undefined) { - error = match[0].trim(); - } - } - return error; - } - - static defaults(value: string): FilterRequest { - const color = getNextColor(); - return new FilterRequest({ - filter: { filter: value, flags: { reg: true, word: false, cases: false } }, - colors: { - background: color, - color: getContrastColor(color, true), - }, - }); - } - - static getHashByDefinition(def: FilterDefinition): string { - return `${def.filter.filter}${def.filter.flags.cases ? 'c' : ''}${ - def.filter.flags.reg ? 'r' : '' - }${def.filter.flags.word ? 'w' : ''}${def.colors.color}${def.colors.background}${ - def.active ? '1' : '0' - }`; - } - - public readonly definition: FilterDefinition; - public readonly updated: Subject = new Subject(); - - private _regex!: RegExp; - private _safeRegExp!: RegExp; - private _hash!: string; - public found: number = 0; - - constructor(def: OptionalDefinition) { - super(); - const defaultMatchColor = - settings.defaults['general.colors.default_filter'] === undefined - ? styles.colors().scheme_color_match - : settings.defaults['general.colors.default_filter']; - this.definition = { - filter: { - filter: def.filter.filter, - flags: Object.assign({}, def.filter.flags), - }, - uuid: def.uuid === undefined ? unique() : def.uuid, - active: def.active === undefined ? true : def.active, - colors: { - color: - def.colors === undefined - ? getContrastColor(defaultMatchColor, true) - : def.colors.color === undefined - ? getContrastColor(defaultMatchColor, true) - : def.colors.color, - background: - def.colors === undefined - ? defaultMatchColor - : def.colors.background === undefined - ? defaultMatchColor - : def.colors.background, - }, - }; - this.update(); - } - - public destroy() { - this.updated.destroy(); - } - - public uuid(): string { - return this.definition.uuid; - } - - public json(): { - to(): string; - from(str: string): FilterRequest | Error; - key(): string; - } { - return { - to: (): string => { - return JSON.stringify(this.definition); - }, - from: (json: string): FilterRequest | Error => { - return FilterRequest.fromJson(json); - }, - key: (): string => { - return FilterRequest.KEY; - }, - }; - } - - public as(): { - regExp(): RegExp; - serializedRegExp(): RegExp; - filter(): IFilter; - } { - return { - regExp: (): RegExp => { - return this._regex; - }, - serializedRegExp: (): RegExp => { - return this._safeRegExp; - }, - filter: (): IFilter => { - return { - filter: this.definition.filter.filter, - flags: Object.assign({}, this.definition.filter.flags), - }; - }, - }; - } - - public alias(): string { - return `${this.definition.filter.filter}:${this.definition.filter.flags.reg ? '1' : '0'}${ - !this.definition.filter.flags.cases ? '1' : '0' - }${this.definition.filter.flags.word ? '1' : '0'}`; - } - - public set(silence: boolean = false): { - from(desc: UpdateRequest): boolean; - color(color: string): boolean; - background(background: string): boolean; - state(active: boolean): boolean; - flags(flags: IFilterFlags): boolean; - filter(filter: string): boolean; - found(number: number): boolean; - } { - return { - from: (desc: UpdateRequest): boolean => { - const event = new UpdateEvent(this); - if (typeof desc.filter === 'string' && this.set(true).filter(desc.filter)) { - event.on().filter(); - } - if (typeof desc.flags === 'string' && this.set(true).flags(desc.flags)) { - event.on().filter(); - } - if (typeof desc.active === 'boolean' && this.set(true).state(desc.active)) { - event.on().state(); - } - if (typeof desc.color === 'string' && this.set(true).color(desc.color)) { - event.on().colors(); - } - if ( - typeof desc.background === 'string' && - this.set(true).background(desc.background) - ) { - event.on().colors(); - } - if (event.changed() && this.update()) { - this.updated.emit(event); - } - return event.changed(); - }, - color: (color: string): boolean => { - this.definition.colors.color = color; - if (!silence && this.update()) { - this.updated.emit(new UpdateEvent(this).on().colors()); - } - return true; - }, - background: (background: string): boolean => { - this.definition.colors.background = background; - if (!silence && this.update()) { - this.updated.emit(new UpdateEvent(this).on().colors()); - } - return true; - }, - state: (active: boolean): boolean => { - this.definition.active = active; - if (!silence && this.update()) { - this.updated.emit(new UpdateEvent(this).on().state()); - } - return true; - }, - flags: (flags: IFilterFlags): boolean => { - this.definition.filter.flags = Object.assign({}, flags); - if (!silence && this.update()) { - this.updated.emit(new UpdateEvent(this).on().filter()); - } - return true; - }, - filter: (filter: string): boolean => { - this.definition.filter.filter = filter; - if (!silence && this.update()) { - this.updated.emit(new UpdateEvent(this).on().filter()); - } - return true; - }, - found: (found: number): boolean => { - this.found = found; - if (!silence && this.update()) { - this.updated.emit(new UpdateEvent(this).on().stat()); - } - return true; - }, - }; - } - - public disabled(): { - displayName(): string; - typeRef(): Key; - icon(): string; - } { - return { - displayName: (): string => { - return this.definition.filter.filter; - }, - typeRef: (): Key => { - return Key.filters; - }, - icon: (): string => { - return 'search'; - }, - }; - } - - public hash(): string { - return this._hash; - } - - public isSame(filter: FilterRequest): boolean { - const hash = (f: FilterRequest) => { - return `${f.definition.filter.filter}|${f.definition.filter.flags.cases}|${f.definition.filter.flags.reg}|${f.definition.filter.flags.word}`; - }; - return hash(filter) === hash(this); - } - - protected update(): boolean { - const prev: string = this._hash; - this._regex = regexFilters.getMarkerRegExp( - this.definition.filter.filter, - this.definition.filter.flags, - ); - this._safeRegExp = regexFilters.getMarkerRegExp( - serializeHtml(this.definition.filter.filter), - this.definition.filter.flags, - ); - this._hash = `${this.definition.filter.filter}${ - this.definition.filter.flags.cases ? 'c' : '' - }${this.definition.filter.flags.reg ? 'r' : ''}${ - this.definition.filter.flags.word ? 'w' : '' - }${this.definition.colors.color}${this.definition.colors.background}${ - this.definition.active ? '1' : '0' - }`; - return prev !== this._hash; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/filters/store.ts b/application/client/src/app/service/session/dependencies/search/filters/store.ts deleted file mode 100644 index af28249a84..0000000000 --- a/application/client/src/app/service/session/dependencies/search/filters/store.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Key, Store, StoredEntity } from '../store'; -import { FilterRequest } from './request'; -import { IFilter } from '@platform/types/filter'; -import { DisableConvertable } from '../disabled/converting'; - -export { FilterRequest } from './request'; - -export class FiltersStore extends Store { - public key(): Key { - return Key.filters; - } - - public addFromFilter(filter: IFilter): boolean { - const request = new FilterRequest({ filter }); - if (this.has(request)) { - return false; - } - this.update([request as StoredEntity]); - return true; - } - - public tryRestore(smth: DisableConvertable): boolean { - if (smth instanceof FilterRequest) { - this.update([smth as StoredEntity]); - return true; - } else { - return false; - } - } - - public getActiveCount(): number { - return this.get().filter((request) => request.definition.active).length; - } - - public has(request: FilterRequest): boolean { - return this.get().find((entity) => entity.isSame(request)) !== undefined; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/filters/store.update.ts b/application/client/src/app/service/session/dependencies/search/filters/store.update.ts deleted file mode 100644 index 9dc1fd0422..0000000000 --- a/application/client/src/app/service/session/dependencies/search/filters/store.update.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { EntityUpdateEvent } from '../store.update'; -import { FilterRequest } from './request'; - -export interface UpdateEventInner { - filter: boolean; - state: boolean; - colors: boolean; - stat: boolean; -} - -export class UpdateEvent extends EntityUpdateEvent { - protected filter: FilterRequest; - protected event: UpdateEventInner = { - filter: false, - state: false, - colors: false, - stat: false, - }; - - constructor(filter: FilterRequest) { - super(); - this.filter = filter; - } - - public on(): { - filter(): UpdateEvent; - state(): UpdateEvent; - colors(): UpdateEvent; - stat(): UpdateEvent; - } { - return { - filter: (): UpdateEvent => { - this.event.filter = true; - return this; - }, - state: (): UpdateEvent => { - this.event.state = true; - return this; - }, - colors: (): UpdateEvent => { - this.event.colors = true; - return this; - }, - stat: (): UpdateEvent => { - this.event.stat = true; - return this; - }, - }; - } - - public changed(): boolean { - return this.event.colors || this.event.filter || this.event.stat || this.event.state; - } - - public consequence(): { - highlights: boolean; - value: boolean; - inner: boolean; - storable: boolean; - } { - return { - highlights: this.event.colors, - value: this.event.state || this.event.filter, - inner: this.event.colors || this.event.filter || this.event.stat || this.event.state, - storable: this.event.colors || this.event.filter || this.event.state, - }; - } - public inner(): UpdateEventInner { - return this.event; - } - public entity(): FilterRequest { - return this.filter; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/highlights.ts b/application/client/src/app/service/session/dependencies/search/highlights.ts deleted file mode 100644 index b8648b7009..0000000000 --- a/application/client/src/app/service/session/dependencies/search/highlights.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { FilterRequest } from './filters/request'; - -import { Subscriber, Subjects, Subject } from '@platform/env/subscription'; -import { ModifierProcessor } from './highlights/processor'; -import { Owner } from '@schema/content/row'; -import { Session } from '@service/session'; -import { serializeHtml } from '@platform/env/str'; -import { safeEscapeAnsi } from '@module/ansi'; - -import * as Modifiers from './highlights/modifiers/index'; - -export class Highlights extends Subscriber { - protected session!: Session; - - public readonly subjects: Subjects<{ - update: Subject; - }> = new Subjects({ - update: new Subject(), - }); - - constructor() { - super(); - } - - init(session: Session) { - this.session = session; - this.register( - this.session.search - .store() - .filters() - .subjects.get() - .highlights.subscribe(() => { - this.subjects.get().update.emit(); - }), - this.session.search - .store() - .charts() - .subjects.get() - .highlights.subscribe(() => { - this.subjects.get().update.emit(); - }), - this.session.search - .store() - .filters() - .subjects.get() - .value.subscribe(() => { - this.subjects.get().update.emit(); - }), - this.session.search - .store() - .charts() - .subjects.get() - .value.subscribe(() => { - this.subjects.get().update.emit(); - }), - ); - this.register( - this.session.search - .state() - .subjects.search.get() - .active.subscribe(() => { - this.subjects.get().update.emit(); - }), - ); - } - - public destroy(): void { - this.unsubscribe(); - this.subjects.destroy(); - } - - public parse( - position: number, - row: string, - parent: Owner, - hasOwnStyles: boolean, - columns?: { column: number; map: [number, number][] }, - ): { - html: string; - color: string | undefined; - background: string | undefined; - injected: { [key: string]: boolean }; - } { - // Get rid of original HTML in logs - const serialized = serializeHtml(row); - const asci = new Modifiers.AsciModifier(serialized); - const escaped = safeEscapeAnsi(serialized); - const filtres = new Modifiers.FiltersModifier( - this.session.search.store().filters().get(), - escaped, - ); - const active = this.session.search.state().getActive(); - const nested = this.session.search.state().nested().get(); - const processor = new ModifierProcessor([ - filtres, - new Modifiers.ChartsModifier(this.session.search.store().charts().get(), escaped), - ...this.session.comments.getModifiers(position, escaped, columns), - ...(active !== undefined - ? [ - new Modifiers.ActiveFilterModifier( - [new FilterRequest({ filter: active })], - escaped, - ), - ] - : []), - ...(nested !== undefined - ? [ - new Modifiers.NestedSearchModifier( - [new FilterRequest({ filter: nested })], - escaped, - ), - ] - : []), - asci, - ]); - const matched = filtres.matched(); - const processed = processor.parse(escaped, parent, hasOwnStyles); - return { - html: processed.row, - color: matched === undefined ? undefined : matched.definition.colors.color, - background: matched === undefined ? undefined : matched.definition.colors.background, - injected: processed.injected, - }; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/highlights/modifier.ts b/application/client/src/app/service/session/dependencies/search/highlights/modifier.ts deleted file mode 100644 index 304517e2d6..0000000000 --- a/application/client/src/app/service/session/dependencies/search/highlights/modifier.ts +++ /dev/null @@ -1,65 +0,0 @@ -export enum EType { - above = 'above', // 0 - Absolute priority - match = 'match', // 1 - Major - breakable = 'breakable', // 2 - Can be ignored. This is ASCII for example - advanced = 'advanced', // 2. -} - -export const Priorities = [EType.above, EType.match, EType.breakable]; - -export interface IModifierRange { - start: number; - end: number; -} - -export enum EHTMLInjectionType { - close = 'close', - open = 'open', -} - -export enum EApplyTo { - all = 'all', - output = 'output', - search = 'search', -} - -export enum EAlias { - Active = 'active', - Filters = 'filtres', - Charts = 'charts', - Comments = 'comments', -} - -export interface IHTMLInjection { - offset: number; - injection: string; - type: EHTMLInjectionType; -} - -export abstract class Modifier { - public static Signature: string = 'modifier'; - - public abstract getInjections(): IHTMLInjection[]; - - public abstract obey(ranges: Array>): void; - - public abstract getRanges(): Array>; - - public abstract type(): EType; - - public abstract getGroupPriority(): number; - - public abstract finalize(str: string): string; - - public abstract getName(): string; - - public abstract alias(): EAlias; - - public applyTo(): EApplyTo { - return EApplyTo.all; - } - - public signature(): string { - return Modifier.Signature; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/active.ts b/application/client/src/app/service/session/dependencies/search/highlights/modifiers/active.ts deleted file mode 100644 index 59d79c9dc4..0000000000 --- a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/active.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { - Modifier, - EType, - IHTMLInjection, - EHTMLInjectionType, - IModifierRange, - EAlias, -} from '../modifier'; -import { FilterRequest } from '../../filters/request'; -import { settings } from '@service/settings'; -import { getContrastColor } from '@styles/colors'; - -import * as ModifiersTools from '../tools'; - -export class ActiveFilterModifier extends Modifier { - private _ranges: IModifierRange[] = []; - private _matched: FilterRequest | undefined; - - constructor(filters: FilterRequest[], row: string) { - super(); - this._map(row, filters); - } - - public alias(): EAlias { - return EAlias.Active; - } - - public getInjections(): IHTMLInjection[] { - const defaultMatchColor = settings.defaults['general.colors.match']; - const injections: IHTMLInjection[] = []; - this._ranges.forEach((range: IModifierRange) => { - injections.push( - ...[ - { - offset: range.start, - injection: ``, - type: EHTMLInjectionType.open, - }, - { - offset: range.end, - injection: ``, - type: EHTMLInjectionType.close, - }, - ], - ); - }); - return injections; - } - - public type(): EType { - return EType.match; - } - - public obey(ranges: Array>) { - this._ranges = ModifiersTools.obey(ranges, this._ranges); - } - - public getRanges(): Array> { - return this._ranges; - } - - public getGroupPriority(): number { - return 1; - } - - public finalize(str: string): string { - return str; - } - - public getName(): string { - return 'ActiveFilterModifier'; - } - - public matched(): FilterRequest | undefined { - return this._matched; - } - - private _map(row: string, filters: FilterRequest[]) { - filters.forEach((request: FilterRequest) => { - row.replace(request.as().serializedRegExp(), (match: string, ...args: any[]) => { - const offset: number = - typeof args[args.length - 2] === 'number' - ? args[args.length - 2] - : args[args.length - 3]; - this._ranges.push({ - start: offset, - end: offset + match.length, - }); - this._matched = request; - return ''; - }); - }); - // Remove nested ranges because it doesn't make sense, - // because color is same - this._ranges = ModifiersTools.removeIncluded(this._ranges); - // Remove conflicts - this._ranges = ModifiersTools.removeCrossing(this._ranges); - } -} diff --git a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/asci.ts b/application/client/src/app/service/session/dependencies/search/highlights/modifiers/asci.ts deleted file mode 100644 index cce5e1e0d6..0000000000 --- a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/asci.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { - Modifier, - EType, - IHTMLInjection, - EHTMLInjectionType, - IModifierRange, - EAlias, -} from '../modifier'; -import { getAnsiMap, Slot } from '@module/ansi'; - -import * as ModifiersTools from '../tools'; - -export interface IRange extends IModifierRange { - bgcl: string | undefined; - fgcl: string | undefined; -} - -export class AsciModifier extends Modifier { - protected ranges: IRange[] = []; - - constructor(row: string) { - super(); - const map = getAnsiMap(row); - if (map instanceof Error) { - return; - } - this.ranges = map - .filter((slot: Slot) => slot.background !== undefined || slot.color !== undefined) - .map((slot: Slot) => { - return { - start: slot.from, - end: slot.to, - bgcl: typeof slot.background !== 'string' ? undefined : slot.background, - fgcl: typeof slot.color !== 'string' ? undefined : slot.color, - }; - }); - // Remove conflicts - this.ranges = ModifiersTools.removeCrossing(this.ranges) as IRange[]; - } - - public alias(): EAlias { - return EAlias.Filters; - } - - public getInjections(): IHTMLInjection[] { - const injections: IHTMLInjection[] = []; - this.ranges.forEach((range: IRange) => { - injections.push( - ...[ - { - offset: range.start, - injection: ``, - type: EHTMLInjectionType.open, - }, - { - offset: range.end, - injection: ``, - type: EHTMLInjectionType.close, - }, - ], - ); - }); - return injections; - } - - public type(): EType { - return EType.match; - } - - public obey(ranges: Array>) { - this.ranges = ModifiersTools.obey(ranges, this.ranges) as IRange[]; - } - - public getRanges(): Array> { - return this.ranges; - } - - public getGroupPriority(): number { - return 2; - } - - public finalize(str: string): string { - return str; - } - - public getName(): string { - return 'AsciModifier'; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/charts.ts b/application/client/src/app/service/session/dependencies/search/highlights/modifiers/charts.ts deleted file mode 100644 index 85478e05a5..0000000000 --- a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/charts.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { - Modifier, - EType, - IHTMLInjection, - EHTMLInjectionType, - IModifierRange, - EAlias, -} from '../modifier'; -import { ChartRequest } from '../../charts/request'; -import { styles } from '@ui/service/styles'; - -import * as Colors from '@styles/colors'; -import * as ModifiersTools from '../tools'; - -export interface IRange extends IModifierRange { - bgcl: string; -} - -export class ChartsModifier extends Modifier { - private _ranges: IRange[] = []; - private _matched: ChartRequest | undefined; - - constructor(highlights: ChartRequest[], row: string) { - super(); - this._map(row, highlights); - } - - public alias(): EAlias { - return EAlias.Charts; - } - - public getInjections(): IHTMLInjection[] { - const injections: IHTMLInjection[] = []; - this._ranges.forEach((range: IRange) => { - const fgcl: string = Colors.getContrastColor(range.bgcl, true); - injections.push( - ...[ - { - offset: range.start, - injection: ``, - type: EHTMLInjectionType.open, - }, - { - offset: range.end, - injection: ``, - type: EHTMLInjectionType.close, - }, - ], - ); - }); - return injections; - } - - public type(): EType { - return EType.match; - } - - public obey(ranges: Array>) { - this._ranges = ModifiersTools.obey(ranges, this._ranges) as IRange[]; - } - - public getRanges(): Array> { - return this._ranges; - } - - public getGroupPriority(): number { - return 2; - } - - public finalize(str: string): string { - return str; - } - - public getName(): string { - return 'ChartsModifier'; - } - - public matched(): ChartRequest | undefined { - return this._matched; - } - - private _map(row: string, highlights: ChartRequest[]) { - highlights.forEach((request: ChartRequest) => { - row.replace(request.as().serializedRegExp(), (match: string, ...args: any[]) => { - const offset: number = - typeof args[args.length - 2] === 'number' - ? args[args.length - 2] - : args[args.length - 3]; - this._ranges.push({ - start: offset, - end: offset + match.length, - bgcl: - request.definition.color === Colors.CColors[0] - ? styles.colors().scheme_color_4 - : request.definition.color === undefined - ? styles.colors().scheme_color_4 - : Colors.shadeColor(request.definition.color, 30), - }); - this._matched = request; - return ''; - }); - }); - // Remove conflicts - this._ranges = ModifiersTools.removeCrossing(this._ranges) as IRange[]; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/comments.ts b/application/client/src/app/service/session/dependencies/search/highlights/modifiers/comments.ts deleted file mode 100644 index 54b2eef232..0000000000 --- a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/comments.ts +++ /dev/null @@ -1,178 +0,0 @@ -import { - Modifier, - EApplyTo, - EType, - IHTMLInjection, - EHTMLInjectionType, - IModifierRange, - EAlias, -} from '../modifier'; - -import * as ModifiersTools from '../tools'; - -import { CommentState, CommentDefinition } from '@platform/types/comment'; - -export class CommentsModifier extends Modifier { - protected ranges: IModifierRange[] = []; - protected readonly comment: CommentDefinition | undefined; - - protected setRange( - comment: CommentDefinition, - position: number, - str: string, - columns?: { column: number; map: [number, number][] }, - ) { - const from = columns !== undefined ? columns.map[columns.column][0] : 0; - const to = - columns !== undefined - ? columns.map[columns.column][0] + columns.map[columns.column][1] - : str.length; - if ( - position === comment.selection.start.position && - position === comment.selection.end.position - ) { - let start = comment.selection.start.offset; - let end = comment.selection.end.offset; - if (from < comment.selection.start.offset && to < comment.selection.start.offset) { - return; - } - if (from > comment.selection.end.offset && to > comment.selection.end.offset) { - return; - } - if (from <= comment.selection.start.offset && comment.selection.start.offset <= to) { - start = comment.selection.start.offset - from; - } else { - start = 0; - } - if (from <= comment.selection.end.offset && comment.selection.end.offset <= to) { - end = comment.selection.end.offset - from; - } else { - end = str.length; - } - this.ranges.push({ - start: start < 0 ? 0 : start, - end: end < 0 ? 0 : end, - }); - } - if ( - position === comment.selection.start.position && - position !== comment.selection.end.position - ) { - let start = comment.selection.start.offset; - if (from < comment.selection.start.offset && to < comment.selection.start.offset) { - return; - } - if (from <= comment.selection.start.offset && comment.selection.start.offset <= to) { - start = comment.selection.start.offset - from; - } else { - start = 0; - } - this.ranges.push({ - start: start < 0 ? 0 : start, - end: str.length, - }); - } - if ( - position !== comment.selection.start.position && - position === comment.selection.end.position - ) { - let end = comment.selection.end.offset; - if (from > comment.selection.end.offset && to > comment.selection.end.offset) { - return; - } - if (from <= comment.selection.end.offset && comment.selection.end.offset <= to) { - end = comment.selection.end.offset - from; - } else { - end = str.length; - } - this.ranges.push({ - start: 0, - end: end < 0 ? 0 : end, - }); - } - if ( - position > comment.selection.start.position && - position < comment.selection.end.position - ) { - this.ranges.push({ - start: 0, - end: str.length, - }); - } - } - - constructor( - comment: CommentDefinition | undefined, - position: number, - row: string, - columns?: { column: number; map: [number, number][] }, - ) { - super(); - if (comment !== undefined) { - this.comment = comment; - this.setRange(comment, position, row, columns); - } - } - - public alias(): EAlias { - return EAlias.Comments; - } - - public getInjections(): IHTMLInjection[] { - if (this.comment === undefined) { - return []; - } - const injections: IHTMLInjection[] = []; - this.ranges.forEach((range: IModifierRange) => { - injections.push( - ...[ - { - offset: range.start, - injection: ``, - type: EHTMLInjectionType.open, - }, - { - offset: range.end, - injection: ``, - type: EHTMLInjectionType.close, - }, - ], - ); - }); - return injections; - } - - public type(): EType { - return EType.above; - } - - public obey(ranges: Array>) { - this.ranges = ModifiersTools.obey(ranges, this.ranges); - } - - public getRanges(): Array> { - return this.ranges; - } - - public getGroupPriority(): number { - return 1; - } - - public finalize(str: string): string { - return str; - } - - public getName(): string { - return 'CommentsModifier'; - } - - public override applyTo(): EApplyTo { - return EApplyTo.output; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/filtres.ts b/application/client/src/app/service/session/dependencies/search/highlights/modifiers/filtres.ts deleted file mode 100644 index 09a5554aca..0000000000 --- a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/filtres.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { - Modifier, - EType, - IHTMLInjection, - EHTMLInjectionType, - IModifierRange, - EAlias, -} from '../modifier'; -import { FilterRequest } from '../../filters/request'; -import { styles } from '@ui/service/styles'; - -import * as Colors from '@styles/colors'; -import * as ModifiersTools from '../tools'; - -export interface IRange extends IModifierRange { - bgcl: string; -} - -export class FiltersModifier extends Modifier { - private _ranges: IRange[] = []; - private _matched: FilterRequest | undefined; - - constructor(highlights: FilterRequest[], row: string) { - super(); - this._map(row, highlights); - } - - public alias(): EAlias { - return EAlias.Filters; - } - - public getInjections(): IHTMLInjection[] { - const injections: IHTMLInjection[] = []; - this._ranges.forEach((range: IRange) => { - const fgcl: string = Colors.getContrastColor(range.bgcl, true); - injections.push( - ...[ - { - offset: range.start, - injection: ``, - type: EHTMLInjectionType.open, - }, - { - offset: range.end, - injection: ``, - type: EHTMLInjectionType.close, - }, - ], - ); - }); - return injections; - } - - public type(): EType { - return EType.match; - } - - public obey(ranges: Array>) { - this._ranges = ModifiersTools.obey(ranges, this._ranges) as IRange[]; - } - - public getRanges(): Array> { - return this._ranges; - } - - public getGroupPriority(): number { - return 2; - } - - public finalize(str: string): string { - return str; - } - - public getName(): string { - return 'FiltersModifier'; - } - - public matched(): FilterRequest | undefined { - return this._matched; - } - - private _map(row: string, highlights: FilterRequest[]) { - highlights.forEach((request: FilterRequest) => { - row.replace(request.as().serializedRegExp(), (match: string, ...args: any[]) => { - const offset: number = - typeof args[args.length - 2] === 'number' - ? args[args.length - 2] - : args[args.length - 3]; - this._ranges.push({ - start: offset, - end: offset + match.length, - bgcl: - request.definition.colors.background === Colors.CColors[0] - ? styles.colors().scheme_color_4 - : request.definition.colors.background === undefined - ? styles.colors().scheme_color_4 - : Colors.shadeColor(request.definition.colors.background, 30), - }); - this._matched = request; - return ''; - }); - }); - // Remove conflicts - this._ranges = ModifiersTools.removeCrossing(this._ranges) as IRange[]; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/index.ts b/application/client/src/app/service/session/dependencies/search/highlights/modifiers/index.ts deleted file mode 100644 index c6df14988e..0000000000 --- a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { ActiveFilterModifier } from './active'; -export { FiltersModifier } from './filtres'; -export { ChartsModifier } from './charts'; -export { CommentsModifier } from './comments'; -export { AsciModifier } from './asci'; -export { NestedSearchModifier } from './nested'; diff --git a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/nested.ts b/application/client/src/app/service/session/dependencies/search/highlights/modifiers/nested.ts deleted file mode 100644 index ff9540c2e0..0000000000 --- a/application/client/src/app/service/session/dependencies/search/highlights/modifiers/nested.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { - Modifier, - EType, - IHTMLInjection, - EHTMLInjectionType, - IModifierRange, - EAlias, -} from '../modifier'; -import { FilterRequest } from '../../filters/request'; - -import * as ModifiersTools from '../tools'; - -export class NestedSearchModifier extends Modifier { - private _ranges: IModifierRange[] = []; - private _matched: FilterRequest | undefined; - - constructor(filters: FilterRequest[], row: string) { - super(); - this._map(row, filters); - } - - public alias(): EAlias { - return EAlias.Active; - } - - public getInjections(): IHTMLInjection[] { - const injections: IHTMLInjection[] = []; - this._ranges.forEach((range: IModifierRange) => { - injections.push( - ...[ - { - offset: range.start, - injection: ``, - type: EHTMLInjectionType.open, - }, - { - offset: range.end, - injection: ``, - type: EHTMLInjectionType.close, - }, - ], - ); - }); - return injections; - } - - public type(): EType { - return EType.match; - } - - public obey(ranges: Array>) { - this._ranges = ModifiersTools.obey(ranges, this._ranges); - } - - public getRanges(): Array> { - return this._ranges; - } - - public getGroupPriority(): number { - return 1; - } - - public finalize(str: string): string { - return str; - } - - public getName(): string { - return 'NestedSearchModifier'; - } - - public matched(): FilterRequest | undefined { - return this._matched; - } - - private _map(row: string, filters: FilterRequest[]) { - filters.forEach((request: FilterRequest) => { - row.replace(request.as().serializedRegExp(), (match: string, ...args: any[]) => { - const offset: number = - typeof args[args.length - 2] === 'number' - ? args[args.length - 2] - : args[args.length - 3]; - this._ranges.push({ - start: offset, - end: offset + match.length, - }); - this._matched = request; - return ''; - }); - }); - // Remove nested ranges because it doesn't make sense, - // because color is same - this._ranges = ModifiersTools.removeIncluded(this._ranges); - // Remove conflicts - this._ranges = ModifiersTools.removeCrossing(this._ranges); - } -} diff --git a/application/client/src/app/service/session/dependencies/search/highlights/processor.ts b/application/client/src/app/service/session/dependencies/search/highlights/processor.ts deleted file mode 100644 index 87b06eecaf..0000000000 --- a/application/client/src/app/service/session/dependencies/search/highlights/processor.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { - Modifier, - EType, - IHTMLInjection, - EHTMLInjectionType, - Priorities, - EApplyTo, -} from './modifier'; -import { Owner } from '@schema/content/row'; -import { Logger } from '@platform/log'; -import { scope } from '@platform/env/scope'; -import { serializeHtml } from '@platform/env/str'; - -export class ModifierProcessor { - private _modifiers: Modifier[]; - private _injections: IHTMLInjection[] = []; - private _logger: Logger = scope.getLogger('ModifierProcessor'); - - constructor(modifiers: Modifier[]) { - this._modifiers = modifiers; - } - - public parse( - row: string, - parent: Owner, - hasOwnStyles: boolean, - ): { row: string; injected: { [key: string]: boolean } } { - const cleanup = (str: string): string => { - // For finalization procedure we are applying - // all modifiers. For example, to cleanup from - // ASCII escapes - this._modifiers.forEach((modifier: Modifier) => { - const finalized: string = modifier.finalize(str); - const safe: string = serializeHtml(finalized); - if (safe.length !== finalized.length) { - this._logger.warn(`Modifier "${modifier.getName()}" tries to inject HTML`); - } - str = safe; - }); - return str; - }; - this._injections = []; - const modifiers: Modifier[] = this._getApplicableModifiers(parent, hasOwnStyles); - Priorities.forEach((type: EType, index: number) => { - const subordinateTypes: EType[] = - index !== Priorities.length - 1 - ? Priorities.slice(index + 1, Priorities.length) - : []; - const masters: Modifier[] = modifiers.filter((m) => m.type() === type); - const subordinates: Modifier[] = modifiers.filter( - (m) => subordinateTypes.indexOf(m.type()) !== -1, - ); - if (masters.length === 0) { - return; - } else { - masters.sort((a, b) => (a.getGroupPriority() > b.getGroupPriority() ? 1 : -1)); - masters.forEach((master: Modifier, n: number) => { - for (let i = n + 1; i <= masters.length - 1; i += 1) { - masters[i].obey(master.getRanges()); - } - }); - } - if (subordinates.length === 0) { - return; - } else { - subordinates.sort((a, b) => (a.getGroupPriority() > b.getGroupPriority() ? 1 : -1)); - masters.forEach((master: Modifier) => { - subordinates.forEach((subordinate: Modifier) => { - subordinate.obey(master.getRanges()); - }); - }); - } - }); - const injected: { [key: string]: boolean } = {}; - modifiers.forEach((modifier: Modifier) => { - let ignore: boolean = false; - // Check injections of modifier - modifier.getInjections().forEach((inj: IHTMLInjection) => { - const err: Error | undefined = this._getInjectionError(inj.injection); - if (err instanceof Error) { - this._logger.warn( - `Injection of modifier "${modifier.getName()}" has been rejected due error: ${ - err.message - }`, - ); - ignore = true; - } - }); - if (!ignore) { - const injections = modifier.getInjections(); - if (injections.length > 0) { - injected[modifier.alias()] = true; - this._injections.push(...modifier.getInjections()); - } else { - injected[modifier.alias()] = false; - } - } else { - this._logger.warn( - `All injections of modifier "${modifier.getName()}" will be ignored`, - ); - } - }); - this._injections.sort((a: IHTMLInjection, b: IHTMLInjection) => { - return a.offset < b.offset ? 1 : -1; - }); - let injections: IHTMLInjection[] = []; - this._injections.forEach((inj: IHTMLInjection) => { - if (injections.find((a) => a.offset === inj.offset) !== undefined) { - // Skip. Already done. - return; - } - const same: IHTMLInjection[] = this._injections.filter((a) => a.offset === inj.offset); - if (same.length === 1) { - injections.push(inj); - } else { - same.sort((a: IHTMLInjection) => { - return a.type === EHTMLInjectionType.close ? 1 : -1; - }); - injections = injections.concat(same); - } - }); - this._injections = injections; - this._injections.forEach((inj: IHTMLInjection) => { - row = - row.substring(0, inj.offset) + - inj.injection + - row.substring(inj.offset, row.length); - }); - if (row.search(/[><]/g) !== -1) { - row = row.replace(/(^.*?<)|(>.*?<)|(>.*?$)/gi, (match: string) => { - let clean: string = match.replace(/[><]/gi, ''); - if (clean === '') { - return match; - } - clean = cleanup(clean); - return `${match[0] === '>' ? '>' : ''}${clean}${ - match[match.length - 1] === '<' ? '<' : '' - }`; - }); - } else { - row = cleanup(row); - } - return { row, injected }; - } - - public wasChanged(): boolean { - return this._injections.length > 0; - } - - private _getApplicableModifiers(target: Owner, hasOwnStyles: boolean): Modifier[] { - const applyTo: EApplyTo = (() => { - if (target === Owner.Output) { - return EApplyTo.output; - } - if (target === Owner.Search) { - return EApplyTo.search; - } - return EApplyTo.all; - })(); - return this._modifiers.filter((modifier: Modifier) => { - if (modifier.applyTo() !== EApplyTo.all && modifier.applyTo() !== applyTo) { - return false; - } - if (hasOwnStyles) { - return [EType.above, EType.match].indexOf(modifier.type()) !== -1; - } else { - return true; - } - }); - } - - private _getInjectionError(injection: string): Error | undefined { - const tag = /<\/?(span|b|i).*?>/gi; - const match: RegExpMatchArray | null = injection.match(tag); - if (match === null) { - return new Error( - `Expecting "injection" has to be HTML tag (supported tags: , and .)`, - ); - } - if (match.length > 1) { - return new Error( - `"injection" should return only one tag. Multiple tags are prohibited`, - ); - } - if (injection.replace(tag, '').length !== 0) { - return new Error( - `"injection" should return only tag without any content outside of tag.`, - ); - } - return undefined; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/highlights/tools.ts b/application/client/src/app/service/session/dependencies/search/highlights/tools.ts deleted file mode 100644 index ac974b1bfa..0000000000 --- a/application/client/src/app/service/session/dependencies/search/highlights/tools.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { IModifierRange } from './modifier'; - -export function removeCrossing(ranges: Array>): Array> { - const removed: number[] = []; - return ranges = ranges.filter((checking: IModifierRange, i: number) => { - let excluded: boolean = false; - ranges.forEach((range: IModifierRange, n: number) => { - if (excluded || removed.indexOf(n) !== -1) { - return; - } - if (range.start < checking.start && range.end > checking.start && range.end < checking.end) { - excluded = true; - } - if (range.start < checking.end && range.end > checking.end && range.start > checking.start) { - excluded = true; - } - }); - if (excluded) { - removed.push(i); - } - return !excluded; - }); -} - -export function removeIncluded(ranges: Array>): Array> { - const removed: number[] = []; - return ranges.filter((checking: IModifierRange, i: number) => { - - let excluded: boolean = false; - ranges.forEach((range: IModifierRange, n: number) => { - if (excluded || removed.indexOf(n) !== -1) { - return; - } - if (range.start < checking.start && range.end > checking.end) { - excluded = true; - } - }); - if (excluded) { - removed.push(i); - } - return !excluded; - }); -} - -export function obey(master: Array>, slave: Array>): Array> { - return slave.filter((checking: IModifierRange) => { - let excluded: boolean = false; - master.forEach((range: IModifierRange) => { - if (excluded) { - return; - } - // Prevent any crossing - if ((range.start < checking.start && range.end > checking.start) || - (range.start < checking.end && range.end > checking.end)) { - excluded = true; - } - }); - return !excluded; - }); -} - -export function consider(master: Array>, slave: Array>): Array> { - return slave.filter((checking: IModifierRange) => { - let excluded: boolean = false; - master.forEach((range: IModifierRange) => { - if (excluded) { - return; - } - // Prevent any crossing - if ((range.start < checking.start && range.end > checking.start) || - (range.start < checking.end && range.end > checking.end)) { - excluded = true; - } - }); - return !excluded; - }); -} \ No newline at end of file diff --git a/application/client/src/app/service/session/dependencies/search/state.ts b/application/client/src/app/service/session/dependencies/search/state.ts deleted file mode 100644 index 28c8fd5263..0000000000 --- a/application/client/src/app/service/session/dependencies/search/state.ts +++ /dev/null @@ -1,406 +0,0 @@ -import { IFilter } from '@platform/types/filter'; -import { Subjects, Subject } from '@platform/env/subscription'; -import { unique } from '@platform/env/sequence'; -import { Session } from '@service/session'; -import { Owner } from '@schema/content/row'; - -import * as obj from '@platform/env/obj'; - -export interface ISearchFinishEvent { - found: number; - error?: string; -} - -export interface IChartsFinishEvent { - error?: string; -} - -export class State { - public readonly subjects: { - search: Subjects<{ - active: Subject; - start: Subject; - finish: Subject; - }>; - charts: Subjects<{ - start: Subject; - finish: Subject; - }>; - nested: Subject; - } = { - search: new Subjects({ - active: new Subject(), - start: new Subject(), - finish: new Subject(), - }), - charts: new Subjects({ - start: new Subject(), - finish: new Subject(), - }), - nested: new Subject(), - }; - - private _session: Session; - private _active: IFilter | undefined; - private _nested: { filter: IFilter | undefined; from: number; visible: boolean } = { - filter: undefined, - from: -1, - visible: false, - }; - private _hash: { - search: string | undefined; - charts: string | undefined; - } = { - search: undefined, - charts: undefined, - }; - private _progress: { - search: Set; - charts: Set; - } = { - search: new Set(), - charts: new Set(), - }; - private _nonActive: IFilter = { - filter: '', - flags: { - cases: false, - word: false, - reg: true, - }, - }; - - constructor(session: Session) { - this._session = session; - } - - public destroy() { - this.subjects.search.destroy(); - this.subjects.charts.destroy(); - } - - public get nonActive(): IFilter { - return this._nonActive; - } - - public set nonActive(filter: IFilter) { - this._nonActive = filter; - } - - public getActive(): IFilter | undefined { - return this._active; - } - - public setActive(filter: IFilter): Promise { - return new Promise((resolve, reject) => { - this._active = obj.clone(filter); - this._hash.search = undefined; - const finish = this.lifecycle().search(); - this._session.search - .drop() - .then(() => { - this.subjects.search.get().active.emit(obj.clone(filter)); - this._session.search - .search([filter]) - .then((found: number) => { - finish({ found }); - resolve(found); - }) - .catch((err: Error) => { - this._active = undefined; - this.subjects.search.get().active.emit(undefined); - finish({ found: 0, error: err.message }); - reject(err); - }); - }) - .catch((err: Error) => { - this._active = undefined; - finish({ found: 0, error: err.message }); - reject(err); - }); - }); - } - - public nested(): { - accept(action: Promise<[number, number] | undefined>): Promise; - next(): Promise; - prev(): Promise; - set(filter: IFilter): Promise; - setFrom(pos: number): void; - nextPos(): number; - prevPos(): number; - get(): IFilter | undefined; - drop(): void; - update(pos: number | undefined): void; - toggle(): void; - visible(): boolean; - } { - return { - accept: ( - action: Promise<[number, number] | undefined>, - ): Promise => { - return new Promise((resolve, reject) => { - action - .then((pos: [number, number] | undefined) => { - if (pos === undefined) { - this._nested.from = -1; - this.nested().update(undefined); - return resolve(undefined); - } else { - this._nested.from = pos[1]; - this.nested().update(pos[0]); - return resolve(pos[0]); - } - }) - .catch((err: Error) => { - this._session.search - .log() - .error(`Fail apply nested search: ${err.message}`); - reject(err); - }); - }); - }, - next: (): Promise => { - return this.nested().accept(this._session.search.searchNestedMatch(false)); - }, - prev: (): Promise => { - return this.nested().accept(this._session.search.searchNestedMatch(true)); - }, - set: (filter: IFilter): Promise => { - this._nested.filter = obj.clone(filter); - this._nested.from = -1; - return this.nested().next(); - }, - setFrom: (pos: number): void => { - this._nested.from = pos; - }, - nextPos: (): number => { - if (this._nested.from >= this._session.search.len()) { - return 0; - } else { - return this._nested.from + 1; - } - }, - prevPos: (): number => { - if (this._nested.from < 0) { - return this._session.search.len() - 1; - } else { - return this._nested.from; - } - }, - get: (): IFilter | undefined => { - return this._nested.filter; - }, - drop: (): void => { - this._nested.filter = undefined; - this._nested.from = -1; - this.nested().update(undefined); - }, - toggle: (): void => { - this._nested.visible = !this._nested.visible; - this.subjects.nested.emit(this._nested.visible); - if (!this._nested.visible) { - this.nested().drop(); - } - }, - update: (pos: number | undefined): void => { - setTimeout(() => { - // Update highlights in background to let views to be updated first - this._session.highlights.subjects.get().update.emit(); - }); - pos !== undefined && - this._session.cursor.select(pos, Owner.NestedSearch, undefined, undefined); - }, - visible: (): boolean => { - return this._nested.visible; - }, - }; - } - - public filters(): Promise { - if (this._active !== undefined) { - return Promise.resolve(); - } - if (!this.hash().search.changed()) { - return Promise.resolve(); - } - return new Promise((resolve, reject) => { - const finish = this.lifecycle().search(); - this._session.search - .drop() - .then(() => { - const filters = this._session.search - .store() - .filters() - .get() - .filter((request) => request.definition.active) - .map((request) => request.as().filter()); - this.hash().search.update(); - if (filters.length === 0) { - finish({ found: 0 }); - return resolve(); - } - this._session.search - .search(filters) - .then((found: number) => { - finish({ found: found }); - resolve(); - }) - .catch((err: Error) => { - finish({ found: 0, error: err.message }); - reject(err); - }); - }) - .catch((err: Error) => { - finish({ found: 0, error: err.message }); - reject(err); - }); - }); - } - - public charts(): Promise { - if (!this.hash().charts.changed()) { - return Promise.resolve(); - } - return new Promise((resolve, reject) => { - const finish = this.lifecycle().charts(); - const charts = this._session.search - .store() - .charts() - .get() - .filter((request) => request.definition.active) - .map((request) => request.as().filter()); - this.hash().charts.update(); - // if (charts.length === 0) { - // finish({}); - // return resolve(); - // } - this._session.search - .extract(charts) - .then(() => { - finish({}); - resolve(); - }) - .catch((err: Error) => { - finish({ error: err.message }); - reject(err); - }); - }); - } - - public progress(): { - search(): boolean; - charts(): boolean; - } { - return { - search: (): boolean => { - return this._progress.search.size > 0; - }, - charts: (): boolean => { - return this._progress.charts.size > 0; - }, - }; - } - - public hasActiveSearch(): boolean { - return this._active !== undefined; - } - - public reset(): { - search(): Promise; - } { - return { - search: (): Promise => { - if (this._active === undefined) { - return Promise.resolve(); - } - this._active = undefined; - this._hash.search = undefined; - this.subjects.search.get().active.emit(undefined); - return this.filters(); - }, - }; - } - - protected lifecycle(): { - search(): (event: ISearchFinishEvent) => void; - charts(): (event: IChartsFinishEvent) => void; - } { - return { - search: (): ((event: ISearchFinishEvent) => void) => { - const uuid = unique(); - this._progress.search.add(uuid); - this.subjects.search.get().start.emit(); - return (event: ISearchFinishEvent) => { - this._progress.search.delete(uuid); - if (this._progress.search.size !== 0) { - return; - } - this.subjects.search.get().finish.emit(event); - }; - }, - charts: (): ((event: IChartsFinishEvent) => void) => { - const uuid = unique(); - this._progress.charts.add(uuid); - this.subjects.charts.get().start.emit(); - return (event: IChartsFinishEvent) => { - this._progress.charts.delete(uuid); - if (this._progress.charts.size !== 0) { - return; - } - this.subjects.charts.get().finish.emit(event); - }; - }, - }; - } - - protected hash(): { - search: { - get(): string; - update(): void; - changed(): boolean; - }; - charts: { - get(): string; - update(): void; - changed(): boolean; - }; - } { - return { - search: { - get: (): string => { - return this._session.search - .store() - .filters() - .get() - .filter((request) => request.definition.active) - .map((request) => request.hash()) - .join('_'); - }, - update: (): void => { - this._hash.search = this.hash().search.get(); - }, - changed: (): boolean => { - return this.hash().search.get() !== this._hash.search; - }, - }, - charts: { - get: (): string => { - return this._session.search - .store() - .charts() - .get() - .filter((request) => request.definition.active) - .map((request) => request.hash()) - .join('_'); - }, - update: (): void => { - this._hash.charts = this.hash().charts.get(); - }, - changed: (): boolean => { - return this.hash().charts.get() !== this._hash.charts; - }, - }, - }; - } -} diff --git a/application/client/src/app/service/session/dependencies/search/store.ts b/application/client/src/app/service/session/dependencies/search/store.ts deleted file mode 100644 index 83af821457..0000000000 --- a/application/client/src/app/service/session/dependencies/search/store.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { Hash, Recognizable } from '@platform/types/storage/entry'; -import { Subject, Subscriber, Subjects } from '@platform/env/subscription'; -import { EntityUpdateEvent } from './store.update'; -import { unique } from '@platform/env/sequence'; - -export enum Key { - filters = 'filters', - charts = 'charts', - ranges = 'ranges', - disabled = 'disabled', -} - -export interface Updatable { - updated: Subject | undefined; -} - -export interface ChangeEvent { - entities: StoredEntity[]; - sequence: string; -} - -export type StoredEntity = T & Hash & Recognizable & Updatable>; - -export abstract class Store extends Subscriber { - public subjects: Subjects<{ - highlights: Subject>; - value: Subject>; - inner: Subject>; - any: Subject>; - }> = new Subjects({ - highlights: new Subject>(), - value: new Subject>(), - inner: new Subject>(), - any: new Subject>(), - }); - - private _entities: Map> = new Map(); - private _hash: string = ''; - private _uuid: string; - - constructor(uuid: string) { - super(); - this._uuid = uuid; - } - - public destroy() { - this.subjects.destroy(); - this.unsubscribe(); - } - - public overwrite(items: StoredEntity[]): string { - this._entities = new Map(); - items.forEach((item) => { - this._entities.set(item.uuid(), item); - }); - return this.refresh(); - } - - public refresh(): string { - const sequence = unique(); - setTimeout(() => { - this._update(sequence); - }); - return sequence; - } - - public update(items: StoredEntity[]): string { - items.forEach((item) => { - this._entities.set(item.uuid(), item); - }); - return this.refresh(); - } - - public delete(items: string[]): string { - items.forEach((uuid) => { - this._entities.delete(uuid); - }); - return this.refresh(); - } - - public get(): StoredEntity[] { - return Array.from(this._entities.values()); - } - - public reorder(params: { prev: number; curt: number }) { - let entities: StoredEntity[] = this.get(); - const prev = entities[params.prev]; - if (prev === undefined) { - return; - } - entities = entities.filter((_entity: StoredEntity, index: number) => { - return index !== params.prev; - }); - entities.splice(params.curt, 0, prev); - this.overwrite(entities); - } - - public clear(): string { - this._entities = new Map(); - return this.refresh(); - } - - public abstract key(): Key; - - public abstract has(entity: T): boolean; - - public hash(): string { - return Array.from(this._entities.values()) - .map((entry) => entry.hash()) - .join('_'); - } - - private _update(sequence: string): void { - this.unsubscribe(); - const entities = Array.from(this._entities.values()); - this.subjects.get().value.emit({ entities, sequence }); - this.subjects.get().any.emit({ entities, sequence }); - this.subjects.get().highlights.emit({ entities, sequence }); - this._entities.forEach((entity) => { - let hash = entity.hash(); - entity.updated !== undefined && - this.register( - entity.updated.subscribe((event) => { - const updated_hash = entity.hash(); - if (hash !== updated_hash) { - hash = updated_hash; - const entities = Array.from(this._entities.values()); - const sequence = unique(); - if (event.consequence().highlights) { - this.subjects.get().highlights.emit({ entities, sequence }); - } - if (event.consequence().inner) { - this.subjects.get().inner.emit({ entities, sequence }); - } - if (event.consequence().value) { - this.subjects.get().value.emit({ entities, sequence }); - } - if (event.consequence().storable) { - this.subjects.get().any.emit({ entities, sequence }); - } - } - }), - ); - }); - } -} diff --git a/application/client/src/app/service/session/dependencies/search/store.update.ts b/application/client/src/app/service/session/dependencies/search/store.update.ts deleted file mode 100644 index 7e772bfded..0000000000 --- a/application/client/src/app/service/session/dependencies/search/store.update.ts +++ /dev/null @@ -1,15 +0,0 @@ -export abstract class EntityUpdateEvent { - abstract consequence(): { - // require redrawing of rows - highlights: boolean; - // require updating of data, like research - value: boolean; - // require redrawing of holders (like filter element) - inner: boolean; - // require saving in remote store. For example number of matches doesn't require - // saving operation - storable: boolean; - }; - abstract inner(): T; - abstract entity(): E; -} diff --git a/application/client/src/app/service/session/dependencies/stream.ts b/application/client/src/app/service/session/dependencies/stream.ts deleted file mode 100644 index 0408bb0eae..0000000000 --- a/application/client/src/app/service/session/dependencies/stream.ts +++ /dev/null @@ -1,425 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Subscriber, Subjects, Subject } from '@platform/env/subscription'; -import { Range, IRange } from '@platform/types/range'; -import { cutUuid } from '@log/index'; -import { Rank } from './rank'; -import { GrabbedElement } from '@platform/types/bindings/miscellaneous'; -import { Observe } from '@platform/types/observe'; -import { ObserveOperation } from './observing/operation'; -import { ObserveSource } from './observing/source'; -import { Info } from './info'; -import { lockers } from '@ui/service/lockers'; -import { Sde } from './observing/sde'; -import { TextExportOptions } from '@platform/types/exporting'; - -import * as Requests from '@platform/ipc/request'; -import * as Events from '@platform/ipc/event'; -import * as $ from '@platform/types/observe'; - -export { ObserveOperation }; - -@SetupLogger() -export class Stream extends Subscriber { - public readonly subjects: Subjects<{ - // Stream is updated (new rows came) - updated: Subject; - // New observe operation is started - started: Subject; - // Observe operation for source is finished - finished: Subject; - // List of sources (observed operations has been changed) - sources: Subject; - // Session rank is changed - rank: Subject; - // Grabber is inited - readable: Subject; - }> = new Subjects({ - updated: new Subject(), - started: new Subject(), - finished: new Subject(), - sources: new Subject(), - rank: new Subject(), - readable: new Subject(), - }); - private _len: number = 0; - private _uuid!: string; - private _info!: Info; - - public readonly observed: { - running: Map; - done: Map; - map: Map; - } = { - running: new Map(), - done: new Map(), - map: new Map(), - }; - public readonly rank: Rank = new Rank(); - public sde!: Sde; - - public init(uuid: string, info: Info) { - this.setLoggerName(`Stream: ${cutUuid(uuid)}`); - this.sde = new Sde(uuid); - this._uuid = uuid; - this._info = info; - this.register( - Events.IpcEvent.subscribe(Events.Stream.Updated.Event, (event) => { - if (event.session !== this._uuid) { - return; - } - this._len = event.rows; - this.subjects.get().updated.emit(this._len); - !this.subjects.get().readable.emitted() && this.subjects.get().readable.emit(); - if (this.rank.set(this._len.toString().length)) { - this.subjects.get().rank.emit(this.rank.len); - } - }), - ); - this.register( - Events.IpcEvent.subscribe(Events.Observe.Started.Event, (event) => { - if (event.session !== this._uuid) { - return; - } - const observe = Observe.from(event.source); - if (observe instanceof Error) { - this.log().error(`Fail to parse Observe: ${observe.message}`); - return; - } - this.observed.running.set( - event.operation, - new ObserveOperation( - event.operation, - observe, - this.sde.send.bind(this.sde, event.operation), - this.observe().restart.bind(this, event.operation), - this.observe().abort.bind(this, event.operation), - ), - ); - this.observe() - .descriptions.request() - .then((sources) => { - let updated = false; - sources.forEach((source) => { - if (!this.observed.map.has(source.id)) { - this.observed.map.set(source.id, source); - updated = true; - } - }); - updated && this.subjects.get().sources.emit(); - }) - .catch((err: Error) => { - this.log().error(`Fail get sources description: ${err.message}`); - }); - this.sde.overwrite(this.observed.running); - this.subjects.get().started.emit(observe); - }), - ); - this.register( - Events.IpcEvent.subscribe(Events.Observe.Finished.Event, (event) => { - if (event.session !== this._uuid) { - return; - } - const stored = this.observed.running.get(event.operation); - if (stored === undefined) { - return; - } - this.observed.done.set(event.operation, stored.asObserve()); - this.observed.running.delete(event.operation); - this.sde.overwrite(this.observed.running); - this.subjects.get().finished.emit(stored.asObserve()); - }), - ); - } - - public destroy() { - this.unsubscribe(); - this.subjects.destroy(); - this.sde.destroy(); - } - - public len(): number { - return this._len; - } - - public observe(): { - start(observe: Observe): Promise; - abort(uuid: string): Promise; - restart(uuid: string, source: Observe): Promise; - list(): Promise>; - sources(): ObserveSource[]; - isFileSource(): boolean; - getSourceFileName(): string | undefined; - descriptions: { - get(id: number): $.Types.ISourceLink | undefined; - id(alias: string): number | undefined; - request(): Promise<$.Types.ISourceLink[]>; - count(): number; - }; - } { - return { - start: (observe: Observe): Promise => { - return Requests.IpcRequest.send( - Requests.Observe.Start.Response, - new Requests.Observe.Start.Request({ - session: this._uuid, - observe: observe.sterilized(), - }), - ) - .then((response) => { - if (typeof response.error === 'string' && response.error !== '') { - return Promise.reject(new Error(response.error)); - } - this._info.fromObserveInfo(observe); - return response.session; - }) - .finally(lockers.progress(`Creating session...`)); - }, - abort: (uuid: string): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Observe.Abort.Response, - new Requests.Observe.Abort.Request({ - session: this._uuid, - operation: uuid, - }), - ) - .then((response: Requests.Observe.Abort.Response) => { - if (response.error !== undefined) { - return reject(new Error(response.error)); - } - resolve(undefined); - }) - .catch((error: Error) => { - this.log().error( - `Fail to cancel observe operation sources: ${error.message}`, - ); - }); - }); - }, - restart: (uuid: string, observe: Observe): Promise => { - return this.observe() - .abort(uuid) - .then(() => { - return this.observe().start(observe); - }); - }, - list: (): Promise> => { - return new Promise((resolve) => { - Requests.IpcRequest.send( - Requests.Observe.List.Response, - new Requests.Observe.List.Request({ - session: this._uuid, - }), - ) - .then((response: Requests.Observe.List.Response) => { - const sources: Map = new Map(); - Object.keys(response.sources).forEach((uuid: string) => { - const source = Observe.from(response.sources[uuid]); - if (source instanceof Error) { - this.log().error(`Fail to parse Observe: ${source.message}`); - return; - } - sources.set(uuid, source); - }); - resolve(sources); - }) - .catch((error: Error) => { - this.log().error( - `Fail to get a list of observed sources: ${error.message}`, - ); - }); - }); - }, - sources: (): ObserveSource[] => { - const sources: ObserveSource[] = []; - Array.from(this.observed.running.values()).forEach((observed: ObserveOperation) => { - sources.push(new ObserveSource(observed.asObserve(), observed)); - }); - Array.from(this.observed.done.values()).forEach((source: Observe) => { - sources.push(new ObserveSource(source)); - }); - return sources; - }, - isFileSource: (): boolean => { - const sources = this.observe().sources(); - if (sources.length !== 1) { - return false; - } - return sources[0].observe.origin.files() !== undefined; - }, - getSourceFileName: (): string | undefined => { - const sources = this.observe().sources(); - if (sources.length !== 1) { - return undefined; - } - const files = sources[0].observe.origin.files(); - if (files === undefined || (files instanceof Array && files.length === 0)) { - return undefined; - } - return files instanceof Array ? files[0] : files; - }, - descriptions: { - get: (id: number): $.Types.ISourceLink | undefined => { - return this.observed.map.get(id); - }, - id: (alias: string): number | undefined => { - const link = Array.from(this.observed.map.values()).find( - (s) => s.alias === alias, - ); - return link !== undefined ? link.id : undefined; - }, - request: (): Promise<$.Types.ISourceLink[]> => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Observe.SourcesDefinitionsList.Response, - new Requests.Observe.SourcesDefinitionsList.Request({ - session: this._uuid, - }), - ) - .then((response: Requests.Observe.SourcesDefinitionsList.Response) => { - resolve(response.sources); - }) - .catch(reject); - }); - }, - count: (): number => { - return this.observed.map.size; - }, - }, - }; - } - - public chunk(range: Range): Promise { - if (this._len === 0) { - // TODO: Grabber is crash session in this case... should be prevented on grabber level - return Promise.resolve([]); - } - return new Promise((resolve) => { - Requests.IpcRequest.send( - Requests.Stream.Chunk.Response, - new Requests.Stream.Chunk.Request({ - session: this._uuid, - from: range.start, - to: range.end, - }), - ) - .then((response: Requests.Stream.Chunk.Response) => { - resolve(response.rows); - }) - .catch((error: Error) => { - this.log().error(`Fail to grab content: ${error.message}`); - }); - }); - } - - public grab(ranges: IRange[]): Promise { - if (this._len === 0) { - // TODO: Grabber is crash session in this case... should be prevented on grabber level - return Promise.resolve([]); - } - return new Promise((resolve) => { - Requests.IpcRequest.send( - Requests.Stream.Ranges.Response, - new Requests.Stream.Ranges.Request({ - session: this._uuid, - ranges, - }), - ) - .then((response: Requests.Stream.Ranges.Response) => { - resolve(response.rows); - }) - .catch((error: Error) => { - this.log().error(`Fail to grab content: ${error.message}`); - }); - }); - } - - public export(): { - text(ranges: IRange[], dest?: string, opt?: TextExportOptions): Promise; - raw(ranges: IRange[], dest?: string): Promise; - isRawAvailable(): Promise; - } { - return { - text: ( - ranges: IRange[], - dest?: string, - opt?: TextExportOptions, - ): Promise => { - if (this._len === 0) { - return Promise.resolve(undefined); - } - const options = - opt === undefined - ? { columns: [], delimiter: undefined, spliter: undefined } - : opt; - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Session.Export.Response, - new Requests.Session.Export.Request({ - session: this._uuid, - dest, - ranges, - options, - }), - ) - .then((response: Requests.Session.Export.Response) => { - if (response.error !== undefined) { - return reject(new Error(response.error)); - } - resolve(response.filename); - }) - .catch((error: Error) => { - this.log().error(`Fail to export content: ${error.message}`); - }); - }); - }, - raw: (ranges: IRange[], dest?: string): Promise => { - if (this._len === 0) { - return Promise.resolve(undefined); - } - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Session.ExportRaw.Response, - new Requests.Session.ExportRaw.Request({ - session: this._uuid, - dest, - ranges, - }), - ) - .then((response: Requests.Session.ExportRaw.Response) => { - if (response.error !== undefined) { - return reject(new Error(response.error)); - } - resolve(response.filename); - }) - .catch((error: Error) => { - this.log().error(`Fail to export raw: ${error.message}`); - }); - }); - }, - isRawAvailable: (): Promise => { - if (this._len === 0) { - return Promise.resolve(false); - } - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Session.IsExportRawAvailable.Response, - new Requests.Session.IsExportRawAvailable.Request({ - session: this._uuid, - }), - ) - .then((response: Requests.Session.IsExportRawAvailable.Response) => { - if (response.error !== undefined) { - return reject(new Error(response.error)); - } - resolve(response.available); - }) - .catch((error: Error) => { - this.log().error(`Fail to check state export raw: ${error.message}`); - }); - }); - }, - }; - } -} -export interface Stream extends LoggerInterface {} diff --git a/application/client/src/app/service/session/dependencies/teamwork.ts b/application/client/src/app/service/session/dependencies/teamwork.ts deleted file mode 100644 index edcfb59bce..0000000000 --- a/application/client/src/app/service/session/dependencies/teamwork.ts +++ /dev/null @@ -1,712 +0,0 @@ -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { Subscriber, Subjects, Subject } from '@platform/env/subscription'; -import { cutUuid } from '@log/index'; -import { Observe } from '@platform/types/observe'; -import { GitHubRepo } from '@platform/types/github'; -import { FileMetaDataDefinition, FileMetaData } from '@platform/types/github/filemetadata'; -import { Session } from '@service/session'; -import { FileDesc } from '@service/history/definition.file'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; -import { ChangeEvent, StoredEntity } from '@service/session/dependencies/search/store'; -import { history } from '@service/history'; -import { LockToken } from '@platform/env/lock.token'; -import { lockers, Locker } from '@ui/service/lockers'; - -import * as utils from '@platform/log/utils'; -import * as Requests from '@platform/ipc/request'; -import * as Events from '@platform/ipc/event'; -import * as moment from 'moment'; - -export interface GitHubError { - time: string; - msg: string; -} - -export const DEFAULT_ENTRY = 'https://api.github.com'; - -@SetupLogger() -export class TeamWork extends Subscriber { - protected readonly subs: Subscriber = new Subscriber(); - protected readonly repos: Map = new Map(); - protected readonly active: { - repo: GitHubRepo | undefined; - username: string | undefined; - } = { - repo: undefined, - username: undefined, - }; - protected session!: Session; - // checksum of opened file - // string - checksum - // undefined - not set yet - // null - cannot be set (stream, multiple files, etc.) - protected checksum: string | undefined | null = undefined; - // Last written hash - // string - hash - // undefined - not loaded or no related profile on github repo - protected recent: { - metadata: FileMetaData | undefined; - sha: string | undefined; - checked: boolean; - } = { - metadata: undefined, - sha: undefined, - checked: false, - }; - protected errors: GitHubError[] = []; - protected destroyed: boolean = false; - protected blocked: string[] = []; - protected listener: LockToken = new LockToken(true); - - protected getLocalMetadata(): FileMetaData { - const filters = this.session.search.store().filters().get(); - const charts = this.session.search.store().charts().get(); - const bookmarks = this.session.bookmarks.get().map((b) => b.asDef()); - const comments = this.session.comments.getAsArray(); - return new FileMetaData({ - protocol: '0.0.1', - filters: filters.map((filter) => filter.definition), - charts: charts.map((chart) => chart.definition), - bookmarks: bookmarks, - comments: comments, - }); - } - protected loading(): { - repos(): Promise; - active(): Promise; - } { - return { - repos: async (): Promise => { - try { - const repos = await Requests.IpcRequest.send( - Requests.GitHub.GetRepos.Response, - new Requests.GitHub.GetRepos.Request(), - ); - const active = await Requests.IpcRequest.send( - Requests.GitHub.GetActive.Response, - new Requests.GitHub.GetActive.Request(), - ); - this.repos.clear(); - repos.repos.forEach((repo: GitHubRepo) => { - this.repos.set(repo.uuid, repo); - }); - if (active.uuid !== undefined) { - this.active.repo = this.repos.get(active.uuid); - } - await this.loading().active(); - } catch (err) { - this.error().add( - `Fail to load available GitHub references: ${utils.error(err)}`, - ); - } - }, - active: (): Promise => { - return new Promise((resolve) => { - const active = this.active.repo; - if (active === undefined) { - this.active.username = undefined; - this.subjects.get().loaded.emit(); - this.subjects.get().username.emit(this.active.username); - this.subjects.get().active.emit(active); - return resolve(); - } - this.user() - .reload() - .catch((err: Error) => { - this.log().error(`Fail to reload user: ${err}`); - this.error().add(`Fail to reload user: ${err}`); - }) - .then(() => { - this.file().check(); - }) - .finally(() => { - this.subjects.get().loaded.emit(); - this.subjects.get().active.emit(active); - resolve(); - }); - }); - }, - }; - } - - protected metadata(): { - import(md: FileMetaDataDefinition, sha: string): void; - } { - return { - import: (md: FileMetaDataDefinition, sha: string): void => { - if (this.active.repo === undefined || this.destroyed) { - return; - } - const local = this.recent.metadata; - const recent = new FileMetaData(md); - this.recent.metadata = recent; - this.recent.sha = sha; - if ( - local !== undefined && - local !== null && - local.hash().equal(this.active.repo.settings, recent) - ) { - return; - } - this.active.repo.settings.filters && - !this.active.repo.settings.readonly && - this.events().wait( - this.session.search - .store() - .filters() - .overwrite( - md.filters.map( - (def) => new FilterRequest(def), - ) as StoredEntity[], - ), - ); - this.active.repo.settings.charts && - !this.active.repo.settings.readonly && - this.events().wait( - this.session.search - .store() - .charts() - .overwrite( - md.charts.map( - (def) => new ChartRequest(def), - ) as StoredEntity[], - ), - ); - this.active.repo.settings.comments && this.session.comments.set(md.comments); - if (this.active.repo.settings.bookmarks && !this.active.repo.settings.readonly) { - this.session.bookmarks - .overwriteFromDefs(md.bookmarks) - .catch((err: Error) => { - this.log().error(`Fail update bookmarks due: ${err.message}`); - }) - .finally(() => { - this.events().wait(this.session.bookmarks.update()); - this.subjects.get().metadata.emit(md); - }); - } else { - this.subjects.get().metadata.emit(md); - } - }, - }; - } - - protected file(): { - check(sha?: string): void; - checkUpdates(): void; - write(): void; - } { - return { - check: (sha?: string): void => { - if ( - typeof this.checksum !== 'string' || - this.active.repo === undefined || - this.destroyed - ) { - return; - } - Requests.IpcRequest.send( - Requests.GitHub.GetFileMeta.Response, - new Requests.GitHub.GetFileMeta.Request({ - checksum: this.checksum, - sha, - }), - ) - .then((response) => { - if (response.error !== undefined) { - this.error().add(`Fail to get metadata: ${response.error}`); - } else if (response.metadata !== undefined && response.sha !== undefined) { - this.metadata().import(response.metadata, response.sha); - } else { - this.recent.metadata = undefined; - this.recent.sha = undefined; - } - this.recent.checked = true; - }) - .catch((err: Error) => { - this.error().add(`Request error: fail to get metadata: ${err.message}`); - }); - }, - checkUpdates: (): void => { - if ( - typeof this.checksum !== 'string' || - this.active.repo === undefined || - this.destroyed - ) { - return; - } - Requests.IpcRequest.send( - Requests.GitHub.CheckUpdates.Response, - new Requests.GitHub.CheckUpdates.Request({ - checksum: this.checksum, - }), - ) - .then((response) => { - if (response.error !== undefined) { - this.error().add( - `Fail to check for updates of metadata: ${response.error}`, - ); - } - }) - .catch((err: Error) => { - this.error().add( - `Request error: fail to check for updates of metadata: ${err.message}`, - ); - }); - }, - write: (): void => { - if ( - typeof this.checksum !== 'string' || - this.active.repo === undefined || - !this.recent.checked || - this.destroyed - ) { - return; - } - if (this.active.repo.settings.readonly) { - return; - } - const metadata = this.getLocalMetadata(); - if ( - this.recent.metadata !== undefined && - metadata.hash().equal(this.active.repo.settings, this.recent.metadata) - ) { - // Last time was written same metadata object - return; - } - Requests.IpcRequest.send( - Requests.GitHub.SetFileMeta.Response, - new Requests.GitHub.SetFileMeta.Request({ - checksum: this.checksum, - metadata: metadata.def, - sha: this.recent.sha, - }), - ) - .then((response) => { - if (response.error !== undefined) { - this.error().add(`Fail to save metadata: ${response.error}`); - } else { - this.recent.sha = response.sha; - } - }) - .catch((err: Error) => { - this.error().add(`Fail to set active repo: ${err.message}`); - }); - }, - }; - } - - protected events(): { - ignored(sequence: string): boolean; - wait(sequence: string): void; - } { - return { - ignored: (sequence: string): boolean => { - if (this.blocked.includes(sequence)) { - this.blocked = this.blocked.filter((s) => s !== sequence); - return true; - } - return false; - }, - wait: (sequence: string): void => { - this.blocked.push(sequence); - }, - }; - } - - public readonly subjects: Subjects<{ - loaded: Subject; - active: Subject; - username: Subject; - metadata: Subject; - error: Subject; - }> = new Subjects({ - loaded: new Subject(), - active: new Subject(), - username: new Subject(), - metadata: new Subject(), - error: new Subject(), - }); - - public init(session: Session) { - this.setLoggerName(`TeamWork: ${cutUuid(session.uuid())}`); - this.session = session; - this.loading() - .repos() - .catch((err: Error) => { - this.error().add(`Loading error: ${err.message}`); - }); - - this.register( - Events.IpcEvent.subscribe( - Events.GitHub.FileUpdated.Event, - (event: Events.GitHub.FileUpdated.Event) => { - this.file().check(event.sha); - }, - ), - Events.IpcEvent.subscribe( - Events.GitHub.Conflict.Event, - (event: Events.GitHub.Conflict.Event) => { - const message = lockers.lock( - new Locker( - false, - `The GitHub repository has been updated by ${event.username}. Your local version is mismatched with the remote. To continue you can drop your local changes to remote or switch to ReadOnly mode and continue with local session data.`, - ) - .set() - .buttons([ - { - caption: `Drop to Remote`, - handler: () => { - message.popup.close(); - this.file().check(); - }, - }, - { - caption: `ReadOnly Mode`, - handler: () => { - message.popup.close(); - if (this.active.repo === undefined) { - return; - } - this.active.repo.settings.readonly = true; - this.repo() - .update(this.active.repo) - .catch((err: Error) => { - this.log().error( - `Fail to update repo settings: ${err.message}`, - ); - }); - }, - }, - ]) - .end(), - { - closable: false, - }, - ); - }, - ), - this.session.stream.subjects.get().started.subscribe((observe: Observe) => { - if (this.checksum === null) { - return; - } - FileDesc.fromDataSource(observe) - .then((desc) => { - if (desc === undefined) { - this.checksum = null; - } else if (this.checksum === undefined) { - this.checksum = desc.checksum; - this.file().check(); - } else { - this.checksum = null; - } - }) - .catch((err: Error) => { - this.checksum = null; - this.error().add(`Fail get chechsum of file: ${err.message}`); - }); - }), - history.subjects.get().created.subscribe((uuid: string) => { - const session = history.get(uuid); - if (session === undefined) { - this.log().error(`Fail to get access to history session`); - return; - } - if (session.check().done()) { - this.listener.unlock(); - } else { - this.register( - session.subjects.get().checked.subscribe(() => { - this.listener.unlock(); - }), - ); - } - }), - this.session.search - .store() - .filters() - .subjects.get() - .any.subscribe((event: ChangeEvent) => { - if (this.listener.isLocked() || this.events().ignored(event.sequence)) { - return; - } - this.file().write(); - }), - this.session.search - .store() - .charts() - .subjects.get() - .any.subscribe((event: ChangeEvent) => { - if (this.listener.isLocked() || this.events().ignored(event.sequence)) { - return; - } - this.file().write(); - }), - this.session.bookmarks.subjects.get().updated.subscribe((sequence: string) => { - if (this.listener.isLocked() || this.events().ignored(sequence)) { - return; - } - this.file().write(); - }), - this.session.comments.subjects.get().updated.subscribe(() => { - this.file().write(); - }), - this.session.comments.subjects.get().added.subscribe(() => { - this.file().write(); - }), - this.session.comments.subjects.get().removed.subscribe(() => { - this.file().write(); - }), - ); - } - - public destroy() { - this.unsubscribe(); - this.subjects.destroy(); - this.destroyed = true; - } - - public repo(): { - list(): GitHubRepo[]; - setActive(repo: GitHubRepo | undefined): void; - getActive(): GitHubRepo | undefined; - create(repo: GitHubRepo): Promise; - update(repo: GitHubRepo): Promise; - delete(uuid: string): Promise; - reload(): Promise; - } { - return { - list: (): GitHubRepo[] => { - return Array.from(this.repos.values()); - }, - setActive: (repo: GitHubRepo | undefined): void => { - Requests.IpcRequest.send( - Requests.GitHub.SetActive.Response, - new Requests.GitHub.SetActive.Request({ - uuid: repo === undefined ? undefined : repo.uuid, - }), - ) - .then((response) => { - if (response.error !== undefined) { - this.error().add(`Fail to save active: ${response.error}`); - } else { - this.active.repo = repo; - this.loading().active(); - } - }) - .catch((err: Error) => { - this.error().add(`Fail to set active repo: ${err.message}`); - }); - }, - getActive: (): GitHubRepo | undefined => { - return this.active.repo; - }, - create: (repo: GitHubRepo): Promise => { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.GitHub.AddRepo.Response, - new Requests.GitHub.AddRepo.Request(repo), - ) - .then((response: Requests.GitHub.AddRepo.Response) => { - if (response.error !== undefined) { - this.error().add(`Fail to add new repo: ${response.error}`); - return reject(new Error(response.error)); - } - if (response.uuid === undefined) { - return reject(new Error(`No uuid for added repo`)); - } - repo.uuid = response.uuid; - this.active.repo = repo; - this.repos.set(repo.uuid, repo); - this.loading().active().finally(resolve); - }) - .catch((err: Error) => { - this.error().add(`Fail to add new GitHub references: ${err.message}`); - reject(err); - }); - }); - }, - update: (repo: GitHubRepo): Promise => { - if (!this.repos.has(repo.uuid)) { - return Promise.reject(new Error(`Github reference doesn't exist`)); - } - return Requests.IpcRequest.send( - Requests.GitHub.UpdateRepo.Response, - new Requests.GitHub.UpdateRepo.Request(repo), - ) - .then((response: Requests.GitHub.UpdateRepo.Response) => { - if (response.error !== undefined) { - this.error().add(`Fail to update new repo: ${response.error}`); - return Promise.reject(new Error(response.error)); - } - this.repos.set(repo.uuid, repo); - if (this.active.repo !== undefined && this.active.repo.uuid !== undefined) { - this.active.repo = repo; - return this.loading().active(); - } else { - this.subjects.get().loaded.emit(); - return Promise.resolve(); - } - }) - .catch((err: Error) => { - this.error().add(`Fail to update GitHub references: ${err.message}`); - }); - }, - delete: async (uuid: string): Promise => { - if (!this.repos.has(uuid)) { - return Promise.reject(new Error(`Github reference doesn't exist`)); - } - if (this.active.repo !== undefined && this.active.repo.uuid === uuid) { - await this.repo().setActive(undefined); - } - return Requests.IpcRequest.send( - Requests.GitHub.RemoveRepo.Response, - new Requests.GitHub.RemoveRepo.Request({ uuid }), - ) - .then((response: Requests.GitHub.RemoveRepo.Response) => { - if (response.error !== undefined) { - this.error().add(`Fail to remove new repo: ${response.error}`); - return Promise.reject(new Error(response.error)); - } - return this.loading().repos(); - }) - .catch((err: Error) => { - this.error().add(`Fail to update GitHub references: ${err.message}`); - }); - }, - reload: (): Promise => { - return this.loading().repos(); - }, - }; - } - - public user(): { - reload(): Promise; - get(): string | undefined; - } { - return { - reload: (): Promise => { - if (this.active.repo === undefined || this.destroyed) { - return Promise.reject(new Error(`No active repo selected`)); - } - return Requests.IpcRequest.send( - Requests.GitHub.GetUserName.Response, - new Requests.GitHub.GetUserName.Request(), - ) - .then((response) => { - if (response.error !== undefined || response.username === undefined) { - this.error().add( - `Fail to get username: ${ - response.error === undefined ? '' : response.error - }`, - ); - this.active.username = undefined; - } else if (response.username !== undefined) { - this.active.username = response.username; - } - }) - .catch((err: Error) => { - this.error().add(`Fail to get username: ${err.message}`); - this.active.username = undefined; - }) - .finally(() => { - this.subjects.get().username.emit(this.active.username); - }); - }, - get: (): string | undefined => { - return this.active.username; - }, - }; - } - - public error(): { - add(msg: string): void; - get(): GitHubError[]; - clear(): void; - } { - return { - add: (msg: string): void => { - this.log().error(msg); - this.errors.push({ - time: moment.unix(Date.now() / 1000).format('MM/DD/YYYY hh:mm:ss'), - msg, - }); - this.subjects.get().error.emit(); - this.session.switch().sidebar.teamwork(); - }, - get: (): GitHubError[] => { - return this.errors; - }, - clear: (): void => { - this.errors = []; - this.subjects.get().error.emit(); - }, - }; - } - - public md(): { - getIfDifferentToLocal(): FileMetaData | undefined; - importFromRemote(): Promise; - } { - return { - getIfDifferentToLocal: (): FileMetaData | undefined => { - const remote = this.recent.metadata; - if (remote === undefined) { - return undefined; - } - const local = this.getLocalMetadata(); - if ( - local.hash().filters() !== remote.hash().filters() || - local.hash().charts() !== remote.hash().charts() || - local.hash().bookmarks() !== remote.hash().bookmarks() - ) { - return remote; - } - return undefined; - }, - importFromRemote: (): Promise => { - const remote = this.recent.metadata; - if (remote === undefined) { - return Promise.resolve(undefined); - } - this.events().wait( - this.session.search - .store() - .filters() - .overwrite( - remote.def.filters.map( - (def) => new FilterRequest(def), - ) as StoredEntity[], - ), - ); - this.events().wait( - this.session.search - .store() - .charts() - .overwrite( - remote.def.charts.map( - (def) => new ChartRequest(def), - ) as StoredEntity[], - ), - ); - this.session.comments.set(remote.def.comments); - return new Promise((resolve) => { - this.session.bookmarks - .overwriteFromDefs(remote.def.bookmarks) - .catch((err: Error) => { - this.log().error(`Fail update bookmarks due: ${err.message}`); - }) - .finally(() => { - this.events().wait(this.session.bookmarks.update()); - resolve(); - }); - }); - }, - }; - } - - public update() { - this.file().checkUpdates(); - } -} -export interface TeamWork extends LoggerInterface {} diff --git a/application/client/src/app/service/session/session.ts b/application/client/src/app/service/session/session.ts deleted file mode 100644 index 3a865e1818..0000000000 --- a/application/client/src/app/service/session/session.ts +++ /dev/null @@ -1,517 +0,0 @@ -import { TabsService, ITabAPI, ETabsListDirection, TabsOptions } from '@elements/tabs/service'; -import { Storage } from '@env/storage'; -import { Stream } from './dependencies/stream'; -import { Search } from './dependencies/search'; -import { Charts } from './dependencies/charts'; -import { Indexed } from './dependencies/indexed'; -import { Cursor } from './dependencies/cursor'; -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { cutUuid } from '@log/index'; -import { Render } from '@schema/render'; -import { components } from '@env/decorators/initial'; -import { Base } from './base'; -import { Bookmarks } from './dependencies/bookmarks'; -import { Comments } from './dependencies/comments'; -import { Exporter } from './dependencies/exporter'; -import { IRange, fromIndexes } from '@platform/types/range'; -import { Providers } from './dependencies/observing/providers'; -import { Attachments } from './dependencies/attachments'; -import { Info } from './dependencies/info'; -import { session } from '@service/session'; -import { Highlights } from './dependencies/search/highlights'; -import { TeamWork } from './dependencies/teamwork'; -import { Cli } from './dependencies/cli'; -import { FilterRequest } from './dependencies/search/filters/request'; -import { ChartRequest } from './dependencies/search/charts/request'; -import { DisabledRequest } from './dependencies/search/disabled/request'; -import { StoredEntity } from './dependencies/search/store'; -import { Notification, notifications } from '@ui/service/notifications'; -import { error } from '@platform/log/utils'; - -import * as ids from '@schema/ids'; -import * as Requests from '@platform/ipc/request'; -import * as Origins from '@platform/types/observe/origin/index'; -import * as Factory from '@platform/types/observe/factory'; -import * as Parsers from '@platform/types/observe/parser/index'; -import * as Types from '@platform/types/observe/types/index'; - -export { Stream }; - -interface Snap { - filters: string[]; - charts: string[]; - disabled: string[]; -} - -@SetupLogger() -export class Session extends Base { - public readonly storage: Storage = new Storage(); - public readonly stream: Stream = new Stream(); - public readonly search: Search = new Search(); - public readonly charts: Charts = new Charts(); - public readonly indexed: Indexed = new Indexed(); - public readonly bookmarks: Bookmarks = new Bookmarks(); - public readonly comments: Comments = new Comments(); - public readonly cursor: Cursor = new Cursor(); - public readonly highlights: Highlights = new Highlights(); - public readonly exporter: Exporter = new Exporter(); - public readonly render: Render; - public readonly observed: Providers = new Providers(); - public readonly attachments: Attachments = new Attachments(); - public readonly info: Info = new Info(); - public readonly teamwork: TeamWork = new TeamWork(); - public readonly cli: Cli = new Cli(); - - private _uuid!: string; - private _tab!: ITabAPI; - private readonly _toolbar: TabsService = new TabsService(); - private readonly _sidebar: TabsService = new TabsService({ - options: new TabsOptions({ direction: ETabsListDirection.left }), - }); - protected inited: boolean = false; - - constructor(render: Render) { - super(); - this.render = render; - this._toolbar.add({ - uuid: ids.TOOLBAR_TAB_SEARCH, - name: 'Search', - active: true, - closable: false, - uppercaseTitle: true, - content: { - factory: components.get('app-views-search'), - inputs: { - session: this, - }, - }, - }); - this._toolbar.add({ - uuid: ids.TOOLBAR_TAB_DETAILS, - name: 'Details', - active: false, - closable: false, - uppercaseTitle: true, - content: { - factory: components.get('app-views-details'), - inputs: { - session: this, - }, - }, - }); - this._toolbar.add({ - uuid: ids.TOOLBAR_TAB_PRESET, - name: 'Presets / History', - active: false, - closable: false, - uppercaseTitle: true, - content: { - factory: components.get('app-views-history'), - inputs: { - session: this, - }, - }, - }); - this._toolbar.add({ - uuid: ids.TOOLBAR_TAB_CHART, - name: 'Chart', - active: false, - closable: false, - uppercaseTitle: true, - content: { - factory: components.get('app-views-chart'), - inputs: { - session: this, - }, - }, - }); - this._sidebar.add({ - uuid: ids.SIDEBAR_TAB_OBSERVING, - name: 'Observing', - active: false, - closable: false, - uppercaseTitle: true, - content: { - factory: components.get('app-views-observe-list'), - inputs: { - session: this, - }, - }, - }); - this._sidebar.add({ - uuid: ids.SIDEBAR_TAB_ATTACHMENTS, - name: 'Attachments', - active: false, - closable: false, - uppercaseTitle: true, - content: { - factory: components.get('app-views-attachments-list'), - inputs: { - session: this, - }, - }, - }); - this._sidebar.add({ - uuid: ids.SIDEBAR_TAB_FILTERS, - name: 'Filters', - active: true, - closable: false, - uppercaseTitle: true, - content: { - factory: components.get('app-views-filters'), - inputs: { - session: this, - }, - }, - }); - this._sidebar.add({ - uuid: ids.SIDEBAR_TAB_COMMENTS, - name: 'Comments', - active: false, - closable: false, - uppercaseTitle: true, - content: { - factory: components.get('app-views-comments'), - inputs: { - session: this, - }, - }, - }); - this._sidebar.add({ - uuid: ids.SIDEBAR_TAB_TEAMWORK, - name: 'Teamwork', - active: false, - closable: false, - uppercaseTitle: true, - content: { - factory: components.get('app-views-teamwork'), - inputs: { - session: this, - }, - }, - }); - } - - public init(): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Session.Create.Response, - new Requests.Session.Create.Request({}), - ) - .then((response) => { - this.setLoggerName(`Session: ${cutUuid(response.uuid)}`); - this._uuid = response.uuid; - this.stream.init(this._uuid, this.info); - this.cursor.init(this._uuid); - this.indexed.init(this._uuid); - this.bookmarks.init(this._uuid, this.stream, this.cursor); - this.comments.init(this); - this.search.init(this); - this.exporter.init(this._uuid, this.stream, this.indexed); - this.observed.init(this); - this.attachments.init(this._uuid); - this.charts.init(this._uuid, this.stream, this.search); - this.highlights.init(this); - this.teamwork.init(this); - this.cli.init(this); - this.inited = true; - resolve(this._uuid); - }) - .catch(reject); - }); - } - - public destroy(): Promise { - this.highlights.destroy(); - this.storage.destroy(); - this.search.destroy(); - this.indexed.destroy(); - this.stream.destroy(); - this.bookmarks.destroy(); - this.comments.destroy(); - this.cursor.destroy(); - this.exporter.destroy(); - this.observed.destroy(); - this.attachments.destroy(); - this.charts.destroy(); - this.info.destroy(); - this.teamwork.destroy(); - this.cli.destroy(); - this.unsubscribe(); - if (!this.inited) { - return Promise.resolve(); - } - return new Promise((resolve) => { - Requests.IpcRequest.send( - Requests.Session.Destroy.Response, - new Requests.Session.Destroy.Request({ session: this.uuid() }), - ) - .then((response) => { - if (response.error !== undefined) { - this.log().error(`Error on destroying session: ${response.error}`); - } - resolve(); - }) - .catch((err: Error) => { - this.log().error(`Error on sending destroy session reques: ${err.message}`); - resolve(); - }); - }); - } - - public bind(tab: ITabAPI) { - this._tab = tab; - } - - public uuid(): string { - return this._uuid; - } - - public sidebar(): TabsService | undefined { - return this._sidebar; - } - - public toolbar(): TabsService | undefined { - return this._toolbar; - } - - public switch(): { - toolbar: { - search(): void; - presets(): void; - details(): void; - charts(): void; - }; - sidebar: { - comments(): void; - filters(): void; - attachments(): void; - observing(): void; - teamwork(): void; - }; - } { - return { - toolbar: { - search: (): void => { - this._toolbar.setActive(ids.TOOLBAR_TAB_SEARCH); - }, - presets: (): void => { - this._toolbar.setActive(ids.TOOLBAR_TAB_PRESET); - }, - details: (): void => { - this._toolbar.setActive(ids.TOOLBAR_TAB_DETAILS); - }, - charts: (): void => { - this._toolbar.setActive(ids.TOOLBAR_TAB_CHART); - }, - }, - sidebar: { - comments: (): void => { - this._sidebar.setActive(ids.SIDEBAR_TAB_COMMENTS); - }, - filters: (): void => { - this._sidebar.setActive(ids.SIDEBAR_TAB_FILTERS); - }, - observing: (): void => { - this._sidebar.setActive(ids.SIDEBAR_TAB_OBSERVING); - }, - attachments: (): void => { - this._sidebar.setActive(ids.SIDEBAR_TAB_ATTACHMENTS); - }, - teamwork: (): void => { - this._sidebar.setActive(ids.SIDEBAR_TAB_TEAMWORK); - }, - }, - }; - } - - public isBound(): boolean { - return true; - } - - public close(): void { - this._tab.close(); - } - - public selection(): { - indexes(): number[]; - ranges(): IRange[]; - } { - return { - indexes: (): number[] => { - const selected = this.cursor.get().slice(); - selected.sort((a, b) => (a > b ? 1 : -1)); - return selected; - }, - ranges: (): IRange[] => { - return fromIndexes(this.selection().indexes()); - }, - }; - } - - public title(): { - set(title: string): Error | undefined; - get(): Error | string; - } { - return { - set: (title: string): Error | undefined => { - return this._tab.setTitle(title); - }, - get: (): Error | string => { - return this._tab.getTitle(); - }, - }; - } - - public snap(): { - get(): string; - load(json: string): Error | undefined; - } { - return { - get: (): string => { - const snap: Snap = { - filters: this.search - .store() - .filters() - .get() - .map((v) => v.json().to()), - disabled: this.search - .store() - .disabled() - .get() - .map((v) => v.json().to()), - charts: this.search - .store() - .charts() - .get() - .map((v) => v.json().to()), - }; - return JSON.stringify(snap); - }, - load: (json: string): Error | undefined => { - try { - const snap: Snap = JSON.parse(json); - if (snap.filters === undefined) { - throw new Error(`No filters list`); - } - if (snap.disabled === undefined) { - throw new Error(`No disabled list`); - } - if (snap.charts === undefined) { - throw new Error(`No charts list`); - } - const warnings: string[] = []; - const check = (v: FilterRequest | DisabledRequest | ChartRequest | Error) => { - if (!(v instanceof Error)) { - return true; - } else { - warnings.push(v.message); - return false; - } - }; - const filters = snap.filters - .map((json) => FilterRequest.fromJson(json)) - .filter((v) => check(v)) as FilterRequest[]; - const charts = snap.charts - .map((json) => ChartRequest.fromJson(json)) - .filter((v) => check(v)) as ChartRequest[]; - const disabled = snap.disabled - .map((json) => DisabledRequest.fromJson(json)) - .filter((v) => check(v)) as DisabledRequest[]; - this.search - .store() - .filters() - .overwrite(filters as StoredEntity[]); - this.search - .store() - .charts() - .overwrite(charts as StoredEntity[]); - this.search - .store() - .disabled() - .overwrite(disabled as StoredEntity[]); - if (warnings.length > 0) { - notifications.notify( - new Notification({ - message: `Some filters/charts weren't imported: ${warnings.join( - '; ', - )}`, - actions: [], - }), - ); - } - return undefined; - } catch (err) { - return new Error(`Fail to parse session snap file: ${error(err)}`); - } - }, - }; - } - - public getTabAPI(): ITabAPI { - return this._tab; - } - - public async searchResultAsNewSession(): Promise { - const filepath: string | undefined = await this.exporter.clone(); - if (filepath === undefined) { - return; - } - const sources = this.stream.observe().sources(); - if (sources.length === 0) { - throw new Error(`Fail to find bound source`); - } - const current = sources[0].observe.clone(); - const parentSearchStore = this.search.store(); - const observe = (() => { - const file = current.origin.as(Origins.File.Configuration); - const concat = current.origin.as( - Origins.Concat.Configuration, - ); - if (file !== undefined) { - file.set().filename(filepath); - return current; - } else if (concat !== undefined) { - if (concat.filetypes().length === 0) { - throw new Error(`Cannot find type of concated files`); - } - return new Factory.File().type(concat.filetypes()[0]).file(filepath).asDlt().get(); - } else { - const observe = new Factory.File() - .type( - (() => { - switch (current.parser.alias()) { - case Parsers.Protocol.Text: - case Parsers.Protocol.Plugin: - return Types.File.FileType.Text; - case Parsers.Protocol.Dlt: - case Parsers.Protocol.SomeIp: - throw new Error( - `Exporting from none-text streams to create new session aren't supported yet`, - ); - } - })(), - ) - .file(filepath) - .asText() - .get(); - observe.parser.overwrite(current.parser.configuration); - return observe; - } - })(); - return session - .initialize() - .observe(observe) - .then((uuid: string) => { - const created = session.get(uuid); - if (created === undefined) { - this.log().error(`Fail to find created session ${uuid}`); - return; - } - created.search.store().filters().overwrite(parentSearchStore.filters().get()); - created.search.store().charts().overwrite(parentSearchStore.charts().get()); - created.search.store().disabled().overwrite(parentSearchStore.disabled().get()); - }); - } -} -export interface Session extends LoggerInterface {} diff --git a/application/client/src/app/service/session/tab.ts b/application/client/src/app/service/session/tab.ts deleted file mode 100644 index aaa64b49b6..0000000000 --- a/application/client/src/app/service/session/tab.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { TabsService, ITab } from '@elements/tabs/service'; -import { unique } from '@platform/env/sequence'; - -export class TabControls { - public readonly uuid: string; - - private readonly service: TabsService; - private _storage: unknown; - - constructor(tab: ITab, service: TabsService) { - if (tab.uuid === undefined) { - tab.uuid = unique(); - } - this.uuid = tab.uuid; - this.service = service; - } - - public close() { - this.service.remove(this.uuid); - } - - public setTitle(title: string) { - this.service.setTitle(this.uuid, title); - } - - public storage(): { - set(value: T): void; - get(): T | undefined; - } { - return { - set: (value: T): void => { - this._storage = value; - }, - get: (): T | undefined => { - return this._storage as T; - }, - }; - } -} diff --git a/application/client/src/app/service/session/unbound.ts b/application/client/src/app/service/session/unbound.ts deleted file mode 100644 index 609f7b4ebf..0000000000 --- a/application/client/src/app/service/session/unbound.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { unique } from '@platform/env/sequence'; -import { TabsService, ITabAPI, ITab } from '@elements/tabs/service'; -import { Base } from './base'; - -export class UnboundTab extends Base { - private _sidebar: TabsService | undefined; - private _toolbar: TabsService | undefined; - - private readonly _uuid: string; - private _tab!: ITabAPI; - - public readonly tab: ITab; - - constructor(opts: { tab: ITab; sidebar?: boolean; toolbar?: boolean; uuid?: string }) { - super(); - this._sidebar = - opts.sidebar !== undefined ? (opts.sidebar ? new TabsService() : undefined) : undefined; - this._toolbar = - opts.toolbar !== undefined ? (opts.toolbar ? new TabsService() : undefined) : undefined; - this._uuid = opts.uuid !== undefined ? opts.uuid : unique(); - this.tab = opts.tab; - } - - public sidebar(): TabsService | undefined { - return this._sidebar; - } - - public toolbar(): TabsService | undefined { - return this._toolbar; - } - - public destroy(): Promise { - return Promise.resolve(); - } - - public bind(tab: ITabAPI) { - this._tab = tab; - } - - public uuid(): string { - return this._uuid; - } - - public isBound(): boolean { - return false; - } -} diff --git a/application/client/src/app/service/settings.ts b/application/client/src/app/service/settings.ts deleted file mode 100644 index 591c1dc08c..0000000000 --- a/application/client/src/app/service/settings.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { services } from '@register/services'; -import { ISettingsEntry } from '@platform/types/settings/entry'; -import { IDescription } from '@platform/types/settings/entry.description'; -import { styles } from '@ui/service/styles'; - -import * as Requests from '@platform/ipc/request/index'; - -export interface ILocalDefaults { - 'general.colors.match': string; - 'general.colors.default_filter': string; - 'general.colors.default_chart': string; -} -export const DEFAULTS: ILocalDefaults = { - 'general.colors.match': styles.colors().scheme_color_2, - 'general.colors.default_filter': styles.colors().scheme_color_match, - 'general.colors.default_chart': styles.colors().scheme_color_match, -}; - -@SetupService(services['settings']) -export class Service extends Implementation { - protected updateLocalSettings(): Promise { - return Promise.all( - Object.keys(DEFAULTS).map((k) => { - const parts = k.split('.'); - let path = ''; - let key = ''; - if (parts.length === 1) { - key = k; - } else { - path = parts.splice(0, parts.length - 1).join('.'); - key = parts[0]; - } - return this.getByPath(path, key) - .then((value) => { - (this.defaults as any)[k] = - value === undefined ? (DEFAULTS as any)[k] : value; - }) - .catch((err: Error) => { - this.log().error(`Fail to get settings for "${k}": ${err.message}`); - }); - }), - ) - .then(() => undefined) - .catch((err: Error) => { - this.log().error(`Fail to update defaults local setting: ${err.message}`); - }); - } - - public defaults: ILocalDefaults = Object.assign({}, DEFAULTS); - - public override ready(): Promise { - return this.updateLocalSettings().catch((err: Error) => { - this.log().error(`Updating local defaults settings: ${err.message}`); - }); - } - - public getDefaultByDesc(desc: IDescription): unknown { - return (DEFAULTS as { [key: string]: any })[ - desc.path !== '' ? `${desc.path}.${desc.key}` : desc.key - ]; - } - - public get(): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Settings.Entries.Response, - new Requests.Settings.Entries.Request(), - ) - .then((response: Requests.Settings.Entries.Response) => { - resolve(response.entries); - }) - .catch(reject); - }); - } - - public getByPath(path: string, key: string): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Settings.Get.Response, - new Requests.Settings.Get.Request({ - path, - key, - }), - ) - .then((response: Requests.Settings.Get.Response) => { - resolve(response.value); - }) - .catch(reject); - }); - } - - public validate(path: string, key: string, value: any): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Settings.Validate.Response, - new Requests.Settings.Validate.Request({ - path, - key, - value, - }), - ) - .then((response: Requests.Settings.Validate.Response) => { - resolve(response.error); - }) - .catch(reject); - }); - } - - public set(path: string, key: string, value: any): Promise { - return new Promise((resolve, reject) => { - Requests.IpcRequest.send( - Requests.Settings.Set.Response, - new Requests.Settings.Set.Request({ - path, - key, - value, - }), - ) - .then((response: Requests.Settings.Validate.Response) => { - if (response.error !== undefined) { - reject(new Error(response.error)); - } else { - resolve(); - } - this.updateLocalSettings(); - }) - .catch(reject); - }); - } -} -export interface Service extends Interface {} -export const settings = register(new Service()); diff --git a/application/client/src/app/service/state.ts b/application/client/src/app/service/state.ts deleted file mode 100644 index eb91863200..0000000000 --- a/application/client/src/app/service/state.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { services } from '@register/services'; -import { ilc, Emitter, Declarations } from '@service/ilc'; - -import * as Events from '@platform/ipc/event/index'; - -export interface States { - ui: { - input: boolean; - }; -} - -@SetupService(services['state']) -export class Service extends Implementation { - private _emitter!: Emitter; - private _states: States = { - ui: { - input: false, - }, - }; - - public override ready(): Promise { - this._emitter = ilc.emitter(this.getName(), this.log()); - const channel = ilc.channel(this.getName(), this.log()); - this.register( - Events.IpcEvent.subscribe( - Events.State.Backend.Event, - (event) => { - this._emitter.backend.state({ - state: (() => { - switch (event.state) { - case Events.State.Backend.State.Ready: - this._emitter.system.ready(); - return Declarations.BackendState.Ready; - case Events.State.Backend.State.Locked: - return Declarations.BackendState.Locked; - } - throw new Error(`Unknown backend state: "${event.state}"`); - })(), - job: event.job, - }); - }, - ), - ); - channel.ui.input.focused(() => { - this._states.ui.input = true; - }); - channel.ui.input.blur(() => { - this._states.ui.input = false; - }); - return Promise.resolve(); - } - - public override destroy(): Promise { - this.unsubscribe(); - return Promise.resolve(); - } - - public setClientAsReady() { - Events.IpcEvent.emit( - new Events.State.Client.Event({ - state: Events.State.Client.State.Ready, - }), - ); - } - - public states(): States { - return this._states; - } -} -export interface Service extends Interface {} -export const state = register(new Service()); diff --git a/application/client/src/app/service/sys.ts b/application/client/src/app/service/sys.ts deleted file mode 100644 index 63dc8f9f5a..0000000000 --- a/application/client/src/app/service/sys.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { services } from '@register/services'; -import { api } from '@service/api'; -import { session } from '@service/session'; -import { CancelablePromise } from '@platform/env/promise'; -import { unique } from '@platform/env/sequence'; -import { system } from '@platform/modules/system'; - -import * as Requests from '@platform/ipc/request/index'; - -type Handler = () => void; - -@SetupService(services['sys']) -export class Service extends Implementation { - protected readonly jobs: Map> = new Map(); - protected readonly state: { - requested: number; - forced: boolean; - done: Handler | undefined; - finished: boolean; - } = { - requested: -1, - forced: false, - done: undefined, - finished: false, - }; - - public override ready(): Promise { - this.register( - api - .transport() - .respondent( - this.getName(), - Requests.System.Shutdown.Request, - ( - request: Requests.System.Shutdown.Request, - ): CancelablePromise => { - return new CancelablePromise((resolve, _reject) => { - if (this.state.done !== undefined) { - this.log().error(`Shutdown was already requestd.`); - return resolve( - new Requests.System.Shutdown.Response({ - state: Requests.System.Shutdown.State.InProgress, - }), - ); - } - this.state.requested = Date.now(); - this.state.forced = request.force; - this.state.done = () => { - this.state.finished = true; - session - .closeAllSessions() - .catch((err: Error) => { - this.log().error( - `Fail to close all session: ${err.message}`, - ); - }) - .finally(() => { - this.log().debug(`Shutdowning services`); - system - .destroy() - .then(() => { - this.log().debug( - `All services are down. Client can be closed`, - ); - }) - .catch((err: Error) => { - this.log().error( - `Fail to shutdown all service: ${err.message}`, - ); - }) - .finally(() => { - resolve( - new Requests.System.Shutdown.Response({ - state: Requests.System.Shutdown.State.Ready, - }), - ); - }); - }); - }; - this.shutdown().init(); - }); - }, - ), - ); - return Promise.resolve(); - } - - public job(): { - add(job: CancelablePromise): string; - remove(uuid: string): void; - } { - return { - add: (job: CancelablePromise): string => { - const uuid = unique(); - this.jobs.set(uuid, job); - job.catch((err: Error) => { - this.log().error(`Job ${uuid} is finished with error: ${err.message}`); - }).finally(() => { - this.job().remove(uuid); - }); - return uuid; - }, - remove: (uuid: string): void => { - this.jobs.delete(uuid); - this.shutdown().track(); - }, - }; - } - - protected shutdown(): { - init(): void; - track(): void; - } { - return { - init: (): void => { - if (this.state.done === undefined) { - this.log().warn(`Cannot init shutdown because finish-handler isn't created`); - return; - } - if (this.state.forced) { - this.log().debug( - `Shutdown is requested in forced mode. All jobs will be canceled`, - ); - this.jobs.forEach((job) => job.abort()); - } - this.shutdown().track(); - }, - track: (): void => { - if (this.state.done === undefined) { - return; - } - if (this.jobs.size > 0) { - this.log().debug( - `Cannot shutdown, still waiting for ${this.jobs.size} jobs to be finished`, - ); - return; - } - this.state.done(); - }, - }; - } -} -export interface Service extends Interface {} -export const sys = register(new Service()); diff --git a/application/client/src/app/ui/elements/autocomplete/component.ts b/application/client/src/app/ui/elements/autocomplete/component.ts deleted file mode 100644 index bac59ef37b..0000000000 --- a/application/client/src/app/ui/elements/autocomplete/component.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - ViewChild, - ElementRef, - AfterContentInit, - AfterViewInit, - EventEmitter, - Output, - ViewEncapsulation, - OnDestroy, - ChangeDetectionStrategy, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { MatAutocompleteTrigger } from '@angular/material/autocomplete'; -import { Controll } from './input'; -import { List } from '@env/storages/recent/list'; -import { Recent } from '@env/storages/recent/item'; -import { Subject } from '@platform/env/subscription'; -import { ErrorState, NullErrorState } from './error'; -import { stop } from '@ui/env/dom'; - -interface Options { - defaults: string; - storage: string; - name: string; - placeholder: string; - label: string; - inlineLabel?: string; - recent: Subject; - error?: ErrorState; -} - -export { ErrorState, Options }; - -@Component({ - selector: 'app-autocomplete-input', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class AutocompleteInput - extends ChangesDetector - implements OnDestroy, AfterContentInit, AfterViewInit -{ - @Input() public options!: Options; - - @Output() public edit: EventEmitter = new EventEmitter(); - @Output() public enter: EventEmitter = new EventEmitter(); - @Output() public panel: EventEmitter = new EventEmitter(); - - @ViewChild('input') inputRef!: ElementRef; - @ViewChild('input', { read: MatAutocompleteTrigger }) panelRef!: MatAutocompleteTrigger; - - public control!: Controll; - public recent!: List; - public error!: ErrorState; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnDestroy(): void { - this.control.destroy(); - } - - public ngAfterContentInit(): void { - this.control = new Controll(); - this.recent = new List(this.control.control, this.options.name, this.options.storage); - this.error = this.options.error !== undefined ? this.options.error : new NullErrorState(); - this.control.set(this.options.defaults); - } - - public ngAfterViewInit(): void { - this.env().subscriber.register( - this.control.actions.edit.subscribe((value: string) => { - this.edit.emit(value); - this.detectChanges(); - }), - this.control.actions.enter.subscribe((value: string) => { - this.enter.emit(value); - this.detectChanges(); - }), - this.control.actions.panel.subscribe((opened: boolean) => { - this.panel.emit(opened); - this.detectChanges(); - }), - this.options.recent.subscribe((value: string | undefined) => { - value = value === undefined ? this.control.value : value; - value.trim() !== '' && this.recent.update(value); - }), - this.error.observer().subscribe(() => { - this.detectChanges(); - }), - ); - this.control.bind(this.inputRef.nativeElement, this.panelRef, this.error); - } - - public ngRemove(recent: Recent, event: MouseEvent) { - this.recent.remove(recent.value); - this.detectChanges(); - stop(event); - } - - public disable(): AutocompleteInput { - this.control.disable(); - this.detectChanges(); - return this; - } - - public enable(): AutocompleteInput { - this.control.enable(); - this.detectChanges(); - return this; - } - - public set(value: string): AutocompleteInput { - this.control.set(value); - this.detectChanges(); - return this; - } - - public focus(): AutocompleteInput { - this.inputRef.nativeElement.focus(); - return this; - } -} -export interface AutocompleteInput extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/autocomplete/error.ts b/application/client/src/app/ui/elements/autocomplete/error.ts deleted file mode 100644 index 5536742f01..0000000000 --- a/application/client/src/app/ui/elements/autocomplete/error.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { ErrorStateMatcher } from '@angular/material/core'; -import { Subject } from '@platform/env/subscription'; -import { UntypedFormControl } from '@angular/forms'; - -export abstract class ErrorState extends ErrorStateMatcher { - protected value: string = ''; - protected timer: number = -1; - public override isErrorState(control: UntypedFormControl | null): boolean { - if (control !== null) { - const updated = this.value !== control.value; - this.value = control.value; - updated && this.check(); - } - return this.is(); - } - - abstract msg(): string; - abstract is(): boolean; - abstract observer(): Subject; - abstract validate(): void; - - public check() { - // We are using timeout to prevent ExpressionChangedAfterItHasBeenCheckedError - clearTimeout(this.timer); - this.timer = setTimeout(() => { - this.validate(); - }) as unknown as number; - } - - public setValue(value: string) { - this.value = value; - this.validate(); - } -} - -export class NullErrorState extends ErrorState { - protected subject: Subject = new Subject(); - - public msg(): string { - return ''; - } - - public is(): boolean { - return false; - } - - public observer(): Subject { - return this.subject; - } - - public validate(): void { - return undefined; - } -} diff --git a/application/client/src/app/ui/elements/autocomplete/input.ts b/application/client/src/app/ui/elements/autocomplete/input.ts deleted file mode 100644 index 47c2e7a510..0000000000 --- a/application/client/src/app/ui/elements/autocomplete/input.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { UntypedFormControl } from '@angular/forms'; -import { Subject } from '@platform/env/subscription'; -import { - MatAutocompleteTrigger, - MatAutocompleteSelectedEvent, -} from '@angular/material/autocomplete'; -import { ErrorState } from './error'; - -export class Controll { - public control: UntypedFormControl = new UntypedFormControl(); - public ref!: HTMLInputElement; - public value: string = ''; - public readonly: boolean = false; - public focused: boolean = false; - public recent: boolean = false; - - public actions: { - edit: Subject; - enter: Subject; - panel: Subject; - } = { - edit: new Subject(), - enter: new Subject(), - panel: new Subject(), - }; - - protected panel!: MatAutocompleteTrigger; - protected error!: ErrorState; - - public destroy() { - this.actions.enter.destroy(); - this.actions.edit.destroy(); - this.actions.panel.destroy(); - } - - public bind(ref: HTMLInputElement, panel: MatAutocompleteTrigger, errorState: ErrorState) { - this.ref = ref; - this.panel = panel; - this.error = errorState; - } - - public isEmpty(): boolean { - return this.value.trim() === ''; - } - - public keyup(event: KeyboardEvent) { - if (event.key === 'Escape') { - this.recent = false; - if (this.control.value.trim() !== '') { - this.drop(); - } - } else if (event.key === 'Enter') { - if (this.recent) { - this.recent = false; - this.panel !== undefined && this.panel.closePanel(); - this.actions.panel.emit(false); - } - this.actions.enter.emit(this.value); - } else if (event.key === 'ArrowUp' || event.key === 'ArrowDown') { - if (!this.recent) { - this.recent = true; - this.panel !== undefined && this.panel.openPanel(); - this.actions.panel.emit(true); - } - } else if (this.control.value !== '' && !this.recent) { - this.recent = true; - this.panel !== undefined && this.panel.openPanel(); - this.actions.panel.emit(true); - } - const prev = this.value; - this.value = this.control.value; - prev !== this.value && this.actions.edit.emit(this.value); - } - - public drop() { - this.error !== undefined && this.error.setValue(''); - this.control.setValue(''); - this.value = ''; - } - - public set(value: string) { - this.error !== undefined && this.error.setValue(value); - this.control.setValue(value); - const prev = this.value; - this.value = this.control.value; - prev !== this.value && this.actions.edit.emit(this.value); - } - - public onPanelClosed() { - this.recent = false; - } - - public selected(event: MatAutocompleteSelectedEvent) { - this.set(event.option.value); - } - - public disable(): void { - this.control.disable(); - } - - public enable(): void { - this.control.enable(); - } -} diff --git a/application/client/src/app/ui/elements/autocomplete/module.ts b/application/client/src/app/ui/elements/autocomplete/module.ts deleted file mode 100644 index b5a9532d10..0000000000 --- a/application/client/src/app/ui/elements/autocomplete/module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatOptionModule } from '@angular/material/core'; - -import { AutocompleteInput } from './component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatIconModule, - MatFormFieldModule, - MatInputModule, - MatAutocompleteModule, - MatOptionModule, - ], - declarations: [AutocompleteInput], - exports: [AutocompleteInput] -}) -export class AutocompleteModule {} diff --git a/application/client/src/app/ui/elements/autocomplete/styles.less b/application/client/src/app/ui/elements/autocomplete/styles.less deleted file mode 100644 index a26b786b43..0000000000 --- a/application/client/src/app/ui/elements/autocomplete/styles.less +++ /dev/null @@ -1,16 +0,0 @@ -@import '../../styles/variables.less'; - - -app-autocomplete-input { - position: relative; - display: flex; - flex-direction: row; - align-items:flex-start; - width: 100%; - & span.inline-label { - color: var(--scheme-color-3); - white-space: nowrap; - margin: 0 6px 0 0; - font-size: 12px; - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/autocomplete/template.html b/application/client/src/app/ui/elements/autocomplete/template.html deleted file mode 100644 index f81f8231d4..0000000000 --- a/application/client/src/app/ui/elements/autocomplete/template.html +++ /dev/null @@ -1,38 +0,0 @@ - - {{options.inlineLabel}} - - - {{error.msg()}} - - - -
- - close -
-
-
-
\ No newline at end of file diff --git a/application/client/src/app/ui/elements/color.selector/component.ts b/application/client/src/app/ui/elements/color.selector/component.ts deleted file mode 100644 index 567b030665..0000000000 --- a/application/client/src/app/ui/elements/color.selector/component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Component, Input, ChangeDetectorRef, Output, EventEmitter } from '@angular/core'; - -@Component({ - selector: 'app-com-color-selector', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -export class ComColorSelectorComponent { - @Input() public color!: string; - @Input() public colors!: string[]; - - @Output() public change = new EventEmitter(); - - private _destroyed: boolean = false; - - constructor(private _cdRef: ChangeDetectorRef) {} - - public _ng_onColorSelect(color: string) { - this.color = color; - this.change.emit(color); - this._forceUpdate(); - } - - private _forceUpdate() { - if (this._destroyed) { - return; - } - this._cdRef.detectChanges(); - } -} diff --git a/application/client/src/app/ui/elements/color.selector/module.ts b/application/client/src/app/ui/elements/color.selector/module.ts deleted file mode 100644 index 99e59e6735..0000000000 --- a/application/client/src/app/ui/elements/color.selector/module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ComColorSelectorComponent } from './component'; - -@NgModule({ - imports: [CommonModule], - declarations: [ComColorSelectorComponent], - exports: [ComColorSelectorComponent], -}) -export class ColorSelectorModule {} diff --git a/application/client/src/app/ui/elements/color.selector/styles.less b/application/client/src/app/ui/elements/color.selector/styles.less deleted file mode 100644 index a3be53c8e9..0000000000 --- a/application/client/src/app/ui/elements/color.selector/styles.less +++ /dev/null @@ -1,45 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - position: relative; - display: block; - & ul { - position: relative; - padding: 0; - margin: 0; - list-style: none; - & li { - position: relative; - display: inline-block; - padding: 0; - margin: 0 3px; - width: 16px; - list-style: none; - height: 16px; - line-height: 16px; - border: 1px solid rgba(255, 255, 255, 0); - transition: color 150ms ease-in-out; - &:hover { - border: 1px solid var(--scheme-color-0); - } - &.selected { - border: 1px solid var(--scheme-color-0); - &::after { - position: absolute; - content: ''; - top: 0; - left: 0; - width: 0; - height: 0; - border-top: 6px solid var(--scheme-color-0); - border-right: 6px solid transparent; - } - &:hover { - &::after { - display: none; - } - } - } - } - } -} diff --git a/application/client/src/app/ui/elements/color.selector/template.html b/application/client/src/app/ui/elements/color.selector/template.html deleted file mode 100644 index fb7af54d3d..0000000000 --- a/application/client/src/app/ui/elements/color.selector/template.html +++ /dev/null @@ -1,5 +0,0 @@ -
    -
  • -
diff --git a/application/client/src/app/ui/elements/containers/dynamic/component.ts b/application/client/src/app/ui/elements/containers/dynamic/component.ts deleted file mode 100644 index f83c8b4894..0000000000 --- a/application/client/src/app/ui/elements/containers/dynamic/component.ts +++ /dev/null @@ -1,79 +0,0 @@ -/* -src: http://blog.rangle.io/dynamically-creating-components-with-angular-2/ -*/ - -import { Component, Input, ViewContainerRef } from '@angular/core'; -import { setProp } from '@platform/env/obj'; - -export interface IComponentDesc { - factory: any; - inputs?: any; -} - -const CCacheFactoryKey: string = '__dynamic_component_factory_cache_key__'; -const getSequence: () => number = (function () { - let sequence: number = 0; - return () => { - return sequence++; - }; -})(); - -@Component({ - selector: 'lib-containers-dynamic', - template: '', - styles: [':host { display: none; }'], - standalone: false, -}) -export class DynamicComponent { - private _component: any = null; - private _cachedKey: number = -1; - - @Input() detectChanges = true; - @Input() alwaysDrop = false; - - @Input() set component(desc: IComponentDesc) { - if (this._component) { - const cacheKey: number | undefined = this._getKey(desc.factory); - // Component already was created - if (!this.alwaysDrop && this._cachedKey === cacheKey) { - // No need to recreate component. Update inputs - Object.keys(desc.inputs).forEach((key: string) => { - this._component.instance[key] = desc.inputs[key]; - }); - this._component.hostView.detectChanges(); - return; - } else { - this._component.destroy(); - this.viewContainerRef.remove(); - this._component = undefined; - } - } - if (typeof desc !== 'object' || desc === null || desc === undefined) { - return; - } - if (desc.factory === undefined) { - return; - } - if (desc.inputs === undefined) { - desc.inputs = {}; - } - const component = this.viewContainerRef.createComponent(desc.factory); - Object.keys(desc.inputs).forEach((inputName) => { - setProp(component.instance, inputName, desc.inputs[inputName]); - }); - this._component = component; - } - - private _getKey(factory: any): number | undefined { - if ((typeof factory !== 'object' || factory === null) && typeof factory !== 'function') { - return undefined; - } - if (typeof factory[CCacheFactoryKey] === 'number') { - return factory[CCacheFactoryKey]; - } - factory[CCacheFactoryKey] = getSequence(); - return undefined; - } - - constructor(private viewContainerRef: ViewContainerRef) {} -} diff --git a/application/client/src/app/ui/elements/containers/frame/component.ts b/application/client/src/app/ui/elements/containers/frame/component.ts deleted file mode 100644 index 0f7d860748..0000000000 --- a/application/client/src/app/ui/elements/containers/frame/component.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Component, ChangeDetectorRef, AfterViewInit, Input } from '@angular/core'; -import { IComponentDesc } from '../dynamic/component'; - -export interface IFrameOptions { - onClose?: (...args: any[]) => any; - closable?: boolean; - caption?: string; - style: { [key: string]: string }; -} - -export { IComponentDesc }; - -@Component({ - selector: 'lib-containers-frame', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -export class FrameComponent implements AfterViewInit { - @Input() public content!: IComponentDesc; - @Input() public options: IFrameOptions = { style: {} }; - - constructor(private _cdRef: ChangeDetectorRef) {} - - ngAfterViewInit() { - if (typeof this.options.closable !== 'boolean') { - this.options.closable = true; - } - if (typeof this.options.caption !== 'string') { - this.options.caption = ''; - } - this._cdRef.detectChanges(); - } - - public _ng_onClose() { - if (typeof this.options.onClose === 'function') { - this.options.onClose(); - } - } -} diff --git a/application/client/src/app/ui/elements/containers/frame/styles.less b/application/client/src/app/ui/elements/containers/frame/styles.less deleted file mode 100644 index b9f469ae3f..0000000000 --- a/application/client/src/app/ui/elements/containers/frame/styles.less +++ /dev/null @@ -1,61 +0,0 @@ -@import '../../../styles/variables.less'; -@import '../../../styles/support.less'; -@import '../../../styles/borders.less'; - -:host { - position: relative; - display: block; - box-sizing: border-box; - height: 100%; - width: auto; - & div.frame-holder { - position: relative; - display: block; - background: var(--scheme-color-5); - overflow: hidden; - box-shadow: 0 0 0.5rem rgba(0, 0, 0, 0.4); - height: 100%; - width: auto; - border-radius: 3px; - .border-based-5; - & div.caption-holder { - position: absolute; - top: 0; - left: 0; - height: @status-bar-height; - width: 100%; - overflow: hidden; - background: var(--scheme-color-2-lighten-5); - & p.caption { - position: absolute; - display: block; - height: 100%; - top: 0; - left: 0; - right: @status-bar-height; - font-size: 0.75rem; - color: var(--scheme-color-1); - padding: 0.15rem 0.5rem; - } - & span.close-button { - position: absolute; - display: block; - top: 0; - right: 0; - width: @status-bar-height; - height: 100%; - cursor: pointer; - font-size: 0.75rem; - text-align: center; - padding-top: 0.3rem; - } - } - & div.content-holder { - position: relative; - width: auto; - height: auto; - margin-top: @status-bar-height; - overflow: auto; - } - } -} diff --git a/application/client/src/app/ui/elements/containers/frame/template.html b/application/client/src/app/ui/elements/containers/frame/template.html deleted file mode 100644 index 86849b611b..0000000000 --- a/application/client/src/app/ui/elements/containers/frame/template.html +++ /dev/null @@ -1,9 +0,0 @@ -
-
-

{{options.caption}}

- -
-
- -
-
\ No newline at end of file diff --git a/application/client/src/app/ui/elements/containers/module.ts b/application/client/src/app/ui/elements/containers/module.ts deleted file mode 100644 index ed7becdd43..0000000000 --- a/application/client/src/app/ui/elements/containers/module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { DynamicComponent } from './dynamic/component'; -import { FrameComponent } from './frame/component'; - -@NgModule({ - imports: [CommonModule], - declarations: [DynamicComponent, FrameComponent], - exports: [DynamicComponent, FrameComponent], -}) -export class ContainersModule {} diff --git a/application/client/src/app/ui/elements/editable/component.ts b/application/client/src/app/ui/elements/editable/component.ts deleted file mode 100644 index ce2cde92cd..0000000000 --- a/application/client/src/app/ui/elements/editable/component.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { - HostListener, - Component, - Input, - Output, - ChangeDetectorRef, - ViewChild, - EventEmitter, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { MatInput } from '@angular/material/input'; - -import * as dom from '@ui/env/dom'; - -@Component({ - selector: 'app-editable-field', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class Field extends ChangesDetector { - @Input() public placeholder!: string; - @Input() public value!: string; - @Input() public caption!: string; - @Output() public changed: EventEmitter = new EventEmitter(); - @Output() public canceled: EventEmitter = new EventEmitter(); - @Output() public edit: EventEmitter = new EventEmitter(); - - @ViewChild(MatInput) _inputRefCom!: MatInput; - - @HostListener('click', ['$event']) onClick(event: MouseEvent) { - this.editable = true; - this.prev = this.value; - this.detectChanges(); - if (this._inputRefCom !== undefined) { - this._inputRefCom.focus(); - } - this.edit.emit(); - return dom.stop(event); - } - - public editable: boolean = false; - protected prev: string = ''; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public onKeyUp(event: KeyboardEvent) { - if (['Escape', 'Enter'].indexOf(event.code) === -1) { - return; - } - this.editable = false; - this.detectChanges(); - switch (event.code) { - case 'Escape': - this.value = this.prev; - this.canceled.emit(); - break; - case 'Enter': - this.changed.emit(this.value); - break; - } - } - - public onBlur() { - this.editable = false; - this.detectChanges(); - } -} -export interface Field extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/editable/module.ts b/application/client/src/app/ui/elements/editable/module.ts deleted file mode 100644 index eb965e16a4..0000000000 --- a/application/client/src/app/ui/elements/editable/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatInputModule } from '@angular/material/input'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -import { Field } from './component'; - -@NgModule({ - imports: [CommonModule, MatInputModule, FormsModule, ReactiveFormsModule], - declarations: [Field], - exports: [Field], -}) -export class EditableModule {} diff --git a/application/client/src/app/ui/elements/editable/styles.less b/application/client/src/app/ui/elements/editable/styles.less deleted file mode 100644 index 4a7e6eda27..0000000000 --- a/application/client/src/app/ui/elements/editable/styles.less +++ /dev/null @@ -1,28 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - position: relative; - display: block; - height: 20px; - & span { - flex: auto; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - padding-left: 6px; - color: var(--scheme-color-0); - cursor: default; - } - & input { - width: ~"calc(100% - 16px)"; - margin: 0 8px; - padding: 0; - border: none; - border-bottom: dashed 1px var(--scheme-color-1); - flex: auto; - white-space: nowrap; - color: var(--scheme-color-0); - background: none; - outline: none; - } -} diff --git a/application/client/src/app/ui/elements/editable/template.html b/application/client/src/app/ui/elements/editable/template.html deleted file mode 100644 index 9597f65f47..0000000000 --- a/application/client/src/app/ui/elements/editable/template.html +++ /dev/null @@ -1,7 +0,0 @@ -{{caption}} - \ No newline at end of file diff --git a/application/client/src/app/ui/elements/filter.hidden/component.ts b/application/client/src/app/ui/elements/filter.hidden/component.ts deleted file mode 100644 index ece483fcc5..0000000000 --- a/application/client/src/app/ui/elements/filter.hidden/component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component, OnDestroy, ChangeDetectorRef, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Filter } from '@ui/env/entities/filter'; - -@Component({ - selector: 'app-filter-hidden', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class HiddenFilter extends ChangesDetector implements AfterContentInit, OnDestroy { - public filter!: Filter; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnDestroy(): void { - this.filter.destroy(); - } - - public ngAfterContentInit(): void { - this.filter = new Filter(this.ilc()).bind(); - } -} -export interface HiddenFilter extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/filter.hidden/module.ts b/application/client/src/app/ui/elements/filter.hidden/module.ts deleted file mode 100644 index 700927ad41..0000000000 --- a/application/client/src/app/ui/elements/filter.hidden/module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { HiddenFilter } from './component'; -export { HiddenFilter } from './component'; - -@NgModule({ - imports: [CommonModule], - declarations: [HiddenFilter], - exports: [HiddenFilter], -}) -export class HiddenFilterModule {} diff --git a/application/client/src/app/ui/elements/filter.hidden/styles.less b/application/client/src/app/ui/elements/filter.hidden/styles.less deleted file mode 100644 index a883c99f48..0000000000 --- a/application/client/src/app/ui/elements/filter.hidden/styles.less +++ /dev/null @@ -1,16 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - position: fixed; - display: block; - top: 12px; - right: 12px; - z-index: 1000; - & div.filter { - position: absolute; - padding: 6px 12px; - background: var(--scheme-color-warning-light); - box-shadow: 3px 3px 3px rgb(0 0 0 / 40%); - border-radius: 3px; - } -} diff --git a/application/client/src/app/ui/elements/filter.hidden/template.html b/application/client/src/app/ui/elements/filter.hidden/template.html deleted file mode 100644 index f43abe5c65..0000000000 --- a/application/client/src/app/ui/elements/filter.hidden/template.html +++ /dev/null @@ -1,3 +0,0 @@ - -
{{filter.value()}}
-
\ No newline at end of file diff --git a/application/client/src/app/ui/elements/filter/component.ts b/application/client/src/app/ui/elements/filter/component.ts deleted file mode 100644 index 1a1e1fc97c..0000000000 --- a/application/client/src/app/ui/elements/filter/component.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { - Component, - Input, - ChangeDetectorRef, - AfterContentInit, - ViewChild, - ElementRef, - AfterViewInit, - OnDestroy, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Filter } from './filter'; -import { FilterInput } from './input'; - -@Component({ - selector: 'app-filter-input', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class InputFilter - extends ChangesDetector - implements AfterContentInit, AfterViewInit, OnDestroy -{ - @Input() public filter!: Filter; - @ViewChild('filterinput') filterInputRef!: ElementRef; - - public input!: FilterInput; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnDestroy(): void { - this.filter.destroy(); - } - - public ngAfterContentInit(): void { - this.input = new FilterInput(this.filter); - } - - public ngAfterViewInit(): void { - this.filter.bind(this.filterInputRef.nativeElement); - } - - public focus(): void { - if (this.filterInputRef === undefined) { - return; - } - this.filterInputRef.nativeElement.focus(); - } - - public getInputElementRef(): HTMLInputElement | undefined { - return this.filterInputRef !== undefined ? this.filterInputRef.nativeElement : undefined; - } -} -export interface InputFilter extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/filter/filter.ts b/application/client/src/app/ui/elements/filter/filter.ts deleted file mode 100644 index 02f3f63db3..0000000000 --- a/application/client/src/app/ui/elements/filter/filter.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { IlcInterface } from '@service/ilc'; -import { Subject, Subjects } from '@platform/env/subscription'; - -export type Handler = () => void; - -export interface Options { - clearOnEscape?: boolean; - clearOnEnter?: boolean; - placeholder: string; -} - -export class Filter { - public readonly options: Options; - public readonly subjects: Subjects<{ - change: Subject; - drop: Subject; - enter: Subject; - focus: Subject; - blur: Subject; - up: Subject; - down: Subject; - }> = new Subjects({ - change: new Subject(), - drop: new Subject(), - enter: new Subject(), - focus: new Subject(), - blur: new Subject(), - up: new Subject(), - down: new Subject(), - }); - private _element!: HTMLInputElement | undefined; - - constructor(ilc: IlcInterface, options: Options) { - ilc.life().destroy(() => { - this.subjects.destroy(); - }); - this.options = options; - } - - public destroy() { - this.subjects.destroy(); - } - - public bind(element: HTMLInputElement | undefined): Filter { - element !== undefined && (this._element = element); - return this; - } - - public focus() { - this._element !== undefined && this._element.focus(); - } - - public value(): string | undefined { - return this._element !== undefined ? this._element.value : undefined; - } - - public defaults(): { - clearOnEscape(): boolean; - clearOnEnter(): boolean; - } { - return { - clearOnEscape: (): boolean => { - return this.options.clearOnEscape !== undefined - ? this.options.clearOnEscape - : false; - }, - clearOnEnter: (): boolean => { - return this.options.clearOnEnter !== undefined ? this.options.clearOnEnter : false; - }, - }; - } -} diff --git a/application/client/src/app/ui/elements/filter/input.ts b/application/client/src/app/ui/elements/filter/input.ts deleted file mode 100644 index ca9da2c1a1..0000000000 --- a/application/client/src/app/ui/elements/filter/input.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { UntypedFormControl } from '@angular/forms'; -import { Filter } from './filter'; - -import * as dom from '@ui/env/dom'; - -export class FilterInput { - public control: UntypedFormControl = new UntypedFormControl(); - protected filter: Filter; - - constructor(filter: Filter) { - this.filter = filter; - } - - public isEmpty(): boolean { - return this._safe().trim() === ''; - } - - public keyup(event: KeyboardEvent) { - if (event.key === 'Escape' && this.filter.defaults().clearOnEscape()) { - this.drop(); - return true; - } - if (event.key === 'Enter' && this.filter.defaults().clearOnEnter()) { - this.filter.subjects.get().enter.emit(this._safe()); - this.drop(); - return true; - } - if (event.key === 'ArrowUp') { - this.filter.subjects.get().up.emit(); - dom.stop(event); - return false; - } - if (event.key === 'ArrowDown') { - this.filter.subjects.get().down.emit(); - dom.stop(event); - return false; - } - this.filter.subjects.get().change.emit(this._safe()); - return true; - } - - public drop() { - this.control.setValue(''); - this.filter.subjects.get().drop.emit(); - this.filter.subjects.get().change.emit(''); - } - - public set(value: string) { - this.control.setValue(value); - this.filter.subjects.get().change.emit(value); - } - - public get(): string { - return this._safe(); - } - - public onFocus() { - this.filter.subjects.get().focus.emit(); - } - - public onBlur() { - this.filter.subjects.get().blur.emit(); - } - - private _safe(): string { - return typeof this.control.value !== 'string' ? '' : this.control.value; - } -} diff --git a/application/client/src/app/ui/elements/filter/module.ts b/application/client/src/app/ui/elements/filter/module.ts deleted file mode 100644 index 6a73442056..0000000000 --- a/application/client/src/app/ui/elements/filter/module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -import { InputFilter } from './component'; - -@NgModule({ - imports: [CommonModule, MatFormFieldModule, MatInputModule, FormsModule, ReactiveFormsModule], - declarations: [InputFilter], - exports: [InputFilter], -}) -export class FilterInputModule {} diff --git a/application/client/src/app/ui/elements/filter/styles.less b/application/client/src/app/ui/elements/filter/styles.less deleted file mode 100644 index 769bf5875b..0000000000 --- a/application/client/src/app/ui/elements/filter/styles.less +++ /dev/null @@ -1,12 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - position: relative; - display: flex; - flex: auto; - height: 32px; - width: 100%; - background: var(--scheme-color-5); - overflow: hidden; - align-items: center; -} diff --git a/application/client/src/app/ui/elements/filter/template.html b/application/client/src/app/ui/elements/filter/template.html deleted file mode 100644 index eba63d3328..0000000000 --- a/application/client/src/app/ui/elements/filter/template.html +++ /dev/null @@ -1,14 +0,0 @@ - - - \ No newline at end of file diff --git a/application/client/src/app/ui/elements/folderinput/component.ts b/application/client/src/app/ui/elements/folderinput/component.ts deleted file mode 100644 index c794f16fbf..0000000000 --- a/application/client/src/app/ui/elements/folderinput/component.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - ViewChild, - ElementRef, - AfterContentInit, - AfterViewInit, - EventEmitter, - Output, - ViewEncapsulation, - ChangeDetectionStrategy, - OnDestroy, -} from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { MatAutocompleteTrigger } from '@angular/material/autocomplete'; -import { Controll } from './input'; -import { FoldersList } from './folders'; -import { ErrorState } from './error'; - -interface Options { - placeholder: string; - label?: string; - defaults: string; - passive: boolean; -} - -export { ErrorState, Options }; - -@Component({ - selector: 'app-folderinput-input', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class FolderInput - extends ChangesDetector - implements OnDestroy, AfterContentInit, AfterViewInit -{ - @Input() public options!: Options; - - @Output() public edit: EventEmitter = new EventEmitter(); - @Output() public enter: EventEmitter = new EventEmitter(); - @Output() public panel: EventEmitter = new EventEmitter(); - - @ViewChild('input') inputRef!: ElementRef; - @ViewChild('input', { read: MatAutocompleteTrigger }) panelRef!: MatAutocompleteTrigger; - - public control!: Controll; - public folders!: FoldersList; - public error: ErrorState = new ErrorState(); - - constructor(cdRef: ChangeDetectorRef, private _sanitizer: DomSanitizer) { - super(cdRef); - } - - public ngOnDestroy(): void { - this.control.destroy(); - } - - public ngAfterContentInit(): void { - this.control = new Controll(); - this.folders = new FoldersList(this.control.control); - this.control.set(this.options.defaults); - this.env().subscriber.register( - this.control.actions.edit.subscribe((value: string) => { - this.edit.emit(value); - this.detectChanges(); - }), - this.control.actions.enter.subscribe((value: string) => { - this.enter.emit(value); - this.detectChanges(); - }), - this.control.actions.panel.subscribe((opened: boolean) => { - this.panel.emit(opened); - this.detectChanges(); - }), - this.error.subject.subscribe(() => { - this.edit.emit(this.control.value); - this.detectChanges(); - }), - ); - } - - public ngAfterViewInit(): void { - this.control.bind(this.inputRef.nativeElement, this.panelRef); - } - - public disable(): FolderInput { - this.control.disable(); - this.detectChanges(); - return this; - } - - public enable(): FolderInput { - this.control.enable(); - this.detectChanges(); - return this; - } - - public set(value: string): FolderInput { - this.control.set(value); - this.folders.setParent(); - this.detectChanges(); - return this; - } - - public focus(): FolderInput { - this.inputRef.nativeElement.focus(); - return this; - } - - public select() { - this.ilc() - .services.system.bridge.folders() - .select() - .then((paths: string[]) => { - if (paths.length !== 1) { - return; - } - this.set(paths[0]); - }); - } - - public home() { - this.ilc() - .services.system.bridge.os() - .homedir() - .then((path: string) => { - this.set(path); - }); - } - - public safeHtml(html: string): SafeHtml { - return this._sanitizer.bypassSecurityTrustHtml(html); - } -} -export interface FolderInput extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/folderinput/error.ts b/application/client/src/app/ui/elements/folderinput/error.ts deleted file mode 100644 index 10a1d2cdb6..0000000000 --- a/application/client/src/app/ui/elements/folderinput/error.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ErrorStateMatcher } from '@angular/material/core'; -import { Subject } from '@platform/env/subscription'; -import { UntypedFormControl } from '@angular/forms'; -import { bridge } from '@service/bridge'; -import { scope } from '@platform/env/scope'; - -export class ErrorState extends ErrorStateMatcher { - public subject: Subject = new Subject(); - protected exist: boolean = false; - protected value: string = ''; - - public override isErrorState(control: UntypedFormControl | null): boolean { - if (control !== null && typeof control.value === 'string') { - const updated = this.value !== control.value; - this.value = control.value; - updated && - this.check().catch((err: Error) => { - scope - .getLogger(`ErrorState (FolderInput)`) - .error(`Fail to check path: ${err.message}`); - }); - } - return this.is(); - } - - public is(): boolean { - return !this.exist; - } - - public async check(): Promise { - if (this.value.trim() === '') { - this.exist = false; - } else { - this.exist = await bridge.files().exists(this.value); - } - this.subject.emit(); - } -} diff --git a/application/client/src/app/ui/elements/folderinput/folder.ts b/application/client/src/app/ui/elements/folderinput/folder.ts deleted file mode 100644 index a5cdbe4994..0000000000 --- a/application/client/src/app/ui/elements/folderinput/folder.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Matchee } from '@module/matcher'; -import { getFileName } from '@platform/types/files'; - -import * as wasm from '@loader/wasm'; - -export class Folder extends Matchee { - public readonly path: string; - public readonly parent: string; - - protected readonly delimiter: string; - - constructor(parent: string, path: string, delimiter: string, matcher: wasm.Matcher) { - super(matcher, { - name: getFileName(path), - }); - this.parent = parent; - this.path = path; - this.delimiter = delimiter; - } - - public html(): string { - const name: string | undefined = this.getHtmlOf('html_name'); - if (name === undefined) { - return this.path; - } else { - const endsWithDelimiter = this.parent.endsWith(this.delimiter); - return `${this.parent}${endsWithDelimiter ? '' : this.delimiter}${name}`; - } - } - - public hash(): string { - return this.path; - } -} diff --git a/application/client/src/app/ui/elements/folderinput/folders.ts b/application/client/src/app/ui/elements/folderinput/folders.ts deleted file mode 100644 index 0185573573..0000000000 --- a/application/client/src/app/ui/elements/folderinput/folders.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { Observable } from 'rxjs'; -import { map, startWith } from 'rxjs/operators'; -import { UntypedFormControl } from '@angular/forms'; -import { SetupLogger, LoggerInterface } from '@platform/entity/logger'; -import { bridge } from '@service/bridge'; -import { Folder } from './folder'; -import { Holder } from '@module/matcher/holder'; - -@SetupLogger() -export class FoldersList extends Holder { - public items: Folder[] = []; - public parent: string = '/'; - public observer!: Observable; - - protected readonly control: UntypedFormControl; - protected previous: string = ''; - protected delimiter: string = ''; - - constructor(control: UntypedFormControl) { - super(); - this.control = control; - this.setLoggerName(`FolderListController`); - this.assign(); - bridge - .folders() - .delimiter() - .then((delimiter) => { - this.delimiter = delimiter; - }) - .catch((err: Error) => { - this.log().error(`Fail to request delimiter: ${err.message}`); - }); - } - - public setParent() { - this.update(); - } - - protected assign() { - this.observer = this.control.valueChanges.pipe( - startWith(''), - map((_updated: string) => { - this.update().catch((err: Error) => { - this.log().error(err.message); - }); - return this.items.sort((a: Folder, b: Folder) => b.getScore() - a.getScore()); - }), - ); - } - - protected async update(): Promise { - const candidate = this.control.value; - if (typeof candidate !== 'string') { - return Promise.resolve(); - } - await this.candidate(candidate); - if (this.parent.trim() === '') { - this.items = []; - return Promise.resolve(); - } - if (this.parent.trim() === '') { - this.items = []; - return Promise.resolve(); - } - if (this.previous === this.parent) { - return Promise.resolve(); - } - const target = this.parent; - this.items = await ( - await bridge.folders().ls([target]) - ).map((i) => new Folder(target, i, this.delimiter, this.matcher)); - this.previous = target; - this.assign(); - } - - protected async candidate(candidate: string): Promise { - async function suggest(candidate: string, current: string): Promise { - if (candidate === current) { - return Promise.resolve(candidate); - } - if (candidate === '.' || candidate.trim() === '') { - return Promise.resolve(''); - } - if (await bridge.files().exists(candidate)) { - return Promise.resolve(candidate); - } - return Promise.resolve(undefined); - } - const finish = (parent: string, query: string | undefined) => { - this.matcher.search(query === undefined ? '' : query); - this.parent = parent; - }; - const info = candidate.trim() === '' ? undefined : await bridge.files().name(candidate); - let suggestion = await suggest(candidate, this.parent); - if (suggestion !== undefined) { - finish(suggestion, info?.name); - return Promise.resolve(); - } - if (info === undefined) { - return Promise.resolve(); - } - suggestion = await suggest(info.parent, this.parent); - if (suggestion !== undefined) { - finish(suggestion, info.name); - } else { - finish('', ''); - } - return Promise.resolve(); - } -} -export interface FoldersList extends LoggerInterface {} diff --git a/application/client/src/app/ui/elements/folderinput/input.ts b/application/client/src/app/ui/elements/folderinput/input.ts deleted file mode 100644 index 11e1181d03..0000000000 --- a/application/client/src/app/ui/elements/folderinput/input.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { UntypedFormControl } from '@angular/forms'; -import { Subject } from '@platform/env/subscription'; -import { - MatAutocompleteTrigger, - MatAutocompleteSelectedEvent, -} from '@angular/material/autocomplete'; - -export class Controll { - public control: UntypedFormControl = new UntypedFormControl(); - public ref!: HTMLInputElement; - public value: string = ''; - public readonly: boolean = false; - public focused: boolean = false; - public recent: boolean = false; - - public actions: { - edit: Subject; - enter: Subject; - panel: Subject; - } = { - edit: new Subject(), - enter: new Subject(), - panel: new Subject(), - }; - private _panel!: MatAutocompleteTrigger; - - public destroy() { - this.actions.enter.destroy(); - this.actions.edit.destroy(); - this.actions.panel.destroy(); - } - - public bind(ref: HTMLInputElement, panel: MatAutocompleteTrigger) { - this.ref = ref; - this._panel = panel; - } - - public isEmpty(): boolean { - return this.value.trim() === ''; - } - - public keyup(event: KeyboardEvent) { - if (event.key === 'Escape') { - this.recent = false; - if (this.control.value.trim() !== '') { - this.drop(); - } - } else if (event.key === 'Enter') { - if (this.recent) { - this.recent = false; - this._panel.closePanel(); - this.actions.panel.emit(false); - } - this.actions.enter.emit(this.value); - } else if (event.key === 'ArrowUp' || event.key === 'ArrowDown') { - if (!this.recent) { - this.recent = true; - this._panel.openPanel(); - this.actions.panel.emit(true); - } - } else if (this.control.value !== '' && !this.recent) { - this.recent = true; - this._panel.openPanel(); - this.actions.panel.emit(true); - } - this.value = this.control.value; - this.actions.edit.emit(this.value); - } - - public drop() { - this.control.setValue(''); - this.value = ''; - } - - public set(value: string) { - this.control.setValue(value); - this.value = this.control.value; - this.actions.edit.emit(this.value); - } - - public onPanelClosed() { - this.recent = false; - } - - public selected(event: MatAutocompleteSelectedEvent) { - this.set(event.option.value); - } - - public disable(): void { - this.control.disable(); - } - - public enable(): void { - this.control.enable(); - } -} diff --git a/application/client/src/app/ui/elements/folderinput/module.ts b/application/client/src/app/ui/elements/folderinput/module.ts deleted file mode 100644 index 6a14b90fef..0000000000 --- a/application/client/src/app/ui/elements/folderinput/module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatOptionModule } from '@angular/material/core'; - -import { FolderInput } from './component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatIconModule, - MatFormFieldModule, - MatInputModule, - MatAutocompleteModule, - MatOptionModule, - ], - declarations: [FolderInput], - exports: [FolderInput] -}) -export class FolderInputModule {} diff --git a/application/client/src/app/ui/elements/folderinput/styles.less b/application/client/src/app/ui/elements/folderinput/styles.less deleted file mode 100644 index 9d6184a845..0000000000 --- a/application/client/src/app/ui/elements/folderinput/styles.less +++ /dev/null @@ -1,21 +0,0 @@ -@import '../../styles/variables.less'; - - -app-folderinput-input { - position: relative; - display: flex; - flex-direction: row; - align-items:flex-start; - width: 100%; - margin-bottom: 12px; - & span.label { - color: var(--scheme-color-2); - white-space: nowrap; - margin: 0 6px 0 0; - } - - & span.codicon-home { - margin-left: 12px; - } - -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/folderinput/template.html b/application/client/src/app/ui/elements/folderinput/template.html deleted file mode 100644 index 0764f7f904..0000000000 --- a/application/client/src/app/ui/elements/folderinput/template.html +++ /dev/null @@ -1,35 +0,0 @@ - - {{options.label}} - - Doesn't exist - - - - - - - - \ No newline at end of file diff --git a/application/client/src/app/ui/elements/locks.history/component.ts b/application/client/src/app/ui/elements/locks.history/component.ts deleted file mode 100644 index 37e808b287..0000000000 --- a/application/client/src/app/ui/elements/locks.history/component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterContentInit, - Input, - AfterViewInit, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Initial } from '@env/decorators/initial'; -import { Locker } from '@ui/service/lockers'; - -@Component({ - selector: 'app-elements-locks-history', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class LocksHistory extends ChangesDetector implements AfterContentInit, AfterViewInit { - @Input() group!: string; - - public lockers: Locker[] = []; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.env().subscriber.register( - this.ilc().services.ui.lockers.unbound.subscribe(() => { - this.load(); - }), - ); - } - - public ngAfterViewInit(): void { - this.load(); - } - - protected load() { - this.lockers = this.ilc().services.ui.lockers.get(this.group); - this.detectChanges(); - } -} -export interface LocksHistory extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/locks.history/entry/component.ts b/application/client/src/app/ui/elements/locks.history/entry/component.ts deleted file mode 100644 index 8cfa1519f7..0000000000 --- a/application/client/src/app/ui/elements/locks.history/entry/component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Locker, Level } from '@ui/service/lockers'; - -@Component({ - selector: 'app-elements-locks-history-entry', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class LocksHistoryEntry { - @Input() locker!: Locker; - - public get Level(): typeof Level { - return Level; - } -} -export interface LocksHistoryEntry extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/locks.history/entry/styles.less b/application/client/src/app/ui/elements/locks.history/entry/styles.less deleted file mode 100644 index dc3ed2e7e6..0000000000 --- a/application/client/src/app/ui/elements/locks.history/entry/styles.less +++ /dev/null @@ -1,35 +0,0 @@ -@import '../../../styles/variables.less'; - -:host{ - position: relative; - display: flex; - width: 100%; - flex-direction: row; - padding: 6px 0 12px 0; - border-bottom: thin dotted var(--scheme-color-4); - &:last-child { - border-bottom: none; - } - & mat-icon { - padding-right: 24px; - font-size: 18px; - height: 18px; - width: 18px; - margin-top: 15px; - &[data-type="error"] { - color: var(--scheme-color-error-light); - } - &[data-type="warning"] { - color: var(--scheme-color-warning-light); - } - } - & div p { - color: var(--scheme-color-2); - &.time { - font-size: 10px; - color: var(--scheme-color-2); - text-align: right; - } - } - -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/locks.history/entry/template.html b/application/client/src/app/ui/elements/locks.history/entry/template.html deleted file mode 100644 index c3bed121ee..0000000000 --- a/application/client/src/app/ui/elements/locks.history/entry/template.html +++ /dev/null @@ -1,7 +0,0 @@ -highlight_off -report_problem -
-

{{locker.getTime()}}

-

{{locker.message}}

-
- diff --git a/application/client/src/app/ui/elements/locks.history/module.ts b/application/client/src/app/ui/elements/locks.history/module.ts deleted file mode 100644 index 627695c261..0000000000 --- a/application/client/src/app/ui/elements/locks.history/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatIconModule } from '@angular/material/icon'; - -import { LocksHistory } from './component'; -import { LocksHistoryEntry } from './entry/component'; - -@NgModule({ - imports: [CommonModule, MatIconModule], - declarations: [LocksHistory, LocksHistoryEntry], - exports: [LocksHistory], -}) -export class LocksHistoryModule {} diff --git a/application/client/src/app/ui/elements/locks.history/styles.less b/application/client/src/app/ui/elements/locks.history/styles.less deleted file mode 100644 index 5a6bac2a0d..0000000000 --- a/application/client/src/app/ui/elements/locks.history/styles.less +++ /dev/null @@ -1,9 +0,0 @@ -@import '../../styles/variables.less'; - -:host{ - position: relative; - display: block; - width: 100%; - height: 100%; - overflow: auto; -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/locks.history/template.html b/application/client/src/app/ui/elements/locks.history/template.html deleted file mode 100644 index f0ed9c94b1..0000000000 --- a/application/client/src/app/ui/elements/locks.history/template.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/application/client/src/app/ui/elements/menu.attachsource/component.ts b/application/client/src/app/ui/elements/menu.attachsource/component.ts deleted file mode 100644 index bc60fe14ea..0000000000 --- a/application/client/src/app/ui/elements/menu.attachsource/component.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { - Component, - Input, - ChangeDetectorRef, - ElementRef, - ViewEncapsulation, - ChangeDetectionStrategy, -} from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -import * as Factory from '@platform/types/observe/factory'; - -@Component({ - selector: 'app-attach-new-source-menu', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class AttachSourceMenu extends ChangesDetector { - @Input() session!: Session; - - public actions: Array<{ icon: string; title: string; handler: () => void } | null> = [ - { - icon: 'note_add', - title: 'Attach Files', - handler: () => { - throw new Error(`Not implemented!`); - }, - }, - null, - { - icon: 'input', - title: 'Connect TCP', - handler: () => { - this.ilc() - .services.system.session.initialize() - .configure(new Factory.Stream().tcp().get(), this.session); - }, - }, - { - icon: 'input', - title: 'Connect UDP', - handler: () => { - this.ilc() - .services.system.session.initialize() - .configure(new Factory.Stream().udp().get(), this.session); - }, - }, - { - icon: 'settings_input_composite', - title: 'Connect Serial', - handler: () => { - this.ilc() - .services.system.session.initialize() - .configure(new Factory.Stream().serial().get(), this.session); - }, - }, - null, - { - icon: 'minimize', - title: 'Command', - handler: () => { - this.ilc() - .services.system.session.initialize() - .configure(new Factory.Stream().process().get(), this.session); - }, - }, - ]; - - constructor(cdRef: ChangeDetectorRef, private _self: ElementRef) { - super(cdRef); - } - - public attach(): { - disabled(): boolean; - error(): string | undefined; - } { - return { - disabled: (): boolean => { - return this.session.observed.getNewSourceError() instanceof Error; - }, - error: (): string | undefined => { - const error = this.session.observed.getNewSourceError(); - return error instanceof Error ? error.message : undefined; - }, - }; - } -} -export interface AttachSourceMenu extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/menu.attachsource/module.ts b/application/client/src/app/ui/elements/menu.attachsource/module.ts deleted file mode 100644 index 952da46e9b..0000000000 --- a/application/client/src/app/ui/elements/menu.attachsource/module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ContainersModule } from '@elements/containers/module'; -import { MatButtonModule } from '@angular/material/button'; -import { AttachSourceMenu } from './component'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatIconModule } from '@angular/material/icon'; -import { MatDividerModule } from '@angular/material/divider'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - MatButtonModule, - MatMenuModule, - MatIconModule, - MatDividerModule, - ], - declarations: [AttachSourceMenu], - exports: [AttachSourceMenu], -}) -export class AttachSourceMenuModule {} diff --git a/application/client/src/app/ui/elements/menu.attachsource/styles.less b/application/client/src/app/ui/elements/menu.attachsource/styles.less deleted file mode 100644 index 2f53df613f..0000000000 --- a/application/client/src/app/ui/elements/menu.attachsource/styles.less +++ /dev/null @@ -1,17 +0,0 @@ -@import '../../styles/variables.less'; - -app-attach-new-source-menu { - display: inline-block; -} -p.attach-menu-warning { - padding: 12px 24px; - color: var(--scheme-color-1); -} -div.attach-new-source-menu { - & .mat-icon { - width: 16px; - height: 16px; - font-size: 16px; - color: var(--scheme-color-1); - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/menu.attachsource/template.html b/application/client/src/app/ui/elements/menu.attachsource/template.html deleted file mode 100644 index 0dd71808d3..0000000000 --- a/application/client/src/app/ui/elements/menu.attachsource/template.html +++ /dev/null @@ -1,14 +0,0 @@ - - -

{{attach().error()}}

- - - - - - -
- diff --git a/application/client/src/app/ui/elements/module.ts b/application/client/src/app/ui/elements/module.ts deleted file mode 100644 index 98c01be2e0..0000000000 --- a/application/client/src/app/ui/elements/module.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { AutocompleteModule } from '@elements/autocomplete/module'; -import { ColorSelectorModule } from '@elements/color.selector/module'; -import { ContainersModule } from '@elements/containers/module'; -import { EditableModule } from '@elements/editable/module'; -import { FilterInputModule } from '@elements/filter/module'; -import { HiddenFilterModule } from '@elements/filter.hidden/module'; -import { FolderInputModule } from '@elements/folderinput/module'; -import { LocksHistoryModule } from '@elements/locks.history/module'; -import { AttachSourceMenuModule } from '@elements/menu.attachsource/module'; -import { NavigatorModule } from '@elements/navigator/module'; -import { PairsModule } from '@elements/pairs/module'; -import { RecentActionsModule } from '@elements/recent/module'; -import { ScrollAreaModule } from '@elements/scrollarea/module'; -import { TabsModule } from '@elements/tabs/module'; -import { TeamworkAppletModule } from '@elements/teamwork/module'; -import { TimezoneSelectorModule } from '@elements/timezones/module'; -import { ComTooltipComponent } from '@elements/tooltip/component'; -import { TreeModule } from '@elements/tree/module'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - ScrollAreaModule, - TabsModule, - RecentActionsModule, - TreeModule, - LocksHistoryModule, - AutocompleteModule, - FolderInputModule, - NavigatorModule, - TeamworkAppletModule, - TimezoneSelectorModule, - ColorSelectorModule, - EditableModule, - FilterInputModule, - HiddenFilterModule, - AttachSourceMenuModule, - PairsModule, - ], - declarations: [ComTooltipComponent], - exports: [ - ContainersModule, - ScrollAreaModule, - TabsModule, - RecentActionsModule, - TreeModule, - LocksHistoryModule, - AutocompleteModule, - FolderInputModule, - NavigatorModule, - TeamworkAppletModule, - TimezoneSelectorModule, - ColorSelectorModule, - EditableModule, - FilterInputModule, - HiddenFilterModule, - AttachSourceMenuModule, - PairsModule, - ComTooltipComponent, - ], - bootstrap: [ComTooltipComponent], -}) -export class ElementsModule {} diff --git a/application/client/src/app/ui/elements/navigator/component.ts b/application/client/src/app/ui/elements/navigator/component.ts deleted file mode 100644 index 8cc667853c..0000000000 --- a/application/client/src/app/ui/elements/navigator/component.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { - Component, - AfterViewInit, - AfterContentInit, - ChangeDetectionStrategy, - ChangeDetectorRef, - ViewEncapsulation, - Input, - OnDestroy, - ViewChild, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { Entity } from './providers/entity'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State, CloseHandler } from './state'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import { InputFilter } from '@elements/filter/component'; -import { Observe } from '@platform/types/observe'; - -@Component({ - selector: 'app-navigator', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Initial() -@Ilc() -export class Navigator - extends ChangesDetector - implements AfterViewInit, AfterContentInit, OnDestroy -{ - @ViewChild('filter') public filterInputRef!: InputFilter; - - @Input() close: CloseHandler | undefined; - @Input() public observe?: Observe; - - public state!: State; - - constructor(cdRef: ChangeDetectorRef, private readonly _sanitizer: DomSanitizer) { - super(cdRef); - } - - public ngOnDestroy(): void { - this.state.destroy(); - } - - public ngAfterContentInit(): void { - this.state = new State( - this, - (): HTMLInputElement | undefined => { - this.detectChanges(); - return this.filterInputRef !== undefined - ? this.filterInputRef.getInputElementRef() - : undefined; - }, - this.observe, - ); - this.close !== undefined && this.state.bind(this.close); - } - - public ngAfterViewInit(): void { - this.state.load(); - this.detectChanges(); - } - - public ngItemContextMenu(event: MouseEvent, entity: Entity) { - this.ilc().emitter.ui.contextmenu.open({ - items: this.state.getContextMenu(entity), - x: event.x, - y: event.y, - }); - } - - public ngAction(entity: Entity): void { - this.state.action(entity); - } - - public safeHtml(html: string): SafeHtml { - return this._sanitizer.bypassSecurityTrustHtml(html); - } -} -export interface Navigator extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/navigator/module.ts b/application/client/src/app/ui/elements/navigator/module.ts deleted file mode 100644 index 3b6bdd2edb..0000000000 --- a/application/client/src/app/ui/elements/navigator/module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ContainersModule } from '@elements/containers/module'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { FilterInputModule } from '@elements/filter/module'; - -import { Navigator } from './component'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - MatButtonModule, - MatIconModule, - FilterInputModule, - MatProgressBarModule, - ], - declarations: [Navigator], - exports: [Navigator], - bootstrap: [Navigator], -}) -export class NavigatorModule {} diff --git a/application/client/src/app/ui/elements/navigator/providers/entity.ts b/application/client/src/app/ui/elements/navigator/providers/entity.ts deleted file mode 100644 index 295be5ac32..0000000000 --- a/application/client/src/app/ui/elements/navigator/providers/entity.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { PassiveMatchee } from '@module/matcher'; -import { Action } from '@service/recent/action'; -import { unique } from '@platform/env/sequence'; - -import * as wasm from '@loader/wasm'; - -export { Action }; -export interface IFileDescription { - parent: string; - filename: string; - name: string; -} - -export type TEntity = Action | IFileDescription; - -export class Entity extends PassiveMatchee { - public readonly uuid: string = unique(); - - constructor( - public readonly origin: Action | IFileDescription, - public readonly index: number, - matcher: wasm.Matcher, - ) { - super(matcher); - } - - public override asObj(): object { - if (this.origin instanceof Action) { - return { - criteria: this.origin.description().major, - }; - } else { - return { - criteria: this.origin.name, - }; - } - } - - public description(): { - major: string; - minor: string; - } { - const major: string | undefined = this.getHtmlOf('html_criteria'); - if (this.origin instanceof Action) { - return major === undefined - ? this.origin.description() - : { - major, - minor: this.origin.description().minor, - }; - } else { - return { - major: major === undefined ? this.origin.name : major, - minor: this.origin.parent, - }; - } - } - - // public hash(): string { - // if (this.origin instanceof Action) { - // return `${this.origin.description().major}-${this.origin.description().minor}`; - // } else { - // return `${this.origin.name}-${this.origin.parent}`; - // } - // } -} diff --git a/application/client/src/app/ui/elements/navigator/providers/entries.ts b/application/client/src/app/ui/elements/navigator/providers/entries.ts deleted file mode 100644 index fa8474accf..0000000000 --- a/application/client/src/app/ui/elements/navigator/providers/entries.ts +++ /dev/null @@ -1,233 +0,0 @@ -import { Entity } from './entity'; -import { Filter } from '@elements/filter/filter'; -import { Subject } from '@platform/env/subscription'; -import { IlcInterface } from '@service/ilc'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { createPassiveMatcheeList } from '@module/matcher'; - -import * as wasm from '@loader/wasm'; - -const MAX_VISIBLE_ITEMS = 10; -const ELEMENT_HEIGHT = 28; - -export interface ICollection { - title: string; - entries: Entity[]; - index: number; -} - -export interface ICollectionInfo { - total: number; - index: number; -} - -export class Entries { - protected entries: Map = new Map(); - - public readonly filter: Filter; - public readonly updated: Subject = new Subject(); - public selected: string = ''; - - constructor( - protected readonly uuid: string, - protected readonly ilc: IlcInterface & ChangesDetector, - protected readonly matcher: wasm.Matcher, - ) { - this.filter = new Filter(ilc, { placeholder: 'Type to filter' }); - ilc.env().subscriber.register( - this.filter.subjects.get().change.subscribe((value: string) => { - this.filtering(value); - }), - ); - } - - protected filtering(value: string): void { - this.matcher.search(value, 'span'); - this.entries.forEach((entries) => { - entries.entries.sort((a: Entity, b: Entity) => b.getScore() - a.getScore()); - }); - this.defaultSelection(); - this.move().update(); - this.updated.emit(); - } - - protected sort(): void { - const sorted: Map = new Map(); - Array.from(this.entries.keys()) - .sort() - .forEach((index: number) => { - const collection = this.entries.get(index); - if (collection === undefined) { - return; - } - sorted.set(index, collection); - }); - this.entries = sorted; - } - - protected all(): Entity[] { - let filtered: Entity[] = []; - this.entries.forEach((collection: ICollection) => { - filtered = filtered.concat( - collection.entries - .filter((a: Entity) => a.getScore() > 0) - .slice(0, MAX_VISIBLE_ITEMS), - ); - }); - return filtered; - } - - public defaultSelection() { - this.selected = ''; - this.entries.forEach((entries) => { - if (this.selected !== '') { - return; - } - if (entries.entries.length > 0) { - this.selected = entries.entries[0].uuid; - } - }); - } - - public add(index: number, title: string, entries: Entity[]) { - this.entries.set(index, { - title, - index, - entries: createPassiveMatcheeList(entries, this.matcher), - }); - this.sort(); - this.updated.emit(); - } - - public remove(index: number): void { - this.entries.delete(index); - this.sort(); - this.updated.emit(); - } - - public len(): number { - return Array.from(this.entries.values()) - .map((collection) => collection.entries.length) - .reduce((partialSum, a) => partialSum + a, 0); - } - - public filtered(): ICollection[] { - return Array.from(this.entries.values()).map((collection: ICollection) => { - return { - index: collection.index, - title: collection.title, - entries: collection.entries - .filter((a: Entity) => a.getScore() > 0) - .slice(0, MAX_VISIBLE_ITEMS), - }; - }); - } - - public stat(): ICollectionInfo[] { - return Array.from(this.entries.values()).map((collection: ICollection) => { - return { - index: collection.index, - title: collection.title, - total: collection.entries.length, - }; - }); - } - - public hasEmptyCollection(): boolean { - return Array.from(this.entries.values()) - .map((en) => en.entries.length) - .includes(0); - } - - public getSelected(): Entity | undefined { - let entity: Entity | undefined; - this.entries.forEach((collection: ICollection) => { - if (entity !== undefined) { - return; - } - entity = collection.entries.find((a) => a.uuid === this.selected); - }); - return entity; - } - - public move(): { - up(): void; - down(): void; - update(): void; - scrollIntoView(index: number): void; - } { - const entries = this.all(); - return { - up: (): void => { - if (entries.length === 0) { - return; - } - if (this.selected === '') { - this.selected = entries[entries.length - 1].uuid; - return; - } - const index = entries.findIndex((a) => a.uuid === this.selected); - this.move().scrollIntoView( - (() => { - if (index === -1 || index === 0) { - this.selected = entries[entries.length - 1].uuid; - return entries.length - 1; - } else { - this.selected = entries[index - 1].uuid; - return index - 1; - } - })(), - ); - }, - down: (): void => { - if (entries.length === 0) { - return; - } - if (this.selected === '') { - this.selected = entries[0].uuid; - return; - } - const index = entries.findIndex((a) => a.uuid === this.selected); - this.move().scrollIntoView( - (() => { - if (index === -1 || index === entries.length - 1) { - this.selected = entries[0].uuid; - return 0; - } else { - this.selected = entries[index + 1].uuid; - return index + 1; - } - })(), - ); - }, - update: (): void => { - if (entries.length === 0) { - return; - } - if (this.selected === '') { - this.selected = entries[0].uuid; - return; - } - const index = entries.findIndex((a) => a.uuid === this.selected); - if (index === -1) { - this.selected = entries[0].uuid; - } - }, - scrollIntoView: (index: number): void => { - const container = document.querySelector(`div[id="${this.uuid}"]`); - if (container === undefined || container === null) { - return; - } - const size = container.getBoundingClientRect(); - const offset = index * ELEMENT_HEIGHT; - if ( - offset >= container.scrollTop && - offset + ELEMENT_HEIGHT <= size.height + container.scrollTop - ) { - return; - } - container.scrollTo(0, offset + ELEMENT_HEIGHT - size.height); - }, - }; - } -} diff --git a/application/client/src/app/ui/elements/navigator/providers/provider.files.ts b/application/client/src/app/ui/elements/navigator/providers/provider.files.ts deleted file mode 100644 index ec4270f98c..0000000000 --- a/application/client/src/app/ui/elements/navigator/providers/provider.files.ts +++ /dev/null @@ -1,331 +0,0 @@ -import { IFileDescription } from './entity'; -import { Provider as Base, INoContentActions, IStatistics } from './provider'; -import { favorites } from '@service/favorites'; -import { bridge } from '@service/bridge'; -import { getFileName } from '@platform/types/files'; -import { notifications, Notification } from '@ui/service/notifications'; -import { FolderEntityType } from '@platform/types/bindings'; - -import * as Factory from '@platform/types/observe/factory'; -import { IMenuItem } from '@ui/service/contextmenu'; - -const DEFAULT_DEEP = 5; -const DEFAULT_LEN = 20000; - -export class Provider extends Base { - protected count: number = 0; - protected roots: string[] = []; - - protected async scan(roots: string[], folders: string[]): Promise { - if (this.isAborted()) { - return Promise.resolve([]); - } - // User can add into favorites nested folder - we should preven duplicates in such cases - for (const path of roots) { - if (folders.indexOf(path) !== -1) { - return Promise.resolve([]); - } else { - folders.push(path); - } - } - let allScanning = ''; - for (const path of roots) { - if (allScanning.length > 0) { - allScanning = `${allScanning} - ${getFileName(path)}`; - } else { - allScanning = `${getFileName(path)}`; - } - } - const data = await bridge.files().ls({ - paths: roots, - depth: DEFAULT_DEEP, - max: DEFAULT_LEN, - include: { files: true, folders: false }, - }); - const items: IFileDescription[] = []; - data.entities.forEach((entity) => { - if (this.isAborted()) { - return; - } - if (entity.kind === FolderEntityType.File && entity.details) { - items.push({ - filename: entity.fullname, - name: entity.name, - parent: entity.details.path, - }); - } - }); - let files: IFileDescription[] = []; - files = files.concat(items); - if (data.max) { - notifications.notify( - new Notification({ - message: `Too many files in: ${allScanning}`, - actions: [], - }), - ); - } - this.roots = roots; - this.count = files.length; - return Promise.resolve(files); - } - - protected open(item: IFileDescription): { - dlt(): void; - pcapng(): void; - pcap(): void; - text(): void; - parserPlugin(): void; - auto(): void; - } { - return { - dlt: (): void => { - this.ilc - .ilc() - .services.system.session.initialize() - .configure( - new Factory.File() - .asDlt() - .type(Factory.FileType.Binary) - .file(item.filename) - .get(), - ) - .catch((err: Error) => { - this.ilc.log().error(`Fail to open text file; error: ${err.message}`); - }); - }, - pcapng: (): void => { - this.ilc - .ilc() - .services.system.session.initialize() - .configure( - new Factory.File() - .asDlt() - .type(Factory.FileType.PcapNG) - .file(item.filename) - .get(), - ) - .catch((err: Error) => { - this.ilc.log().error(`Fail to open text file; error: ${err.message}`); - }); - }, - pcap: (): void => { - this.ilc - .ilc() - .services.system.session.initialize() - .configure( - new Factory.File() - .asDlt() - .type(Factory.FileType.PcapLegacy) - .file(item.filename) - .get(), - ) - .catch((err: Error) => { - this.ilc.log().error(`Fail to open text file; error: ${err.message}`); - }); - }, - text: (): void => { - this.ilc - .ilc() - .services.system.session.initialize() - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(item.filename) - .get(), - ) - .catch((err: Error) => { - this.ilc.log().error(`Fail to open text file; error: ${err.message}`); - }); - }, - parserPlugin: (): void => { - this.ilc - .ilc() - .services.system.session.initialize() - .observe( - new Factory.File() - .asParserPlugin() - .type(Factory.FileType.ParserPlugin) - .file(item.filename) - .get(), - ) - .catch((err: Error) => { - this.ilc - .log() - .error(`Fail to open file with parsr plugins; error: ${err.message}`); - }); - }, - auto: (): void => { - bridge - .files() - .getByPath([item.filename]) - .then((files) => { - if (files.length > 1) { - this.ilc.log().info('More than one file detected'); - return; - } - const filetype = files[0].type; - if (filetype === Factory.FileType.Text) { - this.ilc - .ilc() - .services.system.session.initialize() - .observe( - new Factory.File() - .asText() - .type(filetype) - .file(item.filename) - .get(), - ) - .catch((err: Error) => { - this.ilc - .log() - .error(`Fail to open text file; error: ${err.message}`); - }); - } else { - this.ilc - .ilc() - .services.system.session.initialize() - .configure( - new Factory.File() - .type(filetype) - .file(item.filename) - .guessParser() - .get(), - ) - .catch((err: Error) => { - this.ilc - .log() - .error(`Fail to open text file; error: ${err.message}`); - }); - } - }) - .catch((error) => { - this.ilc.log().error(error); - }); - }, - }; - } - - protected asFileDescription(entity: unknown): IFileDescription | undefined { - if (typeof entity !== 'object' || entity === undefined || entity === null) { - return; - } - let valid = true; - ['parent', 'filename', 'name'].forEach((prop) => { - if (!valid) { - return; - } - if (typeof (entity as { [key: string]: string })[prop] !== 'string') { - valid = false; - } - }); - if (!valid) { - return; - } - return entity as IFileDescription; - } - - protected addRoot(): void { - favorites - .places() - .selectAndAdd() - .then(() => { - // this.state - // .load() - // .catch((err: Error) => { - // this.ilc.log().error(`Fail to reload state favorites: ${err.message}`); - // }) - // .finally(() => { - // this.ilc.detectChanges(); - // }); - }) - .catch((err: Error) => { - this.ilc.log().error(`Fail to add favorites: ${err.message}`); - }); - } - - public async load(): Promise { - const data = await favorites.places().get(); - return this.scan( - data.filter((f) => f.exists).map((f) => f.path), - [], - ); - } - - public action(entity: unknown): void { - const desc = this.asFileDescription(entity); - if (desc === undefined) { - return; - } - this.open(desc).auto(); - } - - public stat(): IStatistics { - return { - title: `Found ${this.count} file(s) in:`, - total: this.count, - info: this.roots, - }; - } - - public getContextMenu(entity: unknown, close?: () => void): IMenuItem[] { - const desc = this.asFileDescription(entity); - if (desc === undefined) { - return []; - } - return [ - { - caption: 'Open as text', - handler: () => { - this.open(desc).text(); - close !== undefined && close(); - }, - }, - { - caption: 'Open as DLT', - handler: () => { - this.open(desc).dlt(); - close !== undefined && close(); - }, - }, - { - caption: 'Open as PcapNG', - handler: () => { - this.open(desc).pcapng(); - close !== undefined && close(); - }, - }, - { - caption: 'Open as Pcap', - handler: () => { - this.open(desc).pcap(); - close !== undefined && close(); - }, - }, - { - caption: 'Open with parser Plugins', - handler: () => { - this.open(desc).parserPlugin(); - close !== undefined && close(); - }, - }, - ]; - } - - public title(): string { - return `File(s)`; - } - - public getNoContentActions(): INoContentActions { - return { - title: `You didn't add any locations into favorites yet. You always can add/remove favorite places on the home screen.`, - buttons: [ - { - caption: `Add Folder(s) to Favorites`, - handler: this.addRoot.bind(this), - }, - ], - }; - } -} diff --git a/application/client/src/app/ui/elements/navigator/providers/provider.recent.ts b/application/client/src/app/ui/elements/navigator/providers/provider.recent.ts deleted file mode 100644 index e9975e7fee..0000000000 --- a/application/client/src/app/ui/elements/navigator/providers/provider.recent.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Provider as Base, INoContentActions, IStatistics } from './provider'; -import { Action } from '@service/recent/action'; -import { recent } from '@service/recent'; -import { IMenuItem } from '@ui/service/contextmenu'; - -export class Provider extends Base { - protected count: number = 0; - - protected storage(): { - remove(uuids: string[]): void; - removeAll(): void; - } { - return { - remove: (uuids: string[]): void => { - recent - .delete(uuids) - .then(() => { - this.reload.emit(); - }) - .catch((err: Error) => { - this.ilc.log().error(`Fail to remove recent action: ${err.message}`); - }); - }, - removeAll: (): void => { - recent - .get() - .then((actions: Action[]) => { - this.storage().remove(actions.map((action: Action) => action.uuid)); - this.reload.emit(); - }) - .catch((err: Error) => { - this.ilc.log().error(`Fail to remove all recent actions: ${err.message}`); - }); - }, - }; - } - public load(): Promise { - return recent.get().then((actions: Action[]) => { - actions = actions.filter((action) => action.isSuitable(this.observe)); - actions.sort((a: Action, b: Action) => { - return b.stat.score().recent() >= a.stat.score().recent() ? 1 : -1; - }); - this.count = actions.length; - return actions; - }); - } - - public action(action: unknown): void { - if (!(action instanceof Action)) { - return; - } - action.apply().catch((err: Error) => { - this.ilc.log().error(`Fail to apply action: ${err.message}`); - }); - } - - public stat(): IStatistics { - return { - title: `Available ${this.count} recent actions`, - total: this.count, - info: [], - }; - } - - public getContextMenu(entity: unknown, _close?: () => void): IMenuItem[] { - if (!(entity instanceof Action)) { - return []; - } - return [ - ...entity.getActions(), - {}, - { - caption: 'Remove recent', - handler: () => { - this.storage().remove([entity.uuid]); - }, - }, - { - caption: 'Clear All', - handler: () => { - this.storage().removeAll(); - }, - }, - ]; - } - - public title(): string { - return `Recent action(s)`; - } - - public getNoContentActions(): INoContentActions { - return { - title: `As soon as some file/source will be opened, recent actions will be shown here`, - buttons: [], - }; - } -} diff --git a/application/client/src/app/ui/elements/navigator/providers/provider.ts b/application/client/src/app/ui/elements/navigator/providers/provider.ts deleted file mode 100644 index 04d6d8df48..0000000000 --- a/application/client/src/app/ui/elements/navigator/providers/provider.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { IlcInterface } from '@service/ilc'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { Subject } from '@platform/env/subscription'; -import { Observe } from '@platform/types/observe'; - -export interface IStatistics { - title: string; - total: number; - info: string[]; -} - -export interface INoContentActions { - title: string; - buttons: { caption: string; handler: () => void }[]; -} - -export abstract class Provider { - private readonly _abort: AbortController = new AbortController(); - - public reload: Subject = new Subject(); - - constructor( - public readonly ilc: IlcInterface & ChangesDetector, - public readonly index: number, - protected readonly observe: Observe | undefined, - ) {} - - public abstract load(): Promise; - public abstract action(entity: T): void; - public abstract stat(): IStatistics; - public abstract getContextMenu(entity: T, close?: () => void): IMenuItem[]; - public abstract title(): string; - public abstract getNoContentActions(): INoContentActions; - - public destroy(): void { - this._abort.abort(); - } - - public isAborted(): boolean { - return this._abort.signal.aborted; - } -} diff --git a/application/client/src/app/ui/elements/navigator/providers/providers.ts b/application/client/src/app/ui/elements/navigator/providers/providers.ts deleted file mode 100644 index aff7330f75..0000000000 --- a/application/client/src/app/ui/elements/navigator/providers/providers.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Entity, TEntity } from './entity'; -import { Entries } from './entries'; -import { INoContentActions, IStatistics, Provider } from './provider'; -import { Provider as ProviderFiles } from './provider.files'; -import { Provider as ProviderRecent } from './provider.recent'; -import { IlcInterface } from '@service/ilc'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Observe } from '@platform/types/observe'; - -import * as wasm from '@loader/wasm'; - -import { IMenuItem } from '@ui/service/contextmenu'; - -const PROVIDERS = [ProviderRecent, ProviderFiles]; - -export class Providers { - protected readonly providers: Provider[] = []; - - constructor( - protected readonly ilc: IlcInterface & ChangesDetector, - protected readonly matcher: wasm.Matcher, - protected readonly entries: Entries, - observe: Observe | undefined, - ) { - this.providers = PROVIDERS.map((Ref, i) => new Ref(ilc, i, observe)); - this.providers.forEach((provider: Provider, i: number) => { - ilc.env().subscriber.register( - provider.reload.subscribe(() => { - this.entries.remove(i); - provider - .load() - .then((entities) => { - this.entries.add( - i, - provider.title(), - entities.map((en) => new Entity(en, i, this.matcher)), - ); - }) - .catch((err: Error) => { - this.ilc - .log() - .error( - `Fail to reload navigation provider data with: ${err.message}`, - ); - }); - }), - ); - }); - } - - public destroy() { - this.providers.forEach((p) => p.destroy()); - } - - public load(): Promise { - return Promise.allSettled(this.providers.map((p) => p.load())).then( - (results: PromiseSettledResult[]) => { - results.forEach((result, i) => { - if (result.status === 'rejected') { - this.ilc - .log() - .error(`Fail to get navigation provider data with: ${result.reason}`); - return; - } - this.entries.add( - i, - this.providers[i].title(), - result.value.map((en) => new Entity(en, i, this.matcher)), - ); - }); - }, - ); - } - - public action(entity: TEntity): void { - this.providers.forEach((p) => p.action(entity)); - } - - public stat(): IStatistics[] { - return this.providers.map((p) => p.stat()); - } - - public getContextMenu(entity: TEntity, close?: () => void): IMenuItem[] { - return this.providers.map((p) => p.getContextMenu(entity, close)).flat(); - } - - public getNoContentActions(index: number): INoContentActions { - if (this.providers[index] === undefined) { - throw new Error(`Fail to find provider with index ${index}.`); - } - return this.providers[index].getNoContentActions(); - } -} diff --git a/application/client/src/app/ui/elements/navigator/state.ts b/application/client/src/app/ui/elements/navigator/state.ts deleted file mode 100644 index bab422b4fd..0000000000 --- a/application/client/src/app/ui/elements/navigator/state.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { Entity } from './providers/entity'; -import { Entries, ICollection } from './providers/entries'; -import { Providers } from './providers/providers'; -import { IlcInterface } from '@service/ilc'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Holder } from '@module/matcher/holder'; -import { unique } from '@platform/env/sequence'; -import { INoContentActions, IStatistics } from './providers/provider'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { Observe } from '@platform/types/observe'; -import { stop } from '@ui/env/dom'; - -const MOVE_SELECTION_DELAY = 150; - -export type CloseHandler = () => void; - -export class State extends Holder { - public readonly uuid: string = unique(); - public entries: Entries; - public empty: boolean = true; - public filtered: ICollection[] = []; - - public statistics: IStatistics[] = []; - public loading: boolean = true; - - protected close: CloseHandler | undefined; - protected readonly movement: { - timer: number; - } = { - timer: -1, - }; - protected readonly providers: Providers; - - protected move(event: KeyboardEvent): boolean { - clearTimeout(this.movement.timer); - if (event.key === 'ArrowDown') { - this.entries.move().down(); - } else if (event.key === 'ArrowUp') { - this.entries.move().up(); - } else { - return false; - } - this.ilc.detectChanges(); - this.movement.timer = setTimeout(() => { - this.move(event); - }, MOVE_SELECTION_DELAY) as unknown as number; - return true; - } - constructor( - protected readonly ilc: IlcInterface & ChangesDetector, - protected readonly filterRefGetter: () => HTMLInputElement | undefined, - protected readonly observe: Observe | undefined, - ) { - super(); - this.ilc = ilc; - this.entries = new Entries(this.uuid, ilc, this.matcher); - this.providers = new Providers(ilc, this.matcher, this.entries, this.observe); - ilc.env().subscriber.register( - ilc - .ilc() - .services.ui.listener.listen( - 'keydown', - window, - (event: KeyboardEvent) => { - if (this.move(event) || event.key !== 'Enter') { - return true; - } - const target = this.entries.getSelected(); - if (target === undefined) { - return true; - } - stop(event); - this.action(target); - return true; - }, - ), - ilc - .ilc() - .services.ui.listener.listen( - 'keyup', - window, - (_event: KeyboardEvent) => { - clearTimeout(this.movement.timer); - return true; - }, - ), - this.entries.updated.subscribe(() => { - this.filtered = this.entries.filtered(); - this.ilc.detectChanges(); - }), - ); - } - - public destroy() { - this.providers.destroy(); - } - - public load(): void { - this.loading = true; - this.providers - .load() - .then(() => { - this.entries.defaultSelection(); - this.loading = false; - this.statistics = this.providers.stat(); - this.empty = this.entries.len() === 0; - this.entries.filter.bind(this.filterRefGetter()).focus(); - this.ilc.markChangesForCheck(); - }) - .catch((err: Error) => { - this.ilc.log().error(`Fail to load navigation entries with: ${err.message}`); - }); - } - - public bind(close: CloseHandler) { - this.close = close; - } - - public count(): number { - return this.entries.len(); - } - - public action(entity: Entity): void { - this.providers.action(entity.origin); - this.close !== undefined && this.close(); - } - - public getContextMenu(entity: Entity): IMenuItem[] { - return this.providers.getContextMenu(entity.origin, this.close); - } - - public getNoContentActions(index: number): INoContentActions { - return this.providers.getNoContentActions(index); - } -} diff --git a/application/client/src/app/ui/elements/navigator/styles.less b/application/client/src/app/ui/elements/navigator/styles.less deleted file mode 100644 index 2337b087a0..0000000000 --- a/application/client/src/app/ui/elements/navigator/styles.less +++ /dev/null @@ -1,141 +0,0 @@ -@import '../../styles/variables.less'; - - -app-navigator { - position: relative; - display: block; - width: 100%; - overflow: hidden; - & div.no-content-actions { - position: relative; - display: block; - width: 100%; - overflow: hidden; - & div.collection-actions{ - border-top: thin solid var(--scheme-color-4); - & p.warning { - padding: 6px 12px; - color: var(--scheme-color-0); - overflow: hidden; - } - } - } - & div.collection-title { - position: sticky; - top:0; - z-index: 1; - height: 0; - width: 100%; - & span.title { - position: absolute; - right: 12px; - font-size: 11px; - background: var(--scheme-color-4); - color: var(--scheme-color-0); - z-index: 1; - padding: 3px 6px; - min-width: 78px; - } - & span.divider { - position: absolute; - left:12px; - right: 12px; - height: 1px; - border-top: thin solid var(--scheme-color-4); - z-index: 1; - } - - } - & div.controlls { - padding-bottom: 12px; - text-align: center; - & button { - color: var(--scheme-color-0); - } - } - & p.info { - padding: 3px 12px; - color: var(--scheme-color-1); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - & p.sub-info { - padding: 3px 12px 3px 24px; - color: var(--scheme-color-2); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - & div.filter { - height: 41px; - width: 100%; - background: var(--scheme-color-5); - overflow: hidden; - } - & div.actions { - position: relative; - width: auto; - overflow-y: auto; - overflow-x: hidden; - max-height: 450px; - } - & div.action { - position: relative; - padding: 6px 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - &:hover { - background: var(--scheme-color-hover); - &::before { - background: var(--scheme-color-hover); - } - } - &.selected, - &.selected:hover { - background: var(--scheme-color-accent-50); - &::before { - background: var(--scheme-color-accent-50); - } - } - &::before { - position: absolute; - display: block; - width: ~"calc(100% + 30px)"; - content: ''; - top:0; - left: -15px; - height: 100%; - } - & p.description { - position: relative; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - color: var(--scheme-color-0); - padding: 0 12px; - & span.major { - margin-right: 12px; - } - & span.major, - & span.minor { - & > span { - background-color: var(--scheme-color-3); - } - } - } - } - & div.stat { - padding-bottom: 12px; - border-top: thin solid var(--scheme-color-4); - } - & div.progress { - & p { - color: var(--scheme-color-1); - display: block; - text-align: center; - } - padding: 12px 12px; - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/navigator/template.html b/application/client/src/app/ui/elements/navigator/template.html deleted file mode 100644 index 840eb1437c..0000000000 --- a/application/client/src/app/ui/elements/navigator/template.html +++ /dev/null @@ -1,43 +0,0 @@ -
- -
- -
- {{collection.title}} - -
-
-

- - -

-
-
-
-
-
- -

{{statistics.title}}

-

{{info}}

-
-
-
-
-
-

Loading...

- -
-
- -
-

{{state.getNoContentActions(collection.index).title}}

-
- -
-
-
-
- diff --git a/application/client/src/app/ui/elements/pairs/component.ts b/application/client/src/app/ui/elements/pairs/component.ts deleted file mode 100644 index 281d842bba..0000000000 --- a/application/client/src/app/ui/elements/pairs/component.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - ViewEncapsulation, - AfterContentInit, - AfterViewInit, - ViewChild, -} from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Pair } from './pair'; -import { State } from './state'; -import { Initial } from '@env/decorators/initial'; -import { MatTableDataSource, MatTable } from '@angular/material/table'; -import { HiddenFilter } from '@elements/filter.hidden/module'; - -@Component({ - selector: 'app-elements-pairs', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Initial() -@Ilc() -export class ElementsPairs extends ChangesDetector implements AfterContentInit, AfterViewInit { - @Input() public map!: Map; - @Input() public close!: () => void; - @ViewChild(MatTable) table!: MatTable; - @ViewChild('filter') filter!: HiddenFilter; - - public data!: MatTableDataSource; - public columns: string[] = ['name', 'value']; - public state!: State; - - constructor(cdRef: ChangeDetectorRef, private _sanitizer: DomSanitizer) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.state = new State(this.map); - this.data = new MatTableDataSource(this.state.pairs); - } - - public ngAfterViewInit(): void { - this.env().subscriber.register( - this.filter.filter.subjects.get().change.subscribe((value: string) => { - this.update(value); - }), - ); - this.env().subscriber.register( - this.filter.filter.subjects.get().drop.subscribe(() => { - this.update(''); - }), - ); - } - - public safeHtml(html: string): SafeHtml { - return this._sanitizer.bypassSecurityTrustHtml(html); - } - - public pairs(): Pair[] { - return this.state.pairs.filter((t) => !t.hidden()); - } - - protected update(filter: string) { - this.state.filter(filter); - this.data.data = this.state.visible(); - this.table.renderRows(); - this.detectChanges(); - } -} -export interface ElementsPairs extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/pairs/module.ts b/application/client/src/app/ui/elements/pairs/module.ts deleted file mode 100644 index 12087db75a..0000000000 --- a/application/client/src/app/ui/elements/pairs/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ElementsPairs } from './component'; -import { MatTableModule } from '@angular/material/table'; -import { HiddenFilterModule } from '@elements/filter.hidden/module'; - -@NgModule({ - imports: [CommonModule, MatTableModule, HiddenFilterModule], - declarations: [ElementsPairs], - exports: [ElementsPairs], - bootstrap: [ElementsPairs] -}) -export class PairsModule {} diff --git a/application/client/src/app/ui/elements/pairs/pair.ts b/application/client/src/app/ui/elements/pairs/pair.ts deleted file mode 100644 index 6298a8212f..0000000000 --- a/application/client/src/app/ui/elements/pairs/pair.ts +++ /dev/null @@ -1,33 +0,0 @@ -import * as wasm from '@loader/wasm'; - -import { Matchee } from '@module/matcher'; - -export class Pair extends Matchee { - public readonly name: string; - public readonly value: string; - - static matcher: wasm.Matcher; - - constructor(name: string, value: string, matcher: wasm.Matcher) { - super(matcher, { name: name, value: value }); - Pair.matcher = matcher; - this.name = name; - this.value = value; - } - - public hidden(): boolean { - return this.getScore() === 0; - } - - public get html(): { - name: string; - value: string; - } { - const name: string | undefined = this.getHtmlOf('html_name'); - const value: string | undefined = this.getHtmlOf('html_value'); - return { - name: name === undefined ? this.name : name, - value: value === undefined ? this.value : value, - }; - } -} diff --git a/application/client/src/app/ui/elements/pairs/state.ts b/application/client/src/app/ui/elements/pairs/state.ts deleted file mode 100644 index 9ab910cc0f..0000000000 --- a/application/client/src/app/ui/elements/pairs/state.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Pair } from './pair'; -import { Holder } from '@module/matcher'; - -export class State extends Holder { - public pairs: Pair[] = []; - - constructor(pairs: Map) { - super(); - pairs.forEach((value, key) => { - this.pairs.push(new Pair(key, value, this.matcher)); - }); - } - - public visible(): Pair[] { - return this.pairs.filter((t) => !t.hidden()); - } - - public filter(value: string): void { - this.matcher.search(value); - this.pairs = this.pairs.sort((a, b) => b.getScore() - a.getScore()); - } -} diff --git a/application/client/src/app/ui/elements/pairs/styles.less b/application/client/src/app/ui/elements/pairs/styles.less deleted file mode 100644 index a00ced7e78..0000000000 --- a/application/client/src/app/ui/elements/pairs/styles.less +++ /dev/null @@ -1,50 +0,0 @@ -@import '../../../ui/styles/variables.less'; - - -app-elements-pairs { - position: relative; - display: block; - width: 100%; - height: 100%; - overflow-x: hidden; - overflow-y: auto; - & table { - width: 100%; - max-width: 100%; - } - tr[mat-row] { - height: auto!important; - td[mat-cell] { - padding: 8px 16px; - } - } - & div.filter { - position: sticky; - z-index: 1000; - padding: 6px 12px; - background: var(--scheme-color-warning-light); - top: 6px; - right: 6px; - box-shadow: 3px 3px 3px rgb(0 0 0 / 40%); - border-radius: 3px; - } - & span.name { - white-space: nowrap; - max-width: 300px; - overflow: hidden; - display: inline-block; - text-overflow: ellipsis; - font-weight: 300; - } - & span.value { - white-space: normal; - } - & span.name, - & span.value{ - word-break: break-all; - & > span { - background-color: var(--scheme-color-3); - color: var(--scheme-color-1); - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/pairs/template.html b/application/client/src/app/ui/elements/pairs/template.html deleted file mode 100644 index bacec8b7ac..0000000000 --- a/application/client/src/app/ui/elements/pairs/template.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - -
- Name - - Value -
diff --git a/application/client/src/app/ui/elements/recent/action.ts b/application/client/src/app/ui/elements/recent/action.ts deleted file mode 100644 index 96955ee90f..0000000000 --- a/application/client/src/app/ui/elements/recent/action.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Matchee } from '@module/matcher'; -import { Action } from '@service/recent/action'; - -import * as wasm from '@loader/wasm'; - -export class WrappedAction extends Matchee { - public readonly action: Action; - - constructor(action: Action, matcher: wasm.Matcher) { - super(matcher, { - major: action.description().major, - minor: action.description().minor, - }); - this.action = action; - } - - public description(): { - major: string; - minor: string; - } { - const major: string | undefined = this.getHtmlOf('html_major'); - const minor: string | undefined = this.getHtmlOf('html_minor'); - return { - major: major === undefined ? this.action.description().major : major, - minor: minor === undefined ? this.action.description().minor : minor, - }; - } - - public hash(): string { - return `${this.action.description().major}-${this.action.description().minor}`; - } -} diff --git a/application/client/src/app/ui/elements/recent/component.ts b/application/client/src/app/ui/elements/recent/component.ts deleted file mode 100644 index f795b9c8d8..0000000000 --- a/application/client/src/app/ui/elements/recent/component.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { - Component, - AfterContentInit, - ChangeDetectionStrategy, - ChangeDetectorRef, - ViewEncapsulation, - ViewChild, - AfterViewInit, - Input, - Output, - EventEmitter, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { Action } from '@service/recent/action'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from './state'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import { HiddenFilter } from '@elements/filter.hidden/component'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-recent-actions', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Initial() -@Ilc() -export class RecentActions extends ChangesDetector implements AfterContentInit, AfterViewInit { - @Input() public observe?: $.Observe; - - @Output() public applied: EventEmitter = new EventEmitter(); - - @ViewChild('filter') filter!: HiddenFilter; - - public state!: State; - - constructor(cdRef: ChangeDetectorRef, private _sanitizer: DomSanitizer) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.markChangesForCheck(); - this.state = new State(this, this.observe); - this.env().subscriber.register( - this.state.update.subscribe(() => { - this.detectChanges(); - }), - ); - if (this.observe !== undefined) { - this.env().subscriber.register( - this.observe.subscribe(() => { - this.state.reload(); - this.detectChanges(); - }), - ); - } - } - - public ngAfterViewInit(): void { - this.env().subscriber.register( - this.filter.filter.subjects.get().change.subscribe((value: string) => { - this.state.filtering(value); - }), - ); - this.env().subscriber.register( - this.filter.filter.subjects.get().drop.subscribe(() => { - this.state.filtering(''); - }), - ); - } - - public onDefaultAction(action: Action) { - action.apply().catch((err: Error) => { - this.log().error(`Fail to apply action: ${err.message}`); - }); - } - - public onAllActions(event: MouseEvent, action: Action) { - const items = [ - ...action.getActions(), - {}, - { - caption: 'Remove recent', - handler: () => { - this.state.remove([action.uuid]); - }, - }, - { - caption: 'Clear All', - handler: () => { - this.state.removeAll(); - }, - }, - ]; - this.ilc().emitter.ui.contextmenu.open({ - items, - x: event.x, - y: event.y, - }); - } - - public safeHtml(html: string): SafeHtml { - return this._sanitizer.bypassSecurityTrustHtml(html); - } -} -export interface RecentActions extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/recent/icon/component.ts b/application/client/src/app/ui/elements/recent/icon/component.ts deleted file mode 100644 index 39d0020c38..0000000000 --- a/application/client/src/app/ui/elements/recent/icon/component.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-recent-nature-icon', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class RecentIcon { - @Input() public observe!: $.Observe; - - public nature(): { - File(): $.Origin.File.Configuration | undefined; - Concat(): $.Origin.Concat.Configuration | undefined; - Process(): $.Origin.Stream.Stream.Process.Configuration | undefined; - Serial(): $.Origin.Stream.Stream.Serial.Configuration | undefined; - TCP(): $.Origin.Stream.Stream.TCP.Configuration | undefined; - UDP(): $.Origin.Stream.Stream.UDP.Configuration | undefined; - } { - const nature = this.observe.origin.nature(); - return { - File: (): $.Origin.File.Configuration | undefined => { - return nature instanceof $.Origin.File.Configuration ? nature : undefined; - }, - Concat: (): $.Origin.Concat.Configuration | undefined => { - return nature instanceof $.Origin.Concat.Configuration ? nature : undefined; - }, - Process: (): $.Origin.Stream.Stream.Process.Configuration | undefined => { - return nature instanceof $.Origin.Stream.Stream.Process.Configuration - ? nature - : undefined; - }, - Serial: (): $.Origin.Stream.Stream.Serial.Configuration | undefined => { - return nature instanceof $.Origin.Stream.Stream.Serial.Configuration - ? nature - : undefined; - }, - TCP: (): $.Origin.Stream.Stream.TCP.Configuration | undefined => { - return nature instanceof $.Origin.Stream.Stream.TCP.Configuration - ? nature - : undefined; - }, - UDP: (): $.Origin.Stream.Stream.UDP.Configuration | undefined => { - return nature instanceof $.Origin.Stream.Stream.UDP.Configuration - ? nature - : undefined; - }, - }; - } - - public parser(): { - Dlt(): $.Parser.Dlt.Configuration | undefined; - SomeIp(): $.Parser.SomeIp.Configuration | undefined; - Text(): $.Parser.Text.Configuration | undefined; - } { - return { - Dlt: (): $.Parser.Dlt.Configuration | undefined => { - return this.observe.parser.as<$.Parser.Dlt.Configuration>( - $.Parser.Dlt.Configuration, - ); - }, - SomeIp: (): $.Parser.SomeIp.Configuration | undefined => { - return this.observe.parser.as<$.Parser.SomeIp.Configuration>( - $.Parser.SomeIp.Configuration, - ); - }, - Text: (): $.Parser.Text.Configuration | undefined => { - return this.observe.parser.as<$.Parser.Text.Configuration>( - $.Parser.Text.Configuration, - ); - }, - }; - } -} -export interface RecentIcon extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/recent/icon/styles.less b/application/client/src/app/ui/elements/recent/icon/styles.less deleted file mode 100644 index 8c753a0fde..0000000000 --- a/application/client/src/app/ui/elements/recent/icon/styles.less +++ /dev/null @@ -1,26 +0,0 @@ -@import '../../../styles/variables.less'; - - -:host { - position: relative; - display: flex; - flex-direction: column; - width: 42px; - overflow: hidden; - align-items: center; - justify-content: center; - & span { - color: var(--scheme-color-2); - font-weight: 500; - padding-right: 12px; - font-size: 12px; - } - & mat-icon { - font-size: 16px; - height: 16px; - width: 16px; - margin: 0; - color: var(--scheme-color-2); - padding: 0 12px 0 0; - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/icon/template.html b/application/client/src/app/ui/elements/recent/icon/template.html deleted file mode 100644 index 9bccc55960..0000000000 --- a/application/client/src/app/ui/elements/recent/icon/template.html +++ /dev/null @@ -1,8 +0,0 @@ - insert_drive_file -folder_open -code -usb -compare_arrows -compare_arrows -DLT -SomeIp \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/module.ts b/application/client/src/app/ui/elements/recent/module.ts deleted file mode 100644 index 755288703a..0000000000 --- a/application/client/src/app/ui/elements/recent/module.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ContainersModule } from '@elements/containers/module'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { HiddenFilterModule } from '@elements/filter.hidden/module'; - -import { RecentActions } from './component'; -import { RecentIcon } from './icon/component'; -import { RecentNatureModule } from './nature/module'; -import { RecentParserModule } from './parser/module'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - MatButtonModule, - MatIconModule, - MatMenuModule, - HiddenFilterModule, - RecentNatureModule, - RecentParserModule, - ], - declarations: [RecentActions, RecentIcon], - exports: [RecentActions], -}) -export class RecentActionsModule {} diff --git a/application/client/src/app/ui/elements/recent/nature/component.ts b/application/client/src/app/ui/elements/recent/nature/component.ts deleted file mode 100644 index fd15eb92d9..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/component.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, AfterContentInit, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-recent-nature', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class RecentNature implements AfterContentInit { - @Input() public observe!: $.Observe; - - public ngAfterContentInit(): void { - // - } - - public as(): { - File(): $.Origin.File.Configuration | undefined; - Concat(): $.Origin.Concat.Configuration | undefined; - Process(): $.Origin.Stream.Stream.Process.Configuration | undefined; - Serial(): $.Origin.Stream.Stream.Serial.Configuration | undefined; - TCP(): $.Origin.Stream.Stream.TCP.Configuration | undefined; - UDP(): $.Origin.Stream.Stream.UDP.Configuration | undefined; - } { - const nature = this.observe.origin.nature(); - return { - File: (): $.Origin.File.Configuration | undefined => { - return nature instanceof $.Origin.File.Configuration ? nature : undefined; - }, - Concat: (): $.Origin.Concat.Configuration | undefined => { - return nature instanceof $.Origin.Concat.Configuration ? nature : undefined; - }, - Process: (): $.Origin.Stream.Stream.Process.Configuration | undefined => { - return nature instanceof $.Origin.Stream.Stream.Process.Configuration - ? nature - : undefined; - }, - Serial: (): $.Origin.Stream.Stream.Serial.Configuration | undefined => { - return nature instanceof $.Origin.Stream.Stream.Serial.Configuration - ? nature - : undefined; - }, - TCP: (): $.Origin.Stream.Stream.TCP.Configuration | undefined => { - return nature instanceof $.Origin.Stream.Stream.TCP.Configuration - ? nature - : undefined; - }, - UDP: (): $.Origin.Stream.Stream.UDP.Configuration | undefined => { - return nature instanceof $.Origin.Stream.Stream.UDP.Configuration - ? nature - : undefined; - }, - }; - } -} -export interface RecentNature extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/recent/nature/concat/component.ts b/application/client/src/app/ui/elements/recent/nature/concat/component.ts deleted file mode 100644 index 67b777a08a..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/concat/component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Component, AfterContentInit, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -// import { bytesToStr, timestampToUTC } from '@env/str'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-recent-nature-concat', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class RecentNatureConcat implements AfterContentInit { - @Input() public origin!: $.Origin.Concat.Configuration; - - public name!: string; - public path!: string; - public size!: string; - public created!: string; - - public ngAfterContentInit(): void { - // this.name = base.name; - // this.path = base.path; - // this.size = bytesToStr(base.size); - // this.created = timestampToUTC(base.created); - } -} -export interface RecentNatureConcat extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/recent/nature/concat/styles.less b/application/client/src/app/ui/elements/recent/nature/concat/styles.less deleted file mode 100644 index 190cad77be..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/concat/styles.less +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - overflow: hidden; - white-space: nowrap; - font-size: 13px; - color: var(--scheme-color-3); - & > span { - color: var(--scheme-color-2); - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/nature/concat/template.html b/application/client/src/app/ui/elements/recent/nature/concat/template.html deleted file mode 100644 index e1c1dd52a0..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/concat/template.html +++ /dev/null @@ -1 +0,0 @@ -Concating {{origin.files().length}} files \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/nature/file/component.ts b/application/client/src/app/ui/elements/recent/nature/file/component.ts deleted file mode 100644 index ded62a63b0..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/file/component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component, AfterContentInit, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { getFileName, getParentFolder } from '@platform/types/files'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-recent-nature-file', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class RecentNatureFile implements AfterContentInit { - @Input() public origin!: $.Origin.File.Configuration; - - public name!: string; - public path!: string; - - public ngAfterContentInit(): void { - this.name = getFileName(this.origin.filename()); - this.path = getParentFolder(this.origin.filename()); - } -} -export interface RecentNatureFile extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/recent/nature/file/styles.less b/application/client/src/app/ui/elements/recent/nature/file/styles.less deleted file mode 100644 index 312349ebd9..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/file/styles.less +++ /dev/null @@ -1,19 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - overflow: hidden; - white-space: nowrap; - font-size: 13px; - & > p { - padding: 0; - margin: 0; - color: var(--scheme-color-3); - & > span { - color: var(--scheme-color-2); - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/nature/file/template.html b/application/client/src/app/ui/elements/recent/nature/file/template.html deleted file mode 100644 index da8cef9bc8..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/file/template.html +++ /dev/null @@ -1,2 +0,0 @@ -

{{name}}

-

{{path}}

\ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/nature/module.ts b/application/client/src/app/ui/elements/recent/nature/module.ts deleted file mode 100644 index 2b5c9d15db..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/module.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { RecentNature } from './component'; -import { RecentNatureConcat } from './concat/component'; -import { RecentNatureFile } from './file/component'; -import { RecentNatureUdp } from './udp/component'; -import { RecentNatureTcp } from './tcp/component'; -import { RecentNatureSerial } from './serial/component'; -import { RecentNatureProcess } from './process/component'; - -@NgModule({ - imports: [CommonModule], - declarations: [ - RecentNature, - RecentNatureConcat, - RecentNatureFile, - RecentNatureUdp, - RecentNatureTcp, - RecentNatureSerial, - RecentNatureProcess, - ], - exports: [RecentNature], -}) -export class RecentNatureModule {} diff --git a/application/client/src/app/ui/elements/recent/nature/process/component.ts b/application/client/src/app/ui/elements/recent/nature/process/component.ts deleted file mode 100644 index 8fdb8e12bd..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/process/component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Component, AfterContentInit, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-recent-nature-process', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class RecentNatureProcess implements AfterContentInit { - @Input() public origin!: $.Origin.Stream.Stream.Process.Configuration; - - public ngAfterContentInit(): void { - // - } -} -export interface RecentNatureProcess extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/recent/nature/process/styles.less b/application/client/src/app/ui/elements/recent/nature/process/styles.less deleted file mode 100644 index 312349ebd9..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/process/styles.less +++ /dev/null @@ -1,19 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - overflow: hidden; - white-space: nowrap; - font-size: 13px; - & > p { - padding: 0; - margin: 0; - color: var(--scheme-color-3); - & > span { - color: var(--scheme-color-2); - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/nature/process/template.html b/application/client/src/app/ui/elements/recent/nature/process/template.html deleted file mode 100644 index 8c5c072f09..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/process/template.html +++ /dev/null @@ -1,2 +0,0 @@ -

run: {{origin.configuration.command}}

-

from: {{origin.configuration.cwd}}

diff --git a/application/client/src/app/ui/elements/recent/nature/serial/component.ts b/application/client/src/app/ui/elements/recent/nature/serial/component.ts deleted file mode 100644 index f5f3c579e8..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/serial/component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Component, AfterContentInit, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-recent-nature-serial', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class RecentNatureSerial implements AfterContentInit { - @Input() public origin!: $.Origin.Stream.Stream.Serial.Configuration; - - public ngAfterContentInit(): void { - // - } -} -export interface RecentNatureSerial extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/recent/nature/serial/styles.less b/application/client/src/app/ui/elements/recent/nature/serial/styles.less deleted file mode 100644 index 190cad77be..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/serial/styles.less +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - overflow: hidden; - white-space: nowrap; - font-size: 13px; - color: var(--scheme-color-3); - & > span { - color: var(--scheme-color-2); - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/nature/serial/template.html b/application/client/src/app/ui/elements/recent/nature/serial/template.html deleted file mode 100644 index 2b2323785c..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/serial/template.html +++ /dev/null @@ -1 +0,0 @@ -Connection to: {{origin.configuration.path}} ({{origin.configuration.baud_rate}}/{{origin.configuration.data_bits}}) \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/nature/styles.less b/application/client/src/app/ui/elements/recent/nature/styles.less deleted file mode 100644 index 856ff2de94..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/styles.less +++ /dev/null @@ -1,8 +0,0 @@ -@import '../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/nature/tcp/component.ts b/application/client/src/app/ui/elements/recent/nature/tcp/component.ts deleted file mode 100644 index d0768f10e4..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/tcp/component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Component, AfterContentInit, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-recent-nature-tcp', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class RecentNatureTcp implements AfterContentInit { - @Input() public origin!: $.Origin.Stream.Stream.TCP.Configuration; - - public ngAfterContentInit(): void { - // - } -} -export interface RecentNatureTcp extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/recent/nature/tcp/styles.less b/application/client/src/app/ui/elements/recent/nature/tcp/styles.less deleted file mode 100644 index 190cad77be..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/tcp/styles.less +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - overflow: hidden; - white-space: nowrap; - font-size: 13px; - color: var(--scheme-color-3); - & > span { - color: var(--scheme-color-2); - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/nature/tcp/template.html b/application/client/src/app/ui/elements/recent/nature/tcp/template.html deleted file mode 100644 index 42e79f9bc2..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/tcp/template.html +++ /dev/null @@ -1 +0,0 @@ -TCP on: {{origin.configuration.bind_addr}} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/nature/template.html b/application/client/src/app/ui/elements/recent/nature/template.html deleted file mode 100644 index 43501548ba..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/template.html +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/nature/udp/component.ts b/application/client/src/app/ui/elements/recent/nature/udp/component.ts deleted file mode 100644 index 7fdcc5d17a..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/udp/component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Component, AfterContentInit, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-recent-nature-udp', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class RecentNatureUdp implements AfterContentInit { - @Input() public origin!: $.Origin.Stream.Stream.UDP.Configuration; - - public ngAfterContentInit(): void { - // - } -} -export interface RecentNatureUdp extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/recent/nature/udp/styles.less b/application/client/src/app/ui/elements/recent/nature/udp/styles.less deleted file mode 100644 index 190cad77be..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/udp/styles.less +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - overflow: hidden; - white-space: nowrap; - font-size: 13px; - color: var(--scheme-color-3); - & > span { - color: var(--scheme-color-2); - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/nature/udp/template.html b/application/client/src/app/ui/elements/recent/nature/udp/template.html deleted file mode 100644 index 8a091f0643..0000000000 --- a/application/client/src/app/ui/elements/recent/nature/udp/template.html +++ /dev/null @@ -1,4 +0,0 @@ -UDP on: {{origin.configuration.bind_addr}} - - Multicast: {{origin.configuration.multicast[0].multiaddr}} ({{origin.configuration.multicast[0].interface}}) - diff --git a/application/client/src/app/ui/elements/recent/parser/component.ts b/application/client/src/app/ui/elements/recent/parser/component.ts deleted file mode 100644 index 27bad6ed8e..0000000000 --- a/application/client/src/app/ui/elements/recent/parser/component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, AfterContentInit, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-recent-parser', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class RecentParser implements AfterContentInit { - @Input() public observe!: $.Observe; - - public ngAfterContentInit(): void { - // - } - - public as(): { - Dlt(): $.Parser.Dlt.Configuration | undefined; - SomeIp(): $.Parser.SomeIp.Configuration | undefined; - Text(): $.Parser.Text.Configuration | undefined; - } { - return { - Dlt: (): $.Parser.Dlt.Configuration | undefined => { - return this.observe.parser.as<$.Parser.Dlt.Configuration>( - $.Parser.Dlt.Configuration, - ); - }, - SomeIp: (): $.Parser.SomeIp.Configuration | undefined => { - return this.observe.parser.as<$.Parser.SomeIp.Configuration>( - $.Parser.SomeIp.Configuration, - ); - }, - Text: (): $.Parser.Text.Configuration | undefined => { - return this.observe.parser.as<$.Parser.Text.Configuration>( - $.Parser.Text.Configuration, - ); - }, - }; - } -} -export interface RecentParser extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/recent/parser/dlt/component.ts b/application/client/src/app/ui/elements/recent/parser/dlt/component.ts deleted file mode 100644 index 36b5cd65a8..0000000000 --- a/application/client/src/app/ui/elements/recent/parser/dlt/component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, AfterContentInit, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -// import { bytesToStr, timestampToUTC } from '@env/str'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-recent-parser-dlt', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class RecentParserDlt implements AfterContentInit { - @Input() public parser!: $.Parser.Dlt.Configuration; - - public logLevel!: string; - public fibex: string[] = []; - public timezone: string | undefined; - - public ngAfterContentInit(): void { - if ( - this.parser.configuration.filter_config === undefined || - this.parser.configuration.filter_config.min_log_level === undefined - ) { - this.logLevel = $.Parser.Dlt.DltLogLevelNames[6]; - } else { - this.logLevel = $.Parser.Dlt.getLogLevelName( - this.parser.configuration.filter_config.min_log_level, - ); - } - if (this.parser.configuration.fibex_file_paths === undefined) { - this.fibex = []; - } else { - this.fibex = this.parser.configuration.fibex_file_paths; - } - this.timezone = this.parser.configuration.tz; - } -} -export interface RecentParserDlt extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/recent/parser/dlt/styles.less b/application/client/src/app/ui/elements/recent/parser/dlt/styles.less deleted file mode 100644 index 3b485ebc82..0000000000 --- a/application/client/src/app/ui/elements/recent/parser/dlt/styles.less +++ /dev/null @@ -1,31 +0,0 @@ -@import '../../../../styles/variables.less'; - - - -:host { - position: relative; - display: block; - & span.path { - margin-left: 12px; - } - & .nowrap { - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - } - & table { - margin-left: -3px; - } - & table > tr { - vertical-align: top; - } - & table * { - border-spacing: 0px; - } - & table { - & td.left-padding { - padding-left: 12px; - } - } - -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/parser/dlt/template.html b/application/client/src/app/ui/elements/recent/parser/dlt/template.html deleted file mode 100644 index 0e8ba23f8c..0000000000 --- a/application/client/src/app/ui/elements/recent/parser/dlt/template.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - -
Log level:{{logLevel}} -

Bound fibex files:

-

{{fibex}}

-
-

Timezone:

-

{{timezone}}

-
diff --git a/application/client/src/app/ui/elements/recent/parser/module.ts b/application/client/src/app/ui/elements/recent/parser/module.ts deleted file mode 100644 index 1ae35bc15a..0000000000 --- a/application/client/src/app/ui/elements/recent/parser/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { RecentParser } from './component'; -import { RecentParserDlt } from './dlt/component'; -import { RecentParserSomeIp } from './someip/component'; - -@NgModule({ - imports: [CommonModule], - declarations: [RecentParser, RecentParserDlt, RecentParserSomeIp], - exports: [RecentParser], -}) -export class RecentParserModule {} diff --git a/application/client/src/app/ui/elements/recent/parser/someip/component.ts b/application/client/src/app/ui/elements/recent/parser/someip/component.ts deleted file mode 100644 index d4958480d4..0000000000 --- a/application/client/src/app/ui/elements/recent/parser/someip/component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Component, AfterContentInit, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -// import { bytesToStr, timestampToUTC } from '@env/str'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-recent-parser-someip', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class RecentParserSomeIp implements AfterContentInit { - @Input() public parser!: $.Parser.SomeIp.Configuration; - public fibex: string[] = []; - - public ngAfterContentInit(): void { - if (this.parser.configuration.fibex_file_paths === undefined) { - this.fibex = []; - } else { - this.fibex = this.parser.configuration.fibex_file_paths; - } - } -} -export interface RecentParserSomeIp extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/recent/parser/someip/styles.less b/application/client/src/app/ui/elements/recent/parser/someip/styles.less deleted file mode 100644 index 8ba5c2caa1..0000000000 --- a/application/client/src/app/ui/elements/recent/parser/someip/styles.less +++ /dev/null @@ -1,31 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - padding: 6px 0; - & div.section { - position: relative; - } - & span.path { - margin-left: 12px; - } - & .nowrap { - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - } - & table > tr { - vertical-align: top; - } - & table * { - border-spacing: 0px; - } - & table { - & td.left-padding { - padding-left: 12px; - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/parser/someip/template.html b/application/client/src/app/ui/elements/recent/parser/someip/template.html deleted file mode 100644 index 2c661cb866..0000000000 --- a/application/client/src/app/ui/elements/recent/parser/someip/template.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - -
-

Bound fibex files:

-

No any fibex files

-

{{fibex}}

-
\ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/parser/styles.less b/application/client/src/app/ui/elements/recent/parser/styles.less deleted file mode 100644 index 856ff2de94..0000000000 --- a/application/client/src/app/ui/elements/recent/parser/styles.less +++ /dev/null @@ -1,8 +0,0 @@ -@import '../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/parser/template.html b/application/client/src/app/ui/elements/recent/parser/template.html deleted file mode 100644 index dd91e7f740..0000000000 --- a/application/client/src/app/ui/elements/recent/parser/template.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/state.ts b/application/client/src/app/ui/elements/recent/state.ts deleted file mode 100644 index 8b4456dee0..0000000000 --- a/application/client/src/app/ui/elements/recent/state.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { Action } from '@service/recent/action'; -import { WrappedAction } from './action'; -import { recent } from '@service/recent'; -import { Subject } from '@platform/env/subscription'; -import { IlcInterface } from '@service/ilc'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Holder } from '@module/matcher'; -import { Logger } from '@platform/log'; - -import * as $ from '@platform/types/observe'; - -export class State extends Holder { - public actions: WrappedAction[] = []; - - public readonly update: Subject = new Subject(); - public readonly observe: $.Observe | undefined; - - private _logger: Logger; - - constructor(ilc: IlcInterface & ChangesDetector, observe?: $.Observe) { - super(); - this.observe = observe; - this._logger = ilc.log(); - ilc.env().subscriber.register(recent.updated.subscribe(this.reload.bind(this))); - this.reload(); - } - - public filtering(value: string) { - this.matcher.search(value); - if (value.trim() === '') { - this.actions.sort((a: WrappedAction, b: WrappedAction) => - b.action.stat.score().recent() >= a.action.stat.score().recent() ? 1 : -1, - ); - } else { - this.actions.sort((a: WrappedAction, b: WrappedAction) => b.getScore() - a.getScore()); - } - this.update.emit(); - } - - public getFilteredActions(): WrappedAction[] { - return this.actions.filter((a: WrappedAction) => a.getScore() > 0); - } - - public remove(uuids: string[]) { - recent - .delete(uuids) - .then(() => { - this.reload(); - }) - .catch((err: Error) => { - this._logger.error(`Fail to remove recent action: ${err.message}`); - }); - } - - public removeAll() { - recent - .get() - .then((actions: Action[]) => { - this.remove(actions.map((action: Action) => action.uuid)); - }) - .catch((err: Error) => { - this._logger.error(`Fail to remove all recent actions: ${err.message}`); - }); - } - - public reload(): void { - recent - .get() - .then((actions: Action[]) => { - this.actions = actions - .filter((action) => action.isSuitable(this.observe)) - .map((action) => new WrappedAction(action, this.matcher)); - this.actions.sort((a: WrappedAction, b: WrappedAction) => { - return b.action.stat.score().recent() >= a.action.stat.score().recent() - ? 1 - : -1; - }); - this.update.emit(); - }) - .catch((error: Error) => { - this._logger.error(`Fail to get recent due error: ${error.message}`); - }); - } -} diff --git a/application/client/src/app/ui/elements/recent/styles.less b/application/client/src/app/ui/elements/recent/styles.less deleted file mode 100644 index 72b72ad278..0000000000 --- a/application/client/src/app/ui/elements/recent/styles.less +++ /dev/null @@ -1,60 +0,0 @@ -@import '../../styles/variables.less'; - - -app-recent-actions { - position: relative; - display: block; - width: 100%; - & div.action { - position: relative; - border-bottom: thin solid var(--scheme-color-4); - padding: 6px 0; - display: flex; - width: 100%; - flex-direction: row; - align-items: flex-start; - & div.column_0 { - - } - & div.column_1 { - flex: auto; - } - &:hover { - background: var(--scheme-color-hover); - &::before { - background: var(--scheme-color-hover); - } - } - &::before { - position: absolute; - display: block; - width: ~"calc(100% + 30px)"; - content: ''; - top:0; - left: -15px; - height: 100%; - } - & p.description { - position: relative; - & span.minor { - padding-left: 12px; - } - & span.major, - & span.minor { - & > span { - background-color: var(--scheme-color-3); - } - } - } - } - & div.filter { - position: absolute; - z-index: 1000; - padding: 6px 12px; - background: var(--scheme-color-warning-light); - top: 6px; - right: 6px; - box-shadow: 3px 3px 3px rgb(0 0 0 / 40%); - border-radius: 3px; - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/recent/template.html b/application/client/src/app/ui/elements/recent/template.html deleted file mode 100644 index 53eb58ad7e..0000000000 --- a/application/client/src/app/ui/elements/recent/template.html +++ /dev/null @@ -1,18 +0,0 @@ - -
-
- -
-
- - -
-
-

- No recent actions -

diff --git a/application/client/src/app/ui/elements/scrollarea/component.ts b/application/client/src/app/ui/elements/scrollarea/component.ts deleted file mode 100644 index dff7709e88..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/component.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { - Component, - OnDestroy, - ChangeDetectorRef, - ViewChild, - Input, - AfterViewInit, - ElementRef, - ChangeDetectionStrategy, - HostBinding, - HostListener, - Output, - EventEmitter, -} from '@angular/core'; -import { Subscriber } from '@platform/env/subscription'; -import { Row, RowSrc } from '@schema/content/row'; -import { Holder } from './controllers/holder'; -import { Service } from './controllers/service'; -import { Frame, ChangesInitiator } from './controllers/frame'; -import { Selecting, SelectionDirection } from './controllers/selection'; -import { Keyboard } from './controllers/keyboard'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { RemoveHandler } from '@ui/service/styles'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { stop } from '@ui/env/dom'; -import { unique } from '@platform/env/sequence'; - -@Component({ - selector: 'app-scrollarea', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class ScrollAreaComponent extends ChangesDetector implements OnDestroy, AfterViewInit { - @ViewChild('content_holder', { static: false }) _nodeHolder!: ElementRef; - - @Input() public service!: Service; - @Input() public tabIndex!: number; - - @Output() public offset = new EventEmitter(); - - private readonly _subscriber: Subscriber = new Subscriber(); - private _id: string = unique(); - private _removeGlobalStyleHandler: RemoveHandler | undefined; - - @HostBinding('tabindex') get tabndex() { - return this.tabIndex === undefined ? 0 : this.tabIndex; - } - - @HostBinding('id') set id(id: string) { - this._id = id; - } - - get id() { - return this._id; - } - - @HostListener('window:keydown', ['$event']) onKeyDown(event: KeyboardEvent) { - this.keyboard.process(event); - } - - @HostListener('window:keyup') onKeyUp() { - this.keyboard.stop(); - } - - @HostListener('window:mouseup', ['$event']) onMouseUp(event: MouseEvent) { - this.selecting.end(event); - } - - @HostListener('window:mousedown', ['$event']) onCheckState(event: MouseEvent) { - this.selecting.check(event); - } - - @HostListener('document:selectionchange') onSelectionChange() { - this.selecting.change(); - } - - @HostListener('focus') onFocus() { - this.keyboard.focus(); - this.service.focus().in(); - } - - @HostListener('blur') onBlur() { - this.keyboard.blur(); - this.service.focus().out(); - } - - public rows: Row[] = []; - public readonly holder: Holder = new Holder(); - public readonly frame: Frame = new Frame(); - public readonly selecting: Selecting = new Selecting(); - public readonly keyboard: Keyboard = new Keyboard(); - public selectionDirection = SelectionDirection; - - constructor(changeDetectorRef: ChangeDetectorRef, private elRef: ElementRef) { - super(changeDetectorRef); - } - - public ngOnDestroy(): void { - this.detauchChangesDetector(); - this.holder.destroy(); - this.frame.destroy(); - this.selecting.destroy(); - this._subscriber.unsubscribe(); - } - - public ngAfterViewInit(): void { - this.holder.bind(this._nodeHolder); - this.frame.bind(this.service, this.holder); - this.service.bind(this.frame, this.elRef.nativeElement); - this.selecting.bind(this._nodeHolder.nativeElement, this.frame, this.service); - this.keyboard.bind(this.frame); - this._subscriber.register( - this.frame.onFrameChange((rows: RowSrc[]) => { - const exists = this.rows.length; - rows.forEach((updated: RowSrc, i: number) => { - if (i < exists) { - this.rows[i].from(updated); - } else { - this.rows.push(new Row(updated)); - } - }); - if (rows.length < exists) { - this.rows.splice(rows.length).forEach((row) => { - row.destroy(); - }); - } - this.markChangesForCheck(); - this.selecting.restore(); - }), - ); - this._subscriber.register( - this.selecting.onSelectionStart(() => { - this._removeGlobalStyleHandler = this.ilc().services.ui.styles - .add(`:not(*[id="${this._id}"] *) { - user-select: none; - }`); - this.markChangesForCheck(); - }), - ); - this._subscriber.register( - this.selecting.onSelectionFinish(() => { - if (typeof this._removeGlobalStyleHandler === 'function') { - this._removeGlobalStyleHandler(); - this._removeGlobalStyleHandler = undefined; - } - this.markChangesForCheck(); - }), - ); - this._subscriber.register( - this.ilc().services.system.hotkeys.listen('G', () => { - if (!this.service.focus().get()) { - return; - } - this.service.scrollToTop(); - }), - ); - this._subscriber.register( - this.ilc().services.system.hotkeys.listen('gg', () => { - if (!this.service.focus().get()) { - return; - } - this.service.scrollToBottom(); - }), - ); - this._subscriber.register( - this.ilc().services.system.hotkeys.listen('Ctrl + C', () => { - if (!this.service.focus().get()) { - return; - } - this.selecting.copyToClipboard().catch((err: Error) => { - this.log().error(`Fail to copy content into clipboard: ${err.message}`); - }); - }), - ); - this.frame.init(); - } - - public getFrameStart(): number { - return this.frame.get().start; - } - - public isSourceSwitched(i: number): boolean { - return this.rows[i - 1] === undefined - ? false - : this.rows[i - 1].source !== this.rows[i].source; - } - - public onScrolling(position: number) { - this.frame.setAdhered(true); - this.frame.moveTo(position, ChangesInitiator.Scrolling); - } - - public onContainerScrolling(event: Event) { - const target = event.target as HTMLElement; - if (target.scrollLeft === undefined) { - return; - } - this.offset.emit(target.scrollLeft); - } - - public onWheel(event: WheelEvent) { - if (Math.abs(event.deltaX) < Math.abs(event.deltaY)) { - this.frame.setAdhered(true); - this.frame.offsetTo(event.deltaY, ChangesInitiator.Wheel); - stop(event); - } - } - - public onMouseDown(event: MouseEvent) { - this.selecting.start(event); - } - - public showSelectionDetectors(): boolean { - return this._removeGlobalStyleHandler !== undefined; - } - - public onMouseInSelectionDetector(direction: SelectionDirection) { - this.selecting.directed().start(direction); - } - - public onMouseOutSelectionDetector() { - this.selecting.directed().finish(); - } -} -export interface ScrollAreaComponent extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/scrollarea/controllers/frame.ts b/application/client/src/app/ui/elements/scrollarea/controllers/frame.ts deleted file mode 100644 index d9bcb80278..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/controllers/frame.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { Subscription, Subject, Subscriber } from '@platform/env/subscription'; -import { Service, Range, IRowsPacket } from './service'; -import { IRange, Range as SafeRange } from '@platform/types/range'; -import { Holder } from './holder'; -import { RowSrc } from '@schema/content/row'; - -export enum ChangesInitiator { - Wheel = 0, - StorageUpdated = 1, - HolderHeight = 2, - Scrolling = 3, - RowsDelivered = 4, - Selecting = 5, - Keyboard = 6, - Refresh = 7, -} - -export interface PositionEvent { - range: IRange; - initiator: ChangesInitiator; -} - -export class Frame extends Subscriber { - private _service!: Service; - private _holder!: Holder; - private _frame: Range = new Range(); - private _rows: RowSrc[] = []; - private _prev: string | undefined; - private readonly _subjects: { - change: Subject; - position: Subject; - } = { - change: new Subject(), - position: new Subject(), - }; - - public bind(service: Service, holder: Holder) { - this._service = service; - this._holder = holder; - this.register( - this._frame.onChange((initiator: ChangesInitiator) => { - this._subjects.position.emit({ range: this._frame.get(), initiator }); - const prev = this._prev; - this._prev = this._frame.hash(); - if (this._frame.isEmpty()) { - this._service.setLen(this._frame.getTotal()); - this._rows = []; - this._subjects.change.emit(this._rows); - } else if (initiator === ChangesInitiator.Refresh || prev !== this._prev) { - this._service.setFrame(this._frame.get()); - } else if (!this._frame.isEmpty()) { - this._service.setLen(this._frame.getTotal()); - this._service.setFrame(this._frame.get()); - } else { - this._service.setLen(this._frame.getTotal()); - } - }), - this._holder.onHeightChange((height: number) => { - this._frame.setLength( - Math.floor(height / this._service.getItemHeight()), - ChangesInitiator.HolderHeight, - ); - this._service.setFrame(this._frame.get()); - }), - this._service.onRows((packet: IRowsPacket) => { - if (!this._frame.equal(packet.range)) { - return; - } - this._rows = packet.rows; - this._subjects.change.emit(this._rows); - }), - this._service.onRefresh(() => { - this._frame.refresh(ChangesInitiator.Refresh); - }), - this._service.onLen((len: number) => { - this._frame.setTotal(len, ChangesInitiator.StorageUpdated); - }), - ); - } - - public destroy(): void { - this.unsubscribe(); - this._subjects.change.destroy(); - this._subjects.position.destroy(); - } - - public init() { - const cursor = this._service.getCursor(); - this._frame.setLength( - Math.floor(this._holder.getHeight() / this._service.getItemHeight()), - ChangesInitiator.HolderHeight, - ); - this._frame.setTotal(this._service.getLen(), ChangesInitiator.Scrolling); - this._frame.moveTo(cursor, ChangesInitiator.Scrolling); - this._service.setFrame(this._frame.get()); - } - - public setAdhered(adhered: boolean) { - this._frame.setAdhered(adhered); - } - - public get(): SafeRange { - return this._frame.get(); - } - - public moveTo(start: number, initiator: ChangesInitiator) { - this._frame.moveTo(start, initiator); - } - - public move(initiator: ChangesInitiator): { - down(): void; - up(): void; - pgdown(): void; - pgup(): void; - } { - return { - down: (): void => { - this.offsetToByRows(1, initiator); - }, - up: (): void => { - this.offsetToByRows(-1, initiator); - }, - pgdown: (): void => { - this.offsetToByRows(this.getFrameLen(), initiator); - }, - pgup: (): void => { - this.offsetToByRows(-this.getFrameLen(), initiator); - }, - }; - } - public offsetTo(offsetPx: number, initiator: ChangesInitiator) { - const offset = Math.round(offsetPx / this._service.getItemHeight()); - this._frame.offsetTo(offset === 0 ? 1 * (offsetPx < 0 ? -1 : 1) : offset, initiator); - } - - public offsetToByRows(offsetRow: number, initiator: ChangesInitiator) { - this._frame.offsetTo(offsetRow, initiator); - } - - public getFrameLen(): number { - return this._frame.getLength(); - } - - public getRows(): RowSrc[] { - return this._rows; - } - - public onFrameChange(handler: (rows: RowSrc[]) => void): Subscription { - return this._subjects.change.subscribe(handler); - } - - public onPositionChange(handler: (position: PositionEvent) => void): Subscription { - return this._subjects.position.subscribe(handler); - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/controllers/holder.ts b/application/client/src/app/ui/elements/scrollarea/controllers/holder.ts deleted file mode 100644 index 7541b8dabc..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/controllers/holder.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { ElementRef } from '@angular/core'; -import { Subscription, Subject } from '@platform/env/subscription'; - -export class Holder { - private _elementRef!: HTMLElement; - private _domRect!: DOMRect; - private readonly _subjects: { - change: Subject; - } = { - change: new Subject(), - }; - private _resizeObserve: ResizeObserver | undefined; - - public destroy() { - if (this._resizeObserve !== undefined) { - this._resizeObserve.unobserve(this._elementRef); - } - this._subjects.change.destroy(); - } - - public bind(elementRef: ElementRef) { - if (this._resizeObserve !== undefined) { - throw new Error(`Holder cannot be bound muliple times`); - } - this._resizeObserve = new ResizeObserver((entries: ResizeObserverEntry[]) => { - if (entries.length !== 1) { - return; - } - this._detect(entries[0].contentRect); - }); - this._elementRef = elementRef.nativeElement; - this._resizeObserve.observe(this._elementRef); - this._detect(this._elementRef.getBoundingClientRect()); - } - - public getHeight(): number { - return this._domRect.height; - } - - public onHeightChange(handler: (height: number) => void): Subscription { - return this._subjects.change.subscribe(handler); - } - - private _detect(rect: DOMRect) { - const changed = this._domRect === undefined ? true : rect.height !== this._domRect.height; - this._domRect = rect; - changed && this._subjects.change.emit(this._domRect.height); - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/controllers/keyboard.ts b/application/client/src/app/ui/elements/scrollarea/controllers/keyboard.ts deleted file mode 100644 index 3afba33c1e..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/controllers/keyboard.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Frame, ChangesInitiator } from './frame'; -export class Keyboard { - static START_REPEAT_DURATION_MS = 400; - static MIN_REPEAT_DURATION_MS = 200; - static STEP_REPEAT_DURATION = 0.05; - - protected focused: boolean = false; - protected frame!: Frame; - - private _repeating: number | undefined; - private _duration: number = 0; - - public bind(frame: Frame) { - this.frame = frame; - } - - public process(event: KeyboardEvent) { - this._duration = Keyboard.START_REPEAT_DURATION_MS; - this._process(event.code); - } - - public stop() { - clearTimeout(this._repeating); - } - - public focus() { - this.focused = true; - } - - public blur() { - this.focused = false; - } - - private _process(code: string) { - if (!this.focused) { - return; - } - switch (code) { - case 'ArrowUp': - this.frame.move(ChangesInitiator.Keyboard).up(); - break; - case 'ArrowDown': - this.frame.move(ChangesInitiator.Keyboard).down(); - break; - case 'PageDown': - this.frame.move(ChangesInitiator.Keyboard).pgdown(); - break; - case 'PageUp': - this.frame.move(ChangesInitiator.Keyboard).pgup(); - break; - } - if (this._duration > Keyboard.MIN_REPEAT_DURATION_MS) { - this._duration = this._duration - this._duration * Keyboard.STEP_REPEAT_DURATION; - } - if (this._duration <= Keyboard.MIN_REPEAT_DURATION_MS) { - this._duration = Keyboard.MIN_REPEAT_DURATION_MS; - } - clearTimeout(this._repeating); - this._repeating = setTimeout( - this._process.bind(this, code), - this._duration, - ) as unknown as number; - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/controllers/range.ts b/application/client/src/app/ui/elements/scrollarea/controllers/range.ts deleted file mode 100644 index 9721cef91f..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/controllers/range.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { Subscription, Subject } from '@platform/env/subscription'; -import { IRange, Range as SafeRange } from '@platform/types/range'; -import { ChangesInitiator } from './frame'; -import { LimittedRange } from '@ui/env/entities/range.limited'; - -export class Range { - private range: LimittedRange = new LimittedRange('scroll_area_range', 0, 0, 0, 0, true); - // Set default state of sticky scrolling; true - initianally sticky scrolling; false - not - private adhered: boolean = false; - private readonly _subjects: { - change: Subject; - } = { - change: new Subject(), - }; - constructor(defaults?: { range: IRange; len: number; total: number }) { - if (defaults !== undefined) { - this.range - .$(defaults.total) - .max(true) - .$(defaults.len) - .len() - .$(defaults.range.start) - .from() - .$(defaults.range.end) - .to(); - } - } - - public destroy() { - this._subjects.change.destroy(); - } - - public setAdhered(adhered: boolean) { - this.adhered = adhered; - } - - public setLength(len: number, initiator: ChangesInitiator) { - const prev = this.range.hash(); - this.range.$(len).len(); - if (prev !== this.range.hash()) { - this._subjects.change.emit(initiator); - } - } - - public getLength(): number { - return this.range.len; - } - - public getTotal(): number { - return this.range.max; - } - - public setTotal(total: number, initiator: ChangesInitiator) { - const prev = this.range.hash(); - this.range.$(total).max(this.adhered); - if (prev !== this.range.hash()) { - this._subjects.change.emit(initiator); - } - } - - public moveTo(from: number, initiator: ChangesInitiator) { - const prev = this.range.hash(); - if (from > this.range.max) { - throw new Error(`Fail to move cursor outside of available data`); - } - this.range.$(from).from(); - if (prev !== this.range.hash()) { - this._subjects.change.emit(initiator); - } - } - - public offsetTo(offset: number, initiator: ChangesInitiator) { - const prev = this.range.hash(); - if (offset < 0) { - this.range.$(this.range.from + offset).from(); - } else { - this.range.$(this.range.from + offset + this.range.len).to(); - } - if (prev !== this.range.hash()) { - this._subjects.change.emit(initiator); - } - } - - public refresh(initiator: ChangesInitiator) { - this._subjects.change.emit(initiator); - } - - public get(): SafeRange { - return new SafeRange(this.range.from, this.range.to); - } - - public equal(range: IRange): boolean { - return this.range.from === range.start && this.range.to === range.end; - } - - public onChange(handler: (ci: ChangesInitiator) => void): Subscription { - return this._subjects.change.subscribe(handler); - } - - public hash(): string { - return `${this.getLength()}:${this.get().start}-${this.get().end}`; - } - - public isEmpty(): boolean { - return this.range.max === 0; - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/controllers/selection.node.ts b/application/client/src/app/ui/elements/scrollarea/controllers/selection.node.ts deleted file mode 100644 index 4f44c393f6..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/controllers/selection.node.ts +++ /dev/null @@ -1,41 +0,0 @@ -export class SelectionNode { - public static select(parent: HTMLElement, path: string): Node | null { - let selector: string = path; - let textNodeIndex: number = -1; - if (selector.indexOf('#text') !== -1) { - const parts: string[] = selector.split(`#text:`); - if (parts.length !== 2) { - return null; - } - textNodeIndex = parseInt(parts[1], 10); - if (isNaN(textNodeIndex) || !isFinite(textNodeIndex)) { - return null; - } - selector = selector.replace(/#text:\d*/gi, '').trim(); - } - let node: ChildNode | null = parent.querySelector(selector); - if (node === null) { - return null; - } - if (textNodeIndex !== -1 && node.childNodes.length === 0) { - return null; - } - if (textNodeIndex !== -1 && node.childNodes.length !== 0) { - node = - node.childNodes[textNodeIndex] === undefined - ? null - : node.childNodes[textNodeIndex]; - node = node === null ? null : node.nodeType !== Node.TEXT_NODE ? null : node; - } - return node; - } - - private _node: Node | null = null; - - public set(node: Node | null) { - this._node = node; - } - public get(): Node | null { - return this._node; - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/controllers/selection.nodeinfo.ts b/application/client/src/app/ui/elements/scrollarea/controllers/selection.nodeinfo.ts deleted file mode 100644 index d8f5d77851..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/controllers/selection.nodeinfo.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { SelectionNode } from './selection.node'; - -export const ROW_INDEX_ATTR: string = 'data-row-index'; -export const ROOT_ROW_NODE: string = 'li'; - -export enum Target { - Focus = 0, - Anchor = 1, -} - -export interface IRowNodeInfo { - path: string; - index: number; -} - -export interface RestorableNodeInfo { - row: number; - path: string; - offset: number; - node: SelectionNode; -} - -export class NodeInfo { - public row: number | undefined; - public path: string | undefined; - public offset: number | undefined; - public node: SelectionNode = new SelectionNode(); - private _target: Target; - - constructor(target: Target) { - this._target = target; - } - - public get(): RestorableNodeInfo | undefined { - if ( - this.row === undefined || - this.path === undefined || - this.offset === undefined || - this.node === null - ) { - return undefined; - } else { - return { - row: this.row, - path: this.path, - offset: this.offset, - node: this.node, - }; - } - } - - public update(selection: Selection) { - if (this._target === Target.Anchor && this.row !== undefined) { - return; - } - const accessor = this._getAccessor(selection); - if (accessor.node()?.nodeType === Node.COMMENT_NODE) { - return; - } - if (this.node.get() !== accessor.node()) { - const rowInfo: IRowNodeInfo | undefined = this._getRowInfo(accessor.node()); - if (rowInfo === undefined) { - this.node.set(null); - return; - } - this.path = rowInfo.path; - this.row = rowInfo.index; - this.node.set(accessor.node()); - this.offset = accessor.offset(); - } else { - this.offset = accessor.offset(); - } - if (this._target === Target.Anchor && this.row === undefined) { - console.log(`${this.path} / ${this.row} / ${this.offset}`); - } - } - - public setToRow(rowIndex: number) { - this.path = `${ROOT_ROW_NODE}[${ROW_INDEX_ATTR}="${rowIndex}"]`; - this.row = rowIndex; - this.offset = 0; - this.node.set(null); - } - - private _getRowInfo(node: Node | null, path: string = ''): IRowNodeInfo | undefined { - if (node === null) { - return undefined; - } - if (node.parentNode === undefined || node.parentNode === null) { - return undefined; - } - if (node.nodeName.toLowerCase() === 'body') { - return undefined; - } - const rowIndex: number | undefined = this._getIndexAttr(node); - if (rowIndex !== undefined) { - return { - index: rowIndex, - path: `${node.nodeName.toLowerCase()}[${ROW_INDEX_ATTR}="${rowIndex}"]${ - path !== '' ? ' ' : '' - }${path}`, - }; - } else if (node.nodeType === Node.TEXT_NODE) { - const textNodeIndex: number = this._getTextNodeIndex(node); - return textNodeIndex === -1 - ? undefined - : this._getRowInfo(node.parentNode as HTMLElement, `#text:${textNodeIndex}`); - } else if (node.parentNode.children.length !== 0 && rowIndex === undefined) { - const childIndex: number = this._getChildIndex(node); - return childIndex === -1 - ? undefined - : this._getRowInfo( - node.parentNode, - `${node.nodeName.toLowerCase()}:nth-child(${childIndex + 1})${ - path !== '' ? ' ' : '' - }${path}`, - ); - } else { - return this._getRowInfo( - node.parentNode as HTMLElement, - `${node.nodeName.toLowerCase()}${path !== '' ? ' ' : ''}${path}`, - ); - } - } - - private _getAccessor(selection: Selection): { - node(): Node | null; - offset(): number; - } { - const self = this; - return { - node(): Node | null { - return self._target === Target.Focus ? selection.focusNode : selection.anchorNode; - }, - offset(): number { - return self._target === Target.Focus - ? selection.focusOffset - : selection.anchorOffset; - }, - }; - } - - private _getIndexAttr(node: Node): number | undefined { - if (typeof (node as HTMLElement).getAttribute !== 'function') { - return undefined; - } - const attr: string | null = (node as HTMLElement).getAttribute(ROW_INDEX_ATTR); - if (attr === null || attr.trim().length === 0) { - return undefined; - } - const index = parseInt(attr, 10); - if (isNaN(index) || !isFinite(index)) { - return undefined; - } - return index; - } - - private _getTextNodeIndex(node: Node): number { - if (node.parentNode === null) { - return -1; - } - let index: number = -1; - try { - Array.prototype.forEach.call(node.parentNode.childNodes, (child: Node, i: number) => { - if (node === child) { - index = i; - throw `found`; - } - }); - } catch (_) { - // Exit from forEach; - } - return index; - } - - private _getChildIndex(node: Node): number { - if (node.parentNode === null) { - return -1; - } - let index: number = -1; - try { - Array.prototype.forEach.call(node.parentNode.children, (child: Node, i: number) => { - if (node === child) { - index = i; - throw `found`; - } - }); - } catch (_) { - // Exit from forEach; - } - return index; - } -} - -export function getFocusNodeInfo(): NodeInfo { - return new NodeInfo(Target.Focus); -} - -export function getAnchorNodeInfo(): NodeInfo { - return new NodeInfo(Target.Anchor); -} diff --git a/application/client/src/app/ui/elements/scrollarea/controllers/selection.ts b/application/client/src/app/ui/elements/scrollarea/controllers/selection.ts deleted file mode 100644 index 653c7750bb..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/controllers/selection.ts +++ /dev/null @@ -1,491 +0,0 @@ -import { Frame, ChangesInitiator } from './frame'; -import { Subject, Subscription } from '@platform/env/subscription'; -import { - ROW_INDEX_ATTR, - NodeInfo, - RestorableNodeInfo, - getFocusNodeInfo, - getAnchorNodeInfo, -} from './selection.nodeinfo'; -import { SelectionNode } from './selection.node'; -import { Service } from './service'; -import { escapeAnsi } from '@module/ansi'; - -import * as nums from '@platform/env/num'; -import * as dom from '@ui/env/dom'; - -const DIRECTED_SCROLL_TIMEOUT_MS = 50; - -export enum SelectionDirection { - Top = 'Top', - Bottom = 'Bottom', -} - -export interface ISelection { - rows: { - start: number; - end: number; - }; - fragments: { - start: string; - end: string; - }; -} - -export class Selecting { - private _frame!: Frame; - private _holder!: HTMLElement; - private _service!: Service; - private _progress: boolean = false; - private _directed: { - direction: SelectionDirection; - timer: number; - } = { - direction: SelectionDirection.Bottom, - timer: -1, - }; - private _selection: { - focus: NodeInfo; - anchor: NodeInfo; - start: string | undefined; - end: string | undefined; - } = { - focus: getFocusNodeInfo(), - anchor: getAnchorNodeInfo(), - start: undefined, - end: undefined, - }; - private _subjects: { - from: Subject; - finish: Subject; - } = { - from: new Subject(), - finish: new Subject(), - }; - private _delimiter: string | undefined; - - protected copyRows(rows: string[]): void { - const delimiter = this._delimiter; - if (rows.length === 0) { - return; - } - if (delimiter === undefined) { - navigator.clipboard.writeText(rows.join('\n')); - } else { - const columns = rows.map((r) => r.split(delimiter)); - const widths = new Array(columns[0].length); - columns.forEach((rows: string[]) => { - rows.forEach((r, i) => { - if (widths[i] === undefined) { - widths[i] = 0; - } - widths[i] = Math.max(widths[i], r.length); - }); - }); - const formated = columns.map((rows: string[]) => { - return rows - .map((r, i) => { - const repeat = nums.diffUInts([widths[i], r.length], 0); - return `${r}${' '.repeat(repeat < 0 ? 0 : repeat)}`; - }) - .join(' | '); - }); - navigator.clipboard.writeText(formated.join('\n')); - } - } - - public bind(holder: HTMLElement, frame: Frame, service: Service) { - this._holder = holder; - this._frame = frame; - this._service = service; - } - - public destroy() {} - - public isInProgress(): boolean { - return this._progress; - } - - public restore() { - const getMaxOffset = (node: Node): number => { - if (node.nodeType === Node.TEXT_NODE) { - return node.textContent === null ? 0 : node.textContent.length - 1; - } else if (node.childNodes.length > 0) { - return node.childNodes.length; - } else { - return 0; - } - }; - if (!this.hasSelection()) { - return; - } - const frame = this._frame.get(); - const focus: RestorableNodeInfo | undefined = this._selection.focus.get(); - const anchor: RestorableNodeInfo | undefined = this._selection.anchor.get(); - const selection: Selection | null = document.getSelection(); - if (!focus || !anchor) { - return; - } - if ( - (focus.row < frame.start && anchor.row < frame.start) || - (focus.row > frame.end && anchor.row > frame.end) - ) { - if (selection !== null) { - selection.removeAllRanges(); - } - return; - } - let anchorOffset: number = -1; - let focusOffset: number = -1; - let anchorPath: string = ''; - let focusPath: string = ''; - if (focus.row === anchor.row) { - anchorOffset = anchor.offset; - focusOffset = focus.offset; - anchorPath = anchor.path; - focusPath = focus.path; - } else if (focus.row > anchor.row) { - // Direction: down - anchorOffset = anchor.row < frame.start ? 0 : anchor.offset; - focusOffset = focus.row > frame.end ? Infinity : focus.offset; - anchorPath = - anchor.row < frame.start ? `li[${ROW_INDEX_ATTR}="${frame.start}"]` : anchor.path; - focusPath = focus.row > frame.end ? `li[${ROW_INDEX_ATTR}="${frame.end}"]` : focus.path; - } else if (focus.row < anchor.row) { - // Direction: up - anchorOffset = anchor.row > frame.end ? Infinity : anchor.offset; - focusOffset = focus.row < frame.start ? 0 : focus.offset; - anchorPath = - anchor.row > frame.end ? `li[${ROW_INDEX_ATTR}="${frame.end}"]` : anchor.path; - focusPath = - focus.row < frame.start ? `li[${ROW_INDEX_ATTR}="${frame.start}"]` : focus.path; - } - if (selection === null) { - return; - } - selection.removeAllRanges(); - const anchorNode: Node | null = SelectionNode.select(this._holder, anchorPath); - const focusNode: Node | null = SelectionNode.select(this._holder, focusPath); - if (anchorNode === null || focusNode === null) { - return; - } - if ( - !isFinite(anchorOffset) || - (typeof anchorNode.textContent === 'string' && - anchorNode.textContent.length <= anchorOffset) - ) { - anchorOffset = getMaxOffset(anchorNode); - } - if ( - !isFinite(focusOffset) || - (typeof focusNode.textContent === 'string' && - focusNode.textContent.length <= focusOffset) - ) { - focusOffset = getMaxOffset(focusNode); - } - try { - selection.setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset); - } catch (e) { - let details: string = 'Error with restoring selection:'; - details += `\n\t-\tanchorPath: ${anchorPath}`; - details += `\n\t-\tfocusNode: ${focusPath}`; - if (typeof anchorNode.textContent === 'string') { - details += `\n\t-\t${ - anchorNode.textContent.length <= anchorOffset ? '[WRONG]' : '' - }anchor (${anchorNode.nodeName}): "${anchorNode.textContent}" (${ - anchorNode.textContent.length - }): ${anchorOffset}`; - } - if (typeof focusNode.textContent === 'string') { - details += `\n\t-\t${ - focusNode.textContent.length <= focusOffset ? '[WRONG]' : '' - }focus (${focusNode.nodeName}): "${focusNode.textContent}" (${ - focusNode.textContent.length - }): ${focusOffset}`; - } - details += `\n\t-\terror: ${e instanceof Error ? e.message : e}`; - console.warn(details); - } - } - - public onSelectionStart(handler: () => void): Subscription { - return this._subjects.from.subscribe(handler); - } - - public onSelectionFinish(handler: () => void): Subscription { - return this._subjects.finish.subscribe(handler); - } - - public directed(): { - start(direction: SelectionDirection): void; - next(): void; - finish(): void; - } { - return { - start: (direction: SelectionDirection): void => { - if (!this._progress) { - return; - } - this._directed.direction = direction; - this.directed().next(); - }, - next: (): void => { - if (!this._progress) { - return; - } - clearTimeout(this._directed.timer); - switch (this._directed.direction) { - case SelectionDirection.Top: - this._frame.offsetToByRows(-1, ChangesInitiator.Selecting); - this._selection.focus.setToRow(this._frame.get().start); - break; - case SelectionDirection.Bottom: - this._frame.offsetToByRows(1, ChangesInitiator.Selecting); - this._selection.focus.setToRow(this._frame.get().end); - break; - } - this._holder.focus(); - this._directed.timer = setTimeout(() => { - this.directed().next(); - }, DIRECTED_SCROLL_TIMEOUT_MS) as any; - }, - finish: (): void => { - clearTimeout(this._directed.timer); - this._directed.timer = -1; - }, - }; - } - - public get(): ISelection | string | undefined { - if (this._selection.focus.row === undefined || this._selection.anchor.row === undefined) { - return undefined; - } - if (this._selection.focus.row === this._selection.anchor.row) { - const selection = document.getSelection(); - const output = selection === null ? undefined : selection.toString(); - return output === null ? undefined : output === '' ? undefined : output; - } - if (this._selection.start === undefined || this._selection.end === undefined) { - return undefined; - } - const rows = { - start: Math.min(this._selection.focus.row, this._selection.anchor.row), - end: Math.max(this._selection.focus.row, this._selection.anchor.row), - }; - const fragments = { - start: this._selection.start, - end: this._selection.end, - }; - if (fragments.start !== fragments.end) { - fragments.start === '' && (rows.start += 1); - fragments.end === '' && (rows.end -= 1); - } - return { - rows, - fragments, - }; - } - - public getAsSelection(): ISelection | undefined { - if (this._selection.focus.row === undefined || this._selection.anchor.row === undefined) { - return undefined; - } - const selection: Selection | null = document.getSelection(); - if ( - (this._selection.start === undefined || this._selection.end === undefined) && - selection !== null - ) { - this._selection.start = selection.toString(); - this._selection.end = selection.toString(); - } - if (this._selection.start === undefined || this._selection.end === undefined) { - return undefined; - } - const rows = { - start: Math.min(this._selection.focus.row, this._selection.anchor.row), - end: Math.max(this._selection.focus.row, this._selection.anchor.row), - }; - const fragments = { - start: this._selection.start, - end: this._selection.end, - }; - if (fragments.start !== fragments.end) { - fragments.start === '' && (rows.start += 1); - fragments.end === '' && (rows.end -= 1); - } - return { - rows, - fragments, - }; - } - - public selection(): { exist: boolean; lines: number } { - const selection = this.get(); - if (selection === undefined) { - return { - exist: false, - lines: 0, - }; - } else { - const len = - typeof selection === 'string' ? 1 : selection.rows.end - selection.rows.start + 1; - return { - exist: selection !== undefined, - lines: len < 0 ? 0 : len, - }; - } - } - - public async copyToClipboard(): Promise { - const selection = this.get(); - if (selection === undefined) { - return Promise.resolve(); - } - if (typeof selection === 'string') { - navigator.clipboard.writeText(selection); - return Promise.resolve(); - } - const rows = ( - await this._service.getRows({ start: selection.rows.start, end: selection.rows.end }) - ).rows.map((r) => { - if (this._delimiter === undefined) { - const escaped = escapeAnsi(r.content); - return escaped instanceof Error ? r.content : escaped; - } else { - return r.content; - } - }); - if (rows.length === 0) { - return Promise.resolve(); - } - if (rows.length > 1 && this._delimiter === undefined) { - selection.fragments.start !== '' && (rows[0] = selection.fragments.start); - selection.fragments.end !== '' && (rows[rows.length - 1] = selection.fragments.end); - } - this.copyRows(rows); - } - - public setDelimiter(delimiter: string | undefined): void { - this._delimiter = delimiter; - } - - public drop() { - this._selection = { - focus: getFocusNodeInfo(), - anchor: getAnchorNodeInfo(), - start: undefined, - end: undefined, - }; - const selection: Selection | null = document.getSelection(); - selection && selection.removeAllRanges(); - } - - public hasSelection(): boolean { - return this._selection.focus !== undefined || this._selection.anchor !== undefined; - } - - public start(event: MouseEvent) { - if (event.button !== undefined && event.button !== 0) { - // Context menu call - return; - } - this.drop(); - this._progress = true; - this._holder.focus(); - this._subjects.from.emit(); - } - - public change() { - if (!this._progress) { - return; - } - const selection: Selection | null = document.getSelection(); - if (selection === null) { - return; - } - this._selection.focus.update(selection); - this._selection.anchor.update(selection); - this._detectBorders(selection); - } - - public end(event: MouseEvent) { - if (event.button !== undefined && event.button !== 0) { - // Context menu call - return; - } - if (!this._progress) { - if (!this._isOwnSelection()) { - this._selection = { - focus: getFocusNodeInfo(), - anchor: getAnchorNodeInfo(), - start: undefined, - end: undefined, - }; - } - return; - } - this._progress = false; - this._subjects.finish.emit(); - } - - public check(event: MouseEvent) { - if (!dom.findParentByTag(event.target as HTMLElement, ['app-scrollarea'])) { - return this.drop(); - } - if (!dom.isParent(event.target as HTMLElement, this._holder)) { - return; - } - setTimeout(() => { - if (this._progress) { - return; - } - if (!this.hasSelection()) { - return; - } - this.restore(); - }, 10); - } - - private _detectBorders(selection: Selection): void { - const asText = selection.toString().split(/[\n\r]/gi); - if ( - this._selection.focus.row !== undefined && - this._selection.anchor.row !== undefined && - asText.length > 0 - ) { - if (this._selection.focus.row > this._selection.anchor.row) { - this._selection.end = asText[asText.length - 1]; - if (this._selection.start === undefined) { - this._selection.start = asText[0]; - } - } else if (this._selection.focus.row < this._selection.anchor.row) { - this._selection.start = asText[0]; - if (this._selection.end === undefined) { - this._selection.end = asText[asText.length - 1]; - } - } else if (this._selection.focus.row === this._selection.anchor.row) { - this._selection.start = undefined; - this._selection.end = undefined; - } - } - } - - private _isOwnSelection(): boolean { - const selection: Selection | null = document.getSelection(); - if (selection === null) { - return false; - } - for (let i = 0; i < selection.rangeCount; i += 1) { - try { - if ( - !dom.isParentOf(selection.getRangeAt(i).commonAncestorContainer, this._holder) - ) { - return false; - } - } catch (_e) { - return false; - } - } - return true; - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/controllers/service.ts b/application/client/src/app/ui/elements/scrollarea/controllers/service.ts deleted file mode 100644 index 317d83cfa8..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/controllers/service.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { RowSrc } from '@schema/content/row'; -import { Range } from './range'; -import { Subject, Subscription } from '@platform/env/subscription'; -import { IRange, Range as SafeRange } from '@platform/types/range'; -import { Destroy } from '@platform/types/env/types'; -import { ChangesInitiator, Frame } from './frame'; - -export { Range }; - -export interface IRowsPacket { - range: IRange; - rows: RowSrc[]; -} - -export type CursorCorrectorHandler = () => number; - -export class Service implements Destroy { - public readonly setFrame: (range: SafeRange) => void; - public readonly getLen: () => number; - public readonly getItemHeight: () => number; - public readonly getRows: (range: IRange) => Promise; - - protected frame!: Frame; - protected elRef!: HTMLElement; - - private _focus: boolean = false; - private readonly _subjects: { - rows: Subject; - refresh: Subject; - len: Subject; - bound: Subject; - focus: Subject; - blur: Subject; - } = { - rows: new Subject(), - refresh: new Subject(), - len: new Subject(), - bound: new Subject(), - focus: new Subject(), - blur: new Subject(), - }; - private _cursor: number = 0; - - constructor(api: { - setFrame(range: IRange): void; - getRows(range: IRange): Promise; - getLen(): number; - getItemHeight(): number; - }) { - this.setFrame = (range: SafeRange) => { - api.setFrame(range); - this._cursor = range.start; - }; - this.getLen = api.getLen; - this.getItemHeight = api.getItemHeight; - this.getRows = api.getRows; - } - - public bind(frame: Frame, elRef: HTMLElement) { - this.frame = frame; - this.elRef = elRef; - this._subjects.bound.emit(); - } - - public getFrame(): Frame { - return this.frame; - } - - public destroy() { - this._subjects.rows.destroy(); - this._subjects.len.destroy(); - this._subjects.refresh.destroy(); - this._subjects.bound.destroy(); - this._subjects.focus.destroy(); - this._subjects.blur.destroy(); - } - - public setAdhered(adhered: boolean) { - if (this.frame === undefined) { - console.error(`Attempt to access frame before initialization`); - return; - } - this.frame.setAdhered(adhered); - } - - public setLen(len: number) { - this._subjects.len.emit(len); - } - - public scrollTo(position: number) { - this.frame.moveTo(position, ChangesInitiator.Selecting); - } - - public scrollToBottom() { - this.frame.moveTo(this.getLen() - 1, ChangesInitiator.Selecting); - } - - public scrollToTop() { - this.frame.moveTo(0, ChangesInitiator.Selecting); - } - - public setRows(rows: IRowsPacket) { - this._subjects.rows.emit(rows); - } - - public onRows(handler: (rows: IRowsPacket) => void): Subscription { - return this._subjects.rows.subscribe(handler); - } - - public onBound(handler: () => void): Subscription { - return this._subjects.bound.subscribe(handler); - } - - public onLen(handler: (len: number) => void): Subscription { - return this._subjects.len.subscribe(handler); - } - - public onRefresh(handler: () => void): Subscription { - return this._subjects.refresh.subscribe(handler); - } - - public onFocus(handler: () => void): Subscription { - return this._subjects.focus.subscribe(handler); - } - - public onBlur(handler: () => void): Subscription { - return this._subjects.blur.subscribe(handler); - } - - public getCursor(): number { - return this._cursor; - } - - public refresh(): void { - this._subjects.refresh.emit(); - } - - public focus(): { - get(): boolean; - in(): void; - out(): void; - set(): void; - } { - return { - get: (): boolean => { - return this._focus; - }, - in: (): void => { - if (this._focus) { - return; - } - this._focus = true; - this._subjects.focus.emit(); - }, - out: (): void => { - if (!this._focus) { - return; - } - this._focus = false; - this._subjects.blur.emit(); - }, - set: (): void => { - this.elRef !== undefined && this.elRef.focus(); - }, - }; - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/module.ts b/application/client/src/app/ui/elements/scrollarea/module.ts deleted file mode 100644 index 1d198f5a71..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { ScrollAreaComponent } from './component'; -import { ScrollAreaVerticalComponent } from './vertical/component'; -import { RowModule } from './row/module'; - -export { ScrollAreaComponent }; - -@NgModule({ - imports: [CommonModule, RowModule], - declarations: [ScrollAreaComponent, ScrollAreaVerticalComponent], - exports: [ScrollAreaComponent, RowModule], - bootstrap: [ScrollAreaComponent], -}) -export class ScrollAreaModule {} diff --git a/application/client/src/app/ui/elements/scrollarea/row/columns/cell.ts b/application/client/src/app/ui/elements/scrollarea/row/columns/cell.ts deleted file mode 100644 index 11f4019021..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/columns/cell.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import { Columns } from '@schema/render/columns'; - -export interface Update { - styles(): Update; - content(content: string): Update; - visability(): Update; -} -export class Cell { - public content: string; - public html!: SafeHtml; - public styles: { [key: string]: string } = {}; - public visible: boolean = true; - public readonly index: number; - - private readonly _sanitizer: DomSanitizer; - private readonly _controller: Columns; - - constructor(sanitizer: DomSanitizer, controller: Columns, content: string, index: number) { - this._sanitizer = sanitizer; - this._controller = controller; - this.content = content; - this.index = index; - this.update().content(content).visability().styles(); - } - - public update(): Update { - const update = { - styles: (): Update => { - this.styles = this._controller.style(this.index); - return update; - }, - content: (content: string): Update => { - if (this.content === content && this.html !== undefined) { - return update; - } - this.content = content; - this.html = this._sanitizer.bypassSecurityTrustHtml(content); - return update; - }, - visability: (): Update => { - this.visible = this._controller.visibility(this.index).get(); - return update; - }, - }; - return update; - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/row/columns/component.ts b/application/client/src/app/ui/elements/scrollarea/row/columns/component.ts deleted file mode 100644 index 858ffa39d0..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/columns/component.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - Component, - Input, - ChangeDetectorRef, - AfterContentInit, - HostBinding, - SkipSelf, - ViewEncapsulation, - ChangeDetectionStrategy, -} from '@angular/core'; -import { DomSanitizer } from '@angular/platform-browser'; -import { Row } from '@schema/content/row'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Columns as Controller } from '@schema/render/columns'; -import { Cell } from './cell'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-scrollarea-row-columns', - styleUrls: ['./styles.less'], - templateUrl: './template.html', - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class Columns extends ChangesDetector implements AfterContentInit { - @Input() public row!: Row; - - public cells: Cell[] = []; - public controller!: Controller; - public visible: Cell[] = []; - - private _sanitizer: DomSanitizer; - - constructor( - @SkipSelf() selfCdRef: ChangeDetectorRef, - cdRef: ChangeDetectorRef, - sanitizer: DomSanitizer, - ) { - super([cdRef, selfCdRef]); - this._sanitizer = sanitizer; - } - - @HostBinding('class') classes = 'row'; - @HostBinding('style.background') background = ''; - @HostBinding('style.color') color = ''; - - public ngAfterContentInit(): void { - this.controller = this.row.session.render.getBoundEntity() as Controller; - this.cells = this.row.columns.map((s, i) => { - return new Cell(this._sanitizer, this.controller, s, i); - }); - this.visible = this.cells.filter((c) => c.visible); - this.env().subscriber.register( - this.controller.subjects.get().resized.subscribe((index: number) => { - this.cells[index].update().styles(); - this.detectChanges(); - }), - this.controller.subjects.get().visibility.subscribe((index: number) => { - this.cells[index].update().visability(); - this.visible = this.cells.filter((c) => c.visible); - this.detectChanges(); - }), - this.controller.subjects.get().colorize.subscribe((index: number) => { - this.cells[index].update().styles(); - this.detectChanges(); - }), - this.row.change.subscribe(() => { - this.row.columns.map((s, i) => { - if (this.cells[i] === undefined) { - this.log().error(`Column ${i} doesn't exist`); - return; - } - this.cells[i].update().content(s); - }); - this.background = this.row.background === undefined ? '' : this.row.background; - this.color = this.row.color === undefined ? '' : this.row.color; - this.detectChanges(); - }), - ); - } -} -export interface Columns extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/scrollarea/row/columns/styles.less b/application/client/src/app/ui/elements/scrollarea/row/columns/styles.less deleted file mode 100644 index e118d5e6c0..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/columns/styles.less +++ /dev/null @@ -1,32 +0,0 @@ -@import '../../../../styles/variables.less'; - -app-scrollarea-row-columns { - display: block; - position: relative; - font-family: 'console', monospace; - font-size: 13.5px; - font-variant-numeric: tabular-nums; - padding: 0; - margin: 0; - line-height: 16px; - height: 16px; - max-height: 16px; - color: var(--scheme-color-0); - font-weight: 500; - user-select: text; - cursor: text; - width: 100%; - span.cell { - display: inline-block; - overflow: hidden; - padding: 0 12px; - color: inherit; - border-left: thin solid var(--scheme-color-3); - &:first-child { - border-left: none; - } - } - & * { - user-select: text; - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/scrollarea/row/columns/template.html b/application/client/src/app/ui/elements/scrollarea/row/columns/template.html deleted file mode 100644 index 59506a35c1..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/columns/template.html +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/application/client/src/app/ui/elements/scrollarea/row/component.ts b/application/client/src/app/ui/elements/scrollarea/row/component.ts deleted file mode 100644 index a4c21a0f1a..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/component.ts +++ /dev/null @@ -1,491 +0,0 @@ -import { - Component, - Input, - ChangeDetectorRef, - AfterContentInit, - AfterViewInit, - HostListener, - HostBinding, - ChangeDetectionStrategy, - SkipSelf, - OnDestroy, -} from '@angular/core'; -import { Owner, Row } from '@schema/content/row'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Locker, Level } from '@ui/service/lockers'; -import { getSourceColor } from '@ui/styles/colors'; -import { Notification } from '@ui/service/notifications'; -import { Selecting } from '../controllers/selection'; -import { popup, Vertical, Horizontal } from '@ui/service/popup'; -import { components } from '@env/decorators/initial'; -import { styles } from '@ui/service/styles'; -import { TextExportOptions } from '@platform/types/exporting'; - -import * as dom from '@ui/env/dom'; - -@Component({ - selector: 'app-scrollarea-row', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class RowComponent - extends ChangesDetector - implements AfterContentInit, AfterViewInit, OnDestroy -{ - protected hash!: string; - - @Input() public row!: Row; - @Input() public selecting!: Selecting; - - public render: number = 1; - public bookmarked: boolean = false; - public selected: boolean = false; - public attachment: - | { - name: string; - color: string; - } - | undefined = undefined; - public source: { - color: string | undefined; - } = { - color: undefined, - }; - - @HostBinding('attr.data-selected') get dataSelectedAttr() { - return this.selected; - } - @HostListener('mouseover') onMouseIn() { - this.ilc().emitter.ui.row.hover(this.row); - } - - @HostListener('mouseout', ['$event.target']) onMouseOut() { - this.ilc().emitter.ui.row.hover(undefined); - } - - @HostListener('mouseleave', ['$event.target']) onMouseLeave() { - this.ilc().emitter.ui.row.hover(undefined); - } - - @HostListener('contextmenu', ['$event']) async onContextMenu(event: MouseEvent) { - const isRawAvailable = await this.row.session.exporter.isRawAvailable(); - const confirmToUser = () => { - this.ilc().services.ui.notifications.notify( - new Notification({ message: 'Data has been exported into file', actions: [] }), - ); - }; - const exportSelected = (raw: boolean, opt?: TextExportOptions) => { - const progress = this.ilc().services.ui.lockers.lock( - new Locker(true, 'exporting into file...') - .set() - .group(this.row.session.uuid()) - .end(), - { - closable: false, - }, - ); - this.row.session.exporter - .export(raw, opt) - .stream(this.row.session.selection().ranges()) - .then((filepath: string | undefined) => { - filepath !== undefined && confirmToUser(); - }) - .finally(() => { - progress.popup.close(); - }) - .catch((err: Error) => { - this.log().error(`Fail to export data${raw ? ' (raw)' : ''}: ${err.message}`); - this.ilc().services.ui.lockers.lock( - new Locker(false, err.message).set().type(Level.error).end(), - { - closable: true, - }, - ); - }); - }; - const exportSearch = (raw: boolean, opt?: TextExportOptions) => { - const progress = this.ilc().services.ui.lockers.lock( - new Locker(true, 'exporting into file...') - .set() - .group(this.row.session.uuid()) - .end(), - { - closable: false, - }, - ); - this.row.session.exporter - .export(raw, opt) - .search() - .then((filepath: string | undefined) => { - filepath !== undefined && confirmToUser(); - }) - .finally(() => { - progress.popup.close(); - }) - .catch((err: Error) => { - this.log().error(`Fail to export data${raw ? ' (raw)' : ''}: ${err.message}`); - this.ilc().services.ui.lockers.lock( - new Locker(false, err.message).set().type(Level.error).end(), - { - closable: true, - }, - ); - }); - }; - const items: {}[] = []; - const selectedRowsCount = this.row.session.selection().indexes().length; - const selection = this.selecting.selection(); - const selectionInfo = this.selecting.getAsSelection(); - const ctrl = this.ilc().services.system.env.platform().darwin() ? 'Cmd' : 'Ctrl'; - items.push( - ...[ - { - caption: 'Copy', - disabled: !selection.exist, - shortcut: `${ctrl} + C`, - handler: () => { - this.selecting.copyToClipboard().catch((err: Error) => { - this.log().error(`Fail to copy selection: ${err.message}`); - }); - }, - }, - {}, - { - caption: - selectedRowsCount === 0 - ? 'Unselect All' - : `Unselect ${selectedRowsCount} row${ - selectedRowsCount > 1 ? 's' : '' - }`, - disabled: selectedRowsCount === 0, - handler: () => { - this.row.session.cursor.drop(); - }, - }, - {}, - ...(this.render === 2 - ? [ - { - caption: - selectedRowsCount === 0 - ? 'Export Selected as Table' - : `Export ${selectedRowsCount} row${ - selectedRowsCount > 1 ? 's' : '' - } as Table`, - disabled: selectedRowsCount === 0, - handler: () => { - popup.open({ - component: { - factory: components.get('app-dialogs-columns-selector'), - inputs: { - session: this.row.session, - accept: ( - columns: number[], - delimiter: string | undefined, - ) => { - exportSelected(false, { - columns, - delimiter, - spliter: this.row.session.render.delimiter(), - }); - }, - }, - }, - position: { - vertical: Vertical.center, - horizontal: Horizontal.center, - }, - uuid: 'Selecting columns', - }); - }, - }, - ] - : [ - { - caption: - selectedRowsCount === 0 - ? 'Export Selected' - : `Export ${selectedRowsCount} row${ - selectedRowsCount > 1 ? 's' : '' - } `, - disabled: selectedRowsCount === 0, - handler: () => { - exportSelected(false); - }, - }, - ]), - - { - caption: - selectedRowsCount === 0 - ? 'Export Selected as Raw' - : `Export ${selectedRowsCount} row${ - selectedRowsCount > 1 ? 's' : '' - } as Raw`, - disabled: !isRawAvailable || selectedRowsCount === 0, - handler: () => { - exportSelected(true); - }, - }, - ...(this.row.owner === Owner.Output - ? [ - { - caption: 'Export All', - disabled: this.row.session.stream.len() === 0, - handler: () => { - this.row.session.exporter - .export(true) - .all() - .catch((err: Error) => { - this.log().error(`Fail export session: ${err.message}`); - }); - }, - }, - {}, - { - caption: 'Comment', - disabled: - selectionInfo === undefined || - !this.row.session.comments.isCreatingAvailable(), - handler: () => { - if (selectionInfo === undefined) { - return; - } - this.row.session.comments - .create(selectionInfo) - .catch((err: Error) => { - this.log().error(`Fail to add comment: ${err.message}`); - }); - dom.stop(event); - }, - }, - ] - : []), - ...(this.row.owner === Owner.Search - ? [ - {}, - ...(this.render === 2 - ? [ - { - caption: 'Export All Search Result as Table', - disabled: this.row.session.indexed.len() === 0, - handler: () => { - popup.open({ - component: { - factory: components.get( - 'app-dialogs-columns-selector', - ), - inputs: { - session: this.row.session, - accept: ( - columns: number[], - delimiter: string | undefined, - ) => { - exportSearch(false, { - columns, - delimiter, - spliter: - this.row.session.render.delimiter(), - }); - }, - }, - }, - position: { - vertical: Vertical.center, - horizontal: Horizontal.center, - }, - uuid: 'Selecting columns', - }); - }, - }, - ] - : [ - { - caption: 'Export All Search Result', - disabled: this.row.session.indexed.len() === 0, - handler: () => { - exportSearch(false); - }, - }, - ]), - { - caption: 'Export All Search Result as Raw', - disabled: !isRawAvailable || this.row.session.indexed.len() === 0, - handler: () => { - exportSearch(true); - }, - }, - {}, - { - caption: 'Open Search Result as New Tab', - disabled: this.row.session.indexed.len() === 0, - handler: () => { - const progress = this.ilc().services.ui.lockers.lock( - new Locker(true, 'preparing new session...') - .set() - .group(this.row.session.uuid()) - .end(), - { - closable: false, - }, - ); - this.row.session - .searchResultAsNewSession() - .finally(() => { - progress.popup.close(); - }) - .catch((err: Error) => { - this.log().error( - `Fail to open search result as new session: ${err.message}`, - ); - this.ilc().services.ui.lockers.lock( - new Locker(false, err.message) - .set() - .type(Level.error) - .end(), - { - closable: true, - }, - ); - }); - }, - }, - ] - : []), - ], - ); - this.ilc().emitter.ui.contextmenu.open({ - items, - x: event.x, - y: event.y, - }); - } - - @HostListener('click', ['$event']) onClick(event: PointerEvent) { - this.row.select().toggle(event); - } - - constructor(@SkipSelf() selfCdRef: ChangeDetectorRef, cdRef: ChangeDetectorRef) { - super([selfCdRef, cdRef]); - } - - public ngOnDestroy(): void { - this.row.destroy(); - } - - public ngAfterContentInit(): void { - this.render = this.row.session.render.delimiter() === undefined ? 1 : 2; - this.selecting.setDelimiter(this.row.session.render.delimiter()); - this.env().subscriber.register( - this.row.session.stream.subjects.get().rank.subscribe(() => { - this.update(); - }), - this.row.session.stream.subjects.get().sources.subscribe(() => { - this.update(); - }), - this.row.change.subscribe(this.update.bind(this)), - this.row.session.bookmarks.subjects.get().updated.subscribe(() => { - this.bookmarked = this.row.bookmark().is(); - this.update(); - }), - this.row.session.indexed.subjects.get().changed.subscribe(this.update.bind(this)), - this.row.session.cursor.subjects.get().updated.subscribe(this.update.bind(this)), - this.row.session.cursor.subjects.get().selected.subscribe(this.update.bind(this)), - this.row.change.subscribe(() => { - this.detectChanges(); - }), - ); - this.update(); - } - - public ngAfterViewInit(): void { - this.update(); - } - - public ngGetRankFiller(position: number): string { - return this.row.session.stream.rank.getFiller(position); - } - - public ngGetSignatureWidth(): { [key: string]: string } { - const width = `${this.row.session.stream.rank.width()}px`; - return { - width: width, - minWidth: width, - maxWidth: width, - }; - } - - public onNumberClick() { - this.row.bookmark().toggle(); - } - - public showAttachment() { - if (this.attachment === undefined) { - return; - } - const attachment = this.row.session.attachments.getByPos(this.row.position); - if (attachment === undefined) { - return; - } - const instance = popup.open({ - component: { - factory: components.get('app-views-attachments-preview'), - inputs: { - attachment: attachment, - embedded: false, - close: () => { - instance.close(); - }, - }, - }, - position: { - vertical: Vertical.center, - horizontal: Horizontal.center, - }, - closeOnKey: 'Escape', - uuid: attachment.uuid, - }); - } - - protected update() { - const hash = (): string => { - return `${this.row.session.stream.rank.width()}.${this.bookmarked}.${this.selected}.${ - this.attachment - }.${this.source.color}`; - }; - const prev = this.hash; - this.bookmarked = this.row.bookmark().is(); - if (this.row.session.stream.observe().descriptions.count() > 1) { - this.source.color = getSourceColor(this.row.source); - } else { - this.source.color = undefined; - } - this.selected = this.row.select().is(); - const attachments = this.row.session.attachments; - if (attachments.has(this.row.position)) { - const attachment = attachments.getByPos(this.row.position); - if (attachment !== undefined) { - this.attachment = { - color: - attachment.color === undefined - ? styles.colors().scheme_color_1 - : attachment.color, - name: attachment.name, - }; - } else { - this.attachment = undefined; - } - } else { - this.attachment = undefined; - } - this.hash = hash(); - if (prev !== this.hash) { - this.detectChanges(); - } - } -} -export interface RowComponent extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/scrollarea/row/module.ts b/application/client/src/app/ui/elements/scrollarea/row/module.ts deleted file mode 100644 index f105b666ed..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/module.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ScrollingModule } from '@angular/cdk/scrolling'; -import { MatIconModule } from '@angular/material/icon'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatButtonModule } from '@angular/material/button'; - -import { RowComponent } from './component'; -import { Standard } from './standard/component'; -import { Columns } from './columns/component'; -import { Separator } from './separator/component'; - -import { ContainersModule } from '@elements/containers/module'; - -@NgModule({ - imports: [ - CommonModule, - ScrollingModule, - ContainersModule, - MatIconModule, - MatCheckboxModule, - MatButtonModule, - ], - declarations: [RowComponent, Standard, Columns, Separator], - exports: [RowComponent], - bootstrap: [RowComponent, Standard, Columns, Separator], -}) -export class RowModule {} diff --git a/application/client/src/app/ui/elements/scrollarea/row/separator/component.ts b/application/client/src/app/ui/elements/scrollarea/row/separator/component.ts deleted file mode 100644 index 309bb6c097..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/separator/component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Component, Input, HostBinding } from '@angular/core'; -import { Row } from '@schema/content/row'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { stop } from '@ui/env/dom'; - -@Component({ - selector: 'app-scrollarea-rows-separator', - styleUrls: ['./styles.less'], - templateUrl: './template.html', - standalone: false, -}) -@Ilc() -export class Separator { - @Input() public row!: Row; - - @HostBinding('class') classes = 'row'; - - public before(event: MouseEvent) { - stop(event); - this.row.extending().before(); - } - - public after(event: MouseEvent) { - stop(event); - this.row.extending().after(); - } -} -export interface Separator extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/scrollarea/row/separator/styles.less b/application/client/src/app/ui/elements/scrollarea/row/separator/styles.less deleted file mode 100644 index 67c9b5885e..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/separator/styles.less +++ /dev/null @@ -1,59 +0,0 @@ -@import '../../../../styles/variables.less'; -@import '../../../../styles/support.less'; - -:host { - display: block; - position: relative; - margin: 1px 0; - height: 14px; - max-height: 14px; - color: var(--scheme-color-0); - font-weight: 500; - user-select: none; - padding: 0 32px; - border-radius: 3px; - border: 1px solid var(--scheme-color-4); - left: 32px; - &::after { - position: absolute; - display: block; - width: 100%; - content: ''; - height: 1px; - border-top: thin dashed var(--scheme-color-4); - top: 7px; - left:100%; - } - &::before { - position: absolute; - display: block; - width: 24px; - content: ''; - height: 1px; - border-top: thin dashed var(--scheme-color-4); - top: 7px; - left:-24px; - } - & span.button { - display: inline-block; - position: relative; - font-size: 13px; - line-height: 15px; - padding: 0 32px; - cursor: pointer; - user-select: none; - &.disabled { - color: var(--scheme-color-4); - cursor: default; - } - } - & span.number { - display: inline-block; - position: relative; - font-size: 12px; - line-height: 13px; - font-family: 'primary'; - font-variant-numeric: tabular-nums; - user-select: none; - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/row/separator/template.html b/application/client/src/app/ui/elements/scrollarea/row/separator/template.html deleted file mode 100644 index e378b91f43..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/separator/template.html +++ /dev/null @@ -1,3 +0,0 @@ - -{{row.nature.hidden}} - \ No newline at end of file diff --git a/application/client/src/app/ui/elements/scrollarea/row/standard/component.ts b/application/client/src/app/ui/elements/scrollarea/row/standard/component.ts deleted file mode 100644 index 11c2edda8c..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/standard/component.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { - Component, - Input, - AfterContentInit, - HostBinding, - ChangeDetectionStrategy, - ChangeDetectorRef, - SkipSelf, - ViewEncapsulation, -} from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import { Row } from '@schema/content/row'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-scrollarea-row-standard', - styleUrls: ['./styles.less'], - template: '', - changeDetection: ChangeDetectionStrategy.OnPush, - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class Standard extends ChangesDetector implements AfterContentInit { - @Input() public row!: Row; - - private _sanitizer: DomSanitizer; - private _hash: string = ''; - - constructor(@SkipSelf() selfCdRef: ChangeDetectorRef, sanitizer: DomSanitizer) { - super(selfCdRef); - this._sanitizer = sanitizer; - } - - @HostBinding('class') classes = 'row'; - @HostBinding('style.background') background = ''; - @HostBinding('style.color') color = ''; - @HostBinding('innerHTML') html: SafeHtml | string = ''; - - protected update() { - this.html = this._sanitizer.bypassSecurityTrustHtml(this.row.html); - this.background = this.row.background === undefined ? '' : this.row.background; - this.color = this.row.color === undefined ? '' : this.row.color; - const hash = this.hash(); - this._hash !== hash && this.detectChanges(); - this._hash = hash; - } - - protected hash(): string { - return `${this.html};${this.background};${this.color}`; - } - - public ngAfterContentInit() { - this.update(); - this.env().subscriber.register(this.row.change.subscribe(this.update.bind(this))); - } -} -export interface Standard extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/scrollarea/row/standard/styles.less b/application/client/src/app/ui/elements/scrollarea/row/standard/styles.less deleted file mode 100644 index fb0020d297..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/standard/styles.less +++ /dev/null @@ -1,25 +0,0 @@ -@import '../../../../styles/variables.less'; -@import '../../../../styles/support.less'; - -app-scrollarea-row-standard { - display: inline-block; - position: relative; - font-family: 'console', monospace; - font-size: 13.5px; - font-variant-numeric: tabular-nums; - padding: 0; - margin: 0; - line-height: 16px; - height: 16px; - max-height: 16px; - white-space: pre; - vertical-align: top; - color: var(--scheme-color-0); - font-weight: 500; - user-select: text; - cursor: text; - min-width: 100%; - & * { - user-select: text; - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/row/standard/template.html b/application/client/src/app/ui/elements/scrollarea/row/standard/template.html deleted file mode 100644 index b0dac65653..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/standard/template.html +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/application/client/src/app/ui/elements/scrollarea/row/styles.less b/application/client/src/app/ui/elements/scrollarea/row/styles.less deleted file mode 100644 index f09f8d9e6b..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/styles.less +++ /dev/null @@ -1,317 +0,0 @@ -@import '../../../styles/variables.less'; -@import '../../../styles/support.less'; - -:host { - display: flex; - padding: 0; - margin: 0; - line-height: 16px; - max-height: 16px; - white-space: nowrap; - min-width: 100%; - user-select: text; - cursor: text; - position: relative; - &[data-selected="true"] { - background: var(--scheme-color-4); - } - & span.tooltip { - position: absolute; - display: none; - background: var(--scheme-color-accent); - color: var(--scheme-color-0); - padding: 3px 6px; - border-radius: 2px; - z-index: 10; - margin-top: -28px; - animation: row-tooltip-animation ease-in-out 300ms forwards; - } - &:hover { - & span.tooltip { - display: block; - } - } - &[data-selected="true"] { - & div.signature { - & span.number { - &::before { - position: absolute; - display: block; - content: ''; - top: 6px; - bottom: 0; - left: -8px; - width: 4px; - height: 4px; - border-radius: 2px; - background: var(--scheme-color-accent); - } - } - } - } - & div.signature { - display: inline-block; - position: sticky; - white-space: nowrap; - left:0; - z-index: 1; - background-color: var(--scheme-color-5); - & span.icon{ - position: absolute; - display: inline-block; - right: 3px; - top: -2px; - font-size: 12px; - width: 16px; - height: 16px; - color: var(--scheme-color-0); - cursor: default; - } - & span.next-match-distance { - position: relative; - display: inline-block; - user-select: none; - margin-left: -7px; - & span.codicon { - font-size: 14px; - padding-top: 2px; - color: var(--scheme-color-0); - cursor: default; - &:hover{ - color: var(--scheme-color-accent); - } - } - } - & span.error { - position: absolute; - display: inline-block; - top: 2px; - margin-left: -14px; - color: var(--scheme-color-warning); - font-size: 10px; - line-height: 10px; - } - & span.source-name { - display: inline-block; - position: relative; - font-family: 'console', monospace; - width: 5rem; - overflow: hidden; - line-height: 16px; - height: 16px; - max-height: 16px; - font-size: 10px; - vertical-align: top; - user-select: none; - cursor: pointer; - } - & span.source-alias { - display: inline-block; - position: relative; - width: 4px; - line-height: 16px; - height: 16px; - max-height: 16px; - vertical-align: top; - user-select: none; - cursor: pointer; - &::after { - background: inherit; - position: absolute; - display: block; - height: 100%; - top: 0; - width: 0; - left: 100%; - content: attr(data-source-name); - cursor: default; - overflow: hidden; - z-index: 1; - font-size: 0.8rem; - line-height: 0.9rem; - color: var(--scheme-color-6); - padding: 0 0.5rem; - opacity: 0; - pointer-events: none; - } - &:hover { - &::after { - width: auto; - opacity: 1; - } - } - } - & span.number { - display: inline-block; - position: relative; - font-family: 'console', monospace; - font-variant-numeric: tabular-nums; - line-height: 16px; - height: 16px; - max-height: 16px; - font-size: 10px; - vertical-align: top; - margin: 0 8px; - padding: 0 8px 0 0; - border-right: thin var(--scheme-color-4) solid; - cursor: default; - color: var(--scheme-color-2); - user-select: none; - &[data-bookmarked="true"] { - &::after { - position: absolute; - display: block; - content: ''; - top: 0; - bottom: 0; - right: 0; - width: 4px; - background: var(--scheme-color-accent); - } - &:hover::after { - background: var(--scheme-color-accent-lighten-20); - } - } - & span.filler { - color: var(--scheme-color-4); - font-variant-numeric: inherit; - line-height: inherit; - height: inherit; - max-height: inherit; - font-size: inherit; - font-family: inherit; - user-select: none; - } - & span.range { - position: absolute; - display: block; - height: 100%; - width: 4px; - top: 0; - right: -6px; - border-style: solid; - &.begin { - border-left-width: 2px; - border-top-width: 2px; - border-right: none; - border-bottom: none; - height: 100%; - width: 4px; - top: 50%; - } - &.end { - border-left-width: 2px; - border-bottom-width: 2px; - border-top: none; - border-right: none; - height: 100%; - width: 4px; - top: -50%; - &.nested { - height: 100%; - top: -50%; - } - } - &.middle { - border-left-width: 2px; - border-top: none; - border-right: none; - border-bottom: none; - height: 185%; - top: ~'calc(-50% + 2px);'; - } - &.open { - width: 0; - height: 0; - border-right: none; - border-top: 4px solid transparent; - border-left: 8px solid var(--scheme-color-accent); - border-bottom: 4px solid transparent; - top: 4px; - } - &.opening { - border-width: 0; - border-top: none; - border-right: none; - border-bottom: none; - } - } - &:hover::after { - position: absolute; - display: block; - content: ''; - top: 0; - bottom: 0; - right: 0; - width: 4px; - background: var(--scheme-color-5-darken-5); - } - } - } - &.timeranges { - & div.signature { - & span.number { - padding: 0 16px 0 0; - margin-right: 12px; - } - } - } - &.bookmarked { - & div.signature { - & span.number { - background: var(--scheme-color-warning); - color: var(--scheme-color-7); - &::after { - position: absolute; - display: block; - content: ''; - top: 0; - bottom: 0; - left: -4px; - width: 4px; - background: var(--scheme-color-warning); - } - } - } - } - &.selected { - /*background: var(--scheme-color-3);*/ - &::after { - position: absolute; - content: ''; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: var(--scheme-color-0-fade-35); - pointer-events: none; - } - } - & p.row { - display: inline-block; - position: relative; - padding: 0; - margin: 0; - line-height: 16px; - height: 16px; - max-height: 16px; - white-space: nowrap; - vertical-align: top; - &.pending { - width: 100%; - background: var(--scheme-color-4); - margin-top: 3px; - line-height: 10px; - height: 10px; - max-height: 10px; - } - } - @keyframes row-tooltip-animation { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/row/template.html b/application/client/src/app/ui/elements/scrollarea/row/template.html deleted file mode 100644 index 10a8edbb68..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/row/template.html +++ /dev/null @@ -1,30 +0,0 @@ -
- - - {{ngGetRankFiller(row.position)}}{{row.position}} - - - -
- - - diff --git a/application/client/src/app/ui/elements/scrollarea/styles.less b/application/client/src/app/ui/elements/scrollarea/styles.less deleted file mode 100644 index 902215e001..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/styles.less +++ /dev/null @@ -1,105 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - display: block; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - overflow: hidden; - user-select: none; - outline: none; - & * { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - } - & div.container { - position: absolute; - display: block; - top: 0; - left: 0; - right: 0; - bottom: 0; - overflow-x: auto; - overflow-y: hidden; - &::-webkit-scrollbar:horizontal { - background-color: var(--scheme-color-5-15); - transition: background 250ms; - } - &::-webkit-scrollbar-thumb:horizontal { - background-color: var(--scheme-color-3-15); - transition: background 250ms; - } - &:hover { - &::-webkit-scrollbar:horizontal { - background-color: var(--scheme-color-5); - } - &::-webkit-scrollbar-thumb:horizontal { - background-color: var(--scheme-color-3); - } - } - } - & ul.holder { - position: absolute; - display: block; - width: auto; - list-style: none; - padding: 0 0 16px 0; - margin: 0; - top: 0; - bottom: 0; - left: 0; - user-select: none; - min-width: 100%; - & li { - display: block; - position: relative; - width: auto; - min-width: 100%; - list-style: none; - padding: 0; - margin: 0; - user-select: text; - } - & li[data-on-border="true"] { - &::after { - display: block; - position: absolute; - content: ''; - top: 0; - left: 0; - width: 100%; - border-top: thin dashed; - border-top-color: var(--scheme-color-accent); - } - } - } - & .selection-detector { - position: absolute; - z-index: 1000; - width: 10000px; - height: 0px; - left: 0; - & .selection-detector-filler { - position: fixed; - width: 10000px; - height: 50px; - } - &.top { - top: 0; - & .selection-detector-filler { - position: fixed; - height: 1000px; - margin-top: -1000px; - } - } - &.bottom { - bottom: 8px; - & .selection-detector-filler { - position: fixed; - height: 10000px; - } - } - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/template.html b/application/client/src/app/ui/elements/scrollarea/template.html deleted file mode 100644 index 3d27c92d2e..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/template.html +++ /dev/null @@ -1,31 +0,0 @@ -
-
-
-
-
    -
  • - -
  • -
-
- -
-
-
diff --git a/application/client/src/app/ui/elements/scrollarea/vertical/component.ts b/application/client/src/app/ui/elements/scrollarea/vertical/component.ts deleted file mode 100644 index da134df290..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/vertical/component.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { - Component, - Input, - AfterContentInit, - AfterViewInit, - HostListener, - Output, - EventEmitter, - ElementRef, - ChangeDetectorRef, -} from '@angular/core'; -import { Service } from '../controllers/service'; -import { Holder } from '../controllers/holder'; -import { ChangesInitiator, Frame, PositionEvent } from '../controllers/frame'; -import { LockToken } from '@ui/env/lock.token'; -import { stop } from '@ui/env/dom'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Ilc, IlcInterface } from '@env/decorators/component'; - -const MAX_SCROLL_THUMB_HEIGHT: number = 20; - -@Component({ - selector: 'app-scrollarea-vertical', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class ScrollAreaVerticalComponent - extends ChangesDetector - implements AfterContentInit, AfterViewInit -{ - @Input() public service!: Service; - @Input() public holder!: Holder; - @Input() public frame!: Frame; - - @Output() public scrolling = new EventEmitter(); - - private _height: number = 0; - private _fillerHeight: number = 0; - private _rowsInView: number = 0; - private _scrollEventLockToken: LockToken = new LockToken(-1); - - @HostListener('scroll', ['$event', '$event.target']) onScroll( - _event: MouseEvent, - target: HTMLElement, - ) { - if (this._scrollEventLockToken.isLocked()) { - return; - } - if (this._fillerHeight === 0) { - return; - } - const rate = target.scrollTop / (target.scrollHeight - target.offsetHeight); - const position = Math.round((this.service.getLen() - this._rowsInView) * rate); - this.scrolling.next(position > this.service.getLen() ? this.service.getLen() : position); - } - - @HostListener('mousedown') onMouseDown() { - this._scrollEventLockToken.unlock(); - } - - @HostListener('window:mouseup') onWindowMouseUp() { - this._scrollEventLockToken.lock(); - } - - @HostListener('wheel', ['$event']) onWheel(event: MouseEvent) { - stop(event); - return false; - } - - constructor(cdRef: ChangeDetectorRef, private elRef: ElementRef) { - super(cdRef); - } - - public ngAfterContentInit() { - this._scrollEventLockToken.lock(); - this.env().subscriber.register( - this.service.onLen((_len: number) => { - this._calculate(); - }), - this.holder.onHeightChange((height: number) => { - if (this._height === height) { - return; - } - this._height = height; - this._calculate(); - }), - this.frame.onPositionChange((event: PositionEvent) => { - if ( - event.initiator === ChangesInitiator.Scrolling || - event.initiator === ChangesInitiator.RowsDelivered - ) { - return; - } - this.detectChanges(); - const position = event.range.start / this.service.getLen(); - this.elRef.nativeElement.scrollTop = - this.elRef.nativeElement.scrollHeight * position; - }), - ); - } - - public ngAfterViewInit(): void { - this._calculate(); - } - - public getFillerStyles(): { height: string } { - return { - height: `${this._fillerHeight}px`, - }; - } - - private _calculate() { - const fillerHeight: number = this.service.getLen() * this.service.getItemHeight(); - this._rowsInView = Math.floor(this._height / this.service.getItemHeight()); - if (fillerHeight === 0 || this._height === 0 || this._height > fillerHeight) { - this._fillerHeight = 0; - } else { - const rate: number = this._height / fillerHeight; - const thumb: number = this._height * rate; - if (thumb < MAX_SCROLL_THUMB_HEIGHT) { - this._fillerHeight = this._height / (MAX_SCROLL_THUMB_HEIGHT / this._height); - } else { - this._fillerHeight = fillerHeight; - } - } - this.markChangesForCheck(); - } -} -export interface ScrollAreaVerticalComponent extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/scrollarea/vertical/styles.less b/application/client/src/app/ui/elements/scrollarea/vertical/styles.less deleted file mode 100644 index 6722ffe220..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/vertical/styles.less +++ /dev/null @@ -1,21 +0,0 @@ -@import '../../../styles/variables.less'; -@import '../../../styles/support.less'; - -:host { - display: block; - position: absolute; - top: 0; - right: 0; - bottom: 0; - width: 15px; - overflow-y: auto; - overflow-x: hidden; - z-index: 1; - cursor: default; - background: var(--scheme-color-5); - & div.scrollfiller { - position: relative; - width: 1px; - height: 10000000px; - } -} diff --git a/application/client/src/app/ui/elements/scrollarea/vertical/template.html b/application/client/src/app/ui/elements/scrollarea/vertical/template.html deleted file mode 100644 index 3862842a8f..0000000000 --- a/application/client/src/app/ui/elements/scrollarea/vertical/template.html +++ /dev/null @@ -1 +0,0 @@ -
diff --git a/application/client/src/app/ui/elements/tabs/component.ts b/application/client/src/app/ui/elements/tabs/component.ts deleted file mode 100644 index 49bbf75819..0000000000 --- a/application/client/src/app/ui/elements/tabs/component.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - Component, - Input, - OnDestroy, - AfterViewInit, - ChangeDetectorRef, - OnChanges, - ChangeDetectionStrategy, -} from '@angular/core'; -import { TabsService } from './service'; -import { TabsOptions } from './options'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Subscriber } from '@platform/env/subscription'; - -@Component({ - selector: 'element-tabs', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -export class TabsComponent extends ChangesDetector implements OnDestroy, AfterViewInit, OnChanges { - @Input() public service: TabsService | undefined; - - private _subscriber: Subscriber = new Subscriber(); - - public _options: TabsOptions = new TabsOptions(); - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngAfterViewInit() { - this._subscribe(); - this._getDefaultOptions(); - } - - ngOnDestroy() { - this._subscriber.unsubscribe(); - } - - ngOnChanges() { - this._subscribe(); - this._getDefaultOptions(); - this.detectChanges(); - } - - private _subscribe() { - this._subscriber.unsubscribe(); - if (this.service === undefined) { - return; - } - this._subscriber.register( - this.service.subjects.get().options.subscribe(this._onOptionsUpdated.bind(this)), - ); - } - - private async _getDefaultOptions() { - if (this.service === undefined) { - return; - } - this._options = await this.service.getOptions(); - this.detectChanges(); - } - - private async _onOptionsUpdated(options: TabsOptions) { - if (this.service === undefined) { - return; - } - this._options = await options; - this.detectChanges(); - } -} diff --git a/application/client/src/app/ui/elements/tabs/content/component.ts b/application/client/src/app/ui/elements/tabs/content/component.ts deleted file mode 100644 index 3217a20486..0000000000 --- a/application/client/src/app/ui/elements/tabs/content/component.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { - Component, - Input, - OnDestroy, - ChangeDetectorRef, - AfterViewInit, - OnChanges, - ChangeDetectionStrategy, -} from '@angular/core'; -import { ITab, TabsService } from '../service'; -import { IComponentDesc } from '../../containers/dynamic/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Subscriber } from '@platform/env/subscription'; - -@Component({ - selector: 'lib-complex-tab-content', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -export class TabContentComponent - extends ChangesDetector - implements OnDestroy, AfterViewInit, OnChanges -{ - @Input() public service!: TabsService; - - public _ng_tab: ITab | undefined = undefined; - public _ng_noTabContent: IComponentDesc | undefined; - - private _subscriber: Subscriber = new Subscriber(); - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngAfterViewInit() { - this._apply(); - } - - ngOnDestroy() { - this._subscriber.unsubscribe(); - } - - ngOnChanges() { - this._apply(); - } - - private _subscribe() { - this._subscriber.unsubscribe(); - this._subscriber.register( - this.service.subjects.get().active.subscribe(this.onActiveTabChange.bind(this)), - this.service.subjects.get().removed.subscribe(this.onRemoveTab.bind(this)), - ); - } - - private _apply() { - this._subscribe(); - this._ng_noTabContent = this.service.getOptions().noTabsContent; - this._getDefaultTab(); - } - - private async _getDefaultTab() { - this._ng_tab = await this.service.getActiveTab(); - this.detectChanges(); - } - - private async onActiveTabChange(tab: ITab) { - const _tab = await tab; - if (_tab.active) { - this._ng_tab = _tab; - this._ng_noTabContent = undefined; - } - this.detectChanges(); - } - - private async onRemoveTab() { - if (this.service.getTabs().size !== 0) { - return; - } - this._ng_tab = undefined; - this._ng_noTabContent = this.service.getOptions().noTabsContent; - this.detectChanges(); - } -} diff --git a/application/client/src/app/ui/elements/tabs/content/styles.less b/application/client/src/app/ui/elements/tabs/content/styles.less deleted file mode 100644 index 0f87e850a8..0000000000 --- a/application/client/src/app/ui/elements/tabs/content/styles.less +++ /dev/null @@ -1,7 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - display: block; - background: var(--scheme-color-5); -} diff --git a/application/client/src/app/ui/elements/tabs/content/template.html b/application/client/src/app/ui/elements/tabs/content/template.html deleted file mode 100644 index 79800d7fe1..0000000000 --- a/application/client/src/app/ui/elements/tabs/content/template.html +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/application/client/src/app/ui/elements/tabs/controller.histroy.ts b/application/client/src/app/ui/elements/tabs/controller.histroy.ts deleted file mode 100644 index b3c52e3fe1..0000000000 --- a/application/client/src/app/ui/elements/tabs/controller.histroy.ts +++ /dev/null @@ -1,24 +0,0 @@ -export class ControllerSessionsHistroy { - - private _sessions: string[] = []; - - public add(session: string) { - if (this._sessions[this._sessions.length - 1] === session) { - return; - } - this._sessions.push(session); - } - - public remove(session: string) { - this._sessions = this._sessions.filter((saved: string) => { - return session !== saved; - }); - } - - public getLast(): string | undefined { - if (this._sessions.length === 0) { - return undefined; - } - return this._sessions[this._sessions.length - 1]; - } -} diff --git a/application/client/src/app/ui/elements/tabs/list/component.ts b/application/client/src/app/ui/elements/tabs/list/component.ts deleted file mode 100644 index 5f4816a201..0000000000 --- a/application/client/src/app/ui/elements/tabs/list/component.ts +++ /dev/null @@ -1,255 +0,0 @@ -import { - Component, - OnDestroy, - Input, - AfterViewInit, - ChangeDetectorRef, - ViewChild, - ElementRef, - ViewChildren, - OnChanges, - ChangeDetectionStrategy, -} from '@angular/core'; -import type { QueryList } from '@angular/core'; -import { ITabInternal, TabsService } from '../service'; -import { TabsOptions } from '../options'; -import { stop } from '@ui/env/dom'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Subscriber } from '@platform/env/subscription'; - -@Component({ - selector: 'element-tabs-list', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -export class TabsListComponent - extends ChangesDetector - implements OnDestroy, AfterViewInit, OnChanges -{ - @ViewChild('holdernode', { static: false }) _ng_holderNode!: ElementRef; - @ViewChild('tabsnode', { static: false }) _ng_tabsNode!: ElementRef; - @ViewChild('injectionsnode', { static: false }) _ng_injectionsNode!: ElementRef; - @ViewChildren('tabnode', { read: ElementRef }) _ng_tabsElRegs!: QueryList; - - @Input() public service!: TabsService; - - public _ng_options: TabsOptions = new TabsOptions(); - public _ng_offset: number = 0; - public tabs: ITabInternal[] = []; - - private _subscriber: Subscriber = new Subscriber(); - private _tabs: Map = new Map(); - private _sizes: { - space: number; - holder: number; - tabs: number[]; - first: number; - } = { - space: 0, - holder: 0, - tabs: [], - first: 0, - }; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - this._subscribeToWinEvents(); - } - - ngAfterViewInit() { - this._apply(); - this._onWindowResize(); - } - - ngOnDestroy() { - this._subscriber.unsubscribe(); - this._unsubscribeToWinEvents(); - } - - ngOnChanges() { - this._apply(); - this.detectChanges(); - } - - public _ng_onClick(tabkey: string) { - this.service.setActive(tabkey); - this.detectChanges(); - } - - public _ng_onTabClose(event: MouseEvent, tabkey: string) { - this.service.remove(tabkey); - this.detectChanges(); - return stop(event); - } - - public _ng_isArrowsNeeded(): boolean { - return this._sizes.space < 0; - } - - public _ng_onLeftArrowClick() { - if (this._sizes.first === 0) { - return; - } - let offset = 0; - let start = this._sizes.first; - for (let i = this._sizes.first - 1; i >= 0; i -= 1) { - if (offset + this._sizes.tabs[i] < this._sizes.holder) { - offset += this._sizes.tabs[i]; - start = i; - } - } - offset = 0; - for (let i = 0; i < start; i += 1) { - offset -= this._sizes.tabs[i]; - } - this._sizes.first = start; - this._ng_offset = offset; - this._ng_offset = this._ng_offset > 0 ? 0 : this._ng_offset; - this.detectChanges(); - } - - public _ng_onRightArrowClick() { - let offset = 0; - let hasSpace: boolean = true; - let last: number = this._sizes.first; - for (let i = last, max = this._sizes.tabs.length - 1; i <= max; i += 1) { - if (offset + this._sizes.tabs[i] < this._sizes.holder) { - offset += this._sizes.tabs[i]; - last = i; - } else { - hasSpace = false; - } - } - if (hasSpace) { - return; - } - this._sizes.first = last + (last + 1 <= this._sizes.tabs.length - 1 ? 1 : 0); - this._ng_offset -= offset; - this.detectChanges(); - } - - public _ng_onContextMenu(event: MouseEvent, tab: ITabInternal) { - tab.subjects.onTitleContextMenu.emit(event); - } - - private _apply() { - this._subscriber.unsubscribe(); - this._subscriber.register( - this.service.subjects.get().new.subscribe(this.onNewTab.bind(this)), - this.service.subjects.get().removed.subscribe(this.onRemoveTab.bind(this)), - this.service.subjects.get().active.subscribe(this.onActiveTabChange.bind(this)), - this.service.subjects.get().options.subscribe(this._onOptionsUpdated.bind(this)), - this.service.subjects.get().updated.subscribe(this._onTabUpdated.bind(this)), - ); - this._tabs = this.service.getTabs(); - this.tabs = Array.from(this._tabs.values()); - this._getDefaultOptions(); - } - - private _subscribeToWinEvents() { - this._onWindowResize = this._onWindowResize.bind(this); - window.addEventListener('resize', this._onWindowResize); - } - - private _unsubscribeToWinEvents() { - window.removeEventListener('resize', this._onWindowResize); - } - - private async onNewTab(tab: ITabInternal) { - this._tabs.set(tab.uuid, await tab); - if (tab.unshift === true) { - this.tabs.unshift(tab); - } else { - this.tabs.push(tab); - } - this._calculateSizes().detectChanges(); - } - - private async onRemoveTab(uuid: string) { - this._tabs.delete(uuid); - this.tabs = this.tabs.filter((tab: ITabInternal) => { - return tab.uuid !== uuid; - }); - this._calculateSizes().detectChanges(); - this._checkOffset(); - } - - private async onActiveTabChange(tab: ITabInternal) { - this._tabs.forEach((storedTab: ITabInternal, uuid: string) => { - if (storedTab.uuid !== tab.uuid && storedTab.active) { - storedTab.active = false; - this._tabs.set(uuid, storedTab); - } - if (storedTab.uuid === tab.uuid && !storedTab.active) { - storedTab.active = true; - this._tabs.set(uuid, storedTab); - } - }); - this.detectChanges(); - } - - private async _getDefaultOptions() { - this._ng_options = await this.service.getOptions(); - this.detectChanges(); - } - - private async _onOptionsUpdated(options: TabsOptions) { - this._ng_options = await options; - this._calculateSizes().detectChanges(); - } - - private async _onTabUpdated(tab: ITabInternal) { - this._tabs.set(tab.uuid, tab); - this.tabs = this.tabs.map((storedTab: ITabInternal) => { - if (storedTab.uuid === tab.uuid) { - return tab; - } - return storedTab; - }); - this._calculateSizes().detectChanges(); - } - - private _calculateSizes(): TabsListComponent { - if (this._ng_holderNode === undefined || this._ng_holderNode === null) { - return this; - } - if (this._ng_tabsNode === undefined || this._ng_tabsNode === null) { - return this; - } - const width: number = ( - this._ng_holderNode.nativeElement as HTMLElement - ).getBoundingClientRect().width; - const tabs: number = ( - this._ng_tabsNode.nativeElement as HTMLElement - ).getBoundingClientRect().width; - const injections: number = - this._ng_injectionsNode !== undefined - ? this._ng_injectionsNode !== null - ? (this._ng_injectionsNode.nativeElement as HTMLElement).getBoundingClientRect() - .width - : 0 - : 0; - const space: number = Math.round(width - tabs - injections); - // eslint-disable-next-line no-compare-neg-zero - this._sizes.space = space === -0 ? 0 : space; - this._sizes.holder = width; - this._sizes.tabs = []; - this._ng_tabsElRegs.forEach((tab: ElementRef) => { - this._sizes.tabs.push(tab.nativeElement.getBoundingClientRect().width); - }); - return this; - } - - private _onWindowResize() { - this._calculateSizes(); - this.detectChanges(); - } - - private _checkOffset() { - if (this._sizes.first >= this._sizes.tabs.length) { - this._ng_onLeftArrowClick(); - } - } -} diff --git a/application/client/src/app/ui/elements/tabs/list/styles.less b/application/client/src/app/ui/elements/tabs/list/styles.less deleted file mode 100644 index 2993c092bb..0000000000 --- a/application/client/src/app/ui/elements/tabs/list/styles.less +++ /dev/null @@ -1,265 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: absolute; - display: block; - background: var(--scheme-color-5-lighten-15); - & div.arrow-left { - position: absolute; - background: var(--scheme-color-5-lighten-15); - display: none; - &.top { - display: block; - width: 1rem; - height: 100%; - left: 0; - z-index: 1; - & span { - position: absolute; - display: block; - top: 0; - width: 100%; - left: 0; - padding: 7px 0 0 5px; - color: var(--scheme-color-1); - } - } - } - & div.arrow-right { - position: absolute; - display: none; - background: var(--scheme-color-5-lighten-15); - &.top { - display: block; - width: 1rem; - height: 100%; - right: 0; - z-index: 1; - & span { - position: absolute; - display: block; - top: 0; - width: 100%; - left: 0; - padding: 7px 0 0 5px; - color: var(--scheme-color-1); - } - } - } - & div.wrapper { - position: absolute; - display: block; - height: 100%; - width: 100%; - list-style: none; - padding: 0; - margin: 0; - transition: all 150ms ease-in-out; - & ul.list { - position: absolute; - display: block; - height: 100%; - list-style: none; - padding: 0; - margin: 0; - white-space: nowrap; - box-sizing: content-box !important; - width: auto; - & li.tab { - display: inline-block; - position: relative; - list-style: none; - box-sizing: content-box !important; - cursor: default; - overflow: hidden; - & mat-icon { - color: var(--scheme-color-0); - padding: 3px 6px 3px 2px; - } - & p.title { - display: inline-block; - white-space: nowrap; - color: var(--scheme-color-1); - opacity: 0.5; - max-width: 10rem; - overflow: hidden; - text-overflow: ellipsis; - font-weight: 400; - vertical-align: top; - &.uppercase { - text-transform: uppercase; - font-size: 12px; - } - } - & div.title-injection { - position: relative; - display: inline-block; - padding: 0; - margin: 0; - vertical-align: top; - } - & mat-icon.close { - font-size: 18px; - opacity: 0; - color: var(--scheme-color-3); - vertical-align: top; - &:hover { - color: var(--scheme-color-1); - } - } - &:hover { - & mat-icon.close { - opacity: 1; - } - } - &.active { - box-sizing: content-box !important; - background: var(--scheme-color-5); - &::after { - position: absolute; - display: block; - content: ''; - background: var(--scheme-color-5); - } - & mat-icon.close { - opacity: 1; - } - & p.title { - color: var(--scheme-color-1); - opacity: 1; - } - } - } - &.top { - box-sizing: content-box !important; - &.arrows-offset { - padding: 0 0 0 1rem; - } - & li.tab { - padding: 0; - margin: 0; - height: 100%; - cursor: default; - box-sizing: content-box !important; - & p.title { - padding: 6px 12px; - &.uppercase { - padding: 8px 12px; - } - } - & mat-icon.close { - padding: 7px 0.5rem 0 0; - transition: all 150ms ease-in-out; - transform: translateY(-16px); - vertical-align: top; - } - &:hover { - & mat-icon.close { - transform: translateY(0); - } - } - &.active { - box-sizing: content-box !important; - background: var(--scheme-color-5); - &::after { - width: 100%; - height: 2px; - bottom: -1px; - background: var(--scheme-color-5); - } - & mat-icon.close { - transform: translateY(0); - } - } - } - } - &.left { - white-space: normal; - box-sizing: content-box !important; - & li.tab { - padding: 0; - margin: 0; - height: auto; - cursor: default; - box-sizing: content-box !important; - white-space: nowrap; - width: ~'calc(100% + 6px)'; - & p.title { - padding: 16px 8px 16px 0px; - writing-mode: vertical-rl; - text-orientation: mixed; - transform: rotate(180deg); - &.uppercase { - padding: 16px 9px 16px 0px; - } - } - & mat-icon.close { - display: inline-block; - padding: 0px 0px 0px 0px; - margin: 0px 0px 7px -15px; - vertical-align: bottom; - transition: all 150ms ease-in-out; - transform: translateY(-16px); - pointer-events: none; - } - &:hover { - & mat-icon.close { - transform: translateY(0); - pointer-events: all; - } - } - &.active { - background: var(--scheme-color-5); - &::after { - width: 100%; - height: 2px; - bottom: -1px; - background: var(--scheme-color-5); - } - & mat-icon.close { - transform: translateY(0); - pointer-events: all; - } - } - } - } - } - &.injection { - display: flex; - margin: 0; - padding: 0; - &.top { - flex-flow: row nowrap; - } - &.left { - flex-flow: column nowrap; - } - & ul.list { - display: block; - position: relative; - height: 100%; - margin: 0; - padding: 0; - flex: 1 auto; - order: 1; - width: auto; - &.top { - width: auto; - } - &.left { - height: auto; - } - } - & div.injection { - display: block; - position: relative; - height: 100%; - margin: 0; - padding: 0; - flex: 1 auto; - order: 2; - width: 100%; - } - } - } -} diff --git a/application/client/src/app/ui/elements/tabs/list/template.html b/application/client/src/app/ui/elements/tabs/list/template.html deleted file mode 100644 index 912bc27e91..0000000000 --- a/application/client/src/app/ui/elements/tabs/list/template.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
    -
  • - {{tab.icon}} -

    {{tab.name}}

    -
    - -
    - close -
  • -
-
- -
-
-
- -
-
- -
diff --git a/application/client/src/app/ui/elements/tabs/module.ts b/application/client/src/app/ui/elements/tabs/module.ts deleted file mode 100644 index 8a0721dc71..0000000000 --- a/application/client/src/app/ui/elements/tabs/module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ContainersModule } from '../containers/module'; -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatIconModule } from '@angular/material/icon'; - -import { TabsComponent } from './component'; -import { TabsListComponent } from './list/component'; -import { TabContentComponent } from './content/component'; - -export { TabsComponent, TabsListComponent, TabContentComponent }; - -@NgModule({ - imports: [CommonModule, ContainersModule, MatIconModule], - declarations: [TabsListComponent, TabContentComponent, TabsComponent], - exports: [TabsComponent], -}) -export class TabsModule {} diff --git a/application/client/src/app/ui/elements/tabs/options.ts b/application/client/src/app/ui/elements/tabs/options.ts deleted file mode 100644 index e6b71cbfcf..0000000000 --- a/application/client/src/app/ui/elements/tabs/options.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { IComponentDesc } from '../containers/dynamic/component'; - -export enum ETabsListDirection { - top = 'top', - left = 'left', - right = 'right', - bottom = 'bottom', -} - -export interface IInjections { - bar?: IComponentDesc; -} - -export interface ITabsOptions { - direction?: ETabsListDirection; - minimized?: boolean; - injections?: IInjections; - noTabsContent?: IComponentDesc; -} - -export class TabsOptions { - public direction: ETabsListDirection = ETabsListDirection.top; - public minimized: boolean = false; - public injections: IInjections | undefined; - public noTabsContent: IComponentDesc | undefined; - - constructor(options?: ITabsOptions) { - options = options ? options : {}; - if (options.direction !== void 0) { - this.direction = options.direction; - } - if (options.minimized !== void 0) { - this.minimized = options.minimized; - } - if (options.injections !== void 0) { - this.injections = options.injections; - } - if (options.noTabsContent !== void 0) { - this.noTabsContent = options.noTabsContent; - } - } -} diff --git a/application/client/src/app/ui/elements/tabs/service.ts b/application/client/src/app/ui/elements/tabs/service.ts deleted file mode 100644 index 595f73e7b1..0000000000 --- a/application/client/src/app/ui/elements/tabs/service.ts +++ /dev/null @@ -1,305 +0,0 @@ -import { Subject, Subjects } from '@platform/env/subscription'; -import { TabsOptions, ITabsOptions } from './options'; -import { IComponentDesc } from '../containers/dynamic/component'; -import { ControllerSessionsHistroy } from './controller.histroy'; -import { unique } from '@platform/env/sequence'; -import { setProp, getProp } from '@platform/env/obj'; - -export { ETabsListDirection, TabsOptions } from './options'; - -export interface ITabSubjects { - onTitleContextMenu: Subject; - onBeforeTabRemove: Subject; -} - -export interface ITab { - uuid?: string; - icon?: string; - uppercaseTitle?: boolean; - name: string; - active: boolean; - closable?: boolean; - content?: IComponentDesc; - tabCaptionInjection?: IComponentDesc; -} - -export interface ITabInternal { - uuid: string; - name: string; - uppercaseTitle: boolean; - icon?: string; - active: boolean; - closable: boolean; - subjects: ITabSubjects; - content?: IComponentDesc; - tabCaptionInjection?: IComponentDesc; - unshift: boolean; -} - -export interface ITabAPI { - tabCaptionInjection?: IComponentDesc; - subjects: ITabSubjects; - getGUID: () => string; - close: () => void; - setTitle: (caption: string) => Error | undefined; - getTitle: () => Error | string; -} - -export class TabsService { - public readonly subjects: Subjects<{ - new: Subject; - removed: Subject; - clear: Subject; - active: Subject; - updated: Subject; - options: Subject; - }> = new Subjects({ - new: new Subject(), - removed: new Subject(), - clear: new Subject(), - active: new Subject(), - updated: new Subject(), - options: new Subject(), - }); - - private _tabs: Map = new Map(); - private _options: TabsOptions = new TabsOptions(); - private _history: ControllerSessionsHistroy = new ControllerSessionsHistroy(); - private _uuid: string = unique(); - - constructor(params?: { - tabs?: Map; - options?: TabsOptions; - uuid?: string; - }) { - params = params ? params : {}; - if (params.tabs !== void 0) { - this._tabs = params.tabs; - } - if (params.options !== void 0) { - this._options = params.options; - } - if (typeof params.uuid === 'string' && params.uuid.trim() !== '') { - this._uuid = params.uuid; - } - } - - public destroy() { - this.subjects.destroy(); - } - - public getUuid(): string { - return this._uuid; - } - - public setActive(uuid: string) { - const tab = this._tabs.get(uuid); - if (tab === undefined) { - return; - } - tab.active = true; - this._tabs.set(uuid, tab); - this.subjects.get().active.emit(tab); - this._history.add(uuid); - } - - public next() { - const guids: string[] = Array.from(this._tabs.keys()); - if (guids.length === 0) { - return; - } - const active = this.getActiveTab(); - let curr: number = -1; - if (active !== undefined) { - curr = guids.findIndex((t) => t === active.uuid); - } - if (curr + 1 > guids.length - 1) { - curr = -1; - } - this.setActive(guids[curr + 1]); - } - - public prev() { - const guids: string[] = Array.from(this._tabs.keys()); - if (guids.length === 0) { - return; - } - const active = this.getActiveTab(); - let curr: number = guids.length; - if (active !== undefined) { - curr = guids.findIndex((t) => t === active.uuid); - } - if (curr - 1 < 0) { - curr = guids.length; - } - this.setActive(guids[curr - 1]); - } - - public add(tab: ITab): ITabAPI { - const _tab = this._normalize(tab); - if (_tab === null) { - throw new Error(`Fail to create tab`); - } - this._tabs.set(_tab.uuid, _tab); - this.subjects.get().new.emit(_tab); - if (_tab.active) { - this.setActive(_tab.uuid); - } - return { - tabCaptionInjection: _tab.tabCaptionInjection, - subjects: _tab.subjects, - getGUID: () => _tab.uuid, - close: this.remove.bind(this, _tab.uuid), - setTitle: this.setTitle.bind(this, _tab.uuid), - getTitle: this.getTitle.bind(this, _tab.uuid), - }; - } - - public unshift(tab: ITab) { - const _tab = this._normalize(tab); - if (_tab === null) { - return; - } - _tab.unshift = true; - const tabs: Map = new Map(); - tabs.set(_tab.uuid, _tab); - this._tabs.forEach((t: ITabInternal, k: string) => { - tabs.set(k, t); - }); - this._tabs = tabs; - this.subjects.get().new.emit(_tab); - if (_tab.active) { - this.setActive(_tab.uuid); - } - } - - public remove(uuid: string): Error | undefined { - const tab = this._tabs.get(uuid); - if (tab === undefined) { - return new Error(`Tab "${uuid}" isn't found.`); - } - if ( - tab.content !== undefined && - tab.content.inputs !== undefined && - tab.content.inputs.onBeforeTabRemove !== undefined - ) { - (tab.content.inputs.onBeforeTabRemove as Subject).emit(); - } - this._tabs.delete(uuid); - this._history.remove(uuid); - this.subjects.get().removed.emit(uuid); - if (tab.active && this._tabs.size > 0) { - const last: string | undefined = this._history.getLast(); - if (last === undefined) { - const next = this._tabs.values().next().value; - next !== undefined && this.setActive(next.uuid); - } else { - this.setActive(last); - } - } - return undefined; - } - - public has(uuid: string): boolean { - let result: boolean = false; - this._tabs.forEach((tab) => { - if (tab.uuid === uuid) { - result = true; - } - }); - return result; - } - - public getTabs(): Map { - return this._tabs; - } - - public getOptions(): TabsOptions { - return this._options; - } - - public setOptions(options: TabsOptions): void { - this._options = options; - this.subjects.get().options.emit(this._options); - } - - public updateOptions(options: ITabsOptions): boolean { - if (typeof options !== 'object' || options === null) { - return false; - } - Object.keys(options).forEach((key: string) => { - setProp(this._options, key, getProp(options, key)); - }); - this.subjects.get().options.emit(this._options); - return true; - } - - public getActiveTab(): ITabInternal | undefined { - let active: ITabInternal | undefined; - this._tabs.forEach((tab: ITabInternal) => { - if (active !== undefined) { - return; - } - if (tab.active) { - active = tab; - } - }); - return active; - } - - public clear() { - this._tabs.clear(); - this.subjects.get().clear.emit(); - } - - public setTitle(uuid: string, title: string): Error | undefined { - const tab: ITabInternal | undefined = this._tabs.get(uuid); - if (tab === undefined) { - return new Error(`Fail to find tab "${uuid}", tab doesn't exist.`); - } - tab.name = title; - this._tabs.set(uuid, tab); - this.subjects.get().updated.emit(tab); - return undefined; - } - - public getTitle(uuid: string): Error | string { - const tab: ITabInternal | undefined = this._tabs.get(uuid); - if (tab === undefined) { - return new Error(`Fail to find tab "${uuid}", tab doesn't exist.`); - } - return tab.name; - } - - public getServiceGuid(): string { - return this._uuid; - } - - private _normalize(tab: ITab): ITabInternal | null { - if (typeof tab !== 'object' || tab === null) { - return null; - } - const _tab: ITabInternal = tab as ITabInternal; - _tab.uuid = - typeof _tab.uuid === 'string' - ? _tab.uuid.trim() !== '' - ? _tab.uuid - : unique() - : unique(); - _tab.closable = typeof _tab.closable === 'boolean' ? _tab.closable : true; - _tab.unshift = false; - _tab.uppercaseTitle = tab.uppercaseTitle === undefined ? false : tab.uppercaseTitle; - _tab.subjects = { - onTitleContextMenu: new Subject(), - onBeforeTabRemove: new Subject(), - }; - if (_tab.content !== undefined) { - if (typeof _tab.content.inputs !== 'object' || _tab.content.inputs === null) { - _tab.content.inputs = {}; - } - _tab.content.inputs.onBeforeTabRemove = _tab.subjects.onBeforeTabRemove; - _tab.content.inputs.onTitleContextMenu = _tab.subjects.onTitleContextMenu; - } - return _tab; - } -} diff --git a/application/client/src/app/ui/elements/tabs/styles.less b/application/client/src/app/ui/elements/tabs/styles.less deleted file mode 100644 index e0ba2473b8..0000000000 --- a/application/client/src/app/ui/elements/tabs/styles.less +++ /dev/null @@ -1,63 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - position: absolute; - display: block; - background: var(--scheme-color-4); - & element-tabs-list { - position: absolute; - overflow: hidden; - &.top { - left: 0; - right: 0; - top: 0; - height: @tabs-list-height; - } - &.bottom { - left: 0; - right: 0; - top: 0; - width: @tabs-list-height; - } - &.left { - left: 0; - top: 0; - bottom: 0; - width: @tabs-list-height; - } - &.right { - top: 0; - right: 0; - bottom: 0; - width: @tabs-list-height; - } - } - & lib-complex-tab-content { - position: absolute; - overflow: hidden; - &.top { - left: 0; - right: 0; - top: @tabs-list-height; - bottom: 0; - } - &.bottom { - left: 0; - right: 0; - bottom: @tabs-list-height; - top: 0; - } - &.left { - top: 0; - right: 0; - left: @tabs-list-height; - bottom: 0; - } - &.right { - top: 0; - left: 0; - right: @tabs-list-height; - bottom: 0; - } - } -} diff --git a/application/client/src/app/ui/elements/tabs/template.html b/application/client/src/app/ui/elements/tabs/template.html deleted file mode 100644 index e7cc8cdb12..0000000000 --- a/application/client/src/app/ui/elements/tabs/template.html +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/application/client/src/app/ui/elements/teamwork/component.ts b/application/client/src/app/ui/elements/teamwork/component.ts deleted file mode 100644 index 566f91ef43..0000000000 --- a/application/client/src/app/ui/elements/teamwork/component.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Component, Input, AfterContentInit, ChangeDetectorRef } from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { GitHubRepo } from '@platform/types/github'; -import { FileMetaData } from '@platform/types/github/filemetadata'; -import { MatSelectChange } from '@angular/material/select'; - -@Component({ - selector: 'app-views-teamwork-applet', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class Teamwork extends ChangesDetector implements AfterContentInit { - @Input() session!: Session; - - protected reload() { - this.repos = this.session.teamwork.repo().list(); - this.active = this.session.teamwork.repo().getActive(); - this.selected = this.active === undefined ? 0 : this.active; - this.remote = this.session.teamwork.md().getIfDifferentToLocal(); - this.detectChanges(); - } - public repos: GitHubRepo[] = []; - public active: GitHubRepo | undefined = undefined; - public selected: GitHubRepo | number = 0; - public remote: FileMetaData | undefined; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.reload(); - this.env().subscriber.register( - this.session.teamwork.subjects.get().active.subscribe(() => { - this.reload(); - this.detectChanges(); - }), - ); - this.env().subscriber.register( - this.session.teamwork.subjects.get().loaded.subscribe(() => { - this.reload(); - this.detectChanges(); - }), - ); - this.env().subscriber.register( - this.session.teamwork.subjects.get().metadata.subscribe(() => { - this.reload(); - this.detectChanges(); - }), - ); - } - - public onSelectionChange(event: MatSelectChange) { - if (event.value === 0) { - this.selected = 0; - this.session.teamwork.repo().setActive(undefined); - } else { - this.selected = event.value; - this.session.teamwork.repo().setActive(event.value); - } - this.detectChanges(); - } - - public openManager() { - this.session.switch().sidebar.teamwork(); - } - - public reloadRemote() { - this.session.teamwork.update(); - } - public importRemote() { - this.session.teamwork - .md() - .importFromRemote() - .then(() => { - this.reload(); - }) - .catch((err: Error) => { - this.log().error(`Fail to import from remote: ${err.message}`); - }); - } -} -export interface Teamwork extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/teamwork/module.ts b/application/client/src/app/ui/elements/teamwork/module.ts deleted file mode 100644 index 1a9ce5faa6..0000000000 --- a/application/client/src/app/ui/elements/teamwork/module.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ContainersModule } from '@elements/containers/module'; -import { MatButtonModule } from '@angular/material/button'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { Teamwork } from './component'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - MatFormFieldModule, - MatSelectModule, - MatExpansionModule, - MatButtonModule, - FormsModule, - ReactiveFormsModule, - ], - declarations: [Teamwork], - exports: [Teamwork], -}) -export class TeamworkAppletModule {} diff --git a/application/client/src/app/ui/elements/teamwork/styles.less b/application/client/src/app/ui/elements/teamwork/styles.less deleted file mode 100644 index 35ce7b1146..0000000000 --- a/application/client/src/app/ui/elements/teamwork/styles.less +++ /dev/null @@ -1,45 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0 0 24px 0; - overflow: hidden; - outline: none; - & div.remote { - max-height: 250px; - overflow-x: hidden; - overflow-y: auto; - & ul { - list-style: none; - margin: 4px 0 8px 0; - & > li { - display: flex; - flex-direction: row; - align-items: center; - & > span.color { - position: relative; - display: block; - height: 16px; - width: 8px; - } - & > span.label { - padding-left: 8px; - } - } - } - } - & div.controlls{ - position: relative; - width: 100%; - overflow: hidden; - text-align: right; - white-space: nowrap; - height: auto; - & button { - margin-left: 8px; - } - } - -} diff --git a/application/client/src/app/ui/elements/teamwork/template.html b/application/client/src/app/ui/elements/teamwork/template.html deleted file mode 100644 index d792f156d7..0000000000 --- a/application/client/src/app/ui/elements/teamwork/template.html +++ /dev/null @@ -1,57 +0,0 @@ - - - Teamwork - Available {{repos.length}} repositories - -
-

List of remotes

- - - Do not share; use locally - - {{repo.owner}}/{{repo.repo}}:{{repo.branch}} - - - -
-

Available on remote

- -

Filters ({{remote.def.filters.length}}):

-
    -
  • - - - {{filter.filter.filter}} -
  • -
-
- -

Charts ({{remote.def.charts.length}}):

-
    -
  • - - {{chart.filter}} -
  • -
-
- -

Bookmarks ({{remote.def.bookmarks.length}}):

-
    -
  • - line: {{bookmark.position}} -
  • -
-
-
-
- - - -
-
-
diff --git a/application/client/src/app/ui/elements/timezones/component.ts b/application/client/src/app/ui/elements/timezones/component.ts deleted file mode 100644 index 813ff613e4..0000000000 --- a/application/client/src/app/ui/elements/timezones/component.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - ViewEncapsulation, - ViewChild, - AfterViewInit, -} from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Timezone } from './timezone'; -import { State } from './state'; -import { Initial } from '@env/decorators/initial'; -import { HiddenFilter } from '@elements/filter.hidden/component'; - -@Component({ - selector: 'app-elements-timezone-selector', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Initial() -@Ilc() -export class ElementsTimezoneSelector extends ChangesDetector implements AfterViewInit { - @Input() public selected!: (timezone: Timezone) => void; - @Input() public close!: () => void; - - @ViewChild('filter') filter!: HiddenFilter; - - public state: State; - - constructor(cdRef: ChangeDetectorRef, private _sanitizer: DomSanitizer) { - super(cdRef); - this.state = new State(); - } - - public ngAfterViewInit(): void { - this.env().subscriber.register( - this.filter.filter.subjects.get().change.subscribe((value: string) => { - this.state.update(value); - this.detectChanges(); - }), - ); - this.env().subscriber.register( - this.filter.filter.subjects.get().drop.subscribe(() => { - this.state.update(''); - this.detectChanges(); - }), - ); - } - - public ngOnSelect(timezine: Timezone) { - this.selected(timezine); - this.close(); - } - - public safeHtml(html: string): SafeHtml { - return this._sanitizer.bypassSecurityTrustHtml(html); - } - - public timezones(): Timezone[] { - return this.state.timezones.filter((t) => !t.hidden()); - } -} -export interface ElementsTimezoneSelector extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/timezones/module.ts b/application/client/src/app/ui/elements/timezones/module.ts deleted file mode 100644 index 1c35147632..0000000000 --- a/application/client/src/app/ui/elements/timezones/module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ElementsTimezoneSelector } from './component'; -import { HiddenFilterModule } from '@elements/filter.hidden/module'; - -@NgModule({ - imports: [CommonModule, HiddenFilterModule], - declarations: [ElementsTimezoneSelector], - exports: [ElementsTimezoneSelector], - bootstrap: [ElementsTimezoneSelector] -}) -export class TimezoneSelectorModule {} diff --git a/application/client/src/app/ui/elements/timezones/state.ts b/application/client/src/app/ui/elements/timezones/state.ts deleted file mode 100644 index 36f7dd5997..0000000000 --- a/application/client/src/app/ui/elements/timezones/state.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Timezone } from '@elements/timezones/timezone'; -import { Holder } from '@module/matcher'; - -import * as moment_timezone from 'moment-timezone'; - -let cache: Timezone[] | undefined; - -export class State extends Holder { - public timezones: Timezone[] = []; - - constructor() { - super(); - const now = new Date(); - const utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth()); - if (cache !== undefined) { - this.timezones = cache; - } else { - this.timezones = moment_timezone.tz - .names() - .map((tzName: string) => { - const zone = moment_timezone.tz.zone(tzName); - if (zone === null) { - return undefined; - } else { - const offset = zone.utcOffset(utc); - return new Timezone( - tzName, - `${offset === 0 ? '' : offset > 0 ? '-' : '+'}${Math.abs(offset) / 60}`, - offset, - this.matcher, - ); - } - }) - .filter((t) => t !== undefined) as Timezone[]; - this.timezones.unshift(new Timezone('UTC', '', 0, this.matcher)); - cache = this.timezones; - } - } - - public update(value: string): void { - this.matcher.search(value); - this.timezones = this.timezones.sort( - (a: Timezone, b: Timezone) => b.getScore() - a.getScore(), - ); - } -} diff --git a/application/client/src/app/ui/elements/timezones/styles.less b/application/client/src/app/ui/elements/timezones/styles.less deleted file mode 100644 index 5369741bc9..0000000000 --- a/application/client/src/app/ui/elements/timezones/styles.less +++ /dev/null @@ -1,45 +0,0 @@ -@import '../../../ui/styles/variables.less'; - - -app-elements-timezone-selector { - position: relative; - display: block; - width: 100%; - height: 100%; - p.timezone { - display: flex; - position: relative; - flex-direction: row; - padding: 6px 12px; - font-size: 15px; - color: var(--scheme-color-2); - &:hover { - background-color: var(--scheme-color-4); - } - & span.spacer { - flex: auto; - margin: 0 12px; - } - & span.utc{ - color: var(--scheme-color-0); - } - & span.name, - & span.utc{ - & > span { - background-color: var(--scheme-color-3); - color: var(--scheme-color-0); - } - } - } - & div.filter { - position: absolute; - z-index: 1000; - padding: 6px 12px; - background: var(--scheme-color-warning-light); - top: 6px; - right: 6px; - box-shadow: 3px 3px 3px rgb(0 0 0 / 40%); - border-radius: 3px; - } - -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/timezones/template.html b/application/client/src/app/ui/elements/timezones/template.html deleted file mode 100644 index 8decb9e2f9..0000000000 --- a/application/client/src/app/ui/elements/timezones/template.html +++ /dev/null @@ -1,6 +0,0 @@ - -

- - - -

diff --git a/application/client/src/app/ui/elements/timezones/timezone.ts b/application/client/src/app/ui/elements/timezones/timezone.ts deleted file mode 100644 index 54c46c9169..0000000000 --- a/application/client/src/app/ui/elements/timezones/timezone.ts +++ /dev/null @@ -1,52 +0,0 @@ -import * as moment_timezone from 'moment-timezone'; -import * as wasm from '@loader/wasm'; - -import { Matchee } from '@module/matcher'; - -export class Timezone extends Matchee { - public readonly name: string; - public readonly utc: string; - public readonly offset: number; - - static matcher: wasm.Matcher; - - constructor(name: string, utc: string, offset: number, matcher: wasm.Matcher) { - super(matcher, { name: name, utc: utc }); - Timezone.matcher = matcher; - this.name = name; - this.utc = utc; - this.offset = offset; - } - - static from(tz: string): Timezone | Error { - const now = new Date(); - const utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth()); - const zone = moment_timezone.tz.zone(tz); - if (zone === null) { - return new Error(`Fail to create timezone from "${tz}"`); - } - const offset = zone.utcOffset(utc); - return new Timezone( - tz, - `${offset === 0 ? '' : offset > 0 ? '-' : '+'}${Math.abs(offset) / 60}`, - offset, - Timezone.matcher !== undefined ? Timezone.matcher : wasm.Matcher.new(), - ); - } - - public hidden(): boolean { - return this.getScore() === 0; - } - - public get html(): { - name: string; - utc: string; - } { - const name: string | undefined = this.getHtmlOf('html_name'); - const utc: string | undefined = this.getHtmlOf('html_utc'); - return { - name: name === undefined ? this.name : name, - utc: utc === undefined ? this.utc : utc, - }; - } -} diff --git a/application/client/src/app/ui/elements/tooltip/component.ts b/application/client/src/app/ui/elements/tooltip/component.ts deleted file mode 100644 index ba9ac439de..0000000000 --- a/application/client/src/app/ui/elements/tooltip/component.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - Component, - Input, - OnDestroy, - ChangeDetectorRef, - AfterViewInit, - TemplateRef, -} from '@angular/core'; - -@Component({ - selector: 'app-com-tooltip', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -export class ComTooltipComponent implements OnDestroy, AfterViewInit { - @Input() public appTooltipText!: string; - @Input() public appTooltipContent!: TemplateRef; - @Input() public appTooltipRefreshRate: number | undefined; - - private _refreshTimer: any; - - constructor(private _cdRef: ChangeDetectorRef) { - this._update = this._update.bind(this); - } - - public ngOnDestroy() { - clearTimeout(this._refreshTimer); - } - - public ngAfterViewInit() { - if ( - typeof this.appTooltipRefreshRate === 'number' && - !isNaN(this.appTooltipRefreshRate) && - isFinite(this.appTooltipRefreshRate) - ) { - this._update(); - } - } - - private _update() { - this._cdRef.detectChanges(); - this._refreshTimer = setTimeout(this._update, this.appTooltipRefreshRate); - } -} diff --git a/application/client/src/app/ui/elements/tooltip/styles.less b/application/client/src/app/ui/elements/tooltip/styles.less deleted file mode 100644 index bf62c12a9e..0000000000 --- a/application/client/src/app/ui/elements/tooltip/styles.less +++ /dev/null @@ -1,9 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - position: relative; - display: block; - background: var(--scheme-color-4); - border-radius: 2px; - padding: 6px; -} diff --git a/application/client/src/app/ui/elements/tooltip/template.html b/application/client/src/app/ui/elements/tooltip/template.html deleted file mode 100644 index 31a4adc140..0000000000 --- a/application/client/src/app/ui/elements/tooltip/template.html +++ /dev/null @@ -1,5 +0,0 @@ - - {{appTooltipText}} - - - \ No newline at end of file diff --git a/application/client/src/app/ui/elements/tree/component.ts b/application/client/src/app/ui/elements/tree/component.ts deleted file mode 100644 index c6c3b1ae81..0000000000 --- a/application/client/src/app/ui/elements/tree/component.ts +++ /dev/null @@ -1,245 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterViewInit, - AfterContentInit, - ViewEncapsulation, - ViewChild, - ElementRef, -} from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from './state'; -import { Initial } from '@env/decorators/initial'; -import { stop } from '@ui/env/dom'; - -import * as Scheme from './scheme'; -import * as Factory from '@platform/types/observe/factory'; - -@Component({ - selector: 'app-elements-tree', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Initial() -@Ilc() -export class ElementsTreeSelector - extends ChangesDetector - implements AfterViewInit, AfterContentInit -{ - @ViewChild('container') container!: ElementRef; - - public state: State; - private init!: Promise; - - constructor( - cdRef: ChangeDetectorRef, - private _sanitizer: DomSanitizer, - ) { - super(cdRef); - this.state = new State(this); - } - - public ngAfterContentInit(): void { - this.init = this.state.init(this.ilc().services).catch((err: Error) => { - this.log().error(`Fail to init folder's tree state: ${err.message}`); - }); - } - - public ngAfterViewInit(): void { - this.state.bind(this.container.nativeElement); - this.init.then(() => { - this.state.expand(); - }); - } - - public safeHtml(html: string): SafeHtml { - return this._sanitizer.bypassSecurityTrustHtml(html); - } - - public hasChild(_: number, _nodeData: Scheme.DynamicFlatNode): boolean { - return _nodeData.expandable; - } - - public ngItemContextMenu(event: MouseEvent, entity: Scheme.Entity) { - if (entity.favourite) { - this.ilc().emitter.ui.contextmenu.open({ - items: [ - { - caption: 'Delete from favourites', - handler: () => { - this.state.removePlace(entity); - this.detectChanges(); - }, - }, - ], - x: event.x, - y: event.y, - }); - return; - } - if (entity.isFolder()) { - this.ilc().emitter.ui.contextmenu.open({ - items: [ - { - caption: 'Add to favourites', - handler: () => { - this.ilc() - .services.system.favorites.places() - .add(entity.getPath()) - .then(() => { - this.detectChanges(); - }) - .catch((err: Error) => { - this.log().error( - `Fail to add place into favorites: ${err.message}`, - ); - }); - }, - }, - ], - x: event.x, - y: event.y, - }); - return; - } - this.ilc().emitter.ui.contextmenu.open({ - items: [ - { - caption: 'Open as text', - handler: () => { - this.ilc() - .services.system.session.initialize() - .observe( - new Factory.File() - .type(Factory.FileType.Text) - .asText() - .file(entity.getPath()) - .get(), - ) - .catch((err: Error) => { - this.log().error(`Fail to open text file; error: ${err.message}`); - }); - }, - }, - { - caption: 'Open as DLT', - handler: () => { - this.ilc() - .services.system.session.initialize() - .observe( - new Factory.File() - .asDlt() - .type(Factory.FileType.Binary) - .file(entity.getPath()) - .get(), - ) - .catch((err: Error) => { - this.log().error(`Fail to open dlt file; error: ${err.message}`); - }); - }, - }, - { - caption: 'Open as PcapNG', - handler: () => { - this.ilc() - .services.system.session.initialize() - .observe( - new Factory.File() - .type(Factory.FileType.PcapNG) - .asDlt() - .file(entity.getPath()) - .get(), - ) - .catch((err: Error) => { - this.log().error(`Fail to open pcapng file; error: ${err.message}`); - }); - }, - }, - { - caption: 'Open as PcapN', - handler: () => { - this.ilc() - .services.system.session.initialize() - .observe( - new Factory.File() - .type(Factory.FileType.PcapLegacy) - .asDlt() - .file(entity.getPath()) - .get(), - ) - .catch((err: Error) => { - this.log().error(`Fail to open pcapng file; error: ${err.message}`); - }); - }, - }, - { - caption: 'Open with parser plugins', - handler: () => { - this.ilc() - .services.system.session.initialize() - .observe( - new Factory.File() - .type(Factory.FileType.ParserPlugin) - .asParserPlugin() - .file(entity.getPath()) - .get(), - ) - .catch((err: Error) => { - this.log().error( - `Fail to open file with plugins: errord ${err.message}`, - ); - }); - }, - }, - ], - x: event.x, - y: event.y, - }); - } - - public onDefaultAction(entity: Scheme.Entity) { - if (entity.isFolder()) { - return; - } - this.ilc() - .services.system.session.initialize() - .suggest(entity.getPath()) - .catch((err: Error) => { - this.log().error(`Fail open file: ${entity.getPath()}: ${err.message}`); - }); - } - - public onScrolling(event: Event) { - stop(event as MouseEvent); - return false; - } - - public add() { - this.ilc() - .services.system.favorites.places() - .selectAndAdd() - .then(() => { - this.detectChanges(); - }) - .catch((err: Error) => { - this.log().error(`Fail to add place into favorites: ${err.message}`); - }); - } - - public reload() { - this.state - .reload() - .then(() => { - this.detectChanges(); - this.state.expand(); - }) - .catch((err: Error) => { - this.log().error(`Fail to reload favorites places: ${err.message}`); - }); - } -} -export interface ElementsTreeSelector extends IlcInterface {} diff --git a/application/client/src/app/ui/elements/tree/entity.ts b/application/client/src/app/ui/elements/tree/entity.ts deleted file mode 100644 index 9499f44cc8..0000000000 --- a/application/client/src/app/ui/elements/tree/entity.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { Filter } from '@elements/filter/filter'; -import { getDomSanitizer } from '@ui/env/globals'; -import { SafeHtml } from '@angular/platform-browser'; -import { fromStr, serialize } from '@platform/env/regex'; -import { getFileExtention } from '@platform/types/files'; -import { FolderEntity, FolderEntityType } from '@platform/types/bindings'; - -const EXTENTION_PATTERN = /^\*\.|^\./gi; - -export class Entity { - public readonly entity: FolderEntity; - public readonly parent: string; - public ext: string | undefined; - public selected: boolean = false; - public favourite: boolean = false; - public expanded: boolean = false; - public exists: boolean = false; - - protected readonly filter: Filter; - - constructor( - entity: FolderEntity, - parent: string, - favourite: boolean, - exists: boolean, - filter: Filter, - ) { - this.entity = entity; - this.parent = parent; - this.favourite = favourite; - this.exists = exists; - this.filter = filter; - if (entity.details) { - this.ext = entity.details.ext.toUpperCase().replace('.', ''); - } - } - - public getPath(): string { - return `${this.parent}${this.parent === '' ? '' : '/'}${this.entity.name}`; - } - - public isFolder(): boolean { - return this.entity.kind === FolderEntityType.Directory; - } - - public getName(): string { - return this.entity.name; - } - - public getExtention(): string { - return getFileExtention(this.entity.name); - } - - public selecting(): { - select(): void; - unselect(): void; - } { - return { - select: (): void => { - this.selected = true; - }, - unselect: (): void => { - this.selected = false; - }, - }; - } - - public isVisible(): boolean { - if (this.expanded) { - return true; - } - const value = this.filter.value(); - if (value === undefined) { - return true; - } - const filter = value.toLowerCase(); - if (filter.trim() === '') { - return true; - } - if (this.isExtentionSearch(filter)) { - const extention = this.getExtention(); - if (extention.trim() === '') { - return true; - } - return ( - this.getExtention() - .toLowerCase() - .indexOf(serialize(filter.replace(EXTENTION_PATTERN, ''))) !== -1 - ); - } else { - return this.getName().toLowerCase().indexOf(serialize(filter)) !== -1; - } - } - - public html(): SafeHtml { - const name = this.getName(); - const value = this.filter.value(); - if (value === undefined) { - return getDomSanitizer().bypassSecurityTrustHtml(name); - } - const filter = value.toLowerCase(); - if (filter.trim() === '') { - return getDomSanitizer().bypassSecurityTrustHtml(name); - } - if (this.isExtentionSearch(filter)) { - const extention = this.getExtention(); - if (extention.trim() === '') { - return getDomSanitizer().bypassSecurityTrustHtml(name); - } - const regexp = fromStr(serialize(filter.replace(EXTENTION_PATTERN, ''))); - if (regexp instanceof Error) { - return getDomSanitizer().bypassSecurityTrustHtml(name); - } - const regexpExt = fromStr(serialize(`.${extention}`) + '$'); - if (regexpExt instanceof Error) { - return getDomSanitizer().bypassSecurityTrustHtml(name); - } - const match = extention.match(regexp); - if (match === null) { - return getDomSanitizer().bypassSecurityTrustHtml(name); - } - let html = extention; - match.forEach((m) => { - html = html.replace(m, `${m}`); - }); - return getDomSanitizer().bypassSecurityTrustHtml(name.replace(regexpExt, `.${html}`)); - } else { - const regexp = fromStr(filter); - if (regexp instanceof Error) { - return getDomSanitizer().bypassSecurityTrustHtml(name); - } - const match = name.match(regexp); - if (match === null) { - return getDomSanitizer().bypassSecurityTrustHtml(name); - } - let html = name; - match.forEach((m) => { - html = html.replace(m, `${m}`); - }); - return getDomSanitizer().bypassSecurityTrustHtml(html); - } - } - - protected isExtentionSearch(filter: string): boolean { - return filter.startsWith('.') || filter.startsWith('*.'); - } -} diff --git a/application/client/src/app/ui/elements/tree/module.ts b/application/client/src/app/ui/elements/tree/module.ts deleted file mode 100644 index 68e9df68c0..0000000000 --- a/application/client/src/app/ui/elements/tree/module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatTreeModule } from '@angular/material/tree'; -import { CdkTreeModule } from '@angular/cdk/tree'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { FilterInputModule } from '@elements/filter/module'; - -import { ElementsTreeSelector } from './component'; - -import { InputListenerDirective } from '@ui/env/directives/input'; - -@NgModule({ - imports: [ - CommonModule, - MatTreeModule, - CdkTreeModule, - MatProgressBarModule, - MatButtonModule, - MatIconModule, - FilterInputModule, - MatProgressSpinnerModule, - ], - declarations: [ElementsTreeSelector, InputListenerDirective], - exports: [ElementsTreeSelector], - bootstrap: [ElementsTreeSelector], -}) -export class TreeModule {} diff --git a/application/client/src/app/ui/elements/tree/scheme.ts b/application/client/src/app/ui/elements/tree/scheme.ts deleted file mode 100644 index 53a59b8675..0000000000 --- a/application/client/src/app/ui/elements/tree/scheme.ts +++ /dev/null @@ -1,274 +0,0 @@ -import { CollectionViewer, SelectionChange, DataSource } from '@angular/cdk/collections'; -import { FlatTreeControl } from '@angular/cdk/tree'; -import { BehaviorSubject, merge, Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { Entity } from './entity'; -import { Services } from '@service/ilc/services'; -import { Filter } from '@elements/filter/filter'; -import { FavoritePlace } from '@service/favorites'; -import { IlcInterface } from '@service/ilc'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { FolderEntityType } from '@platform/types/bindings'; - -export { Entity }; - -type ExpandedCallback = () => void; - -const DEFAULT_LEN = 10000; - -export class DynamicFlatNode { - protected expandedCallback: ExpandedCallback | undefined; - - constructor( - public item: Entity, - public level = 1, - public expandable = false, - public isLoading = false, - ) {} - - public onExpanded(cb: ExpandedCallback) { - this.expandedCallback = cb; - } - - public afterExpanded() { - if (this.expandedCallback === undefined) { - return; - } - const cb = this.expandedCallback; - this.expandedCallback = undefined; - cb(); - } - - public isVisible(): boolean { - return this.item.isVisible(); - } -} - -export class DynamicDatabase { - public readonly structure = new Map(); - public roots: FavoritePlace[] = []; - - protected readonly services: Services; - protected readonly filter: Filter; - protected source!: DynamicDataSource; - - constructor(services: Services, filter: Filter) { - this.services = services; - this.filter = filter; - } - - public destroy() { - this.roots = []; - this.structure.clear(); - } - - public bind(source: DynamicDataSource) { - this.source = source; - } - - public initialData(): DynamicFlatNode[] { - return this.roots.map( - (root: FavoritePlace) => - new DynamicFlatNode( - new Entity( - { - name: root.path, - fullname: root.path, - kind: FolderEntityType.Directory, - details: null, - }, - '', - true, - root.exists, - this.filter, - ), - 0, - root.exists, - ), - ); - } - - public overwrite(roots: FavoritePlace[]) { - this.roots = roots; - this.source.data = this.initialData(); - } - - public getChildren(path: string): Promise { - const entities = this.structure.get(path); - if (entities !== undefined) { - return Promise.resolve(entities); - } - return new Promise((resolve, reject) => { - this.services.system.bridge - .files() - .ls({ paths: [path], depth: 1, max: DEFAULT_LEN }) - .then((data) => { - const sub = data.entities.map( - (entity) => new Entity(entity, path, false, true, this.filter), - ); - sub.sort((a) => { - return a.isFolder() ? -1 : 1; - }); - this.structure.set(path, sub); - resolve(sub); - }) - .catch(reject); - }); - } - - public isExpandable(path: string): boolean { - return this.structure.has(path); - } - - public isEmpty(): boolean { - return this.roots.length === 0; - } -} - -export type OnToggleHandler = (entity: Entity, expand: boolean) => void; - -export class DynamicDataSource implements DataSource { - public readonly dataChange = new BehaviorSubject([]); - - protected readonly treeControl: FlatTreeControl; - protected readonly database: DynamicDatabase; - protected readonly onToggle: OnToggleHandler; - protected readonly ilc: IlcInterface & ChangesDetector; - - get data(): DynamicFlatNode[] { - return this.dataChange.value; - } - set data(value: DynamicFlatNode[]) { - this.treeControl.dataNodes = value; - this.dataChange.next(value); - } - - constructor( - treeControl: FlatTreeControl, - database: DynamicDatabase, - onToggle: OnToggleHandler, - ilc: IlcInterface & ChangesDetector, - ) { - this.treeControl = treeControl; - this.database = database; - this.onToggle = onToggle; - this.ilc = ilc; - } - - public connect(collectionViewer: CollectionViewer): Observable { - this.treeControl.expansionModel.changed.subscribe((change) => { - if ( - (change as SelectionChange).added || - (change as SelectionChange).removed - ) { - this.handleTreeControl(change as SelectionChange); - } - }); - return merge(collectionViewer.viewChange, this.dataChange).pipe(map(() => this.data)); - } - - public disconnect(_collectionViewer: CollectionViewer): void { - this.database.destroy(); - } - - public handleTreeControl(change: SelectionChange) { - if (change.added) { - change.added.forEach((node) => this.toggleNode(node, true)); - } - if (change.removed) { - change.removed - .slice() - .reverse() - .forEach((node) => this.toggleNode(node, false)); - } - } - - public expandByPath(path: string): Promise { - const node = this.getByPath(path); - if (node === undefined) { - return Promise.resolve(); - } - return new Promise((resolve) => { - let isResolved = false; - const done = () => { - clearTimeout(timeout); - if (isResolved) { - return; - } - isResolved = true; - resolve(); - }; - const timeout = setTimeout(() => { - // We are using timeout to prevent dead promisses - done(); - }, 5000); - node.onExpanded(() => { - done(); - }); - this.treeControl.expand(node); - }); - } - - public async expand(paths: string[] | DynamicFlatNode): Promise { - if (paths instanceof Array) { - for (const path of paths) { - await this.expandByPath(path); - } - } else { - this.treeControl.expand(paths); - } - return Promise.resolve(); - } - - public getByPath(path: string): DynamicFlatNode | undefined { - return this.data.find((e) => e.item.getPath() == path); - } - - public toggleNode(node: DynamicFlatNode, expand: boolean): Promise { - const index = this.data.indexOf(node); - if (index < 0 || !node.item.exists) { - // If no children, or cannot find the node, no op - node.afterExpanded(); - return Promise.resolve(); - } - this.onToggle(node.item, expand); - node.item.expanded = expand; - return new Promise((resolve, _reject) => { - node.isLoading = true; - this.database - .getChildren(node.item.getPath()) - .then((entries: Entity[]) => { - if (expand) { - const nodes = entries.map( - (entity) => - new DynamicFlatNode(entity, node.level + 1, entity.isFolder()), - ); - this.data.splice(index + 1, 0, ...nodes); - } else { - let count = 0; - for ( - let i = index + 1; - i < this.data.length && this.data[i].level > node.level; - i++, count++ - ) { - // Counting - } - this.data.splice(index + 1, count); - } - // notify the change - this.dataChange.next(this.data); - }) - .catch((err: Error) => { - this.ilc - .log() - .error(`Unexpected error with getting childs for tree: ${err.message}`); - }) - .finally(() => { - node.isLoading = false; - node.afterExpanded(); - this.ilc.detectChanges(); - resolve(); - }); - }); - } -} diff --git a/application/client/src/app/ui/elements/tree/state.ts b/application/client/src/app/ui/elements/tree/state.ts deleted file mode 100644 index fe9f3cfc7f..0000000000 --- a/application/client/src/app/ui/elements/tree/state.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { FlatTreeControl } from '@angular/cdk/tree'; -import { Services } from '@service/ilc'; -import { Filter } from '@elements/filter/filter'; -import { IlcInterface } from '@service/ilc'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { favorites, FavoritePlace } from '@service/favorites'; -import { Subscription } from '@platform/env/subscription'; - -import * as Scheme from './scheme'; - -export class State { - public filter: Filter; - public favorites: FavoritePlace[] = []; - public scheme!: { - db: Scheme.DynamicDatabase; - tree: FlatTreeControl; - source: Scheme.DynamicDataSource; - }; - protected ilc: IlcInterface & ChangesDetector; - protected focused: boolean = false; - - constructor(ilc: IlcInterface & ChangesDetector) { - this.ilc = ilc; - this.filter = new Filter(ilc, { - clearOnEnter: true, - clearOnEscape: true, - placeholder: 'Files filter', - }); - this.filter.subjects.get().change.subscribe((_path: string) => { - ilc.detectChanges(); - }); - ilc.env().subscriber.register( - ilc - .ilc() - .services.ui.listener.listen( - 'keydown', - window, - (event: KeyboardEvent) => { - if (!this.focused) { - return true; - } - const count = this.scheme.source.data.length; - const selected = this.scheme.source.data.findIndex((d) => d.item.selected); - if (selected === -1) { - if (count > 0) { - this.scheme.source.data[0].item.selecting().select(); - } - return true; - } - const selectedRef = this.scheme.source.data[selected]; - const nextRef = this.scheme.source.data[selected + 1]; - const prevRef = this.scheme.source.data[selected - 1]; - if (event.key === 'ArrowDown' && nextRef !== undefined) { - selectedRef.item.selecting().unselect(); - nextRef.item.selecting().select(); - } else if (event.key === 'ArrowUp' && prevRef !== undefined) { - selectedRef.item.selecting().unselect(); - prevRef.item.selecting().select(); - } else if (event.key === ' ') { - if (selectedRef.expandable) { - this.scheme.source.expand(selectedRef); - } - } - if (event.key === 'ArrowDown' || event.key === 'ArrowUp') { - ilc.detectChanges(); - this._scrollIntoView(); - return false; - } - ilc.detectChanges(); - return true; - }, - ), - ); - } - - public async init(services: Services): Promise { - const db = new Scheme.DynamicDatabase(services, this.filter); - const tree = new FlatTreeControl( - (node: Scheme.DynamicFlatNode) => node.level, - (node: Scheme.DynamicFlatNode) => node.expandable, - ); - const source = new Scheme.DynamicDataSource( - tree, - db, - (entity: Scheme.Entity, expanded: boolean) => { - (() => { - if (expanded) { - return favorites.expanded().add(entity.getPath(), entity.parent); - } else { - return favorites.expanded().remove(entity.getPath()); - } - })().catch((err: Error) => { - this.ilc.log().error(`Fail to update state of folder's tree: ${err.message}`); - }); - }, - this.ilc, - ); - db.bind(source); - source.data = db.initialData(); - this.scheme = { db, tree, source }; - await this.reload(); - this.ilc.env().subscriber.register( - favorites.updates.get().list.subscribe(() => { - favorites - .places() - .get() - .then((places) => { - this.favorites = places; - this.scheme.db.overwrite(this.favorites.slice()); - }) - .catch((err: Error) => { - this.ilc.log().error(`Fail to get favorites places list: ${err.message}`); - }) - .finally(() => { - this.ilc.detectChanges(); - }); - }), - ); - } - - public bind(container: HTMLElement): void { - this.focus = this.focus.bind(this); - this.blur = this.blur.bind(this); - container.addEventListener('focus', this.focus); - container.addEventListener('blur', this.blur); - this.ilc.env().subscriber.register( - new Subscription('container_focus_listener', () => { - container.removeEventListener('focus', this.focus); - container.removeEventListener('blur', this.blur); - }), - ); - } - - public async reload(): Promise { - this.favorites = await favorites.places().get(); - this.scheme.db.overwrite(this.favorites.slice()); - if (this.scheme.source.data.length > 0) { - this.scheme.source.data[0].item.selecting().select(); - } - this.ilc.detectChanges(); - } - - public expand() { - this.scheme.source.expand(favorites.states.map((v) => v.path)); - } - - public focus(): void { - this.focused = true; - } - - public blur(): void { - this.focused = false; - } - - public select(node: Scheme.DynamicFlatNode) { - const selected = this.scheme.source.data.find((d) => d.item.selected); - if (selected !== undefined) { - selected.item.selecting().unselect(); - } - node.item.selecting().select(); - this.ilc.detectChanges(); - } - - public removePlace(entity: Scheme.Entity) { - const path = entity.getPath(); - favorites - .places() - .remove(path) - .catch((err: Error) => { - this.ilc.log().error(`Fail to add favorites: ${err.message}`); - }); - } - - public isEmpty(): boolean { - return this.scheme.db.isEmpty(); - } - - private _scrollIntoView() { - const nodes = document.querySelectorAll(`mat-tree-node[data-selected="true"]`); - if (nodes.length === 0) { - return; - } - nodes.forEach((node: Element) => { - (node as HTMLElement).scrollIntoView({ - behavior: 'auto', - block: 'nearest', - inline: 'nearest', - }); - }); - } -} diff --git a/application/client/src/app/ui/elements/tree/styles.less b/application/client/src/app/ui/elements/tree/styles.less deleted file mode 100644 index 7c206eaa71..0000000000 --- a/application/client/src/app/ui/elements/tree/styles.less +++ /dev/null @@ -1,139 +0,0 @@ -@import '../../styles/variables.less'; - -app-elements-tree { - position: relative; - display: block; - width: 100%; - height: 100%; - div.greeting { - padding: 12px; - & p { - color: var(--scheme-color-1); - } - & div.buttons { - padding-top: 12px; - text-align: center; - & button { - color: var(--scheme-color-0); - } - } - } - div.controls { - position: absolute; - display: flex; - flex-direction: row; - top: 0; - left: 0; - height: 32px; - width: ~"calc(100% - 2px)"; - & app-filter-input { - margin-left: 12px; - flex: auto; - } - & span.small-icon-button { - padding-top: 4px; - margin: 4px 0px 0 6px; - } - & span.small-icon-button:last-child { - margin-right: 6px; - } - } - div.tree { - position: absolute; - top:32px; - left:0; - width: ~"calc(100% - 22px)"; - padding: 0 11px; - bottom: 0; - overflow-y:auto; - overflow-x: hidden; - outline: none; - & mat-tree { - background: none; - padding-left: 4px; - & button[disabled="true"] { - display: none; - } - } - & mat-tree-node { - position: relative; - min-height: 18px; - border: solid thin rgba(0,0,0,0); - z-index: 0; - &[data-selected="true"] { - &:after { - position: absolute; - content: ''; - display: block; - width: 2px; - height: 100%; - right: 0; - top:0; - background: var(--scheme-color-active); - } - } - &[data-exists="false"] { - color: var(--scheme-color-4); - } - &:hover { - &:before { - position: absolute; - content: ''; - display: block; - width: ~"calc(100% + 36px)"; - height: 100%; - left: -16px; - top:0; - background: var(--scheme-color-hover); - z-index: -1; - } - } - & button { - line-height: 16px!important; - width: 16px!important; - height: 16px!important; - padding: 0!important; - overflow: hidden; - margin-left: -8px; - margin-right: 4px; - } - & mat-icon { - height: 16px; - width: 16px; - line-height: 16px; - font-size: 16px; - } - & mat-progress-bar { - position: absolute; - height: 2px; - bottom: 0; - } - & span.name { - position: relative; - white-space: nowrap; - display: flex; - overflow: hidden; - text-overflow: ellipsis; - align-items: center; - & > span { - overflow: hidden; - text-overflow: ellipsis; - } - & span.ext { - margin-right: 6px; - color: var(--scheme-color-2); - flex: none; - font-size: 10px; - line-height: 10px; - height: 10px; - font-weight: 500; - margin-left: 12px; - } - & span.match { - background: var(--scheme-color-active); - } - } - } - } - -} \ No newline at end of file diff --git a/application/client/src/app/ui/elements/tree/template.html b/application/client/src/app/ui/elements/tree/template.html deleted file mode 100644 index d67730a3d6..0000000000 --- a/application/client/src/app/ui/elements/tree/template.html +++ /dev/null @@ -1,48 +0,0 @@ -
- - - -
-
-
-

You can add some locations to your favorites. It will give you a way to quickly browse files from these locations.

-
- -
-
- - - - - {{node.item.ext}} - - - - - - - - - - - -
\ No newline at end of file diff --git a/application/client/src/app/ui/env/directives/contextmenu.trigger.ts b/application/client/src/app/ui/env/directives/contextmenu.trigger.ts deleted file mode 100644 index f7e1670a64..0000000000 --- a/application/client/src/app/ui/env/directives/contextmenu.trigger.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { AfterViewInit, Directive, OnDestroy, HostListener, Input } from '@angular/core'; - -@Directive({ - selector: '[appContextMenuTrigger]', - standalone: false, -}) -export class ContextMenuTriggerDirective implements AfterViewInit, OnDestroy { - @Input() public menu!: string; - private _menuRef!: HTMLElement; - private _position: - | { - x: number; - y: number; - } - | undefined; - - constructor() { - // private _hostElement: ElementRef - this._mouseup = this._mouseup.bind(this); - window.addEventListener('mouseup', this._mouseup); - } - - @HostListener('contexmenu', ['$event']) _contexmenu(event: MouseEvent) { - this._position = { x: event.x, y: event.y }; - } - - public ngAfterViewInit() { - // (this._hostElement.nativeElement as HTMLElement).focus(); - } - - public ngOnDestroy(): void { - window.removeEventListener('mouseup', this._mouseup); - } - - private _mouseup(event: MouseEvent) { - this._position = undefined; - console.log(event); - } -} diff --git a/application/client/src/app/ui/env/directives/dragdrop.file.ts b/application/client/src/app/ui/env/directives/dragdrop.file.ts deleted file mode 100644 index bb528ff5b7..0000000000 --- a/application/client/src/app/ui/env/directives/dragdrop.file.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Directive, OnDestroy, Output, EventEmitter, ElementRef } from '@angular/core'; -import { bridge } from '@service/bridge'; -import { File as OwnFileDef } from '@platform/types/files'; -import { stop } from '@ui/env/dom'; - -// Property 'path' exists, but it doesn't a part of specification -export interface GlobalFileDef extends File { - path: string; -} - -@Directive({ - selector: '[appMatDragDropFileFeature]', - standalone: false, -}) -export class MatDragDropFileFeatureDirective implements OnDestroy { - @Output() dropped: EventEmitter = new EventEmitter(); - - protected drop(event: DragEvent): void { - stop(event); - const files: string[] = this.getFiles(event); - if (files.length === 0) { - return; - } - bridge - .files() - .getByPath(files) - .then((files) => { - this.dropped.emit(files); - }); - } - - protected stop(event: MouseEvent): boolean { - return stop(event); - } - - protected getFiles(event: DragEvent): string[] { - if (event.dataTransfer === null || event.dataTransfer === undefined) { - return []; - } - const files = (() => { - if (event.dataTransfer.files) { - return Array.from(event.dataTransfer.files).map((f) => - window.electron.webUtils.getPathForFile(f), - ); - } else if (event.dataTransfer.items) { - return ( - Array.from(event.dataTransfer.items) - .map((item: DataTransferItem) => { - if (item.kind === 'file') { - return item.getAsFile(); - } else { - return undefined; - } - }) - .filter((f) => f !== undefined) as File[] - ).map((f) => window.electron.webUtils.getPathForFile(f)); - } else { - return []; - } - })(); - return files; - } - - constructor(protected readonly element: ElementRef) { - // Note: The files property of DataTransfer objects can only be accessed from within - // the drop event. For all other events, the files property will be empty - because - // its underlying data store will be in a protected mode. - // https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/files - // - // Using of @HostBinding doesn't work always smooth and looks like - // "protected mode" is a reason. - // - // That's why we are binding event's handlers directly to DOM elements - this.stop = this.stop.bind(this); - this.drop = this.drop.bind(this); - this.element.nativeElement.addEventListener('dragover', this.stop); - this.element.nativeElement.addEventListener('dragleave', this.stop); - this.element.nativeElement.addEventListener('drop', this.drop); - } - - public ngOnDestroy(): void { - this.element.nativeElement.removeEventListener('dragover', this.stop); - this.element.nativeElement.removeEventListener('dragleave', this.stop); - this.element.nativeElement.removeEventListener('drop', this.drop); - } -} diff --git a/application/client/src/app/ui/env/directives/dragging.ts b/application/client/src/app/ui/env/directives/dragging.ts deleted file mode 100644 index c435bc3a76..0000000000 --- a/application/client/src/app/ui/env/directives/dragging.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { - AfterViewInit, - Directive, - ElementRef, - OnDestroy, - HostListener, - Input, - Output, - EventEmitter, -} from '@angular/core'; -import { stop } from '@ui/env/dom'; - -export interface ChangeEvent { - top: number; - left: number; -} -@Directive({ - selector: '[appDragging]', - standalone: false, -}) -export class DraggingDirective implements AfterViewInit, OnDestroy { - @Input() public min: { - top: number; - left: number; - } = { - top: 0, - left: 0, - }; - - @Input() public max: { - top: number; - left: number; - } = { - top: 0, - left: 0, - }; - @Input() public top!: number; - @Input() public left!: number; - @Output() changed = new EventEmitter(); - - protected readonly position: { - top: number; - left: number; - } = { - top: -1, - left: -1, - }; - - constructor(private _hostElement: ElementRef) { - this._mousemove = this._mousemove.bind(this); - this._mouseup = this._mouseup.bind(this); - window.addEventListener('mousemove', this._mousemove); - window.addEventListener('mouseup', this._mouseup); - } - - @HostListener('mousedown', ['$event']) _mousedown(event: MouseEvent) { - this.position.top = event.y; - this.position.left = event.x; - } - - public ngAfterViewInit() { - (this._hostElement.nativeElement as HTMLElement).focus(); - } - - public ngOnDestroy(): void { - window.removeEventListener('mousemove', this._mousemove); - window.removeEventListener('mouseup', this._mouseup); - } - - private _mousemove(event: MouseEvent) { - if (this.position.top === -1 || this.position.left === -1) { - return; - } - const diff = { - left: event.x - this.position.left, - top: event.y - this.position.top, - }; - this.top += diff.top; - this.left += diff.left; - if (this.top > this.max.top && this.max.top !== -1) { - this.top = this.max.top; - } else if (this.top < this.min.top && this.min.top !== -1) { - this.top = this.min.top; - } - if (this.left > this.max.left && this.max.left !== -1) { - this.left = this.max.left; - } else if (this.left < this.min.left && this.min.left !== -1) { - this.left = this.min.left; - } - this.position.top = event.y; - this.position.left = event.x; - stop(event); - this.changed.emit({ top: this.top, left: this.left }); - } - - private _mouseup(event: MouseEvent) { - this._mousemove(event); - this.position.top = -1; - this.position.left = -1; - } -} diff --git a/application/client/src/app/ui/env/directives/input.ts b/application/client/src/app/ui/env/directives/input.ts deleted file mode 100644 index 2af1b472dd..0000000000 --- a/application/client/src/app/ui/env/directives/input.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Directive, HostListener } from '@angular/core'; -import { ilc, Emitter } from '@service/ilc'; -import { scope } from '@platform/env/scope'; - -@Directive({ - selector: '[appInputListener]', - exportAs: 'appInputListener', - standalone: false, -}) -export class InputListenerDirective { - private _emitter: Emitter; - - @HostListener('focus') focus() { - this._emitter.ui.input.focused(); - } - - @HostListener('blur') blur() { - this._emitter.ui.input.blur(); - } - - constructor() { - this._emitter = ilc.emitter('appInputListener', scope.getLogger('appInputListener')); - } -} diff --git a/application/client/src/app/ui/env/directives/material.dragdrop.ts b/application/client/src/app/ui/env/directives/material.dragdrop.ts deleted file mode 100644 index 4f554fb604..0000000000 --- a/application/client/src/app/ui/env/directives/material.dragdrop.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { Directive, OnDestroy, HostListener } from '@angular/core'; -import { CdkDragRelease, CdkDragMove } from '@angular/cdk/drag-drop'; -import { getPropByPath } from '@platform/env/obj'; -import { scope } from '@platform/env/scope'; - -@Directive({ - selector: '[appMatDragDropResetFeature]', - exportAs: 'appMatDragDropResetFeatureRef', - standalone: false, -}) -export class MatDragDropResetFeatureDirective implements OnDestroy { - private _anchor: HTMLElement | undefined; - private _logger = scope.getLogger('DragDropDir'); - private _timer: any; - - @HostListener('cdkDragMoved', ['$event']) _cdkDragMoved(event: CdkDragMove) { - if (this._anchor !== undefined) { - return; - } - const placeholder: HTMLElement | undefined = this._getPlaceholder(event); - if (placeholder === undefined || placeholder.parentElement === null) { - return; - } - this._anchor = this._getAnchor(); - placeholder.parentElement.insertBefore(this._anchor, placeholder); - } - - @HostListener('cdkDragReleased', ['$event']) _cdkDragReleased() { - this._timer = setTimeout(this._dropAnchor.bind(this), 250); - } - - public ngOnDestroy() { - clearTimeout(this._timer); - this._dropAnchor(); - } - - public reset(event: CdkDragRelease): Error | undefined { - if (this._anchor === undefined) { - return new Error( - this._logger.warn(`Anchor isn't created, even cdkDragReleased is triggered.`), - ); - } - const placeholder: HTMLElement | undefined = this._getPlaceholder(event); - if (placeholder === undefined || this._anchor.parentNode === null) { - this._dropAnchor(); - return new Error(this._logger.warn(`Fail to find placeholder on cdkDragReleased`)); - } - this._anchor.parentNode.insertBefore(placeholder, this._anchor); - placeholder.style.transform = ''; - this._dropAnchor(); - return undefined; - } - - private _getPlaceholder(event: CdkDragMove | CdkDragRelease): HTMLElement | undefined { - const placeholder: HTMLElement | Error | undefined = getPropByPath( - event, - 'source._dragRef._placeholder', - ); - if (placeholder instanceof Error) { - this._logger.warn( - `Fail get placeholder from event (CdkDragMove | CdkDragRelease) due error: ${placeholder.message}`, - ); - return undefined; - } - if (placeholder === undefined || placeholder === null) { - this._logger.warn(`Placeholder isn't initialized yet.`); - return undefined; - } - return placeholder; - } - - private _getAnchor(): HTMLElement { - const anchor = document.createElement('span'); - anchor.style.display = 'none'; - return anchor; - } - - private _dropAnchor() { - if (this._anchor === undefined || this._anchor.parentNode === null) { - return; - } - this._anchor.parentNode.removeChild(this._anchor); - this._anchor = undefined; - } -} diff --git a/application/client/src/app/ui/env/directives/module.ts b/application/client/src/app/ui/env/directives/module.ts deleted file mode 100644 index c2314b753c..0000000000 --- a/application/client/src/app/ui/env/directives/module.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { NgModule } from '@angular/core'; -import { ResizerDirective } from './resizer'; -import { DraggingDirective } from './dragging'; -import { ResizeObserverDirective } from './resize.observer'; -import { MatDragDropResetFeatureDirective } from './material.dragdrop'; -import { MatDragDropFileFeatureDirective } from './dragdrop.file'; - -@NgModule({ - declarations: [ - ResizerDirective, - ResizeObserverDirective, - DraggingDirective, - MatDragDropResetFeatureDirective, - MatDragDropFileFeatureDirective, - ], - exports: [ - ResizerDirective, - ResizeObserverDirective, - DraggingDirective, - MatDragDropResetFeatureDirective, - MatDragDropFileFeatureDirective, - ], - imports: [], -}) -export class AppDirectiviesModule {} diff --git a/application/client/src/app/ui/env/directives/resize.observer.ts b/application/client/src/app/ui/env/directives/resize.observer.ts deleted file mode 100644 index e4816e5e83..0000000000 --- a/application/client/src/app/ui/env/directives/resize.observer.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { - AfterViewInit, - Directive, - ElementRef, - OnDestroy, - Output, - EventEmitter, -} from '@angular/core'; -import { NormalizedBackgroundTask } from '@platform/env/normalized'; - -const UPDATE_DELAY_MS = 20; - -@Directive({ - selector: '[appResizeObserver]', - standalone: false, -}) -export class ResizeObserverDirective implements AfterViewInit, OnDestroy { - @Output() changesize = new EventEmitter(); - - protected hostElement!: HTMLElement; - protected domRect!: DOMRect; - protected resizeObserve: ResizeObserver | undefined; - protected readonly runner: NormalizedBackgroundTask = new NormalizedBackgroundTask( - UPDATE_DELAY_MS, - ); - constructor(hostElement: ElementRef) { - this.hostElement = hostElement.nativeElement; - } - - public ngAfterViewInit() { - if (this.resizeObserve !== undefined) { - throw new Error(`Holder cannot be bound muliple times`); - } - this.resizeObserve = new ResizeObserver((entries: ResizeObserverEntry[]) => { - if (entries.length !== 1) { - return; - } - this._detect(entries[0].contentRect); - }); - this.resizeObserve.observe(this.hostElement); - this._detect(this.hostElement.getBoundingClientRect()); - } - - public ngOnDestroy(): void { - if (this.resizeObserve !== undefined) { - this.resizeObserve.unobserve(this.hostElement); - } - this.runner.abort(); - } - - private _detect(rect: DOMRect) { - const changed = - this.domRect === undefined - ? true - : rect.height !== this.domRect.height || rect.width !== this.domRect.width; - this.domRect = rect; - changed && - this.runner.run(() => { - this.changesize.emit(rect); - }); - } -} diff --git a/application/client/src/app/ui/env/directives/resizer.ts b/application/client/src/app/ui/env/directives/resizer.ts deleted file mode 100644 index 6cbee55c9c..0000000000 --- a/application/client/src/app/ui/env/directives/resizer.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { - AfterViewInit, - Directive, - HostBinding, - ElementRef, - OnDestroy, - HostListener, - Input, - Output, - EventEmitter, -} from '@angular/core'; -import { Subject } from '@platform/env/subscription'; -import { stop } from '@ui/env/dom'; -import { NormalizedBackgroundTask } from '@platform/env/normalized'; - -export enum Direction { - Vertical = 'Vertical', - Horizontal = 'Horizontal', -} - -const UPDATE_DELAY_MS = 20; - -@Directive({ - selector: '[appResizer]', - standalone: false, -}) -export class ResizerDirective implements AfterViewInit, OnDestroy { - @Input() public direction!: Direction; - @Input() public min: number = -1; - @Input() public max: number = -1; - @Input() public size!: number; - @Input() public corrector: number = 1; - @Input() public resized: Subject | undefined; - @Output() changesize = new EventEmitter(); - - protected position: number = -1; - protected readonly runner: NormalizedBackgroundTask = new NormalizedBackgroundTask( - UPDATE_DELAY_MS, - ); - - constructor(private _hostElement: ElementRef) { - this._mousemove = this._mousemove.bind(this); - this._mouseup = this._mouseup.bind(this); - } - - @HostListener('mousedown', ['$event']) _mousedown(event: MouseEvent) { - this.position = this._getPos(event); - this.listeners().bind(); - } - - @HostBinding('class.dragging') get dragging() { - return this.position !== -1; - } - - public ngAfterViewInit() { - (this._hostElement.nativeElement as HTMLElement).focus(); - } - - public ngOnDestroy(): void { - this.listeners().unbind(); - this.runner.abort(); - } - - private _mousemove(event: MouseEvent) { - if (this.position === -1) { - return; - } - const diff = this._getPos(event) - this.position; - this.size -= diff * this.corrector; - if (this.size > this.max && this.max !== -1) { - this.size = this.max; - } else if (this.size < this.min && this.min !== -1) { - this.size = this.min; - } - this.position = this._getPos(event); - stop(event); - this.runner.run(() => { - if (this.resized !== undefined) { - this.resized.emit(this.size); - } else { - this.changesize.emit(this.size); - } - }); - } - - private _mouseup(event: MouseEvent) { - this._mousemove(event); - this.position = -1; - this.listeners().unbind(); - } - - private _getPos(event: MouseEvent): number { - return this.direction === Direction.Horizontal ? event.x : event.y; - } - - protected listeners(): { - bind(): void; - unbind(): void; - } { - return { - bind: (): void => { - window.addEventListener('mousemove', this._mousemove); - window.addEventListener('mouseup', this._mouseup); - }, - unbind: (): void => { - window.removeEventListener('mousemove', this._mousemove); - window.removeEventListener('mouseup', this._mouseup); - }, - }; - } -} diff --git a/application/client/src/app/ui/env/dom.ts b/application/client/src/app/ui/env/dom.ts deleted file mode 100644 index e2d3e1edc1..0000000000 --- a/application/client/src/app/ui/env/dom.ts +++ /dev/null @@ -1,58 +0,0 @@ -export function stop(event: KeyboardEvent | MouseEvent | Event): boolean { - if (event === undefined || event === null) { - return false; - } - typeof event.stopImmediatePropagation === 'function' && event.stopImmediatePropagation(); - typeof event.stopPropagation === 'function' && event.stopPropagation(); - typeof event.preventDefault === 'function' && event.preventDefault(); - return false; -} - -export function findParentByTag( - target: HTMLElement | null | undefined, - tag: string[], -): HTMLElement | undefined { - tag = tag.map((t) => t.toLowerCase()); - if (target === null || target === undefined) { - return undefined; - } - if (typeof target.tagName !== 'string') { - return undefined; - } - const targetTag = target.tagName.toLowerCase(); - if (tag.includes(targetTag)) { - return target; - } - if (targetTag === 'body') { - return undefined; - } - return findParentByTag(target.parentNode as HTMLElement, tag); -} - -export function isParentOf( - target: HTMLElement | Node | null | undefined, - parent: HTMLElement | null | undefined, -): boolean { - if (target === null || target === undefined) { - return false; - } - if (parent === null || parent === undefined) { - return false; - } - if (target === parent) { - return true; - } - if (target.parentElement === undefined || target.parentElement === null) { - return false; - } - if (target.parentElement !== parent) { - return isParent(target.parentElement, parent); - } else { - return true; - } -} - -export function isParent(target: HTMLElement, parent: HTMLElement): boolean { - const candidate = findParentByTag(target, [parent.tagName]); - return candidate === undefined ? false : candidate === parent; -} diff --git a/application/client/src/app/ui/env/entities/filter.ts b/application/client/src/app/ui/env/entities/filter.ts deleted file mode 100644 index 207fb7941e..0000000000 --- a/application/client/src/app/ui/env/entities/filter.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { InternalAPI } from '@service/ilc'; -import { Subject, Subjects } from '@platform/env/subscription'; -import { syncHasFocusedInput } from '@ui/env/globals'; -import { unique } from '@platform/env/sequence'; -import { filters } from '@ui/service/filters'; - -export type Handler = () => void; - -export class Filter { - private _filter: string = ''; - private readonly _ilc: InternalAPI; - private readonly _uuid: string = unique(); - - public readonly subjects: Subjects<{ - change: Subject; - drop: Subject; - }> = new Subjects({ - change: new Subject(), - drop: new Subject(), - }); - - constructor(ilc: InternalAPI) { - this._ilc = ilc; - this._ilc.channel.ui.input.focused(() => { - this.drop(); - }); - filters.add(this._uuid); - this.keyboard = this.keyboard.bind(this); - } - - public destroy() { - this.unbind(); - filters.remove(this._uuid); - } - - public bind(): Filter { - window.addEventListener('keyup', this.keyboard); - return this; - } - - public unbind(): Filter { - window.removeEventListener('keyup', this.keyboard); - return this; - } - - public keyboard(event: KeyboardEvent): boolean { - if (!filters.isEnabled(this._uuid)) { - return false; - } - if (syncHasFocusedInput()) { - return false; - } - if (this._ilc.services.system.state.states().ui.input) { - return false; - } - if (event.ctrlKey || event.metaKey || event.altKey) { - return false; - } - if (event.code === 'Backspace') { - if (this._filter.length > 0) { - this._filter = this._filter.substring(0, this._filter.length - 1); - this.subjects.get().change.emit(this._filter); - return true; - } - } else if (event.code === 'Escape' || event.code === 'Enter') { - if (this._filter !== '') { - this.drop(); - return true; - } - } else if (event.key.length === 1 && this._filter.length < 50) { - this._filter += event.key; - if (this._filter.trim() === '') { - this.drop(); - } else { - this.subjects.get().change.emit(this._filter); - } - return true; - } - return false; - } - public isEmpty(): boolean { - return this._filter.trim() === ''; - } - public value(): string { - return this._filter; - } - public drop(): boolean { - if (this._filter === '') { - return false; - } - this._filter = ''; - this.subjects.get().drop.emit(); - return true; - } - public uuid(): string { - return this._uuid; - } -} diff --git a/application/client/src/app/ui/env/entities/range.limited.ts b/application/client/src/app/ui/env/entities/range.limited.ts deleted file mode 100644 index e7d5e590a1..0000000000 --- a/application/client/src/app/ui/env/entities/range.limited.ts +++ /dev/null @@ -1,110 +0,0 @@ -export class LimittedRange { - public from: number; - public to: number; - public len: number; - public max: number; - private _alias: string; - private _sticky: boolean; - private _unmodified: boolean = true; - - constructor( - alias: string, - from: number, - to: number, - len: number, - max: number, - sticky: boolean, - ) { - if (isNaN(from) || !isFinite(from)) { - throw new Error(`[${alias}]: Invalid number from. Fail to change it.`); - } - if (isNaN(to) || !isFinite(to)) { - throw new Error(`[${alias}]: Invalid number value for "to". Fail to change it.`); - } - if (isNaN(len) || !isFinite(len)) { - throw new Error(`[${alias}]: Invalid number value for "len". Fail to change it.`); - } - if (isNaN(max) || !isFinite(max)) { - throw new Error(`[${alias}]: Invalid number value for "max". Fail to change it.`); - } - this._alias = alias; - this._sticky = sticky; - this.max = max; - this.from = from; - this.to = to; - this.len = len; - } - - public $(value: number): { - len(): LimittedRange; - from(): LimittedRange; - to(): LimittedRange; - max(adhered: boolean): LimittedRange; - } { - if (isNaN(value) || !isFinite(value)) { - throw new Error(`[${this._alias}]: Invalid number. Fail to change it.`); - } - return { - len: (): LimittedRange => { - this.len = value < 0 ? 0 : value; - this.to = this.from + this.len; - return this._normalize(); - }, - from: (): LimittedRange => { - this.from = value < 0 ? 0 : value; - this.to = this.from + this.len; - return this._normalize(); - }, - to: (): LimittedRange => { - this.to = value < 0 ? 0 : value; - this.from = this.to - this.len; - return this._normalize(); - }, - max: (adhered: boolean): LimittedRange => { - const prevMax = this.max; - this.max = value < 0 ? 0 : value; - const sticky = this._unmodified - ? this._sticky - : this._sticky - ? this.to === prevMax - 1 - : false; - if (sticky && adhered) { - this.to = this.max === 0 ? 0 : this.max - 1; - const from = this.to - this.len; - this.from = from < 0 ? 0 : from; - } else { - this.to = this.from + this.len; - } - return this._normalize(); - }, - }; - } - - public hash(): string { - return `${this.from}.${this.to}.${this.len}.${this.max}`; - } - - private _normalize(): LimittedRange { - if (this.from > this.max) { - this.from = this.max - this.len; - } - if (this.from < 0) { - this.from = 0; - } - if (this.to >= this.max) { - this.to = this.max - 1; - this.from = this.to - this.len; - } - if (this.from < 0) { - this.from = 0; - this.to = Math.min(this.len, this.max - 1); - } - if (this.to < 0) { - this.to = 0; - } - if (this.from !== 0) { - this._unmodified = false; - } - return this; - } -} diff --git a/application/client/src/app/ui/env/entities/value.limited.ts b/application/client/src/app/ui/env/entities/value.limited.ts deleted file mode 100644 index 5f2c855874..0000000000 --- a/application/client/src/app/ui/env/entities/value.limited.ts +++ /dev/null @@ -1,104 +0,0 @@ -export class LimittedValue { - public min: number; - public max: number; - public value: number; - private _alias: string; - private _prev: number = -1; - - constructor(alias: string, min: number, max: number, value: number) { - if (isNaN(value) || !isFinite(value)) { - throw new Error(`[${alias}]: Invalid number value. Fail to change it.`); - } - if (isNaN(min) || !isFinite(min)) { - throw new Error(`[${alias}]: Invalid number value for "min". Fail to change it.`); - } - if (isNaN(max) || !isFinite(max)) { - throw new Error(`[${alias}]: Invalid number value for "max". Fail to change it.`); - } - this._alias = alias; - this.max = max; - this.min = min; - this.value = value; - this.min !== -1 && (this.value = this.value < this.min ? this.min : this.value); - this.max !== -1 && (this.value = this.value > this.max ? this.max : this.value); - this._prev = -1; - } - - public set(value: number): boolean { - if (isNaN(value) || !isFinite(value)) { - throw new Error(`[${this._alias}]: Invalid number value. Fail to change it.`); - } - if (this.max !== -1 && value > this.max) { - this.value = this.max; - return true; - } - if (this.min !== -1 && value < this.min) { - this.value = this.min; - return true; - } - this.value = value; - return false; - } - - public setMin(value: number): void { - if (isNaN(value) || !isFinite(value)) { - throw new Error(`[${this._alias}]: Invalid number value for "min". Fail to change it.`); - } - this.min = value; - this.set(this.value); - } - - public setMax(value: number): void { - if (isNaN(value) || !isFinite(value)) { - throw new Error(`[${this._alias}]: Invalid number value for "max". Fail to change it.`); - } - this.max = value; - this.set(this.value); - } - - public toggle(): void { - if (this.value === this.min) { - this._prev !== -1 && this.set(this._prev); - } else { - this._prev = this.value; - this.set(this.min); - } - } - - public occupy(): void { - if (this.value === this.max) { - this._prev !== -1 && this.set(this._prev); - } else { - this._prev = this.value; - this.set(this.max); - } - } - - public to(): { - min(): void; - max(): void; - } { - return { - min: (): void => { - this.set(this.min); - }, - max: (): void => { - this.set(this.max); - }, - }; - } - - public is(): { - min(): boolean; - max(): boolean; - } { - return { - min: (): boolean => { - return this.value === this.min; - }, - max: (): boolean => { - return this.value === this.max; - }, - }; - } -} diff --git a/application/client/src/app/ui/env/extentions/changes.ts b/application/client/src/app/ui/env/extentions/changes.ts deleted file mode 100644 index a3ce43ec6d..0000000000 --- a/application/client/src/app/ui/env/extentions/changes.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { ChangeDetectorRef } from '@angular/core'; - -export class ChangesDetector { - private _changeDetectorRef: ChangeDetectorRef[]; - private _detauched: boolean = false; - - constructor(changeDetectorRef: ChangeDetectorRef | ChangeDetectorRef[]) { - this._changeDetectorRef = - changeDetectorRef instanceof Array ? changeDetectorRef : [changeDetectorRef]; - } - - public static detectChanges(comRef: any) { - if (typeof comRef !== 'object' || comRef === null) { - return; - } - if (typeof comRef._changeDetectorRef !== 'object' || comRef._changeDetectorRef === null) { - return; - } - if (typeof comRef._changeDetectorRef.detectChanges !== 'function') { - return; - } - comRef._changeDetectorRef.detectChanges(); - } - - public detauchChangesDetector() { - this._detauched = true; - } - - public detectChanges() { - if (this._detauched) { - return; - } - this._changeDetectorRef.forEach((cdRef) => cdRef.detectChanges()); - } - - public markChangesForCheck() { - if (this._detauched) { - return; - } - this._changeDetectorRef.forEach((cdRef) => cdRef.markForCheck()); - } - - public reattachChangesDetector() { - if (this._detauched) { - return; - } - this._changeDetectorRef.forEach((cdRef) => cdRef.reattach()); - } -} diff --git a/application/client/src/app/ui/env/globals.ts b/application/client/src/app/ui/env/globals.ts deleted file mode 100644 index 8b34eb9a88..0000000000 --- a/application/client/src/app/ui/env/globals.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { NgZone } from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import * as regex from '@platform/env/regex'; - -const store: { - sanitizer: DomSanitizer | undefined; - ngZone: NgZone | undefined; -} = { - sanitizer: undefined, - ngZone: undefined, -}; - -export function getDomSanitizer(): DomSanitizer { - if (store.sanitizer === undefined) { - throw new Error(`No DomSanitizer has been setup`); - } - return store.sanitizer; -} - -export function setDomSanitizer(sanitizer: DomSanitizer): void { - if (store.sanitizer !== undefined) { - throw new Error(`DomSanitizer has been setup already`); - } - store.sanitizer = sanitizer; -} - -export function getNgZone(): NgZone { - if (store.ngZone === undefined) { - throw new Error(`No NgZone has been setup`); - } - return store.ngZone; -} - -export function getNgZoneSafly(): NgZone | undefined { - return store.ngZone; -} - -export function setNgZone(ngZone: NgZone): void { - if (store.ngZone !== undefined) { - throw new Error(`NgZone has been setup already`); - } - store.ngZone = ngZone; -} - -export function wrapMatchesToHtml(matcher: string, str: string, tag: string = 'span'): string { - if (matcher === '') { - return str; - } - const reg = regex.fromStr(matcher); - if (reg instanceof Error) { - return str; - } - return str.replace(reg, (match): string => { - return `<${tag}>${match}`; - }); -} - -export function wrapMatchesToSafeHtml( - matcher: string, - str: string, - tag: string = 'span', -): SafeHtml { - return getDomSanitizer().bypassSecurityTrustHtml(wrapMatchesToHtml(matcher, str, tag)); -} - -export function hasFocusedInput(): Promise { - return new Promise((resolve) => { - setTimeout(() => { - if (document.activeElement === null) { - return resolve(false); - } - const tag: string = document.activeElement.tagName.toLowerCase(); - if (['input', 'textarea'].indexOf(tag) !== -1) { - resolve(false); - } else { - resolve(true); - } - }, 50); - }); -} - -export function syncHasFocusedInput(): boolean { - if (document.activeElement === null) { - return false; - } - const tag: string = document.activeElement.tagName.toLowerCase(); - return ['input', 'textarea'].indexOf(tag) !== -1; -} diff --git a/application/client/src/app/ui/env/lock.token.ts b/application/client/src/app/ui/env/lock.token.ts deleted file mode 100644 index 886543bbef..0000000000 --- a/application/client/src/app/ui/env/lock.token.ts +++ /dev/null @@ -1,27 +0,0 @@ -export class LockToken { - private _id: any = undefined; - private _timeout: number; - - constructor(timeout: number = 200) { - this._timeout = timeout; - } - - public lock() { - if (this._timeout > 0) { - this._id = setTimeout(() => { - this._id = undefined; - }, this._timeout); - } else { - this._id = -1; - } - } - - public unlock() { - clearTimeout(this._id); - this._id = undefined; - } - - public isLocked(): boolean { - return this._id !== undefined; - } -} diff --git a/application/client/src/app/ui/layout/component.ts b/application/client/src/app/ui/layout/component.ts deleted file mode 100644 index c86cc1eb88..0000000000 --- a/application/client/src/app/ui/layout/component.ts +++ /dev/null @@ -1,306 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterViewInit, - HostBinding, - NgZone, - ChangeDetectionStrategy, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { LimittedValue } from '@ui/env/entities/value.limited'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Direction } from '@directives/resizer'; -import { Base } from '@service/session'; -import { Subject } from '@platform/env/subscription'; - -const TOOLBAR_NORMAL_HEIGHT = 250; -const SIDEBAR_NORMAL_WIDTH = 350; -const TOOLBAR_MIN_HEIGHT = 50; -const SIDEBAR_MIN_WIDTH = 50; -const TOOLBAR_MAX_SIZE_RATE = 0.8; -const SIDEBAR_MAX_SIZE_RATE = 0.8; - -function initialToolbarHeight(): LimittedValue { - return new LimittedValue('toolbar.height', TOOLBAR_MIN_HEIGHT, -1, TOOLBAR_NORMAL_HEIGHT); -} - -function initialSidebarWidth(): LimittedValue { - return new LimittedValue('sidebar.width', SIDEBAR_MIN_WIDTH, -1, SIDEBAR_NORMAL_WIDTH); -} - -@Component({ - selector: 'app-layout', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class Layout extends ChangesDetector implements AfterViewInit { - public readonly Direction = Direction; - - @HostBinding('class') get cssClass() { - if (this.ilc().services.ui.popup.getCount() === 0) { - return ''; - } - return this.ilc().services.ui.popup.isBlured() ? 'blur' : 'transporent'; - } - - public toolbar: LimittedValue = initialToolbarHeight(); - public sidebar: LimittedValue = initialSidebarWidth(); - public session: Base | undefined; - public resizes: { - toolbar: Subject; - sidebar: Subject; - } = { - toolbar: new Subject(), - sidebar: new Subject(), - }; - - private _layout: DOMRect | undefined; - - private readonly _sessions: Map = new Map(); - - constructor(cdRef: ChangeDetectorRef, private ngZone: NgZone) { - super(cdRef); - this.ilc().channel.session.change(this._onSessionChange.bind(this)); - this.ilc().channel.session.closed(this._onSessionClosed.bind(this)); - } - - public ngAfterViewInit(): void { - this.ilc().services.ui.dropfiles.state().enable(); - this._onSessionChange(); - this.ilc().channel.ui.popup.updated(() => { - this.ngZone.run(() => { - this.detectChanges(); - }); - }); - this.ilc().channel.ui.toolbar.occupy(() => { - this.ngZone.run(() => { - this.toggle().occupy(); - }); - }); - this.ilc().channel.ui.toolbar.state( - ( - getter: (state: { - min: boolean; - max: boolean; - occupied: boolean; - size: number; - }) => void, - ) => { - getter({ - min: this.toolbar.is().min(), - max: this.toolbar.is().max(), - occupied: this.toolbar.is().max(), - size: this.toolbar.value, - }); - }, - ); - this.ilc().channel.ui.toolbar.min(() => { - this.ngZone.run(() => { - this.set().toolbar().min(); - }); - }); - this.ilc().channel.ui.toolbar.max(() => { - this.ngZone.run(() => { - this.set().toolbar().max(); - }); - }); - this.ilc().channel.ui.sidebar.min(() => { - this.ngZone.run(() => { - this.set().sidebar().min(); - }); - }); - this.ilc().channel.ui.sidebar.max(() => { - this.ngZone.run(() => { - this.set().sidebar().max(); - }); - }); - this.env().subscriber.register( - this.ilc().services.system.hotkeys.listen('Ctrl + B', () => { - this.toggle().sidebar(); - }), - ); - this.env().subscriber.register( - this.ilc().services.system.hotkeys.listen('Ctrl + J', () => { - this.toggle().toolbar(); - }), - ); - this.env().subscriber.register( - this.resizes.toolbar.subscribe((height: number) => { - this.toolbar.set(height); - this.markChangesForCheck(); - this.ilc().emitter.ui.toolbar.resize(); - }), - ); - this.env().subscriber.register( - this.resizes.sidebar.subscribe((width: number) => { - this.sidebar.set(width); - this.markChangesForCheck(); - this.ilc().emitter.ui.sidebar.resize(); - }), - ); - } - - public ngLayoutResize(rect: DOMRect) { - this._updateSizes(rect).detectChanges(); - } - - public ngWorkspaceStyle(): { [key: string]: string } { - if (this.session === undefined) { - return { - right: '0px', - left: '0px', - bottom: '0px', - }; - } - return { - right: `${this.session.sidebar() !== undefined ? this.sidebar.value : 0}px`, - left: `0px`, - bottom: `${this.session.toolbar() !== undefined ? this.toolbar.value : 0}px`, - }; - } - - public ngToolbarStyle(): { [key: string]: string } { - return { - right: `${this.sidebar.value}px`, - left: `0px`, - height: `${this.toolbar.value}px`, - }; - } - - public ngToolbarResizeStyle(): { [key: string]: string } { - return { - right: `${this.sidebar.value}px`, - left: `0px`, - bottom: `${this.toolbar.value}px`, - }; - } - - public ngSidebarStyle(): { [key: string]: string } { - return { - width: `${this.sidebar.value}px`, - }; - } - - protected toggle(): { - sidebar(): void; - toolbar(): void; - occupy(): void; - } { - const session = this.ilc().services.system.session.active().base(); - return { - sidebar: (): void => { - if (session === undefined) { - return; - } - this.sidebar.toggle(); - this.detectChanges(); - this.ilc().emitter.ui.sidebar.resize(); - }, - toolbar: (): void => { - if (session === undefined) { - return; - } - this.toolbar.toggle(); - this.detectChanges(); - this.ilc().emitter.ui.toolbar.resize(); - }, - occupy: (): void => { - if (session === undefined) { - return; - } - this.toolbar.occupy(); - this.detectChanges(); - this.ilc().emitter.ui.toolbar.resize(); - }, - }; - } - - protected set(): { - toolbar(): { - min(): void; - max(): void; - }; - sidebar(): { - min(): void; - max(): void; - }; - } { - return { - toolbar: () => { - return { - min: (): void => { - this.toolbar.to().min(); - this.detectChanges(); - }, - max: (): void => { - this.toolbar.to().max(); - this.detectChanges(); - }, - }; - }, - sidebar: () => { - return { - min: (): void => { - this.sidebar.to().min(); - this.detectChanges(); - }, - max: (): void => { - this.sidebar.to().max(); - this.detectChanges(); - }, - }; - }, - }; - } - - private _updateSizes(rect?: DOMRect): Layout { - if (this.session === undefined) { - return this; - } - if (rect !== undefined) { - this._layout = rect; - } - if (this._layout === undefined) { - return this; - } - this.toolbar.setMax(Math.ceil(this._layout.height * TOOLBAR_MAX_SIZE_RATE)); - this.sidebar.setMax(Math.ceil(this._layout.width * SIDEBAR_MAX_SIZE_RATE)); - return this; - } - - private _onSessionChange() { - const session = this.ilc().services.system.session.active().base(); - if (this.session !== undefined) { - this._updateSizes(); - this._sessions.set(this.session.uuid(), { - toolbar: this.toolbar.value, - sidebar: this.sidebar.value, - }); - } - if (session !== undefined) { - const heights = this._sessions.get(session.uuid()); - if (heights !== undefined) { - this.toolbar.set(heights.toolbar); - this.sidebar.set(heights.sidebar); - } else { - this.toolbar = initialToolbarHeight(); - this.sidebar = initialSidebarWidth(); - } - } - this.session = session; - this._updateSizes(); - this.detectChanges(); - } - - private _onSessionClosed(session: string) { - this._sessions.delete(session); - if (this.session !== undefined && this.session.uuid() === session) { - this.session = undefined; - } - this.detectChanges(); - } -} -export interface Layout extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/contextmenu/component.ts b/application/client/src/app/ui/layout/contextmenu/component.ts deleted file mode 100644 index 9964bcc72c..0000000000 --- a/application/client/src/app/ui/layout/contextmenu/component.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { - Component, - OnDestroy, - ChangeDetectorRef, - ViewChild, - AfterViewInit, - ElementRef, -} from '@angular/core'; -import { Ilc, IlcInterface, Declarations } from '@env/decorators/component'; -import { unique } from '@platform/env/sequence'; - -@Component({ - selector: 'app-layout-contextmenu', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class LayoutContextMenu implements OnDestroy, AfterViewInit { - @ViewChild('menu') _ng_menuRef!: ElementRef; - - public _ng_menu: Declarations.IMenu | undefined; - public _ng_guid: string = unique(); - - private _top: number = 0; - private _left: number = 0; - - constructor(private _cdRef: ChangeDetectorRef) { - this.ilc().channel.ui.contextmenu.open(this._open.bind(this)); - this.ilc().channel.ui.contextmenu.close(this._remove.bind(this)); - } - - public get _ng_top() { - return `${this._top}px`; - } - - public get _ng_left() { - return `${this._left}px`; - } - - public ngOnDestroy() { - window.removeEventListener('keydown', this._onWindowKeyDown); - window.removeEventListener('mousedown', this._onWindowMouseDown); - } - - public ngAfterViewInit() { - this._onWindowKeyDown = this._onWindowKeyDown.bind(this); - this._onWindowMouseDown = this._onWindowMouseDown.bind(this); - window.addEventListener('keydown', this._onWindowKeyDown, true); - window.addEventListener('mousedown', this._onWindowMouseDown, true); - } - - public _ng_onMouseDown(item: Declarations.IMenuItem) { - if (typeof item.handler !== 'function') { - return; - } - if (item.disabled) { - return; - } - item.handler(); - if (this._ng_menu !== undefined && this._ng_menu.after !== undefined) { - this._ng_menu.after(); - } - this._remove(); - } - - private _open(menu: Declarations.IMenu) { - this._ng_menu = menu; - this._top = menu.y; - this._left = menu.x; - this._cdRef.detectChanges(); - // Recheck position - setTimeout(() => { - if (this._ng_menuRef === undefined || this._ng_menuRef === null) { - return; - } - const size: ClientRect = ( - this._ng_menuRef.nativeElement as HTMLElement - ).getBoundingClientRect(); - if (window.innerWidth < size.width + menu.x) { - this._left = window.innerWidth - size.width; - } - if (window.innerHeight < size.height + menu.y) { - this._top = window.innerHeight - size.height; - } - if (this._top !== menu.y || this._left !== menu.x) { - this._cdRef.detectChanges(); - } - }); - } - - private _onWindowKeyDown(event: KeyboardEvent) { - if ( - this._isContextMenuNode(event.target as HTMLElement) || - (event.key !== 'Escape' && event.key !== 'Enter') - ) { - return false; - } - this._remove(); - return; - } - - private _onWindowMouseDown(event: MouseEvent) { - if (this._isContextMenuNode(event.target as HTMLElement)) { - return false; - } - this._remove(); - return; - } - - private _remove() { - this._ng_menu = undefined; - this._top = 0; - this._left = 0; - this._cdRef.detectChanges(); - } - - private _isContextMenuNode(node: HTMLElement): boolean { - if (typeof node.nodeName === 'string' && node.nodeName.toLowerCase() === 'body') { - return false; - } - if (typeof node.getAttribute === 'function' && node.getAttribute('id') === this._ng_guid) { - return true; - } - if (node.parentNode !== undefined && node.parentNode !== null) { - return this._isContextMenuNode(node.parentNode as HTMLElement); - } - return false; - } -} -export interface LayoutContextMenu extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/contextmenu/styles.less b/application/client/src/app/ui/layout/contextmenu/styles.less deleted file mode 100644 index 76078ba644..0000000000 --- a/application/client/src/app/ui/layout/contextmenu/styles.less +++ /dev/null @@ -1,72 +0,0 @@ -@import '../../styles/variables.less'; -@import '../../styles/support.less'; -@import '../../styles/text.less'; -@import '../../styles/borders.less'; - -:host { - position: fixed; - display: block; - z-index: 10000; - top: 0; - left: 0; - & div.wrapper { - position: fixed; - display: block; - box-sizing: border-box; - z-index: 100; - border-radius: 8px; - box-shadow: 3px 3px 16px rgba(0, 0, 0, 0.4); - background: var(--scheme-color-5-darken-5); - .border-based-5; - & ul.menu { - position: relative; - display: block; - padding: 4px 0; - margin: 0; - list-style: none; - border-radius: 8px; - overflow: hidden; - & li.item { - position: relative; - display: flex; - flex-direction: row; - padding: 0.25rem 1rem; - margin: 0; - list-style: none; - cursor: default; - font-size: 0.9rem; - white-space: nowrap; - color: var(--scheme-color-1); - &:hover { - background: var(--scheme-color-4); - } - &.delimiter { - height: 1px; - padding: 0; - margin: 0.25rem 0; - border-bottom: 1px solid var(--scheme-color-4); - &:hover { - background: none; - } - } - &.disabled { - color: var(--scheme-color-3); - &:hover { - background: none; - } - } - & span.caption { - position: relative; - flex: 1 auto; - white-space: nowrap; - } - & span.shortcut { - position: relative; - padding-left: 32px; - white-space: nowrap; - color: var(--scheme-color-3); - } - } - } - } -} diff --git a/application/client/src/app/ui/layout/contextmenu/template.html b/application/client/src/app/ui/layout/contextmenu/template.html deleted file mode 100644 index 04c43da336..0000000000 --- a/application/client/src/app/ui/layout/contextmenu/template.html +++ /dev/null @@ -1,11 +0,0 @@ -
- - -
diff --git a/application/client/src/app/ui/layout/focus/component.ts b/application/client/src/app/ui/layout/focus/component.ts deleted file mode 100644 index 1ea95df0fe..0000000000 --- a/application/client/src/app/ui/layout/focus/component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Component, ChangeDetectorRef, ElementRef, AfterViewInit, ViewChild } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; - -@Component({ - selector: 'app-layout-focus', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class LayoutFocus implements AfterViewInit { - @ViewChild('input') _ng_input!: ElementRef; - - constructor(private _cdRef: ChangeDetectorRef) { - // this._subscriptions.onSessionChange = - // EventsSessionService.getObservable().onSessionChange.subscribe( - // this._onSessionChange.bind(this), - // ); - } - - ngAfterViewInit() { - this._onSessionChange(); - } - - private _onSessionChange() { - if (this._ng_input === undefined && (this._ng_input as any).nativeElement !== undefined) { - return; - } - (this._ng_input.nativeElement as HTMLInputElement).focus(); - } -} -export interface LayoutFocus extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/focus/styles.less b/application/client/src/app/ui/layout/focus/styles.less deleted file mode 100644 index 8a4d56699f..0000000000 --- a/application/client/src/app/ui/layout/focus/styles.less +++ /dev/null @@ -1,19 +0,0 @@ -:host { - position: absolute; - display: block; - height: 1px; - width: 1px; - top: -1px; - left: 1px; - overflow: hidden; - opacity: 0.000001; - & input { - position: absolute; - display: block; - height: 1px; - width: 1px; - top: -1px; - left: 1px; - overflow: hidden; - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/layout/focus/template.html b/application/client/src/app/ui/layout/focus/template.html deleted file mode 100644 index 9e7b4e243c..0000000000 --- a/application/client/src/app/ui/layout/focus/template.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/application/client/src/app/ui/layout/module.ts b/application/client/src/app/ui/layout/module.ts deleted file mode 100644 index 76da03cf88..0000000000 --- a/application/client/src/app/ui/layout/module.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ContainersModule } from '@elements/containers/module'; -import { AppDirectiviesModule } from '@directives/module'; -import { ElementsModule } from '@elements/module'; -import { RecentActionsModule } from '@elements/recent/module'; -import { LayoutHomeModule } from './workspace/no-tabs-content/module'; - -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; - -import { Layout } from './component'; -import { LayoutStatusBar } from './statusbar/component'; -import { LayoutFocus } from './focus/component'; -import { LayoutContextMenu } from './contextmenu/component'; -import { LayoutSidebar } from './sidebar/component'; -import { LayoutSidebarCaption } from './sidebar/caption/component'; -import { LayoutSidebarControls } from './sidebar/controls/component'; -import { LayoutWorkspace } from './workspace/component'; -import { LayoutWorkspaceControls } from './workspace/controls/component'; -import { LayoutToolbar } from './toolbar/component'; -import { LayoutToolbarControls } from './toolbar/controls/component'; -import { LayoutPopups } from './popups/component'; -import { LayoutPopup } from './popups/popup/component'; -import { LayoutSnackBar } from './snackbar/component'; -import { LayoutSnackBarMessage } from './snackbar/message/component'; - -import { OverlayModule } from '@angular/cdk/overlay'; -import { JobsModule } from '@views/statusbar/jobs/module'; -import { SessionModule } from '@views/statusbar/session/module'; -import { SessionInfoModule } from '@views/statusbar/info/module'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - AppDirectiviesModule, - ElementsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatSnackBarModule, - MatIconModule, - MatMenuModule, - JobsModule, - SessionModule, - SessionInfoModule, - RecentActionsModule, - LayoutHomeModule, - OverlayModule, - ], - declarations: [ - Layout, - LayoutStatusBar, - LayoutFocus, - LayoutContextMenu, - LayoutSidebar, - LayoutSidebarCaption, - LayoutSidebarControls, - LayoutWorkspace, - LayoutWorkspaceControls, - LayoutToolbar, - LayoutToolbarControls, - LayoutPopups, - LayoutPopup, - LayoutSnackBar, - LayoutSnackBarMessage, - ], - exports: [Layout, AppDirectiviesModule], - bootstrap: [ - Layout, - LayoutStatusBar, - LayoutFocus, - LayoutContextMenu, - LayoutSidebar, - LayoutSidebarCaption, - LayoutSidebarControls, - LayoutWorkspace, - LayoutWorkspaceControls, - LayoutToolbar, - LayoutToolbarControls, - LayoutPopups, - LayoutPopup, - LayoutSnackBar, - LayoutSnackBarMessage, - ], -}) -export class LayoutModule {} diff --git a/application/client/src/app/ui/layout/popups/component.ts b/application/client/src/app/ui/layout/popups/component.ts deleted file mode 100644 index 9a17dfb13b..0000000000 --- a/application/client/src/app/ui/layout/popups/component.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterContentInit, - ChangeDetectionStrategy, - HostBinding, - SkipSelf, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Popup } from '@ui/service/popup'; - -@Component({ - selector: 'app-layout-popups', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class LayoutPopups extends ChangesDetector implements AfterContentInit { - public popups: Map void }> = new Map(); - - protected visible: boolean = false; - protected shadowed: boolean = true; - - @HostBinding('class') get visability() { - return this.visible ? `visible ${this.shadowed ? '' : 'transporent'}` : 'hidden'; - } - - constructor(@SkipSelf() selfCdRef: ChangeDetectorRef, cdRef: ChangeDetectorRef) { - super([selfCdRef, cdRef]); - } - - public ngAfterContentInit(): void { - this.ilc().channel.ui.popup.open((popup: Popup) => { - if (this.popups.has(popup.uuid)) { - return; - } - popup.options.component.inputs === undefined && (popup.options.component.inputs = {}); - popup.options.component.inputs.close = this._close.bind(this, popup.uuid); - this.popups.set(popup.uuid, { popup, close: this._close.bind(this, popup.uuid) }); - this.visible = true; - this.shadowed = popup.isBlured(); - this.ilc().services.ui.popup.setCount(this.popups.size); - this.ilc().emitter.ui.popup.updated(this.popups.size); - this.markChangesForCheck(); - popup.subjects.get().opened.emit(); - }); - this.ilc().channel.ui.popup.close((uuid: string) => { - this._close(uuid); - }); - } - - public onBGClick(): void { - this.popups.forEach((popup, uuid) => { - if (popup.popup.options.closable === false) { - return; - } - if (popup.popup.options.closeOnBGClick === false) { - return; - } - this._close(uuid); - }); - } - - private _close(uuid: string): void { - const stored = this.popups.get(uuid); - if (stored === undefined) { - return; - } - this.popups.delete(uuid); - this.popups.size === 0 && (this.visible = false); - this.ilc().services.ui.popup.setCount(this.popups.size); - this.ilc().emitter.ui.popup.updated(this.popups.size); - this.markChangesForCheck(); - stored.popup.subjects.get().closed.emit(); - } -} -export interface LayoutPopups extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/popups/popup/component.ts b/application/client/src/app/ui/layout/popups/popup/component.ts deleted file mode 100644 index 7924da041d..0000000000 --- a/application/client/src/app/ui/layout/popups/popup/component.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterViewInit, - AfterContentInit, - ChangeDetectionStrategy, - Input, - HostBinding, - HostListener, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Popup } from '@ui/service/popup'; - -@Component({ - selector: 'app-layout-popup', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class LayoutPopup extends ChangesDetector implements AfterViewInit, AfterContentInit { - @Input() public popup!: Popup; - @Input() public close!: () => void; - - @HostBinding('class') get cssClassEdited() { - if (this.popup.options.position === undefined) { - return `v-bottom h-center`; - } else { - return `v-${this.popup.options.position.vertical} h-${this.popup.options.position.horizontal}`; - } - } - - @HostListener('click', ['$event']) onClick(event: MouseEvent) { - if ((event.target as HTMLElement).tagName.toLowerCase() === 'app-layout-popup') { - if (this.popup.options.closable === false) { - return; - } - if (this.popup.options.closeOnBGClick === false) { - return; - } - this.close(); - } - } - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.popup.options.component.inputs = - this.popup.options.component.inputs === undefined - ? {} - : this.popup.options.component.inputs; - this.popup.options.component.inputs.close = this.close; - this.popup.options.component.inputs.popup = this.popup; - } - - public ngAfterViewInit(): void { - this.env().subscriber.register( - this.ilc().services.ui.listener.listen( - 'keydown', - window, - (event: KeyboardEvent) => { - if (this.popup.options.closable === false) { - return true; - } - if (this.popup.options.closeOnKey === undefined) { - return true; - } - if (this.popup.options.closeOnKey === '*') { - this.close(); - return true; - } - const keys = this.popup.options.closeOnKey.split(','); - if (keys.includes(event.key)) { - this.close(); - } - return true; - }, - ), - ); - } - - public ngStyle(): { width: string } { - if (this.popup.options === undefined || this.popup.options.width === undefined) { - return { width: 'auto' }; - } else { - return { width: `${this.popup.options.width}px` }; - } - } -} -export interface LayoutPopup extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/popups/popup/styles.less b/application/client/src/app/ui/layout/popups/popup/styles.less deleted file mode 100644 index bc2c34659f..0000000000 --- a/application/client/src/app/ui/layout/popups/popup/styles.less +++ /dev/null @@ -1,41 +0,0 @@ -@import '../../../styles/variables.less'; -:host { - position: absolute; - display: flex; - z-index: 1000; - top: 0px; - left: 0px; - width: 100%; - height: 100%; - overflow: hidden; - flex-direction: column; - & .container { - background: var(--scheme-color-5); - box-shadow: 3px 3px 4px rgba(0,0,0,0.4); - max-width: 70%; - max-height: 80%; - overflow-x: hidden; - overflow-y: auto; - } - &.v-bottom { - justify-content: flex-end; - } - &.v-top { - justify-content:flex-start; - } - &.v-center { - justify-content: center; - } - &.h-left { - align-items:flex-start; - align-content:flex-start; - } - &.h-right { - align-items:flex-end; - align-content:flex-end; - } - &.h-center { - align-items: center; - align-content: center; - } -} diff --git a/application/client/src/app/ui/layout/popups/popup/template.html b/application/client/src/app/ui/layout/popups/popup/template.html deleted file mode 100644 index 2b7cf5b5cf..0000000000 --- a/application/client/src/app/ui/layout/popups/popup/template.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
\ No newline at end of file diff --git a/application/client/src/app/ui/layout/popups/styles.less b/application/client/src/app/ui/layout/popups/styles.less deleted file mode 100644 index 90bd73e3ff..0000000000 --- a/application/client/src/app/ui/layout/popups/styles.less +++ /dev/null @@ -1,32 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - position: absolute; - display: none; - z-index: 1000; - top: 0px; - left: 0px; - width: 100%; - height: 100%; - overflow: hidden; - &.visible { - display: block; - } - & div.background { - position: absolute; - top: 0px; - left: 0px; - width: 100%; - height: 100%; - overflow: hidden; - } - & div.background { - background: rgba(0,0,0,0.4); - } - &.transporent { - & div.background { - background: rgba(0,0,0,0.01); - } - - } -} diff --git a/application/client/src/app/ui/layout/popups/template.html b/application/client/src/app/ui/layout/popups/template.html deleted file mode 100644 index c2a987fd7a..0000000000 --- a/application/client/src/app/ui/layout/popups/template.html +++ /dev/null @@ -1,2 +0,0 @@ -
- \ No newline at end of file diff --git a/application/client/src/app/ui/layout/sidebar/caption/component.ts b/application/client/src/app/ui/layout/sidebar/caption/component.ts deleted file mode 100644 index fadc1a4203..0000000000 --- a/application/client/src/app/ui/layout/sidebar/caption/component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component, AfterViewInit, ChangeDetectorRef } from '@angular/core'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { Ilc, IlcInterface } from '@env/decorators/component'; - -@Component({ - selector: 'app-layout-sidebar-caption', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class LayoutSidebarCaption implements AfterViewInit { - public _ng_injection: IComponentDesc | undefined = undefined; - - constructor(private _cdRef: ChangeDetectorRef) {} - - ngAfterViewInit() { - // this._subscriptions.onInjectionUpdated = - // SidebarSessionsService.getObservable().injection.subscribe( - // this._onInjectionUpdated.bind(this), - // ); - } - - // private _onInjectionUpdated(comp: IComponentDesc | undefined) { - // this._ng_injection = comp; - // this._cdRef.detectChanges(); - // } -} -export interface LayoutSidebarCaption extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/sidebar/caption/styles.less b/application/client/src/app/ui/layout/sidebar/caption/styles.less deleted file mode 100644 index a3cae639b2..0000000000 --- a/application/client/src/app/ui/layout/sidebar/caption/styles.less +++ /dev/null @@ -1,10 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; -} diff --git a/application/client/src/app/ui/layout/sidebar/caption/template.html b/application/client/src/app/ui/layout/sidebar/caption/template.html deleted file mode 100644 index 60de0d3391..0000000000 --- a/application/client/src/app/ui/layout/sidebar/caption/template.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/application/client/src/app/ui/layout/sidebar/component.ts b/application/client/src/app/ui/layout/sidebar/component.ts deleted file mode 100644 index 6877e4ee48..0000000000 --- a/application/client/src/app/ui/layout/sidebar/component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { - Component, - Input, - AfterViewInit, - ChangeDetectorRef, - ChangeDetectionStrategy, -} from '@angular/core'; -import { Base } from '@service/session'; -import { TabsOptions, ETabsListDirection } from '@elements/tabs/options'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-layout-sidebar', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class LayoutSidebar extends ChangesDetector implements AfterViewInit { - @Input() public session!: Base; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngAfterViewInit() { - this.session.sidebar()?.setOptions( - new TabsOptions({ - direction: ETabsListDirection.left, - }), - ); - this.detectChanges(); - } -} -export interface LayoutSidebar extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/sidebar/controls/component.ts b/application/client/src/app/ui/layout/sidebar/controls/component.ts deleted file mode 100644 index 2cd34c3b03..0000000000 --- a/application/client/src/app/ui/layout/sidebar/controls/component.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Component, ChangeDetectorRef } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; - -@Component({ - selector: 'app-layout-sidebar-controls', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class LayoutSidebarControls { - constructor(private _cdRef: ChangeDetectorRef) {} - - public _ng_onAdd(event: MouseEvent) { - console.log(event); - // const tabs: ITab[] | undefined = this.ilc().services.ui.sidebar.getNotOpened(); - // if (tabs === undefined || tabs.length === 0) { - // return; - // } - // const items: IMenuItem[] = tabs.map((tab: ITab) => { - // return { - // caption: tab.name, - // handler: () => { - // if (tab.guid === undefined) { - // return; - // } - // // this.state.maximize(); - // SidebarSessionsService.addByGuid(tab.guid); - // }, - // }; - // }); - // this.ilc().services.ui.contextmenu.show({ - // items: items, - // x: event.pageX, - // y: event.pageY, - // }); - } -} -export interface LayoutSidebarControls extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/sidebar/controls/styles.less b/application/client/src/app/ui/layout/sidebar/controls/styles.less deleted file mode 100644 index f26bc1031b..0000000000 --- a/application/client/src/app/ui/layout/sidebar/controls/styles.less +++ /dev/null @@ -1,10 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - white-space: nowrap; - height: 100%; - width: 100%; - margin: 0; - padding: 0; -} diff --git a/application/client/src/app/ui/layout/sidebar/controls/template.html b/application/client/src/app/ui/layout/sidebar/controls/template.html deleted file mode 100644 index 85d01d3ae6..0000000000 --- a/application/client/src/app/ui/layout/sidebar/controls/template.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/application/client/src/app/ui/layout/sidebar/styles.less b/application/client/src/app/ui/layout/sidebar/styles.less deleted file mode 100644 index 5d0a0209c3..0000000000 --- a/application/client/src/app/ui/layout/sidebar/styles.less +++ /dev/null @@ -1,17 +0,0 @@ -@import '../../styles/variables.less'; -@import '../../styles/support.less'; - -:host { - position: relative; - display: block; - box-sizing: border-box; - background: var(--scheme-color-5-darken-5); - border-left: var(--scheme-color-5-darken-5) thin solid; - border-right: var(--scheme-color-5-lighten-5) thin solid; - & element-tabs { - top: 0; - left: 0; - bottom: 0; - right: 0; - } -} diff --git a/application/client/src/app/ui/layout/sidebar/template.html b/application/client/src/app/ui/layout/sidebar/template.html deleted file mode 100644 index 578566ca76..0000000000 --- a/application/client/src/app/ui/layout/sidebar/template.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/application/client/src/app/ui/layout/snackbar/component.ts b/application/client/src/app/ui/layout/snackbar/component.ts deleted file mode 100644 index 65c2461bd4..0000000000 --- a/application/client/src/app/ui/layout/snackbar/component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Component, AfterContentInit, NgZone } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import { notifications } from '@ui/service/notifications'; -import { Notification } from '@ui/service/notification/notification'; -import { LayoutSnackBarMessage } from './message/component'; - -@Component({ - selector: 'app-layout-snackbar', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class LayoutSnackBar implements AfterContentInit { - constructor(protected snackBar: MatSnackBar, protected zone: NgZone) {} - - ngAfterContentInit(): void { - this.env().subscriber.register( - notifications.subjects.get().pop.subscribe((notification: Notification) => { - this.zone.run(() => { - const ref = this.snackBar.openFromComponent(LayoutSnackBarMessage, { - data: { - notification, - ref: () => ref, - }, - duration: notification.duration(), - }); - }); - }), - ); - } -} -export interface LayoutSnackBar extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/snackbar/message/component.ts b/application/client/src/app/ui/layout/snackbar/message/component.ts deleted file mode 100644 index 393ba7cc0d..0000000000 --- a/application/client/src/app/ui/layout/snackbar/message/component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component, Inject, ViewEncapsulation } from '@angular/core'; -import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Action } from '@platform/types/notification/index'; -import { Notification } from '@ui/service/notification/notification'; - -import * as Requests from '@platform/ipc/request'; - -@Component({ - selector: 'app-layout-snackbar-message', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class LayoutSnackBarMessage { - constructor( - @Inject(MAT_SNACK_BAR_DATA) - public data: { - notification: Notification; - ref: () => MatSnackBarRef; - }, - ) {} - - ngOnAction(action: Action): void { - this.data.ref().dismiss(); - Requests.IpcRequest.send( - Requests.Action.Call.Response, - new Requests.Action.Call.Request({ - uuid: action.uuid, - inputs: undefined, - }), - ) - .then((response) => { - if (response.error !== undefined) { - this.log().error( - `Fail to process action ${action.name} (${action.uuid}); error: ${response.error}`, - ); - } - }) - .catch((error: Error) => { - this.log().error( - `Fail to send action ${action.name} (${action.uuid}); error: ${error.message}`, - ); - }); - } - - ngDismiss() { - this.data.ref().dismiss(); - } -} -export interface LayoutSnackBarMessage extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/snackbar/message/styles.less b/application/client/src/app/ui/layout/snackbar/message/styles.less deleted file mode 100644 index 584561d695..0000000000 --- a/application/client/src/app/ui/layout/snackbar/message/styles.less +++ /dev/null @@ -1,21 +0,0 @@ -@import '../../../styles/variables.less'; - -app-layout-snackbar-message { - padding: 0 16px 0 0; - position: relative; - display: block; - & div.message{ - padding-bottom: 12px; - } - & div.controlls { - text-align: right; - & button { - margin-left: 12px; - } - } - & button[data-controll="close"] { - position: absolute; - right: -14px; - top: -14px; - } -} diff --git a/application/client/src/app/ui/layout/snackbar/message/template.html b/application/client/src/app/ui/layout/snackbar/message/template.html deleted file mode 100644 index 2704feb258..0000000000 --- a/application/client/src/app/ui/layout/snackbar/message/template.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

{{ data.notification.message() }}

-
-
- -
- \ No newline at end of file diff --git a/application/client/src/app/ui/layout/snackbar/styles.less b/application/client/src/app/ui/layout/snackbar/styles.less deleted file mode 100644 index 8fdbe2d445..0000000000 --- a/application/client/src/app/ui/layout/snackbar/styles.less +++ /dev/null @@ -1,3 +0,0 @@ -:host { - -} \ No newline at end of file diff --git a/application/client/src/app/ui/layout/snackbar/template.html b/application/client/src/app/ui/layout/snackbar/template.html deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/application/client/src/app/ui/layout/state.ts b/application/client/src/app/ui/layout/state.ts deleted file mode 100644 index e2ac673c0b..0000000000 --- a/application/client/src/app/ui/layout/state.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Observable, Subject } from 'rxjs'; - -export class State {} -export class AreaState { - public minimized: boolean = true; - - private _subjects = { - minimized: new Subject(), - updated: new Subject(), - }; - - public getObservable(): { - minimized: Observable; - updated: Observable; - } { - return { - minimized: this._subjects.minimized.asObservable(), - updated: this._subjects.updated.asObservable(), - }; - } - - public minimize() { - // if (LayoutStateService.locked()) { - // return; - // } - this.minimized = true; - this._subjects.minimized.next(this.minimized); - this._subjects.updated.next(this); - // ViewsEventsService.fire().onResize(); - } - - public maximize() { - // if (LayoutStateService.locked()) { - // return; - // } - this.minimized = false; - this._subjects.minimized.next(this.minimized); - this._subjects.updated.next(this); - // ViewsEventsService.fire().onResize(); - } -} diff --git a/application/client/src/app/ui/layout/statusbar/component.ts b/application/client/src/app/ui/layout/statusbar/component.ts deleted file mode 100644 index 450401f3a0..0000000000 --- a/application/client/src/app/ui/layout/statusbar/component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-layout-statusbar', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class LayoutStatusBar extends ChangesDetector { - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } -} -export interface LayoutStatusBar extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/statusbar/styles.less b/application/client/src/app/ui/layout/statusbar/styles.less deleted file mode 100644 index c0f6a6e3c7..0000000000 --- a/application/client/src/app/ui/layout/statusbar/styles.less +++ /dev/null @@ -1,50 +0,0 @@ -@import '../../styles/variables.less'; -@import '../../styles/support.less'; -@import '../../styles/borders.less'; - -:host { - position: relative; - display: block; - box-sizing: border-box; - width: 100%; - height: 100%; - background: var(--scheme-color-5-darken-5); - .border-based-5; - & ul.apps { - position: absolute; - display: flex; - flex-direction: row; - top: 0; - width: 50%; - height: 100%; - overflow: hidden; - list-style: none; - padding: 0; - margin: 0; - white-space: nowrap; - & li.app { - position: relative; - display: flex; - height: 100%; - width: auto; - margin: 0; - align-items: center; - padding: 0; - } - &.left { - left: 0; - flex-direction: row; - & li.app { - flex-direction: row; - } - } - &.right { - left: 50%; - flex-direction: row-reverse; - & li.app { - flex-direction: row-reverse; - } - } - - } -} diff --git a/application/client/src/app/ui/layout/statusbar/template.html b/application/client/src/app/ui/layout/statusbar/template.html deleted file mode 100644 index cbeaf9def0..0000000000 --- a/application/client/src/app/ui/layout/statusbar/template.html +++ /dev/null @@ -1,7 +0,0 @@ -
    -
  • -
-
    -
  • -
  • -
diff --git a/application/client/src/app/ui/layout/styles.less b/application/client/src/app/ui/layout/styles.less deleted file mode 100644 index e332c972a6..0000000000 --- a/application/client/src/app/ui/layout/styles.less +++ /dev/null @@ -1,276 +0,0 @@ -@import '../styles/variables.less'; - -:host { - display: block; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: var(--scheme-color-5); - &.transporent, - &.blur { - & div.main * { - user-select: none!important; - pointer-events: none!important; - } - } - &.blur { - & div.main { - filter: blur(1px); - } - } - & div.wrapper { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - & div.main { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - bottom: @status-bar-height; - & div.workspace { - position: absolute; - display: block; - top: 0; - left: 0; - right: @tabs-list-height; - margin-bottom: 6px; - &.full { - right: 0; - bottom: 0; - } - } - & div.toolbar { - position: absolute; - display: block; - left: 0; - bottom: 0; - right: @tabs-list-height; - background: var(--scheme-color-5); - & element-tabs { - top: 0; - left: 0; - bottom: 0; - right: 0; - position: absolute; - display: block; - overflow: hidden; - } - } - & div.sidebar { - position: absolute; - display: block; - top: 0; - bottom: 0; - right: 0; - width: @tabs-list-height; - z-index: 1; - & div.sidebar-caption { - position: absolute; - display: block; - top: 0; - left: 0; - height: @tabs-list-height; - right: 0; - overflow: hidden; - background: var(--scheme-color-5-lighten-10); - box-sizing: border-box; - & div.switcher { - position: absolute; - top: 0; - left: 0; - height: @tabs-list-height; - width: @tabs-list-height; - - } - & div.injections { - position: absolute; - display: none; - top: 0; - left: @tabs-list-height; - height: @tabs-list-height; - right: @tabs-list-height; - overflow: hidden; - } - & div.location { - position: absolute; - display: none; - top: 0; - right: 0; - height: @tabs-list-height; - width: @tabs-list-height; - } - } - & app-layout-sidebar { - top: @tabs-list-height; - left: 0; - bottom: 0; - right: 0; - position: absolute; - display: block; - overflow: hidden; - margin-left: 5px; - } - & div.sidebar-resizer { - position: absolute; - display: block; - top: 0; - left: 0px; - width: 6px; - bottom: 0; - background: var(--scheme-color-5-lighten-15); - cursor: col-resize; - z-index: 1; - &.dragging { - &::after{ - display: block; - content: ''; - position: absolute; - top:0; - height: 100%; - left:2px; - width: 1px; - border-left: dashed var(--scheme-color-1) thin; - } - } - &:hover { - &::after{ - display: block; - content: ''; - position: absolute; - top:0; - height: 100%; - left:2px; - width: 1px; - border-left: dashed var(--scheme-color-1) thin; - } - } - } - } - & div.toolbar-resizer { - position: absolute; - display: block; - left: 0; - bottom: -3px; - height: 6px; - right: 0; - background: var(--scheme-color-5-lighten-15); - cursor: row-resize; - z-index: 1; - &.dragging { - &::after{ - display: block; - content: ''; - position: absolute; - top:2px; - height: 1px; - left:0; - width: 100%; - border-top: dashed var(--scheme-color-1) thin; - } - } - &:hover { - &::after{ - display: block; - content: ''; - position: absolute; - top:2px; - height: 1px; - left:0; - width: 100%; - border-top: dashed var(--scheme-color-1) thin; - } - } - } - } - & app-layout-statusbar { - position: absolute; - display: block; - overflow: hidden; - bottom: 0; - height: @status-bar-height; - left: 0; - right: 0; - } - &.fb-minimized { - } - &.fb-maximized { - & div.main { - & div.sidebar { - & div.sidebar-caption { - & div.switcher { - & span.small-icon-button { - transform: rotate(180deg); - } - } - & div.injections { - display: block; - } - & div.location { - display: block; - } - } - } - } - } - &.fb-maximized.func-left { - & div.main { - & div.sidebar { - & div.sidebar-caption { - & div.switcher { - & span.small-icon-button { - transform: rotate(0deg); - } - } - } - } - } - } - &.func-left { - & div.main { - & div.workspace { - position: absolute; - display: block; - top: 0; - right: 0; - bottom: 0; - left: @tabs-list-height; - } - & div.sidebar { - position: absolute; - display: block; - top: 0; - bottom: 0; - left: 0; - width: @tabs-list-height; - & div.sidebar-caption { - & div.location { - left: 0; - right: unset !important; - & span.small-icon-button { - transform: rotate(180deg); - } - } - & div.switcher { - right: 0; - left: unset !important; - & span.small-icon-button { - transform: rotate(180deg); - } - } - } - } - & div.sidebar-resizer { - right: -3px; - left: unset !important; - } - } - } - } -} diff --git a/application/client/src/app/ui/layout/template.html b/application/client/src/app/ui/layout/template.html deleted file mode 100644 index d91911e8d9..0000000000 --- a/application/client/src/app/ui/layout/template.html +++ /dev/null @@ -1,52 +0,0 @@ -
-
-
- -
-
- -
-
- -
- - - - -
diff --git a/application/client/src/app/ui/layout/toolbar/component.ts b/application/client/src/app/ui/layout/toolbar/component.ts deleted file mode 100644 index 56ca448ace..0000000000 --- a/application/client/src/app/ui/layout/toolbar/component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { - Component, - Input, - AfterViewInit, - ChangeDetectorRef, - ChangeDetectionStrategy, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Base } from '@service/session'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-layout-toolbar', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class LayoutToolbar extends ChangesDetector implements AfterViewInit { - @Input() public session!: Base; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngAfterViewInit() { - this.detectChanges(); - } -} -export interface LayoutToolbar extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/toolbar/controls/component.ts b/application/client/src/app/ui/layout/toolbar/controls/component.ts deleted file mode 100644 index 90bf678850..0000000000 --- a/application/client/src/app/ui/layout/toolbar/controls/component.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Component, Input, AfterContentInit, OnDestroy, ChangeDetectorRef } from '@angular/core'; -import { AreaState } from '../../state'; -import { Observable, Subscription } from 'rxjs'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { stop } from '@ui/env/dom'; - -@Component({ - selector: 'app-layout-toolbar-controls', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class LayoutToolbarControls implements AfterContentInit, OnDestroy { - @Input() public state!: AreaState; - @Input() public injection!: Observable; - - public _ng_injection: IComponentDesc | undefined = undefined; - - private _subscriptions: { [key: string]: Subscription } = {}; - - constructor(private _cdRef: ChangeDetectorRef) {} - - public ngAfterContentInit() { - // this._subscriptions.onInjection = this.injection.subscribe(this._onInjecton.bind(this)); - } - - public ngOnDestroy() { - Object.keys(this._subscriptions).forEach((key: string) => { - this._subscriptions[key].unsubscribe(); - }); - } - - public _ng_onStateToggle(event: MouseEvent) { - if (this.state.minimized) { - this.state.maximize(); - } else { - this.state.minimize(); - } - stop(event); - return false; - } - - public _ng_onAdd(event: MouseEvent) { - // const tabs: ITab[] | undefined = ToolbarSessionsService.getInactiveTabs(); - // if (tabs === undefined || tabs.length === 0) { - // return; - // } - // const items: Declarations.IMenuItem[] = tabs.map((tab: ITab) => { - // return { - // caption: tab.name, - // handler: () => { - // if (tab.guid === undefined) { - // this.log().error(`Tab guid is undefined`); - // return; - // } - // this.state.maximize(); - // ToolbarSessionsService.addByGuid(tab.guid); - // ToolbarSessionsService.setActive(tab.guid, undefined, false).catch( - // (error: Error) => this.log().error(error.message), - // ); - // }, - // }; - // }); - // this.ilc().services.ui.contextmenu.show({ - // items: items, - // x: event.pageX, - // y: event.pageY, - // }); - stop(event); - } - - private _onInjecton(injection: IComponentDesc) { - this._ng_injection = injection; - this._cdRef.detectChanges(); - } -} -export interface LayoutToolbarControls extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/toolbar/controls/styles.less b/application/client/src/app/ui/layout/toolbar/controls/styles.less deleted file mode 100644 index e1c97f68f8..0000000000 --- a/application/client/src/app/ui/layout/toolbar/controls/styles.less +++ /dev/null @@ -1,38 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - white-space: nowrap; - height: 100%; - width: 100%; - text-align: right; - display: flex; - flex-flow: row nowrap; - margin: 0; - padding: 0; - & .left-area { - flex: 1 auto; - order: 1; - width: auto; - } - & .injection-area { - flex: 1 auto; - order: 2; - width: 100%; - } - & .right-area { - flex: 1 auto; - order: 2; - width: 100%; - &.injection-exist { - order: 3; - width: auto; - } - & span.state-trigger { - transition: transform 350ms ease-in-out; - } - & span.state-trigger.minimized { - transform: rotate(180deg); - } - } -} diff --git a/application/client/src/app/ui/layout/toolbar/controls/template.html b/application/client/src/app/ui/layout/toolbar/controls/template.html deleted file mode 100644 index 869470cc6a..0000000000 --- a/application/client/src/app/ui/layout/toolbar/controls/template.html +++ /dev/null @@ -1,9 +0,0 @@ -
- -
-
- -
-
- -
\ No newline at end of file diff --git a/application/client/src/app/ui/layout/toolbar/styles.less b/application/client/src/app/ui/layout/toolbar/styles.less deleted file mode 100644 index 2d908f8cbf..0000000000 --- a/application/client/src/app/ui/layout/toolbar/styles.less +++ /dev/null @@ -1,19 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - top: 0; - left: 0; - bottom: 0; - right: 0; - position: absolute; - display: block; - & element-tabs { - top: 0; - left: 0; - bottom: 0; - right: 0; - position: absolute; - display: block; - overflow: hidden; - } -} diff --git a/application/client/src/app/ui/layout/toolbar/template.html b/application/client/src/app/ui/layout/toolbar/template.html deleted file mode 100644 index e6032eeb11..0000000000 --- a/application/client/src/app/ui/layout/toolbar/template.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/application/client/src/app/ui/layout/workspace/component.ts b/application/client/src/app/ui/layout/workspace/component.ts deleted file mode 100644 index e806b6801e..0000000000 --- a/application/client/src/app/ui/layout/workspace/component.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { - Component, - AfterViewInit, - ChangeDetectorRef, - ChangeDetectionStrategy, -} from '@angular/core'; -import { TabsService } from '@elements/tabs/service'; -import { LayoutHome } from './no-tabs-content/component'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { components } from '@env/decorators/initial'; - -import * as ids from '@schema/ids'; - -@Component({ - selector: 'app-layout-workspace', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class LayoutWorkspace extends ChangesDetector implements AfterViewInit { - public tabs: TabsService; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - this.tabs = this.ilc().services.system.session.getTabsService(); - } - - ngAfterViewInit() { - this.ilc() - .services.system.session.add() - .unbound({ - uuid: ids.WORKSPACE_TAB_HOME, - sidebar: true, - toolbar: false, - tab: { - content: { - factory: LayoutHome, - }, - active: true, - name: '', - closable: false, - icon: 'home', - }, - }) - .sidebar() - ?.add({ - content: { - factory: components.get('app-elements-tree'), - }, - active: true, - closable: false, - name: 'Favourite', - }); - this.env().subscriber.register( - this.ilc().services.system.hotkeys.listen('Ctrl + Tab', () => { - this.tabs.next(); - }), - ); - this.env().subscriber.register( - this.ilc().services.system.hotkeys.listen('Shift + Ctrl + Tab', () => { - this.tabs.prev(); - }), - ); - this.env().subscriber.register( - this.ilc().services.system.hotkeys.listen('Ctrl + T', () => { - this.tabs.setActive(ids.WORKSPACE_TAB_HOME); - }), - ); - } -} -export interface LayoutWorkspace extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/workspace/controls/component.ts b/application/client/src/app/ui/layout/workspace/controls/component.ts deleted file mode 100644 index 91fd96637d..0000000000 --- a/application/client/src/app/ui/layout/workspace/controls/component.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { stop } from '@ui/env/dom'; - -@Component({ - selector: 'app-layout-workspace-controls', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class LayoutWorkspaceControls { - @Input() public onNewTab!: () => void; - - public addNewTab(event: MouseEvent) { - stop(event); - if (typeof this.onNewTab !== 'function') { - return false; - } - this.onNewTab(); - return false; - } -} -export interface LayoutWorkspaceControls extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/workspace/controls/styles.less b/application/client/src/app/ui/layout/workspace/controls/styles.less deleted file mode 100644 index 57a831d34f..0000000000 --- a/application/client/src/app/ui/layout/workspace/controls/styles.less +++ /dev/null @@ -1,13 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - display: inline-block; - white-space: nowrap; - height: 100%; - width: 100%; - text-align: left; - & .add-new { - margin-top: 5px; - } -} diff --git a/application/client/src/app/ui/layout/workspace/controls/template.html b/application/client/src/app/ui/layout/workspace/controls/template.html deleted file mode 100644 index 46708e9394..0000000000 --- a/application/client/src/app/ui/layout/workspace/controls/template.html +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/application/client/src/app/ui/layout/workspace/no-tabs-content/action/component.ts b/application/client/src/app/ui/layout/workspace/no-tabs-content/action/component.ts deleted file mode 100644 index b58fc7870d..0000000000 --- a/application/client/src/app/ui/layout/workspace/no-tabs-content/action/component.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Component, Input, ChangeDetectorRef, AfterViewInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Base } from '../../../../../service/actions/action'; -import { Storage as ActionsStorage } from '../../../../../service/actions/storage'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { stop } from '@ui/env/dom'; - -@Component({ - selector: 'app-home-action', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class ActionComponent extends ChangesDetector implements AfterViewInit { - @Input() public action!: Base; - @Input() public actions!: ActionsStorage; - @Input() public menu!: boolean; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterViewInit(): void { - this.env().subscriber.register( - this.actions.updated.subscribe(() => { - this.detectChanges(); - }), - ); - } - - public isPinned() { - return this.actions.isPinned(this.action.uuid()); - } - - public onPin(event: MouseEvent) { - this.actions.toggle(this.action.uuid()); - stop(event); - } -} -export interface ActionComponent extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/workspace/no-tabs-content/action/styles.less b/application/client/src/app/ui/layout/workspace/no-tabs-content/action/styles.less deleted file mode 100644 index 8f0d95aea3..0000000000 --- a/application/client/src/app/ui/layout/workspace/no-tabs-content/action/styles.less +++ /dev/null @@ -1,43 +0,0 @@ -@import '../../../../styles/variables.less'; - -:host { - display: block; - width: 100%; - & div.wrapper { - position: relative; - display: flex; - flex-direction: row; - align-items: center; - width: 100%; - & span.left { - flex: auto; - font-size: 14px; - } - & mat-icon { - margin-left: 12px; - margin-right: 0px; - width: 16px; - height: 16px; - font-size: 16px; - opacity: 0.01; - transition: opacity ease-in-out 150ms; - &[data-pinned="no"] { - color: var(--scheme-color-3); - } - &[data-pinned="yes"] { - color: var(--scheme-color-1); - } - &:hover { - color: var(--scheme-color-0); - cursor: default; - } - } - } - &:hover { - & div.wrapper { - & mat-icon { - opacity: 1; - } - } - } -} diff --git a/application/client/src/app/ui/layout/workspace/no-tabs-content/action/template.html b/application/client/src/app/ui/layout/workspace/no-tabs-content/action/template.html deleted file mode 100644 index e325430656..0000000000 --- a/application/client/src/app/ui/layout/workspace/no-tabs-content/action/template.html +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/application/client/src/app/ui/layout/workspace/no-tabs-content/component.ts b/application/client/src/app/ui/layout/workspace/no-tabs-content/component.ts deleted file mode 100644 index a925237055..0000000000 --- a/application/client/src/app/ui/layout/workspace/no-tabs-content/component.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { - Component, - ViewEncapsulation, - AfterViewInit, - OnDestroy, - ChangeDetectorRef, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Storage as ActionsStorage } from '../../../../service/actions/storage'; -import { Base as Action } from '../../../../service/actions/action'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -import * as actions from '@service/actions/index'; - -@Component({ - selector: 'app-layout-area-no-tabs-content', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class LayoutHome extends ChangesDetector implements AfterViewInit, OnDestroy { - public readonly menu = { - file: [ - new actions.FileAny.Action(), - new actions.FileDlt.Action(), - new actions.FilePcap.Action(), - new actions.FilePcapLegacy.Action(), - null, - new actions.FolderText.Action(), - new actions.FolderDlt.Action(), - new actions.FolderPcap.Action(), - new actions.FilePcapLegacy.Action(), - ], - conenctTo: [ - new actions.UdpDlt.Action(), - new actions.TcpDlt.Action(), - null, - new actions.SerialText.Action(), - ], - terminal: new actions.StdoutText.Action(), - }; - public actions: ActionsStorage = new ActionsStorage(); - public pinned: Array = []; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnDestroy(): void { - this.actions.destroy(); - } - - public ngAfterViewInit(): void { - this.actions.load(); - this.env().subscriber.register( - this.actions.updated.subscribe(() => { - this.update(); - }), - ); - this.update(); - } - - protected update() { - const actions = this.actions.get().sort((a, b) => (a.group() > b.group() ? -1 : 1)); - const pinned: Array = []; - let group = -1; - actions.forEach((action) => { - if (group === -1) { - group = action.group(); - } - if (group !== action.group()) { - pinned.push(null); - group = action.group(); - } - pinned.push(action); - }); - this.pinned = pinned; - this.detectChanges(); - } -} -export interface LayoutHome extends IlcInterface {} diff --git a/application/client/src/app/ui/layout/workspace/no-tabs-content/module.ts b/application/client/src/app/ui/layout/workspace/no-tabs-content/module.ts deleted file mode 100644 index 129650f48a..0000000000 --- a/application/client/src/app/ui/layout/workspace/no-tabs-content/module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ContainersModule } from '@elements/containers/module'; -import { RecentActionsModule } from '@elements/recent/module'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { AppDirectiviesModule } from '@directives/module'; - -import { LayoutHome } from './component'; -import { ActionComponent } from './action/component'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatIconModule, - MatMenuModule, - RecentActionsModule, - AppDirectiviesModule, - ], - declarations: [LayoutHome, ActionComponent], - exports: [LayoutHome], - bootstrap: [LayoutHome, ActionComponent], -}) -export class LayoutHomeModule {} diff --git a/application/client/src/app/ui/layout/workspace/no-tabs-content/styles.less b/application/client/src/app/ui/layout/workspace/no-tabs-content/styles.less deleted file mode 100644 index 45927ec246..0000000000 --- a/application/client/src/app/ui/layout/workspace/no-tabs-content/styles.less +++ /dev/null @@ -1,65 +0,0 @@ -@import '../../../styles/variables.less'; - -app-layout-area-no-tabs-content { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - & * { - color: var(--scheme-color-0); - } - h1 { - font-size: 14px; - } - & .menu-buttons { - display: flex; - flex-direction: row; - align-items: center; - text-align: center; - align-self: center; - } - & button.menu-button { - width: 82px; - height: 80px!important; - display: flex; - flex-direction: column; - align-items: center; - margin-left: 8px; - &:first-child{ - margin-left: 0; - } - & mat-icon { - margin-top: 8px; - margin-bottom: 8px; - margin-right: 0!important; - margin-left: 0!important; - } - } - & div.left { - position: absolute; - width: 20rem; - top:0; - bottom: 0; - left: 0; - } - & div.right { - position: absolute; - display: flex; - left: 20rem; - right: 0; - bottom: 0; - top: 0; - & mat-card.fill { - overflow-y: auto; - overflow-x: hidden; - width: 100%; - } - } - & div.feature { - margin: 6px 0; - padding: 6px 0 0px 0; - } -} diff --git a/application/client/src/app/ui/layout/workspace/no-tabs-content/template.html b/application/client/src/app/ui/layout/workspace/no-tabs-content/template.html deleted file mode 100644 index 1489a1c554..0000000000 --- a/application/client/src/app/ui/layout/workspace/no-tabs-content/template.html +++ /dev/null @@ -1,64 +0,0 @@ -
-
-
- - - - - - - - - Favorited Actions - Add/remove favorited actions - - -

You can add some actions to favorites. Just click on the star (on hover above action).

-
- - - - - - -
-
-
-
- - Recently Opened - List of recently opened source - - - - -
-
-
- - - - - - - - - - - - - - - - - - diff --git a/application/client/src/app/ui/layout/workspace/styles.less b/application/client/src/app/ui/layout/workspace/styles.less deleted file mode 100644 index 2d908f8cbf..0000000000 --- a/application/client/src/app/ui/layout/workspace/styles.less +++ /dev/null @@ -1,19 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - top: 0; - left: 0; - bottom: 0; - right: 0; - position: absolute; - display: block; - & element-tabs { - top: 0; - left: 0; - bottom: 0; - right: 0; - position: absolute; - display: block; - overflow: hidden; - } -} diff --git a/application/client/src/app/ui/layout/workspace/template.html b/application/client/src/app/ui/layout/workspace/template.html deleted file mode 100644 index 202e1e6e5b..0000000000 --- a/application/client/src/app/ui/layout/workspace/template.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/application/client/src/app/ui/service/contextmenu.ts b/application/client/src/app/ui/service/contextmenu.ts deleted file mode 100644 index 74ca6f0d4a..0000000000 --- a/application/client/src/app/ui/service/contextmenu.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { ui } from '@register/services'; -import { ilc, Emitter } from '@service/ilc'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { unique } from '@platform/env/sequence'; -import { Once } from '@platform/env/togglers'; - -export { IComponentDesc }; -export interface IMenuItem { - id?: string; - caption?: string; - handler?: () => void; - disabled?: boolean; - shortcut?: string; -} - -export interface IMenu { - id?: string; - component?: IComponentDesc; - items?: IMenuItem[]; - after?: () => void; - x: number; - y: number; -} - -@SetupService(ui['contextmenu']) -export class Service extends Implementation { - private _emitter!: Emitter; - - public override ready(): Promise { - this._emitter = ilc.emitter(this.getName(), this.log()); - return Promise.resolve(); - } - - public show(menu: IMenu): Once { - const uuid = menu.id !== undefined ? menu.id : unique(); - menu.id = uuid; - this._emitter.ui.contextmenu.open(menu); - return new Once( - `contextmenu: ${uuid}`, - () => { - this._emitter.ui.contextmenu.close(); - }, - uuid, - ); - } - - public remove(): void { - this._emitter.ui.contextmenu.close(); - } -} -export interface Service extends Interface {} -export const contextmenu = register(new Service()); diff --git a/application/client/src/app/ui/service/dropfiles.ts b/application/client/src/app/ui/service/dropfiles.ts deleted file mode 100644 index 480dc1f660..0000000000 --- a/application/client/src/app/ui/service/dropfiles.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { ui } from '@register/services'; -import { bridge } from '@service/bridge'; -import { stop } from '@ui/env/dom'; -import { Action as FileAnyAction } from '@service/actions/file.any'; - -@SetupService(ui['dropfiles']) -export class Service extends Implementation { - protected enabled: boolean = false; - - protected drop(event: DragEvent): boolean { - if (!this.enabled) { - return true; - } - const files: string[] = this.getFiles(event); - stop(event); - if (files.length === 0) { - this.log().warn(`No files dropped.`); - return false; - } - this.log().debug(`${files.length} file(s) has been dropped`); - bridge - .files() - .getByPath(files) - .then((files) => { - if (files.length === 0) { - return; - } - const action = new FileAnyAction(); - if (files.length === 1) { - action.from(files[0]); - } else { - action.multiple(files); - } - }) - .catch((err: Error) => { - this.log().warn(`Fail get files due: ${err.message}`); - }); - return false; - } - - protected stop(event: MouseEvent): boolean { - if (!this.enabled) { - return true; - } - return stop(event); - } - - protected getFiles(event: DragEvent): string[] { - if (event.dataTransfer === null || event.dataTransfer === undefined) { - return []; - } - const files = (() => { - if (event.dataTransfer.files) { - return Array.from(event.dataTransfer.files).map((f) => - window.electron.webUtils.getPathForFile(f), - ); - } else if (event.dataTransfer.items) { - return ( - Array.from(event.dataTransfer.items) - .map((item: DataTransferItem) => { - if (item.kind === 'file') { - return item.getAsFile(); - } else { - return undefined; - } - }) - .filter((f) => f !== undefined) as File[] - ).map((f) => window.electron.webUtils.getPathForFile(f)); - } else { - return []; - } - })(); - return files; - } - - public override ready(): Promise { - this.stop = this.stop.bind(this); - this.drop = this.drop.bind(this); - document.addEventListener('dragover', this.stop); - document.addEventListener('dragleave', this.stop); - document.addEventListener('drop', this.drop); - return Promise.resolve(); - } - - public override destroy(): Promise { - document.removeEventListener('dragover', this.stop); - document.removeEventListener('dragleave', this.stop); - document.removeEventListener('drop', this.drop); - return Promise.resolve(); - } - - public state(): { - enable(): void; - disable(): void; - } { - return { - enable: (): void => { - this.enabled = true; - }, - disable: (): void => { - this.enabled = false; - }, - }; - } -} -export interface Service extends Interface {} -export const dropfiles = register(new Service()); diff --git a/application/client/src/app/ui/service/filters.ts b/application/client/src/app/ui/service/filters.ts deleted file mode 100644 index 309f3d19fe..0000000000 --- a/application/client/src/app/ui/service/filters.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { ui } from '@register/services'; -import { Subject } from '@platform/env/subscription'; - -@SetupService(ui['filters']) -export class Service extends Implementation { - public readonly updated: Subject = new Subject(); - protected filters: string[] = []; - - public override destroy(): Promise { - this.updated.destroy(); - return Promise.resolve(); - } - - public add(uuid: string) { - !this.filters.includes(uuid) && this.filters.push(uuid); - this.updated.emit(); - } - - public remove(uuid: string) { - this.filters = this.filters.filter((f) => f !== uuid); - this.updated.emit(); - } - - public isEnabled(uuid: string): boolean { - return this.filters.length === 0 ? false : this.filters[this.filters.length - 1] === uuid; - } -} - -export interface Service extends Interface {} -export const filters = register(new Service()); diff --git a/application/client/src/app/ui/service/layout.ts b/application/client/src/app/ui/service/layout.ts deleted file mode 100644 index c3b999f999..0000000000 --- a/application/client/src/app/ui/service/layout.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { ui } from '@register/services'; -import { ilc, Emitter } from '@service/ilc'; - -@SetupService(ui['layout']) -export class Service extends Implementation { - private _emitter!: Emitter; - - public override ready(): Promise { - this._emitter = ilc.emitter(this.getName(), this.log()); - return Promise.resolve(); - } - - public sidebar(): { - min: () => void; - max: () => void; - } { - const emitter = this._emitter; - return { - min(): void { - emitter.ui.sidebar.min(); - }, - max(): void { - emitter.ui.sidebar.max(); - }, - }; - } - - public toolbar(): { - min: () => void; - max: () => void; - occupy: () => void; - state: ( - getter: (state: { - min: boolean; - max: boolean; - occupied: boolean; - size: number; - }) => void, - ) => void; - } { - const emitter = this._emitter; - return { - min(): void { - emitter.ui.toolbar.min(); - }, - max(): void { - emitter.ui.toolbar.max(); - }, - occupy(): void { - emitter.ui.toolbar.occupy(); - }, - state( - getter: (state: { - min: boolean; - max: boolean; - occupied: boolean; - size: number; - }) => void, - ): void { - emitter.ui.toolbar.state(getter); - }, - }; - } -} - -export interface Service extends Interface {} -export const layout = register(new Service()); diff --git a/application/client/src/app/ui/service/listener.ts b/application/client/src/app/ui/service/listener.ts deleted file mode 100644 index 00b6fe3adc..0000000000 --- a/application/client/src/app/ui/service/listener.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { ui } from '@register/services'; -import { IOptions } from './listener/options'; -import { Target, getTargetUuid, ITarget } from './listener/target'; -import { Subscription } from '@platform/env/subscription'; - -@SetupService(ui['listener']) -export class Service extends Implementation { - protected targets: Map = new Map(); - - public override ready(): Promise { - return Promise.resolve(); - } - - public override destroy(): Promise { - this.targets.forEach((target) => target.destroy()); - return Promise.resolve(); - } - - public listen( - event: string, - target: ITarget, - handler: (event: T) => boolean, - options?: IOptions, - ): Subscription { - const uuid = getTargetUuid(target); - let holder: Target | undefined = undefined; - if (uuid === undefined) { - holder = new Target(target); - this.targets.set(holder.uuid, holder); - } else { - holder = this.targets.get(uuid); - } - if (holder === undefined) { - throw new Error(`Fail to recognise target`); - } - if (event.trim() === '') { - throw new Error(`Event name isn't defined`); - } - return holder.listen(event, handler, options); - } -} -export interface Service extends Interface {} -export const listener = register(new Service()); diff --git a/application/client/src/app/ui/service/listener/handler.ts b/application/client/src/app/ui/service/listener/handler.ts deleted file mode 100644 index 1dc02ff9c2..0000000000 --- a/application/client/src/app/ui/service/listener/handler.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { IOptions } from './options'; -import { unique } from '@platform/env/sequence'; - -export class Handler { - public readonly priority: number = 1; - public readonly uuid: string = unique(); - protected handler: (event: T) => boolean; - - constructor(handler: (event: T) => boolean, options?: IOptions) { - options = options === undefined ? {} : options; - this.priority = options.priority !== undefined ? options.priority : this.priority; - this.handler = handler; - } - - public proccess(event: T): boolean { - return this.handler(event); - } -} diff --git a/application/client/src/app/ui/service/listener/options.ts b/application/client/src/app/ui/service/listener/options.ts deleted file mode 100644 index 7aaa96a424..0000000000 --- a/application/client/src/app/ui/service/listener/options.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface IOptions { - priority?: number; -} diff --git a/application/client/src/app/ui/service/listener/target.ts b/application/client/src/app/ui/service/listener/target.ts deleted file mode 100644 index 96b5db7320..0000000000 --- a/application/client/src/app/ui/service/listener/target.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { unique } from '@platform/env/sequence'; -import { Handler } from './handler'; -import { Subscription } from '@platform/env/subscription'; -import { IOptions } from './options'; - -export interface ITarget { - addEventListener: (...args: any[]) => void; -} - -export class Target { - static KEY = '___GLOBAL_LISTENER_UUID_TARGET___'; - public readonly uuid: string = unique(); - - protected handlers: Map>> = new Map(); - protected signals: Map = new Map(); - protected target: ITarget; - - constructor(target: ITarget) { - this.target = target; - (this.target as any)[Target.KEY] = this.uuid; - } - - public destroy(): void { - this.handlers.clear(); - this.signals.forEach((controller) => controller.abort()); - this.signals.clear(); - } - - public equal(target: ITarget): boolean { - return (target as any)[Target.KEY] === this.uuid; - } - - public listen( - event: string, - handler: (event: T) => boolean, - options?: IOptions, - ): Subscription { - if (event.trim() === '') { - throw new Error(`Invalid event name`); - } - let handlers = this.handlers.get(event); - if (handlers === undefined) { - const control = new AbortController(); - this.target.addEventListener(event, this.process.bind(this, event), { - capture: true, - signal: control.signal, - }); - this.signals.set(event, control); - handlers = new Map(); - } - const instance = new Handler(handler, options); - const uuid = instance.uuid; - handlers.set(uuid, instance as Handler); - this.handlers.set(event, handlers); - return new Subscription(`event: ${uuid}`, () => { - const handlers = this.handlers.get(event); - if (handlers === undefined) { - return; - } - handlers.delete(uuid); - this.handlers.set(event, handlers); - if (handlers.size === 0) { - this.handlers.delete(event); - const signal = this.signals.get(event); - if (signal !== undefined) { - signal.abort(); - } - this.signals.delete(event); - } - }); - } - - protected process(name: string, event: unknown): boolean { - const handlers = this.handlers.get(name); - if (handlers === undefined) { - return true; - } - const sorted = Array.from(handlers.values()); - sorted.sort((a, b) => { - return a.priority > b.priority ? -1 : 1; - }); - let result = true; - sorted.forEach((handler) => { - if (!result) { - return; - } - result = handler.proccess(event); - }); - if (!result) { - const untyped = event as any; - ['preventDefault', 'stopImmediatePropagation', 'stopPropagation'].forEach( - (alias: string) => { - typeof untyped[alias] === 'function' && untyped[alias](); - }, - ); - } - return result; - } -} - -export function getTargetUuid(target: ITarget): string | undefined { - return (target as any)[Target.KEY]; -} diff --git a/application/client/src/app/ui/service/lockers.ts b/application/client/src/app/ui/service/lockers.ts deleted file mode 100644 index e2eaa4594d..0000000000 --- a/application/client/src/app/ui/service/lockers.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { ui } from '@register/services'; -import { popup, PopupOptions, Popup } from '@ui/service/popup'; -import { components } from '@env/decorators/initial'; -import { Locker } from './lokers/locker'; -import { Level } from './notification/index'; -import { Vertical, Horizontal } from '@ui/service/popup'; -import { Subject } from '@platform/env/subscription'; - -export { Locker, Level }; - -@SetupService(ui['lockers']) -export class Service extends Implementation { - public unbound: Subject = new Subject(); - - protected lockers: Map = new Map(); - - public override destroy(): Promise { - this.lockers.forEach((stored) => { - if (stored.popup !== undefined) { - stored.popup.close(); - } - }); - this.lockers.clear(); - this.unbound.destroy(); - return Promise.resolve(); - } - - public lock(locker: Locker, options: PopupOptions): { locker: Locker; popup: Popup } { - const created = { - locker, - popup: popup.open( - Object.assign(options, { - component: { - factory: components.get('app-dialogs-locker-message'), - inputs: { - locker, - }, - }, - position: { - vertical: Vertical.center, - horizontal: Horizontal.center, - }, - width: 350, - }), - ), - }; - this.action().add(created.locker, created.popup); - return created; - } - - public get(group: string): Locker[] { - return Array.from(this.lockers.values()) - .filter((s) => s.popup === undefined && s.locker.group === group) - .map((s) => s.locker); - } - - public progress(caption: string): () => void { - const { locker: _, popup } = lockers.lock( - new Locker(true, caption).set().type(Level.progress).end(), - { - closable: false, - }, - ); - return () => { - popup.close(); - }; - } - - protected action(): { - add(locker: Locker, popup: Popup): void; - unbound(group: string): void; - } { - return { - add: (locker: Locker, popup: Popup): void => { - this.lockers.set(locker.uuid, { locker, popup }); - const subscription = popup.subjects.get().closed.subscribe(() => { - subscription.destroy(); - this.action().unbound(locker.uuid); - }); - }, - unbound: (uuid: string): void => { - const stored = this.lockers.get(uuid); - if (stored === undefined) { - return; - } - if ([Level.error, Level.warning].includes(stored.locker.type)) { - stored.popup = undefined; - this.lockers.set(uuid, stored); - } else { - this.lockers.delete(uuid); - } - this.unbound.emit(stored.locker); - }, - }; - } -} -export interface Service extends Interface {} -export const lockers = register(new Service()); diff --git a/application/client/src/app/ui/service/lokers/locker.ts b/application/client/src/app/ui/service/lokers/locker.ts deleted file mode 100644 index ba12e06ec6..0000000000 --- a/application/client/src/app/ui/service/lokers/locker.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { unique } from '@platform/env/sequence'; -import { Subject } from '@platform/env/subscription'; -import { Level } from '../notification/index'; - -export interface Button { - caption: string; - handler: () => void; -} -export interface Setter { - message(msg: string | undefined): Setter; - type(type: Level): Setter; - spinner(spinner: boolean): Setter; - group(uuid: string): Setter; - buttons(buttons: Button[]): Setter; - end(): Locker; -} -export class Locker { - public updated: Subject = new Subject(); - public message: string | undefined; - public buttons: Button[] = []; - public type: Level = Level.info; - public spinner: boolean = true; - public group: string = unique(); - public uuid: string = unique(); - public created: number = Date.now(); - - constructor(spinner: boolean, message: string | undefined) { - this.message = message; - this.spinner = spinner; - } - - public getLevel(): Level { - return this.type; - } - - public getGroup(): string { - return this.group; - } - - public getTime(): string { - return new Date(this.created).toLocaleTimeString(); - } - - public set(): Setter { - const setter = { - message: (msg: string | undefined): Setter => { - this.message = msg; - this.updated.emit(); - return setter; - }, - type: (type: Level): Setter => { - this.type = type; - this.updated.emit(); - return setter; - }, - spinner: (spinner: boolean): Setter => { - this.spinner = spinner; - this.updated.emit(); - return setter; - }, - group: (uuid: string): Setter => { - this.group = uuid; - this.updated.emit(); - return setter; - }, - buttons: (buttons: Button[]): Setter => { - this.buttons = buttons; - this.updated.emit(); - return setter; - }, - end: (): Locker => { - return this; - }, - }; - return setter; - } -} diff --git a/application/client/src/app/ui/service/notification/index.ts b/application/client/src/app/ui/service/notification/index.ts deleted file mode 100644 index 2ae160ea6d..0000000000 --- a/application/client/src/app/ui/service/notification/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export enum Level { - info = 'info', - error = 'error', - warning = 'warning', - accent = 'accent', - progress = 'progress', -} diff --git a/application/client/src/app/ui/service/notification/notification.ts b/application/client/src/app/ui/service/notification/notification.ts deleted file mode 100644 index 95e21be682..0000000000 --- a/application/client/src/app/ui/service/notification/notification.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { unique } from '@platform/env/sequence'; -import { Action } from '@platform/types/notification/index'; - -import * as Events from '@platform/ipc/event'; - -export interface INotification { - message: string; - session?: string; - pinned?: boolean; - actions: Action[]; -} - -export class Notification { - static from(event: Events.Notification.Pop.Event): Notification { - return new Notification({ - message: event.message, - actions: event.actions, - session: event.session, - pinned: true, - }); - } - - public readonly notification: INotification; - public readonly uuid: string = unique(); - - constructor(notification: INotification) { - this.notification = notification; - } - - public actions(): Action[] { - return this.notification.actions; - } - - public message(): string { - return this.notification.message; - } - - public duration(): number | undefined { - return this.notification.pinned === true ? undefined : 3000; - } -} diff --git a/application/client/src/app/ui/service/notifications.ts b/application/client/src/app/ui/service/notifications.ts deleted file mode 100644 index e72fc36078..0000000000 --- a/application/client/src/app/ui/service/notifications.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { ui } from '@register/services'; -import { Notification } from './notification/notification'; -import { Subject, Subjects } from '@platform/env/subscription'; -import { Level } from './notification/index'; - -import * as Events from '@platform/ipc/event'; - -export { Level, Notification }; - -@SetupService(ui['notifications']) -export class Service extends Implementation { - public subjects: Subjects<{ - pop: Subject; - store: Subject; - }> = new Subjects({ - pop: new Subject(), - store: new Subject(), - }); - - protected messages: Map = new Map(); - - public override ready(): Promise { - Events.IpcEvent.subscribe( - Events.Notification.Pop.Event, - (event: Events.Notification.Pop.Event) => { - const notification = Notification.from(event); - this.messages.set(notification.uuid, notification); - this.subjects.get().pop.emit(notification); - }, - ); - return Promise.resolve(); - } - - public notify(notification: Notification): Service { - this.store(notification).subjects.get().pop.emit(notification); - return this; - } - - public store(notification: Notification): Service { - this.messages.set(notification.uuid, notification); - this.subjects.get().store.emit(notification); - return this; - } - - public clear() { - console.log(`... not implemented`); - } -} -export interface Service extends Interface {} -export const notifications = register(new Service()); diff --git a/application/client/src/app/ui/service/popup.ts b/application/client/src/app/ui/service/popup.ts deleted file mode 100644 index a342ae0f6a..0000000000 --- a/application/client/src/app/ui/service/popup.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { ui } from '@register/services'; -import { ilc, Emitter } from '@service/ilc'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { Popup, Options, PopupOptions, Vertical, Horizontal } from './popup/popup'; - -export { IComponentDesc, Popup, Vertical, Horizontal, PopupOptions, Options }; - -@SetupService(ui['popup']) -export class Service extends Implementation { - private _emitter!: Emitter; - private _count: number = 0; - private _blured: boolean = true; - - public override ready(): Promise { - this._emitter = ilc.emitter(this.getName(), this.log()); - return Promise.resolve(); - } - - public open(options: Options): Popup { - const popup = new Popup(options, this.close.bind(this)); - this._blured = popup.isBlured(); - this._emitter.ui.popup.open(popup); - return popup; - } - - public close(uuid: string): void { - this._emitter.ui.popup.close(uuid); - } - - public setCount(count: number) { - this._count = count; - } - - public getCount(): number { - return this._count; - } - - public isBlured(): boolean { - return this._blured; - } -} -export interface Service extends Interface {} -export const popup = register(new Service()); diff --git a/application/client/src/app/ui/service/popup/popup.ts b/application/client/src/app/ui/service/popup/popup.ts deleted file mode 100644 index 1a34b84c22..0000000000 --- a/application/client/src/app/ui/service/popup/popup.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { unique } from '@platform/env/sequence'; -import { Subjects, Subject } from '@platform/env/subscription'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; - -export enum Vertical { - top = 'top', - center = 'center', - bottom = 'bottom', -} - -export enum Horizontal { - left = 'left', - right = 'right', - center = 'center', -} - -export interface Position { - vertical: Vertical; - horizontal: Horizontal; -} - -export interface PopupOptions { - closable?: boolean; - width?: number; - position?: Position; - closeOnKey?: string; - closeOnBGClick?: boolean; - uuid?: string; - blur?: boolean; -} - -export interface Options extends PopupOptions { - component: IComponentDesc; -} - -export class Popup { - public subjects: Subjects<{ - opened: Subject; - closed: Subject; - }> = new Subjects({ - opened: new Subject(), - closed: new Subject(), - }); - - public options: Options; - public readonly uuid: string; - - protected readonly closer: (uuid: string) => void; - - constructor(options: Options, closer: (uuid: string) => void) { - this.uuid = options.uuid === undefined ? unique() : options.uuid; - this.options = options; - this.closer = closer; - } - - public destroy() { - this.close(); - this.subjects.destroy(); - } - - public close(): void { - this.closer(this.uuid); - } - - public isBlured(): boolean { - return this.options.blur === undefined ? true : this.options.blur; - } -} diff --git a/application/client/src/app/ui/service/sidebar.ts b/application/client/src/app/ui/service/sidebar.ts deleted file mode 100644 index 53c7aa4515..0000000000 --- a/application/client/src/app/ui/service/sidebar.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { ui } from '@register/services'; -import { ilc, Emitter, Channel, Declarations, Services } from '@service/ilc'; - -import { TabsService, ITab } from '@elements/tabs/service'; -import { UUIDs } from './sidebar/register'; -import { Tabs } from './sidebar/tabs'; - -@SetupService(ui['sidebar']) -export class Service extends Implementation { - private _emitter!: Emitter; - private _channel!: Channel; - private _services!: Services; - private _available!: Tabs; - private _active: string | undefined; - private _sessions: Map = new Map(); - - public override ready(): Promise { - this._emitter = ilc.emitter(this.getName(), this.log()); - this._channel = ilc.channel(this.getName(), this.log()); - this._services = ilc.services(this.getName(), this.log()); - this._channel.session.change(this._onSessionChange.bind(this)); - this._channel.session.closed(this._onSessionClosed.bind(this)); - this._channel.ui.sidebar.view(this._onViewChange.bind(this)); - this._available = new Tabs(); - return Promise.resolve(); - } - - public override destroy(): Promise { - this._sessions.forEach((serivce: TabsService) => { - serivce.clear(); - }); - this._sessions.clear(); - return Promise.resolve(); - } - - public add(tabs: ITab[] | ITab) { - if (this._active === undefined) { - return; - } - const service: TabsService | undefined = this._sessions.get(this._active); - if (service === undefined) { - return; - } - tabs = tabs instanceof Array ? tabs : [tabs]; - // Add tabs - tabs.forEach((tab: ITab) => { - if (tab.uuid === undefined) { - return; - } - const uuid = tab.uuid; - if (!service.has(tab.uuid)) { - const tab: ITab | undefined = this._available.get(uuid); - if (tab === undefined) { - return; - } - service.add(tab); - } - }); - } - - public addByGuid(uuid: string) { - if (this._active === undefined) { - return; - } - const tab: ITab | undefined = this._available.get(uuid); - const service: TabsService | undefined = this._sessions.get(this._active); - if (service === undefined || tab === undefined) { - return; - } - if (tab.uuid === undefined) { - return; - } - if (service.has(tab.uuid)) { - return; - } - service.add(tab); - } - - public remove(uuid: string) { - if (this._active === undefined) { - return; - } - const service: TabsService | undefined = this._sessions.get(this._active); - if (service === undefined) { - return; - } - service.remove(uuid); - return; - } - - public has(tab: string): boolean { - if (this._active === undefined) { - return false; - } - const service: TabsService | undefined = this._sessions.get(this._active); - if (service === undefined) { - return false; - } - return service.has(tab); - } - - public setActive(uuid: string, openTabOnly: boolean = false): Promise { - return new Promise((resolve, reject) => { - if (this._active === undefined) { - return reject(new Error(this.log().warn(`Session uuid isn't defined`))); - } - const service: TabsService | undefined = this._sessions.get(this._active); - if (service === undefined) { - return reject(new Error(this.log().warn(`Fail to find tab's service`))); - } - const tab = service.getActiveTab(); - if (!service.has(uuid)) { - const tab: ITab | undefined = this._available.get(uuid); - if (tab === undefined) { - return reject( - new Error(this.log().warn(`Fail to find tab "${uuid}". Tab isn't added.`)), - ); - } - service.add(tab); - } - if (openTabOnly === true) { - if (tab !== undefined) { - service.setActive(tab.uuid); - } - } else { - service.setActive(uuid); - } - resolve(); - }); - } - - private _onSessionChange(uuid: string | undefined) { - if (uuid === undefined) { - return; - } - if (this._sessions.has(uuid)) { - // Service already exists - return; - } - const service: TabsService = new TabsService(); - this._available.defaults().forEach((tab: ITab) => { - service.add(tab); - }); - this._sessions.set(uuid, service); - this._active = uuid; - } - - private _onSessionClosed(uuid: string) { - const service: TabsService | undefined = this._sessions.get(uuid); - if (service !== undefined) { - service.destroy(); - } - this._sessions.delete(uuid); - } - - private _onViewChange(target: Declarations.AvailableSidebarTabs) { - this._services.ui.layout.sidebar().max(); - switch (target) { - case Declarations.AvailableSidebarTabs.SearchManager: - this.setActive(UUIDs.search); - break; - case Declarations.AvailableSidebarTabs.CommentsManager: - this.setActive(UUIDs.comments); - break; - case Declarations.AvailableSidebarTabs.Shell: - this.setActive(UUIDs.shell); - break; - case Declarations.AvailableSidebarTabs.DLTConnector: - this.setActive(UUIDs.dltdeamon); - break; - case Declarations.AvailableSidebarTabs.Concat: - this.setActive(UUIDs.concat); - break; - case Declarations.AvailableSidebarTabs.Merge: - this.setActive(UUIDs.merging); - break; - } - } -} - -export interface Service extends Interface {} -export const sidebar = register(new Service()); diff --git a/application/client/src/app/ui/service/sidebar/register.ts b/application/client/src/app/ui/service/sidebar/register.ts deleted file mode 100644 index cd657faa62..0000000000 --- a/application/client/src/app/ui/service/sidebar/register.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { ITab } from '@elements/tabs/service'; -// import { SidebarAppSearchManagerComponent } from '@sidebar/search.manager/component'; -// import { SidebarAppCommentsComponent } from '@sidebar/comments/component'; -// import { SidebarAppMergeFilesComponent } from '@sidebar/merge/component'; -// import { SidebarAppConcatFilesComponent } from '@sidebar/concat/component'; -// import { SidebarAppDLTConnectorComponent } from '@sidebar/dlt.connector/component'; -// import { SidebarAppShellComponent } from '@sidebar/shell/component'; -// import { SidebarAppAdbComponent } from '@sidebar/adb/component'; - -export enum Available { - SearchManager = 'SearchManager', - CommentsManager = 'CommentsManager', - DLTConnector = 'DLTConnector', - Shell = 'Shell', - Concat = 'Concat', - Merge = 'Merge', -} - -export const UUIDs = { - search: 'search', - merging: 'merging', - concat: 'concat', - dltdeamon: 'dltdeamon', - comments: 'comments', - shell: 'shell', - adb: 'adb', -}; - -export interface IDefault extends ITab { - default: boolean; -} - -export const DEFAULTS: IDefault[] = [ - // { - // uuid: UUIDs.search, - // name: 'Search', - // content: { - // factory: SidebarAppSearchManagerComponent, - // inputs: {}, - // }, - // closable: false, - // active: true, - // default: true, - // }, - // { - // uuid: UUIDs.comments, - // name: 'Comments', - // content: { - // factory: SidebarAppCommentsComponent, - // inputs: {}, - // }, - // closable: true, - // active: true, - // default: true, - // }, - // { - // addedAsDefault: false, - // tab: { - // uuid: UUIDs.merging, - // name: 'Merging', - // content: { - // factory: SidebarAppMergeFilesComponent, - // inputs: {}, - // }, - // closable: true, - // active: true, - // }, - // }, - // { - // addedAsDefault: false, - // tab: { - // uuid: UUIDs.concat, - // name: 'Concat', - // content: { - // factory: SidebarAppConcatFilesComponent, - // inputs: {}, - // }, - // closable: true, - // active: true, - // }, - // }, - // { - // addedAsDefault: false, - // tab: { - // uuid: UUIDs.dltdeamon, - // name: 'DLT Deamon', - // content: { - // factory: SidebarAppDLTConnectorComponent, - // inputs: {}, - // }, - // closable: true, - // active: true, - // }, - // }, - // { - // addedAsDefault: false, - // tab: { - // uuid: UUIDs.shell, - // name: 'Shell', - // content: { - // factory: SidebarAppShellComponent, - // inputs: {}, - // }, - // closable: true, - // active: true, - // }, - // }, - // { - // addedAsDefault: false, - // tab: { - // uuid: UUIDs.adb, - // name: 'Adb', - // content: { - // factory: SidebarAppAdbComponent, - // inputs: {}, - // }, - // closable: true, - // active: true, - // }, - // }, -]; diff --git a/application/client/src/app/ui/service/sidebar/tabs.ts b/application/client/src/app/ui/service/sidebar/tabs.ts deleted file mode 100644 index 77af319430..0000000000 --- a/application/client/src/app/ui/service/sidebar/tabs.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { ITab } from '@elements/tabs/service'; -import { DEFAULTS } from './register'; - -export class Tabs { - private _available: Array = []; - - constructor() { - this._available = DEFAULTS.map((defaultView) => { - return { - uuid: defaultView.uuid, - name: defaultView.name, - active: false, - closable: defaultView.closable, - content: defaultView.content, - default: defaultView.default, - }; - }); - } - - public all(): ITab[] { - return this._available; - } - - public defaults(): ITab[] { - return this._available.filter((tab) => tab.default); - } - - public get(uuid: string): ITab | undefined { - return this._available.find((tab: ITab) => { - return tab.uuid === uuid; - }); - } - - public visible(uuid: string): boolean { - let result: boolean = false; - DEFAULTS.forEach((defaultView) => { - if (result) { - return; - } - if (defaultView.default === true && defaultView.uuid === uuid) { - result = true; - } - }); - return result; - } -} diff --git a/application/client/src/app/ui/service/styles.ts b/application/client/src/app/ui/service/styles.ts deleted file mode 100644 index bedae85e61..0000000000 --- a/application/client/src/app/ui/service/styles.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { ui } from '@register/services'; -import { bridge } from '@service/bridge'; -import { ilc } from '@service/ilc'; - -export type RemoveHandler = () => void; - -const COLOR_THEME_KEY = 'color_theme_settings'; - -type Theme = 'dark-theme' | 'light-theme'; - -@SetupService(ui['styles']) -export class Service extends Implementation { - protected _sheet!: CSSStyleSheet; - protected _theme: Theme = 'dark-theme'; - - public override init(): Promise { - const style = document.createElement('style') as HTMLStyleElement; - document.head.appendChild(style); - if (style.sheet === null) { - return Promise.reject(new Error(`Fail to create global style sheet`)); - } - this._sheet = style.sheet; - ilc.channel(this.getName(), this.log()).system.ready(() => { - this.theme().load(); - }); - - return Promise.resolve(); - } - - public add(rule: string): RemoveHandler { - const index = this._sheet.insertRule(rule); - return () => { - this._sheet.deleteRule(index); - }; - } - - public theme(): { - dark(): void; - light(): void; - load(): void; - save(): void; - apply(): void; - } { - return { - dark: (): void => { - this._theme = 'dark-theme'; - this.theme().apply(); - }, - light: (): void => { - this._theme = 'light-theme'; - this.theme().apply(); - }, - load: (): void => { - bridge - .storage(COLOR_THEME_KEY) - .read() - .then((theme: string) => { - if (theme !== 'dark-theme' && theme !== 'light-theme') { - this._theme = 'dark-theme'; - this.theme().save(); - } else { - this._theme = theme; - } - this.theme().apply(); - }) - .catch((err: Error) => { - this.log().error(`Fail to load theme: ${err.message}`); - this.theme().save(); - }); - }, - save: (): void => { - bridge - .storage(COLOR_THEME_KEY) - .write(this._theme) - .catch((err: Error) => { - this.log().error(`Fail to save theme: ${err.message}`); - }); - }, - apply: () => { - if (this._theme !== 'dark-theme' && this._theme !== 'light-theme') { - this._theme = 'dark-theme'; - } - document.body.className = this._theme; - this.theme().save(); - }, - }; - } - - public colors(): { - scheme_color_0: string; - scheme_color_1: string; - scheme_color_2: string; - scheme_color_3: string; - scheme_color_4: string; - scheme_color_5: string; - scheme_color_6: string; - scheme_color_error: string; - scheme_color_accent: string; - scheme_color_warning: string; - scheme_color_match: string; - scheme_search_match: string; - } { - if (this._theme === 'dark-theme') { - return { - scheme_color_0: '#FFFFFF', - scheme_color_1: '#eaeaea', - scheme_color_2: '#c0c0c0', - scheme_color_3: '#979797', - scheme_color_4: '#555555', - scheme_color_5: '#333333', - scheme_color_6: '#111111', - scheme_color_error: 'rgb(253, 21, 21)', - scheme_color_accent: '#74b9ff', - scheme_color_warning: '#fffd71', - scheme_color_match: '#e4e15b', - scheme_search_match: '#AA0000', - }; - } else { - return { - scheme_color_0: '#000000', - scheme_color_1: '#151515', - scheme_color_2: '#3f3f3f', - scheme_color_3: '#686868', - scheme_color_4: '#aaaaaa', - scheme_color_5: '#efefef', - scheme_color_6: '#fafafa', - scheme_color_error: 'rgb(253, 21, 21)', - scheme_color_accent: '#74b9ff', - scheme_color_warning: '#fffd71', - scheme_color_match: '#e4e15b', - scheme_search_match: '#AA0000', - }; - } - } -} - -export interface Service extends Interface {} -export const styles = register(new Service()); diff --git a/application/client/src/app/ui/service/toolbar.ts b/application/client/src/app/ui/service/toolbar.ts deleted file mode 100644 index fb980a0e8a..0000000000 --- a/application/client/src/app/ui/service/toolbar.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { SetupService, Interface, Implementation, register } from '@platform/entity/service'; -import { ui } from '@register/services'; -import { ilc, Emitter, Channel, Declarations, Services } from '@service/ilc'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { unique } from '@platform/env/sequence'; - -import { TabsService, ITab } from '@elements/tabs/service'; -import { UUIDs } from './toolbar/register'; -import { Tabs } from './toolbar/tabs'; - -@SetupService(ui['toolbar']) -export class Service extends Implementation { - private _emitter!: Emitter; - private _channel!: Channel; - private _services!: Services; - private _available!: Tabs; - private _active: string | undefined; - private _sessions: Map = new Map(); - - public override ready(): Promise { - this._emitter = ilc.emitter(this.getName(), this.log()); - this._channel = ilc.channel(this.getName(), this.log()); - this._services = ilc.services(this.getName(), this.log()); - this._channel.ux.hotkey(this._onHotKey.bind(this)); - this._channel.session.change(this._onSessionChange.bind(this)); - this._channel.session.closed(this._onSessionClosed.bind(this)); - this._channel.ui.toolbar.view(this._onViewChange.bind(this)); - this._available = new Tabs(); - return Promise.resolve(); - } - - public override destroy(): Promise { - this._sessions.forEach((serivce: TabsService) => { - serivce.clear(); - }); - this._sessions.clear(); - return Promise.resolve(); - } - - public add(name: string, content: IComponentDesc, uuid?: string): string | undefined { - if (this._active === undefined) { - return undefined; - } - const service: TabsService | undefined = this._sessions.get(this._active); - if (service === undefined) { - return undefined; - } - uuid = typeof uuid !== 'string' ? unique() : uuid; - if (!service.has(uuid)) { - service.add({ - uuid: uuid, - name, - active: true, - content, - }); - } - this._sessions.set(this._active, service); - return uuid; - } - - public addByGuid(uuid: string): void { - if (this._active === undefined) { - return undefined; - } - const tab: ITab | undefined = this._available.get(uuid); - const service: TabsService | undefined = this._sessions.get(this._active); - if (service === undefined || tab === undefined) { - return undefined; - } - service.add(tab); - } - - public remove(uuid: string): void { - if (this._active === undefined) { - return undefined; - } - const service: TabsService | undefined = this._sessions.get(this._active); - if (service === undefined) { - return undefined; - } - service.remove(uuid); - this._sessions.set(this._active, service); - } - - public has(uuid: string): boolean { - if (this._active === undefined) { - return false; - } - const service: TabsService | undefined = this._sessions.get(this._active); - if (service === undefined) { - return false; - } - return service.has(uuid); - } - - public setActive(uuid: string, openTabOnly: boolean = false): Promise { - return new Promise((resolve, reject) => { - if (this._active === undefined) { - return reject(new Error(this.log().warn(`Session uuid isn't defined`))); - } - const service: TabsService | undefined = this._sessions.get(this._active); - if (service === undefined) { - return reject(new Error(this.log().warn(`Fail to find tab's service`))); - } - const tab = service.getActiveTab(); - if (!service.has(uuid)) { - const tab: ITab | undefined = this._available.get(uuid); - if (tab === undefined) { - return reject( - new Error(this.log().warn(`Fail to find tab "${uuid}". Tab isn't added.`)), - ); - } - service.add(tab); - } - if (openTabOnly === true) { - if (tab !== undefined) { - service.setActive(tab.uuid); - } - } else { - service.setActive(uuid); - } - resolve(); - }); - } - - public getInactiveTabs(session?: string): ITab[] | undefined { - session = session === undefined ? this._active : session; - if (session === undefined) { - return undefined; - } - const service: TabsService | undefined = this._sessions.get(session); - if (service === undefined) { - return undefined; - } - return this._available.all().filter((tab: ITab) => { - return tab.uuid === undefined ? false : !service.has(tab.uuid); - }); - } - - private _onHotKey(event: Declarations.HotkeyEvent) { - console.log(`Not implemented: ${event}`); - // if (this._active === undefined) { - // return; - // } - // const service: TabsService | undefined = this._sessions.get(this._active); - // if (service === undefined) { - // return; - // } - // LayoutStateService.toolbarMax(); - // service.setActive(UUIDs.search); - } - - private _onSessionClosed(session: string) { - const service: TabsService | undefined = this._sessions.get(session); - if (service === undefined) { - return; - } - service.destroy(); - this._sessions.delete(session); - if (this._active === session) { - this._active = undefined; - } - } - - private _onSessionChange(uuid: string | undefined) { - if (uuid === undefined) { - return; - } - let service: TabsService | undefined = this._sessions.get(uuid); - if (service === undefined) { - service = new TabsService({ uuid: `toolbar: ${uuid}` }); - this._available.all().map((tab: ITab) => { - if (tab.uuid !== undefined && !this._available.visible(tab.uuid)) { - return; - } - service !== undefined && service.unshift(tab); - }); - this._sessions.set(uuid, service); - } - this._active = uuid; - } - - private _onViewChange(target: Declarations.AvailableToolbarTabs) { - if (this._active === undefined) { - return; - } - this._services.ui.layout.toolbar().max(); - switch (target) { - case Declarations.AvailableToolbarTabs.Search: - this.addByGuid(UUIDs.search); - break; - case Declarations.AvailableToolbarTabs.Charts: - this.addByGuid(UUIDs.charts); - break; - case Declarations.AvailableToolbarTabs.TimeMeasurement: - this.addByGuid(UUIDs.timemeasurement); - break; - case Declarations.AvailableToolbarTabs.Notifications: - this.addByGuid(UUIDs.notification); - break; - } - } -} -export interface Service extends Interface {} -export const toolbar = register(new Service()); diff --git a/application/client/src/app/ui/service/toolbar/register.ts b/application/client/src/app/ui/service/toolbar/register.ts deleted file mode 100644 index f6a7cea668..0000000000 --- a/application/client/src/app/ui/service/toolbar/register.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { unique } from '@platform/env/sequence'; -// import { ViewSearchComponent } from '@views/search/component'; -// import { SidebarAppNotificationsComponent } from '@views/notifications/component'; -// import { SidebarAppNotificationsCounterComponent } from '@views/notifications/counter/component'; -// import { ViewChartComponent } from '@views/chart/component'; - -export enum Available { - Search = 'Search', - Charts = 'Charts', - TimeMeasurement = 'TimeMeasurement', - Notifications = 'Notifications', - Details = 'Details', -} - -export const UUIDs = { - search: unique(), - charts: unique(), - notification: unique(), - timemeasurement: unique(), - details: unique(), -}; - -export interface IView { - name: string; - uuid: string; - factory: any; - tabCaptionInjection?: any; - inputs: { [key: string]: any }; - default?: boolean; - closable: boolean; -} - -export const DEFAULTS: IView[] = [ - // { - // name: 'Time Measurement', - // uuid: UUIDs.timemeasurement, - // factory: ViewMeasurementComponent, - // inputs: {}, - // closable: true, - // }, - // { - // name: 'Charts', - // uuid: UUIDs.charts, - // factory: ViewChartComponent, - // inputs: {}, - // closable: true, - // }, - // { - // name: 'Notifications', - // uuid: UUIDs.notification, - // factory: SidebarAppNotificationsComponent, - // tabCaptionInjection: SidebarAppNotificationsCounterComponent, - // inputs: {}, - // closable: true, - // }, - // { - // name: 'Search', - // uuid: UUIDs.search, - // factory: ViewSearchComponent, - // inputs: {}, - // default: true, - // closable: false, - // }, -]; diff --git a/application/client/src/app/ui/service/toolbar/tabs.ts b/application/client/src/app/ui/service/toolbar/tabs.ts deleted file mode 100644 index d1cfc43958..0000000000 --- a/application/client/src/app/ui/service/toolbar/tabs.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { ITab } from '@elements/tabs/service'; -import { DEFAULTS } from './register'; - -export class Tabs { - private _available: ITab[] = []; - private _inputs: { [key: string]: any } = {}; - - constructor() { - this._available = DEFAULTS.map((defaultView) => { - return { - uuid: defaultView.uuid, - name: defaultView.name, - active: false, - tabCaptionInjection: - defaultView.tabCaptionInjection === undefined - ? undefined - : { - factory: defaultView.tabCaptionInjection, - inputs: Object.assign(defaultView.inputs, this._inputs), - }, - closable: defaultView.closable, - content: { - factory: defaultView.factory, - inputs: Object.assign(defaultView.inputs, this._inputs), - }, - }; - }); - } - - public all(): ITab[] { - return this._available; - } - - public get(uuid: string): ITab | undefined { - return this._available.find((tab: ITab) => { - return tab.uuid === uuid; - }); - } - - public visible(uuid: string): boolean { - let result: boolean = false; - DEFAULTS.forEach((defaultView) => { - if (result) { - return; - } - if (defaultView.default === true && defaultView.uuid === uuid) { - result = true; - } - }); - return result; - } -} diff --git a/application/client/src/app/ui/styles/borders.less b/application/client/src/app/ui/styles/borders.less deleted file mode 100644 index 55f5c435c4..0000000000 --- a/application/client/src/app/ui/styles/borders.less +++ /dev/null @@ -1,27 +0,0 @@ - -@import './variables.less'; - -.border-based-1{ - box-sizing: border-box; - border: var(--scheme-color-1) outset thin; -} - -.border-based-2{ - box-sizing: border-box; - border: var(--scheme-color-2) outset thin; -} - -.border-based-3{ - box-sizing: border-box; - border: var(--scheme-color-3) outset thin; -} - -.border-based-4{ - box-sizing: border-box; - border: var(--scheme-color-4) outset thin; -} - -.border-based-5{ - box-sizing: border-box; - border: var(--scheme-color-5) outset thin; -} \ No newline at end of file diff --git a/application/client/src/app/ui/styles/buttons.less b/application/client/src/app/ui/styles/buttons.less deleted file mode 100644 index ea2cbc105c..0000000000 --- a/application/client/src/app/ui/styles/buttons.less +++ /dev/null @@ -1,87 +0,0 @@ -@import './variables.less'; - -button.major-button { - background-color: var(--scheme-color-active); -} - -button.flat-codicon-button { - position: relative; - display: flex; - align-items: center; - border: none; - padding: 0 6px; - white-space: nowrap; - background: none; - color: var(--scheme-color-1); - height: 24px; - outline: none; - &:hover { - background: var(--scheme-color-4); - } - & span { - padding-right: 6px; - } -} - -& span.small-link-button { - display: inline-block; - font-size: 12px; - cursor: pointer; - color: var(--scheme-color-2); - border-bottom: dashed thin var(--scheme-color-4); - padding: 2px; - &:hover { - color: var(--scheme-color-1); - border-bottom: dashed thin var(--scheme-color-2); - } -} - -& span.small-icon-button { - display: inline-block; - height: 24px; - width: 24px; - color: var(--scheme-color-1); - text-align: center; - padding-top: 4px; - box-sizing: border-box; - margin: 0px 0px 0px 0px; - border-radius: 3px; - transition: transform 350ms ease-in-out; - &.no-right-marging { - margin-right: 0px; - } - &:hover{ - color: var(--scheme-color-3); - } - &.disabled { - color: var(--scheme-color-3); - &:hover{ - color: var(--scheme-color-3); - } - } - &.with-background { - &:hover{ - background-color: var(--scheme-color-4); - color: var(--scheme-color-0); - } - &.disabled { - color: var(--scheme-color-3); - &:hover{ - color: var(--scheme-color-3); - background: none; - } - &.active { - background: none; - &:hover{ - background: none; - } - } - } - &.active { - background-color: var(--scheme-color-active); - &:hover{ - background-color: var(--scheme-color-active); - } - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/styles/codicons/codicon.less b/application/client/src/app/ui/styles/codicons/codicon.less deleted file mode 100644 index 8466f27b9c..0000000000 --- a/application/client/src/app/ui/styles/codicons/codicon.less +++ /dev/null @@ -1,582 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - - @font-face { - font-family: "codicon"; - font-display: block; - src: url("./codicon.ttf?2ab61cbaefbdf4c7c5589068100bee0c") format("truetype"); -} - -.codicon[class*='codicon-'] { - font: normal normal normal 16px/1 codicon; - display: inline-block; - text-decoration: none; - text-rendering: auto; - text-align: center; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - user-select: none; - -webkit-user-select: none; - -ms-user-select: none; -} - -/*--------------------- - * Modifiers - *-------------------*/ - -@keyframes codicon-spin { - 100% { - transform:rotate(360deg); - } -} - -.codicon-sync.codicon-modifier-spin, -.codicon-loading.codicon-modifier-spin, -.codicon-gear.codicon-modifier-spin { - /* Use steps to throttle FPS to reduce CPU usage */ - animation: codicon-spin 1.5s steps(30) infinite; -} - -.codicon-modifier-disabled { - opacity: 0.5; -} - -.codicon-modifier-hidden { - opacity: 0; -} - -/* custom speed & easing for loading icon */ -.codicon-loading { - animation-duration: 1s !important; - animation-timing-function: cubic-bezier(0.53, 0.21, 0.29, 0.67) !important; -} - -/*--------------------- - * Icons - *-------------------*/ - -.codicon-add:before { content: "\ea60" } -.codicon-plus:before { content: "\ea60" } -.codicon-gist-new:before { content: "\ea60" } -.codicon-repo-create:before { content: "\ea60" } -.codicon-lightbulb:before { content: "\ea61" } -.codicon-light-bulb:before { content: "\ea61" } -.codicon-repo:before { content: "\ea62" } -.codicon-repo-delete:before { content: "\ea62" } -.codicon-gist-fork:before { content: "\ea63" } -.codicon-repo-forked:before { content: "\ea63" } -.codicon-git-pull-request:before { content: "\ea64" } -.codicon-git-pull-request-abandoned:before { content: "\ea64" } -.codicon-record-keys:before { content: "\ea65" } -.codicon-keyboard:before { content: "\ea65" } -.codicon-tag:before { content: "\ea66" } -.codicon-tag-add:before { content: "\ea66" } -.codicon-tag-remove:before { content: "\ea66" } -.codicon-person:before { content: "\ea67" } -.codicon-person-follow:before { content: "\ea67" } -.codicon-person-outline:before { content: "\ea67" } -.codicon-person-filled:before { content: "\ea67" } -.codicon-git-branch:before { content: "\ea68" } -.codicon-git-branch-create:before { content: "\ea68" } -.codicon-git-branch-delete:before { content: "\ea68" } -.codicon-source-control:before { content: "\ea68" } -.codicon-mirror:before { content: "\ea69" } -.codicon-mirror-public:before { content: "\ea69" } -.codicon-star:before { content: "\ea6a" } -.codicon-star-add:before { content: "\ea6a" } -.codicon-star-delete:before { content: "\ea6a" } -.codicon-star-empty:before { content: "\ea6a" } -.codicon-comment:before { content: "\ea6b" } -.codicon-comment-add:before { content: "\ea6b" } -.codicon-alert:before { content: "\ea6c" } -.codicon-warning:before { content: "\ea6c" } -.codicon-search:before { content: "\ea6d" } -.codicon-search-save:before { content: "\ea6d" } -.codicon-log-out:before { content: "\ea6e" } -.codicon-sign-out:before { content: "\ea6e" } -.codicon-log-in:before { content: "\ea6f" } -.codicon-sign-in:before { content: "\ea6f" } -.codicon-eye:before { content: "\ea70" } -.codicon-eye-unwatch:before { content: "\ea70" } -.codicon-eye-watch:before { content: "\ea70" } -.codicon-circle-filled:before { content: "\ea71" } -.codicon-primitive-dot:before { content: "\ea71" } -.codicon-close-dirty:before { content: "\ea71" } -.codicon-debug-breakpoint:before { content: "\ea71" } -.codicon-debug-breakpoint-disabled:before { content: "\ea71" } -.codicon-debug-hint:before { content: "\ea71" } -.codicon-terminal-decoration-success:before { content: "\ea71" } -.codicon-primitive-square:before { content: "\ea72" } -.codicon-edit:before { content: "\ea73" } -.codicon-pencil:before { content: "\ea73" } -.codicon-info:before { content: "\ea74" } -.codicon-issue-opened:before { content: "\ea74" } -.codicon-gist-private:before { content: "\ea75" } -.codicon-git-fork-private:before { content: "\ea75" } -.codicon-lock:before { content: "\ea75" } -.codicon-mirror-private:before { content: "\ea75" } -.codicon-close:before { content: "\ea76" } -.codicon-remove-close:before { content: "\ea76" } -.codicon-x:before { content: "\ea76" } -.codicon-repo-sync:before { content: "\ea77" } -.codicon-sync:before { content: "\ea77" } -.codicon-clone:before { content: "\ea78" } -.codicon-desktop-download:before { content: "\ea78" } -.codicon-beaker:before { content: "\ea79" } -.codicon-microscope:before { content: "\ea79" } -.codicon-vm:before { content: "\ea7a" } -.codicon-device-desktop:before { content: "\ea7a" } -.codicon-file:before { content: "\ea7b" } -.codicon-file-text:before { content: "\ea7b" } -.codicon-more:before { content: "\ea7c" } -.codicon-ellipsis:before { content: "\ea7c" } -.codicon-kebab-horizontal:before { content: "\ea7c" } -.codicon-mail-reply:before { content: "\ea7d" } -.codicon-reply:before { content: "\ea7d" } -.codicon-organization:before { content: "\ea7e" } -.codicon-organization-filled:before { content: "\ea7e" } -.codicon-organization-outline:before { content: "\ea7e" } -.codicon-new-file:before { content: "\ea7f" } -.codicon-file-add:before { content: "\ea7f" } -.codicon-new-folder:before { content: "\ea80" } -.codicon-file-directory-create:before { content: "\ea80" } -.codicon-trash:before { content: "\ea81" } -.codicon-trashcan:before { content: "\ea81" } -.codicon-history:before { content: "\ea82" } -.codicon-clock:before { content: "\ea82" } -.codicon-folder:before { content: "\ea83" } -.codicon-file-directory:before { content: "\ea83" } -.codicon-symbol-folder:before { content: "\ea83" } -.codicon-logo-github:before { content: "\ea84" } -.codicon-mark-github:before { content: "\ea84" } -.codicon-github:before { content: "\ea84" } -.codicon-terminal:before { content: "\ea85" } -.codicon-console:before { content: "\ea85" } -.codicon-repl:before { content: "\ea85" } -.codicon-zap:before { content: "\ea86" } -.codicon-symbol-event:before { content: "\ea86" } -.codicon-error:before { content: "\ea87" } -.codicon-stop:before { content: "\ea87" } -.codicon-variable:before { content: "\ea88" } -.codicon-symbol-variable:before { content: "\ea88" } -.codicon-array:before { content: "\ea8a" } -.codicon-symbol-array:before { content: "\ea8a" } -.codicon-symbol-module:before { content: "\ea8b" } -.codicon-symbol-package:before { content: "\ea8b" } -.codicon-symbol-namespace:before { content: "\ea8b" } -.codicon-symbol-object:before { content: "\ea8b" } -.codicon-symbol-method:before { content: "\ea8c" } -.codicon-symbol-function:before { content: "\ea8c" } -.codicon-symbol-constructor:before { content: "\ea8c" } -.codicon-symbol-boolean:before { content: "\ea8f" } -.codicon-symbol-null:before { content: "\ea8f" } -.codicon-symbol-numeric:before { content: "\ea90" } -.codicon-symbol-number:before { content: "\ea90" } -.codicon-symbol-structure:before { content: "\ea91" } -.codicon-symbol-struct:before { content: "\ea91" } -.codicon-symbol-parameter:before { content: "\ea92" } -.codicon-symbol-type-parameter:before { content: "\ea92" } -.codicon-symbol-key:before { content: "\ea93" } -.codicon-symbol-text:before { content: "\ea93" } -.codicon-symbol-reference:before { content: "\ea94" } -.codicon-go-to-file:before { content: "\ea94" } -.codicon-symbol-enum:before { content: "\ea95" } -.codicon-symbol-value:before { content: "\ea95" } -.codicon-symbol-ruler:before { content: "\ea96" } -.codicon-symbol-unit:before { content: "\ea96" } -.codicon-activate-breakpoints:before { content: "\ea97" } -.codicon-archive:before { content: "\ea98" } -.codicon-arrow-both:before { content: "\ea99" } -.codicon-arrow-down:before { content: "\ea9a" } -.codicon-arrow-left:before { content: "\ea9b" } -.codicon-arrow-right:before { content: "\ea9c" } -.codicon-arrow-small-down:before { content: "\ea9d" } -.codicon-arrow-small-left:before { content: "\ea9e" } -.codicon-arrow-small-right:before { content: "\ea9f" } -.codicon-arrow-small-up:before { content: "\eaa0" } -.codicon-arrow-up:before { content: "\eaa1" } -.codicon-bell:before { content: "\eaa2" } -.codicon-bold:before { content: "\eaa3" } -.codicon-book:before { content: "\eaa4" } -.codicon-bookmark:before { content: "\eaa5" } -.codicon-debug-breakpoint-conditional-unverified:before { content: "\eaa6" } -.codicon-debug-breakpoint-conditional:before { content: "\eaa7" } -.codicon-debug-breakpoint-conditional-disabled:before { content: "\eaa7" } -.codicon-debug-breakpoint-data-unverified:before { content: "\eaa8" } -.codicon-debug-breakpoint-data:before { content: "\eaa9" } -.codicon-debug-breakpoint-data-disabled:before { content: "\eaa9" } -.codicon-debug-breakpoint-log-unverified:before { content: "\eaaa" } -.codicon-debug-breakpoint-log:before { content: "\eaab" } -.codicon-debug-breakpoint-log-disabled:before { content: "\eaab" } -.codicon-briefcase:before { content: "\eaac" } -.codicon-broadcast:before { content: "\eaad" } -.codicon-browser:before { content: "\eaae" } -.codicon-bug:before { content: "\eaaf" } -.codicon-calendar:before { content: "\eab0" } -.codicon-case-sensitive:before { content: "\eab1" } -.codicon-check:before { content: "\eab2" } -.codicon-checklist:before { content: "\eab3" } -.codicon-chevron-down:before { content: "\eab4" } -.codicon-chevron-left:before { content: "\eab5" } -.codicon-chevron-right:before { content: "\eab6" } -.codicon-chevron-up:before { content: "\eab7" } -.codicon-chrome-close:before { content: "\eab8" } -.codicon-chrome-maximize:before { content: "\eab9" } -.codicon-chrome-minimize:before { content: "\eaba" } -.codicon-chrome-restore:before { content: "\eabb" } -.codicon-circle-outline:before { content: "\eabc" } -.codicon-circle:before { content: "\eabc" } -.codicon-debug-breakpoint-unverified:before { content: "\eabc" } -.codicon-terminal-decoration-incomplete:before { content: "\eabc" } -.codicon-circle-slash:before { content: "\eabd" } -.codicon-circuit-board:before { content: "\eabe" } -.codicon-clear-all:before { content: "\eabf" } -.codicon-clippy:before { content: "\eac0" } -.codicon-close-all:before { content: "\eac1" } -.codicon-cloud-download:before { content: "\eac2" } -.codicon-cloud-upload:before { content: "\eac3" } -.codicon-code:before { content: "\eac4" } -.codicon-collapse-all:before { content: "\eac5" } -.codicon-color-mode:before { content: "\eac6" } -.codicon-comment-discussion:before { content: "\eac7" } -.codicon-credit-card:before { content: "\eac9" } -.codicon-dash:before { content: "\eacc" } -.codicon-dashboard:before { content: "\eacd" } -.codicon-database:before { content: "\eace" } -.codicon-debug-continue:before { content: "\eacf" } -.codicon-debug-disconnect:before { content: "\ead0" } -.codicon-debug-pause:before { content: "\ead1" } -.codicon-debug-restart:before { content: "\ead2" } -.codicon-debug-start:before { content: "\ead3" } -.codicon-debug-step-into:before { content: "\ead4" } -.codicon-debug-step-out:before { content: "\ead5" } -.codicon-debug-step-over:before { content: "\ead6" } -.codicon-debug-stop:before { content: "\ead7" } -.codicon-debug:before { content: "\ead8" } -.codicon-device-camera-video:before { content: "\ead9" } -.codicon-device-camera:before { content: "\eada" } -.codicon-device-mobile:before { content: "\eadb" } -.codicon-diff-added:before { content: "\eadc" } -.codicon-diff-ignored:before { content: "\eadd" } -.codicon-diff-modified:before { content: "\eade" } -.codicon-diff-removed:before { content: "\eadf" } -.codicon-diff-renamed:before { content: "\eae0" } -.codicon-diff:before { content: "\eae1" } -.codicon-discard:before { content: "\eae2" } -.codicon-editor-layout:before { content: "\eae3" } -.codicon-empty-window:before { content: "\eae4" } -.codicon-exclude:before { content: "\eae5" } -.codicon-extensions:before { content: "\eae6" } -.codicon-eye-closed:before { content: "\eae7" } -.codicon-file-binary:before { content: "\eae8" } -.codicon-file-code:before { content: "\eae9" } -.codicon-file-media:before { content: "\eaea" } -.codicon-file-pdf:before { content: "\eaeb" } -.codicon-file-submodule:before { content: "\eaec" } -.codicon-file-symlink-directory:before { content: "\eaed" } -.codicon-file-symlink-file:before { content: "\eaee" } -.codicon-file-zip:before { content: "\eaef" } -.codicon-files:before { content: "\eaf0" } -.codicon-filter:before { content: "\eaf1" } -.codicon-flame:before { content: "\eaf2" } -.codicon-fold-down:before { content: "\eaf3" } -.codicon-fold-up:before { content: "\eaf4" } -.codicon-fold:before { content: "\eaf5" } -.codicon-folder-active:before { content: "\eaf6" } -.codicon-folder-opened:before { content: "\eaf7" } -.codicon-gear:before { content: "\eaf8" } -.codicon-gift:before { content: "\eaf9" } -.codicon-gist-secret:before { content: "\eafa" } -.codicon-gist:before { content: "\eafb" } -.codicon-git-commit:before { content: "\eafc" } -.codicon-git-compare:before { content: "\eafd" } -.codicon-compare-changes:before { content: "\eafd" } -.codicon-git-merge:before { content: "\eafe" } -.codicon-github-action:before { content: "\eaff" } -.codicon-github-alt:before { content: "\eb00" } -.codicon-globe:before { content: "\eb01" } -.codicon-grabber:before { content: "\eb02" } -.codicon-graph:before { content: "\eb03" } -.codicon-gripper:before { content: "\eb04" } -.codicon-heart:before { content: "\eb05" } -.codicon-home:before { content: "\eb06" } -.codicon-horizontal-rule:before { content: "\eb07" } -.codicon-hubot:before { content: "\eb08" } -.codicon-inbox:before { content: "\eb09" } -.codicon-issue-reopened:before { content: "\eb0b" } -.codicon-issues:before { content: "\eb0c" } -.codicon-italic:before { content: "\eb0d" } -.codicon-jersey:before { content: "\eb0e" } -.codicon-json:before { content: "\eb0f" } -.codicon-kebab-vertical:before { content: "\eb10" } -.codicon-key:before { content: "\eb11" } -.codicon-law:before { content: "\eb12" } -.codicon-lightbulb-autofix:before { content: "\eb13" } -.codicon-link-external:before { content: "\eb14" } -.codicon-link:before { content: "\eb15" } -.codicon-list-ordered:before { content: "\eb16" } -.codicon-list-unordered:before { content: "\eb17" } -.codicon-live-share:before { content: "\eb18" } -.codicon-loading:before { content: "\eb19" } -.codicon-location:before { content: "\eb1a" } -.codicon-mail-read:before { content: "\eb1b" } -.codicon-mail:before { content: "\eb1c" } -.codicon-markdown:before { content: "\eb1d" } -.codicon-megaphone:before { content: "\eb1e" } -.codicon-mention:before { content: "\eb1f" } -.codicon-milestone:before { content: "\eb20" } -.codicon-mortar-board:before { content: "\eb21" } -.codicon-move:before { content: "\eb22" } -.codicon-multiple-windows:before { content: "\eb23" } -.codicon-mute:before { content: "\eb24" } -.codicon-no-newline:before { content: "\eb25" } -.codicon-note:before { content: "\eb26" } -.codicon-octoface:before { content: "\eb27" } -.codicon-open-preview:before { content: "\eb28" } -.codicon-package:before { content: "\eb29" } -.codicon-paintcan:before { content: "\eb2a" } -.codicon-pin:before { content: "\eb2b" } -.codicon-play:before { content: "\eb2c" } -.codicon-run:before { content: "\eb2c" } -.codicon-plug:before { content: "\eb2d" } -.codicon-preserve-case:before { content: "\eb2e" } -.codicon-preview:before { content: "\eb2f" } -.codicon-project:before { content: "\eb30" } -.codicon-pulse:before { content: "\eb31" } -.codicon-question:before { content: "\eb32" } -.codicon-quote:before { content: "\eb33" } -.codicon-radio-tower:before { content: "\eb34" } -.codicon-reactions:before { content: "\eb35" } -.codicon-references:before { content: "\eb36" } -.codicon-refresh:before { content: "\eb37" } -.codicon-regex:before { content: "\eb38" } -.codicon-remote-explorer:before { content: "\eb39" } -.codicon-remote:before { content: "\eb3a" } -.codicon-remove:before { content: "\eb3b" } -.codicon-replace-all:before { content: "\eb3c" } -.codicon-replace:before { content: "\eb3d" } -.codicon-repo-clone:before { content: "\eb3e" } -.codicon-repo-force-push:before { content: "\eb3f" } -.codicon-repo-pull:before { content: "\eb40" } -.codicon-repo-push:before { content: "\eb41" } -.codicon-report:before { content: "\eb42" } -.codicon-request-changes:before { content: "\eb43" } -.codicon-rocket:before { content: "\eb44" } -.codicon-root-folder-opened:before { content: "\eb45" } -.codicon-root-folder:before { content: "\eb46" } -.codicon-rss:before { content: "\eb47" } -.codicon-ruby:before { content: "\eb48" } -.codicon-save-all:before { content: "\eb49" } -.codicon-save-as:before { content: "\eb4a" } -.codicon-save:before { content: "\eb4b" } -.codicon-screen-full:before { content: "\eb4c" } -.codicon-screen-normal:before { content: "\eb4d" } -.codicon-search-stop:before { content: "\eb4e" } -.codicon-server:before { content: "\eb50" } -.codicon-settings-gear:before { content: "\eb51" } -.codicon-settings:before { content: "\eb52" } -.codicon-shield:before { content: "\eb53" } -.codicon-smiley:before { content: "\eb54" } -.codicon-sort-precedence:before { content: "\eb55" } -.codicon-split-horizontal:before { content: "\eb56" } -.codicon-split-vertical:before { content: "\eb57" } -.codicon-squirrel:before { content: "\eb58" } -.codicon-star-full:before { content: "\eb59" } -.codicon-star-half:before { content: "\eb5a" } -.codicon-symbol-class:before { content: "\eb5b" } -.codicon-symbol-color:before { content: "\eb5c" } -.codicon-symbol-constant:before { content: "\eb5d" } -.codicon-symbol-enum-member:before { content: "\eb5e" } -.codicon-symbol-field:before { content: "\eb5f" } -.codicon-symbol-file:before { content: "\eb60" } -.codicon-symbol-interface:before { content: "\eb61" } -.codicon-symbol-keyword:before { content: "\eb62" } -.codicon-symbol-misc:before { content: "\eb63" } -.codicon-symbol-operator:before { content: "\eb64" } -.codicon-symbol-property:before { content: "\eb65" } -.codicon-wrench:before { content: "\eb65" } -.codicon-wrench-subaction:before { content: "\eb65" } -.codicon-symbol-snippet:before { content: "\eb66" } -.codicon-tasklist:before { content: "\eb67" } -.codicon-telescope:before { content: "\eb68" } -.codicon-text-size:before { content: "\eb69" } -.codicon-three-bars:before { content: "\eb6a" } -.codicon-thumbsdown:before { content: "\eb6b" } -.codicon-thumbsup:before { content: "\eb6c" } -.codicon-tools:before { content: "\eb6d" } -.codicon-triangle-down:before { content: "\eb6e" } -.codicon-triangle-left:before { content: "\eb6f" } -.codicon-triangle-right:before { content: "\eb70" } -.codicon-triangle-up:before { content: "\eb71" } -.codicon-twitter:before { content: "\eb72" } -.codicon-unfold:before { content: "\eb73" } -.codicon-unlock:before { content: "\eb74" } -.codicon-unmute:before { content: "\eb75" } -.codicon-unverified:before { content: "\eb76" } -.codicon-verified:before { content: "\eb77" } -.codicon-versions:before { content: "\eb78" } -.codicon-vm-active:before { content: "\eb79" } -.codicon-vm-outline:before { content: "\eb7a" } -.codicon-vm-running:before { content: "\eb7b" } -.codicon-watch:before { content: "\eb7c" } -.codicon-whitespace:before { content: "\eb7d" } -.codicon-whole-word:before { content: "\eb7e" } -.codicon-window:before { content: "\eb7f" } -.codicon-word-wrap:before { content: "\eb80" } -.codicon-zoom-in:before { content: "\eb81" } -.codicon-zoom-out:before { content: "\eb82" } -.codicon-list-filter:before { content: "\eb83" } -.codicon-list-flat:before { content: "\eb84" } -.codicon-list-selection:before { content: "\eb85" } -.codicon-selection:before { content: "\eb85" } -.codicon-list-tree:before { content: "\eb86" } -.codicon-debug-breakpoint-function-unverified:before { content: "\eb87" } -.codicon-debug-breakpoint-function:before { content: "\eb88" } -.codicon-debug-breakpoint-function-disabled:before { content: "\eb88" } -.codicon-debug-stackframe-active:before { content: "\eb89" } -.codicon-circle-small-filled:before { content: "\eb8a" } -.codicon-debug-stackframe-dot:before { content: "\eb8a" } -.codicon-terminal-decoration-mark:before { content: "\eb8a" } -.codicon-debug-stackframe:before { content: "\eb8b" } -.codicon-debug-stackframe-focused:before { content: "\eb8b" } -.codicon-debug-breakpoint-unsupported:before { content: "\eb8c" } -.codicon-symbol-string:before { content: "\eb8d" } -.codicon-debug-reverse-continue:before { content: "\eb8e" } -.codicon-debug-step-back:before { content: "\eb8f" } -.codicon-debug-restart-frame:before { content: "\eb90" } -.codicon-debug-alt:before { content: "\eb91" } -.codicon-call-incoming:before { content: "\eb92" } -.codicon-call-outgoing:before { content: "\eb93" } -.codicon-menu:before { content: "\eb94" } -.codicon-expand-all:before { content: "\eb95" } -.codicon-feedback:before { content: "\eb96" } -.codicon-group-by-ref-type:before { content: "\eb97" } -.codicon-ungroup-by-ref-type:before { content: "\eb98" } -.codicon-account:before { content: "\eb99" } -.codicon-bell-dot:before { content: "\eb9a" } -.codicon-debug-console:before { content: "\eb9b" } -.codicon-library:before { content: "\eb9c" } -.codicon-output:before { content: "\eb9d" } -.codicon-run-all:before { content: "\eb9e" } -.codicon-sync-ignored:before { content: "\eb9f" } -.codicon-pinned:before { content: "\eba0" } -.codicon-github-inverted:before { content: "\eba1" } -.codicon-server-process:before { content: "\eba2" } -.codicon-server-environment:before { content: "\eba3" } -.codicon-pass:before { content: "\eba4" } -.codicon-issue-closed:before { content: "\eba4" } -.codicon-stop-circle:before { content: "\eba5" } -.codicon-play-circle:before { content: "\eba6" } -.codicon-record:before { content: "\eba7" } -.codicon-debug-alt-small:before { content: "\eba8" } -.codicon-vm-connect:before { content: "\eba9" } -.codicon-cloud:before { content: "\ebaa" } -.codicon-merge:before { content: "\ebab" } -.codicon-export:before { content: "\ebac" } -.codicon-graph-left:before { content: "\ebad" } -.codicon-magnet:before { content: "\ebae" } -.codicon-notebook:before { content: "\ebaf" } -.codicon-redo:before { content: "\ebb0" } -.codicon-check-all:before { content: "\ebb1" } -.codicon-pinned-dirty:before { content: "\ebb2" } -.codicon-pass-filled:before { content: "\ebb3" } -.codicon-circle-large-filled:before { content: "\ebb4" } -.codicon-circle-large:before { content: "\ebb5" } -.codicon-circle-large-outline:before { content: "\ebb5" } -.codicon-combine:before { content: "\ebb6" } -.codicon-gather:before { content: "\ebb6" } -.codicon-table:before { content: "\ebb7" } -.codicon-variable-group:before { content: "\ebb8" } -.codicon-type-hierarchy:before { content: "\ebb9" } -.codicon-type-hierarchy-sub:before { content: "\ebba" } -.codicon-type-hierarchy-super:before { content: "\ebbb" } -.codicon-git-pull-request-create:before { content: "\ebbc" } -.codicon-run-above:before { content: "\ebbd" } -.codicon-run-below:before { content: "\ebbe" } -.codicon-notebook-template:before { content: "\ebbf" } -.codicon-debug-rerun:before { content: "\ebc0" } -.codicon-workspace-trusted:before { content: "\ebc1" } -.codicon-workspace-untrusted:before { content: "\ebc2" } -.codicon-workspace-unknown:before { content: "\ebc3" } -.codicon-terminal-cmd:before { content: "\ebc4" } -.codicon-terminal-debian:before { content: "\ebc5" } -.codicon-terminal-linux:before { content: "\ebc6" } -.codicon-terminal-powershell:before { content: "\ebc7" } -.codicon-terminal-tmux:before { content: "\ebc8" } -.codicon-terminal-ubuntu:before { content: "\ebc9" } -.codicon-terminal-bash:before { content: "\ebca" } -.codicon-arrow-swap:before { content: "\ebcb" } -.codicon-copy:before { content: "\ebcc" } -.codicon-person-add:before { content: "\ebcd" } -.codicon-filter-filled:before { content: "\ebce" } -.codicon-wand:before { content: "\ebcf" } -.codicon-debug-line-by-line:before { content: "\ebd0" } -.codicon-inspect:before { content: "\ebd1" } -.codicon-layers:before { content: "\ebd2" } -.codicon-layers-dot:before { content: "\ebd3" } -.codicon-layers-active:before { content: "\ebd4" } -.codicon-compass:before { content: "\ebd5" } -.codicon-compass-dot:before { content: "\ebd6" } -.codicon-compass-active:before { content: "\ebd7" } -.codicon-azure:before { content: "\ebd8" } -.codicon-issue-draft:before { content: "\ebd9" } -.codicon-git-pull-request-closed:before { content: "\ebda" } -.codicon-git-pull-request-draft:before { content: "\ebdb" } -.codicon-debug-all:before { content: "\ebdc" } -.codicon-debug-coverage:before { content: "\ebdd" } -.codicon-run-errors:before { content: "\ebde" } -.codicon-folder-library:before { content: "\ebdf" } -.codicon-debug-continue-small:before { content: "\ebe0" } -.codicon-beaker-stop:before { content: "\ebe1" } -.codicon-graph-line:before { content: "\ebe2" } -.codicon-graph-scatter:before { content: "\ebe3" } -.codicon-pie-chart:before { content: "\ebe4" } -.codicon-bracket:before { content: "\eb0f" } -.codicon-bracket-dot:before { content: "\ebe5" } -.codicon-bracket-error:before { content: "\ebe6" } -.codicon-lock-small:before { content: "\ebe7" } -.codicon-azure-devops:before { content: "\ebe8" } -.codicon-verified-filled:before { content: "\ebe9" } -.codicon-newline:before { content: "\ebea" } -.codicon-layout:before { content: "\ebeb" } -.codicon-layout-activitybar-left:before { content: "\ebec" } -.codicon-layout-activitybar-right:before { content: "\ebed" } -.codicon-layout-panel-left:before { content: "\ebee" } -.codicon-layout-panel-center:before { content: "\ebef" } -.codicon-layout-panel-justify:before { content: "\ebf0" } -.codicon-layout-panel-right:before { content: "\ebf1" } -.codicon-layout-panel:before { content: "\ebf2" } -.codicon-layout-sidebar-left:before { content: "\ebf3" } -.codicon-layout-sidebar-right:before { content: "\ebf4" } -.codicon-layout-statusbar:before { content: "\ebf5" } -.codicon-layout-menubar:before { content: "\ebf6" } -.codicon-layout-centered:before { content: "\ebf7" } -.codicon-target:before { content: "\ebf8" } -.codicon-indent:before { content: "\ebf9" } -.codicon-record-small:before { content: "\ebfa" } -.codicon-error-small:before { content: "\ebfb" } -.codicon-terminal-decoration-error:before { content: "\ebfb" } -.codicon-arrow-circle-down:before { content: "\ebfc" } -.codicon-arrow-circle-left:before { content: "\ebfd" } -.codicon-arrow-circle-right:before { content: "\ebfe" } -.codicon-arrow-circle-up:before { content: "\ebff" } -.codicon-layout-sidebar-right-off:before { content: "\ec00" } -.codicon-layout-panel-off:before { content: "\ec01" } -.codicon-layout-sidebar-left-off:before { content: "\ec02" } -.codicon-blank:before { content: "\ec03" } -.codicon-heart-filled:before { content: "\ec04" } -.codicon-map:before { content: "\ec05" } -.codicon-map-filled:before { content: "\ec06" } -.codicon-circle-small:before { content: "\ec07" } -.codicon-bell-slash:before { content: "\ec08" } -.codicon-bell-slash-dot:before { content: "\ec09" } -.codicon-comment-unresolved:before { content: "\ec0a" } -.codicon-git-pull-request-go-to-changes:before { content: "\ec0b" } -.codicon-git-pull-request-new-changes:before { content: "\ec0c" } -.codicon-search-fuzzy:before { content: "\ec0d" } -.codicon-comment-draft:before { content: "\ec0e" } -.codicon-send:before { content: "\ec0f" } -.codicon-sparkle:before { content: "\ec10" } -.codicon-insert:before { content: "\ec11" } \ No newline at end of file diff --git a/application/client/src/app/ui/styles/codicons/codicon.ttf b/application/client/src/app/ui/styles/codicons/codicon.ttf deleted file mode 100644 index ea2309d11d3390a5cf2f8dac873808182dffc666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73504 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 diff --git a/application/client/src/app/ui/styles/colors.less b/application/client/src/app/ui/styles/colors.less deleted file mode 100644 index b663026325..0000000000 --- a/application/client/src/app/ui/styles/colors.less +++ /dev/null @@ -1,74 +0,0 @@ - -/* -var(--scheme-color-0): #FFFFFF; -var(--scheme-color-1): #eaeaea; -var(--scheme-color-2): #c0c0c0; -var(--scheme-color-3): #979797; -var(--scheme-color-4): #555555; -var(--scheme-color-5): #333333; -var(--scheme-color-6): #111111; -var(--scheme-color-7): #000000; -*/ -@import './variables.less'; - -.color-scheme-0 { - color: var(--scheme-color-0); -} -.color-scheme-1 { - color: var(--scheme-color-1); -} -.color-scheme-2 { - color: var(--scheme-color-2); -} -.color-scheme-3 { - color: var(--scheme-color-3); -} -.color-scheme-4 { - color: var(--scheme-color-4); -} -.color-scheme-5 { - color: var(--scheme-color-5); -} -.color-scheme-6 { - color: var(--scheme-color-6); -} -.color-scheme-error { - color: var(--scheme-color-error); -} -.color-scheme-accent { - color: var(--scheme-color-accent); -} -.color-scheme-warning { - color: var(--scheme-color-warning); -} - -.bk-scheme-0 { - background: var(--scheme-color-0); -} -.bk-scheme-1 { - background: var(--scheme-color-1); -} -.bk-scheme-2 { - background: var(--scheme-color-2); -} -.bk-scheme-3 { - background: var(--scheme-color-3); -} -.bk-scheme-4 { - background: var(--scheme-color-4); -} -.bk-scheme-5 { - background: var(--scheme-color-5); -} -.bk-scheme-6 { - background: var(--scheme-color-6); -} -.bk-scheme-error { - background: var(--scheme-color-error); -} -.bk-scheme-accent { - background: var(--scheme-color-accent); -} -.bk-scheme-warning { - background: var(--scheme-color-warning); -} \ No newline at end of file diff --git a/application/client/src/app/ui/styles/colors.ts b/application/client/src/app/ui/styles/colors.ts deleted file mode 100644 index 23950de959..0000000000 --- a/application/client/src/app/ui/styles/colors.ts +++ /dev/null @@ -1,263 +0,0 @@ -const colorsCache: Map = new Map(); -const contrastColorsCache: Map = new Map(); - -export function getColorHolder(color: string): (index: number) => string { - return function (colors: { [key: string]: string }, index: number) { - if (colors[index] === undefined) { - colors[index] = index === 0 ? color : shadeColor(colors[index - 1], 40, true); - } - return colors[index]; - }.bind(null, {}); -} -export function shadeColor(color: string, percent: number, reverse: boolean = false) { - // source: https://stackoverflow.com/questions/5560248/programmatically-lighten-or-darken-a-hex-color-or-rgb-and-blend-colors - - const key: string = `${color}${percent}`; - const cached: string | undefined = colorsCache.get(key); - if (cached !== undefined) { - return cached; - } - const R = parseInt(color.substring(1, 3), 16); - const G = parseInt(color.substring(3, 5), 16); - const B = parseInt(color.substring(5, 7), 16); - - let rR = (R * (100 + percent)) / 100; - let rG = (G * (100 + percent)) / 100; - let rB = (B * (100 + percent)) / 100; - - if (reverse) { - rR = rR < 255 ? rR : (R * (100 - percent)) / 100; - rG = rG < 255 ? rG : (G * (100 - percent)) / 100; - rB = rB < 255 ? rB : (B * (100 - percent)) / 100; - } - - rR = rR < 255 ? rR : 255; - rG = rG < 255 ? rG : 255; - rB = rB < 255 ? rB : 255; - - const RR = rR.toString(16).length === 1 ? '0' + rR.toString(16) : rR.toString(16); - const GG = rG.toString(16).length === 1 ? '0' + rG.toString(16) : rG.toString(16); - const BB = rB.toString(16).length === 1 ? '0' + rB.toString(16) : rB.toString(16); - - const result: string = '#' + RR.substr(0, 2) + GG.substr(0, 2) + BB.substr(0, 2); - colorsCache.set(key, result); - return result; -} - -export function getContrastColor(hex: string, bw: boolean = false) { - function padZero(str: string, len?: number) { - len = len || 2; - const zeros = new Array(len).join('0'); - return (zeros + str).slice(-len); - } - const alias = `${hex}:${bw}`; - const cached = contrastColorsCache.get(alias); - if (cached !== undefined) { - return cached; - } - if (hex.toLowerCase().indexOf('rgb') === 0) { - hex = rgbToHex(hex); - } - if (hex.indexOf('#') === 0) { - hex = hex.slice(1); - } - // convert 3-digit hex to 6-digits. - if (hex.length === 3) { - hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; - } - if (hex.length !== 6) { - throw new Error(`Invalid HEX color: ${hex}`); - } - const r = parseInt(hex.slice(0, 2), 16); - const g = parseInt(hex.slice(2, 4), 16); - const b = parseInt(hex.slice(4, 6), 16); - const color = (() => { - if (bw) { - // http://stackoverflow.com/a/3943023/112731 - return r * 0.299 + g * 0.587 + b * 0.114 > 186 ? '#000000' : '#FFFFFF'; - } else { - return ( - '#' + - padZero((255 - r).toString(16)) + - padZero((255 - g).toString(16)) + - padZero((255 - b).toString(16)) - ); - } - })(); - contrastColorsCache.set(alias, color); - return color; - // https://stackoverflow.com/questions/35969656/how-can-i-generate-the-opposite-color-according-to-current-color -} - -export function hexToRgb(hex: string): { r: number; g: number; b: number } | undefined { - const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); - return result - ? { - r: parseInt(result[1], 16), - g: parseInt(result[2], 16), - b: parseInt(result[3], 16), - } - : undefined; -} - -export function rgbToHex(color: string) { - const colors = color - .replace(/[^\d,]/gi, '') - .split(',') - .map((c: string) => { - return parseInt(c, 10); - }) - .filter((c: number) => { - return !isNaN(c) && isFinite(c); - }); - if (colors.length !== 3) { - return '#000000'; - } - // tslint:disable-next-line: no-bitwise - return ( - `#` + ((1 << 24) + (colors[0] << 16) + (colors[1] << 8) + colors[2]).toString(16).slice(1) - ); -} - -export function rgbFromStr(color: string): { r: number; g: number; b: number } | undefined { - const colors = color - .replace(/[^\d,]/gi, '') - .split(',') - .map((c: string) => { - return parseInt(c, 10); - }) - .filter((c: number) => { - return !isNaN(c) && isFinite(c); - }); - if (colors.length !== 3) { - return undefined; - } - return { - r: colors[0], - g: colors[2], - b: colors[1], - }; -} - -export function getColorDiff(a: string, b: string): number | undefined { - let rgbA; - let rgbB; - if (a.indexOf('#') !== -1) { - rgbA = hexToRgb(a); - } else { - rgbA = rgbFromStr(a); - } - if (b.indexOf('#') !== -1) { - rgbB = hexToRgb(b); - } else { - rgbB = rgbFromStr(b); - } - if (rgbB === undefined || rgbA === undefined) { - return undefined; - } - const diffR = rgbA.r - rgbB.r; - const diffG = rgbA.g - rgbB.g; - const diffB = rgbA.b - rgbB.b; - return Math.sqrt(diffR * diffR + diffG * diffG + diffB * diffB); -} - -export function getUniqueColorTo(used: string[]): string { - const max: { rate: number; color: string } = { rate: -1, color: '' }; - for (let i = 5; i >= 0; i -= 1) { - const color = `rgb(${Math.round(Math.random() * 204) + 50}, ${ - Math.round(Math.random() * 204) + 50 - }, ${Math.round(Math.random() * 204) + 50})`; - let rate = -1; - used.forEach((c: string) => { - const r = getColorDiff(c, color); - if (r !== undefined && rate < r) { - rate = r; - } - }); - if (rate > 100) { - return color; - } else if (max.rate < rate || max.color === '') { - max.color = color; - max.rate = rate; - } - } - return max.color; -} - -export const CColors = [ - 'rgba(0,0,0,0)', - '#000000', - '#2d3436', - '#636e72', - '#b2bec3', - '#c0c0c0', - '#dfe6e9', - '#eaeaea', - '#ffffff', - '#2ecc71', - '#55efc4', - '#1abc9c', - '#5d8d5d', - '#72a75b', - '#6ab04c', - '#badc58', - '#b4d6ad', - '#a3d0b5', - '#81ecec', - '#74b9ff', - '#778beb', - '#a29bfe', - '#786fa6', - '#00cec9', - '#ffeaa7', - '#f7d794', - '#fdcb6e', - '#f8a5c2', - '#fd79a8', - '#fab1a0', - '#f3a683', - '#f19066', - '#ea8685', - '#e66767', - '#e17055', - '#596275', - '#574b90', - '#303952', -]; - -export const CShortColors = ['#fbe961', '#a1eefd', '#a2fa91', '#f4b5b4', '#9fb6f8', '#dadada']; - -export function getBasicColors(): string[] { - return CColors.slice(3, CColors.length); -} - -export function shuffledBasicColors(): string[] { - return getBasicColors() - .map((value) => ({ value, sort: Math.random() })) - .sort((a, b) => a.sort - b.sort) - .map(({ value }) => value); -} - -let nextColorIndex = 0; -const shufled = shuffledBasicColors(); - -export function getNextColor(): string { - nextColorIndex = nextColorIndex >= shufled.length ? 0 : nextColorIndex + 1; - return shufled[nextColorIndex]; -} - -const sourceColors: string[] = []; - -export function getSourceColor(id: number): string { - if (sourceColors.length === 0) { - const colors = getBasicColors(); - sourceColors.push(colors[Math.floor(Math.random() * (colors.length - 1))]); - } - if (id >= sourceColors.length) { - const toGenerate = id - (sourceColors.length - 1); - for (let i = toGenerate; i >= 0; i -= 1) { - sourceColors.push(getUniqueColorTo(sourceColors)); - } - } - return sourceColors[id]; -} diff --git a/application/client/src/app/ui/styles/containers.less b/application/client/src/app/ui/styles/containers.less deleted file mode 100644 index e90cc44b80..0000000000 --- a/application/client/src/app/ui/styles/containers.less +++ /dev/null @@ -1,52 +0,0 @@ -div.preset-container{ - position: absolute; - display: flex; - flex-direction: column; - align-items: center; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - div.preset-container-content { - position: absolute; - display: block; - top: 0; - width: 100%; - max-width: 1000px; - height: 100%; - overflow: hidden; - &.w-1200 { - max-width: 1200px; - } - &.w-1400 { - max-width: 1400px; - } - &.w-1600 { - max-width: 1600px; - } - & div.preset-container-left { - position: absolute; - display: flex; - flex-direction: column; - top: 0; - bottom: 0; - left: 0; - right: 330px; - overflow: hidden; - justify-content: stretch; - justify-items: stretch; - } - & div.preset-container-right { - position: absolute; - width: 320px; - right: 6px; - bottom: 0; - top: 0; - overflow-y: auto; - overflow-x: hidden; - display: flex; - flex-direction: column; - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/styles/fontawesome/LICENSE.txt b/application/client/src/app/ui/styles/fontawesome/LICENSE.txt deleted file mode 100644 index f31bef92b6..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/LICENSE.txt +++ /dev/null @@ -1,34 +0,0 @@ -Font Awesome Free License -------------------------- - -Font Awesome Free is free, open source, and GPL friendly. You can use it for -commercial projects, open source projects, or really almost whatever you want. -Full Font Awesome Free license: https://fontawesome.com/license/free. - -# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) -In the Font Awesome Free download, the CC BY 4.0 license applies to all icons -packaged as SVG and JS file types. - -# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL) -In the Font Awesome Free download, the SIL OFL license applies to all icons -packaged as web and desktop font files. - -# Code: MIT License (https://opensource.org/licenses/MIT) -In the Font Awesome Free download, the MIT license applies to all non-font and -non-icon files. - -# Attribution -Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font -Awesome Free files already contain embedded comments with sufficient -attribution, so you shouldn't need to do anything additional when using these -files normally. - -We've kept attribution comments terse, so we ask that you do not actively work -to remove them from files, especially code. They're a great way for folks to -learn about Font Awesome. - -# Brand Icons -All brand icons are trademarks of their respective owners. The use of these -trademarks does not indicate endorsement of the trademark holder by Font -Awesome, nor vice versa. **Please do not use brand logos for any purpose except -to represent the company, product, or service to which they refer.** diff --git a/application/client/src/app/ui/styles/fontawesome/less/_animated.less b/application/client/src/app/ui/styles/fontawesome/less/_animated.less deleted file mode 100644 index 704ec95103..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_animated.less +++ /dev/null @@ -1,19 +0,0 @@ -// Animated Icons -// -------------------------- - -.@{fa-css-prefix}-spin { - animation: fa-spin 2s infinite linear; -} - -.@{fa-css-prefix}-pulse { - animation: fa-spin 1s infinite steps(8); -} - -@keyframes fa-spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -} diff --git a/application/client/src/app/ui/styles/fontawesome/less/_bordered-pulled.less b/application/client/src/app/ui/styles/fontawesome/less/_bordered-pulled.less deleted file mode 100644 index 29a356b423..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_bordered-pulled.less +++ /dev/null @@ -1,16 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.@{fa-css-prefix}-border { - border-radius: .1em; - border: solid .08em @fa-border-color; - padding: .2em .25em .15em; -} - -.@{fa-css-prefix}-pull-left { float: left; } -.@{fa-css-prefix}-pull-right { float: right; } - -.@{fa-css-prefix}, .fas, .far, .fal, .fab { - &.@{fa-css-prefix}-pull-left { margin-right: .3em; } - &.@{fa-css-prefix}-pull-right { margin-left: .3em; } -} diff --git a/application/client/src/app/ui/styles/fontawesome/less/_core.less b/application/client/src/app/ui/styles/fontawesome/less/_core.less deleted file mode 100644 index 82031d6523..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_core.less +++ /dev/null @@ -1,12 +0,0 @@ -// Base Class Definition -// ------------------------- - -.@{fa-css-prefix}, .fas, .far, .fal, .fab { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; -} diff --git a/application/client/src/app/ui/styles/fontawesome/less/_fixed-width.less b/application/client/src/app/ui/styles/fontawesome/less/_fixed-width.less deleted file mode 100644 index be817c6375..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_fixed-width.less +++ /dev/null @@ -1,6 +0,0 @@ -// Fixed Width Icons -// ------------------------- -.@{fa-css-prefix}-fw { - text-align: center; - width: (20em / 16); -} diff --git a/application/client/src/app/ui/styles/fontawesome/less/_icons.less b/application/client/src/app/ui/styles/fontawesome/less/_icons.less deleted file mode 100644 index c1b6fba971..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_icons.less +++ /dev/null @@ -1,1333 +0,0 @@ -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ - -.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } -.@{fa-css-prefix}-accessible-icon:before { content: @fa-var-accessible-icon; } -.@{fa-css-prefix}-accusoft:before { content: @fa-var-accusoft; } -.@{fa-css-prefix}-acquisitions-incorporated:before { content: @fa-var-acquisitions-incorporated; } -.@{fa-css-prefix}-ad:before { content: @fa-var-ad; } -.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; } -.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; } -.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } -.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } -.@{fa-css-prefix}-adobe:before { content: @fa-var-adobe; } -.@{fa-css-prefix}-adversal:before { content: @fa-var-adversal; } -.@{fa-css-prefix}-affiliatetheme:before { content: @fa-var-affiliatetheme; } -.@{fa-css-prefix}-air-freshener:before { content: @fa-var-air-freshener; } -.@{fa-css-prefix}-algolia:before { content: @fa-var-algolia; } -.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } -.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } -.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } -.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } -.@{fa-css-prefix}-alipay:before { content: @fa-var-alipay; } -.@{fa-css-prefix}-allergies:before { content: @fa-var-allergies; } -.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } -.@{fa-css-prefix}-amazon-pay:before { content: @fa-var-amazon-pay; } -.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } -.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } -.@{fa-css-prefix}-amilia:before { content: @fa-var-amilia; } -.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } -.@{fa-css-prefix}-android:before { content: @fa-var-android; } -.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } -.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } -.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } -.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } -.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } -.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } -.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } -.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } -.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } -.@{fa-css-prefix}-angry:before { content: @fa-var-angry; } -.@{fa-css-prefix}-angrycreative:before { content: @fa-var-angrycreative; } -.@{fa-css-prefix}-angular:before { content: @fa-var-angular; } -.@{fa-css-prefix}-ankh:before { content: @fa-var-ankh; } -.@{fa-css-prefix}-app-store:before { content: @fa-var-app-store; } -.@{fa-css-prefix}-app-store-ios:before { content: @fa-var-app-store-ios; } -.@{fa-css-prefix}-apper:before { content: @fa-var-apper; } -.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } -.@{fa-css-prefix}-apple-alt:before { content: @fa-var-apple-alt; } -.@{fa-css-prefix}-apple-pay:before { content: @fa-var-apple-pay; } -.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } -.@{fa-css-prefix}-archway:before { content: @fa-var-archway; } -.@{fa-css-prefix}-arrow-alt-circle-down:before { content: @fa-var-arrow-alt-circle-down; } -.@{fa-css-prefix}-arrow-alt-circle-left:before { content: @fa-var-arrow-alt-circle-left; } -.@{fa-css-prefix}-arrow-alt-circle-right:before { content: @fa-var-arrow-alt-circle-right; } -.@{fa-css-prefix}-arrow-alt-circle-up:before { content: @fa-var-arrow-alt-circle-up; } -.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } -.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } -.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } -.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } -.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } -.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } -.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } -.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } -.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } -.@{fa-css-prefix}-arrows-alt-h:before { content: @fa-var-arrows-alt-h; } -.@{fa-css-prefix}-arrows-alt-v:before { content: @fa-var-arrows-alt-v; } -.@{fa-css-prefix}-artstation:before { content: @fa-var-artstation; } -.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } -.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } -.@{fa-css-prefix}-asymmetrik:before { content: @fa-var-asymmetrik; } -.@{fa-css-prefix}-at:before { content: @fa-var-at; } -.@{fa-css-prefix}-atlas:before { content: @fa-var-atlas; } -.@{fa-css-prefix}-atlassian:before { content: @fa-var-atlassian; } -.@{fa-css-prefix}-atom:before { content: @fa-var-atom; } -.@{fa-css-prefix}-audible:before { content: @fa-var-audible; } -.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } -.@{fa-css-prefix}-autoprefixer:before { content: @fa-var-autoprefixer; } -.@{fa-css-prefix}-avianex:before { content: @fa-var-avianex; } -.@{fa-css-prefix}-aviato:before { content: @fa-var-aviato; } -.@{fa-css-prefix}-award:before { content: @fa-var-award; } -.@{fa-css-prefix}-aws:before { content: @fa-var-aws; } -.@{fa-css-prefix}-baby:before { content: @fa-var-baby; } -.@{fa-css-prefix}-baby-carriage:before { content: @fa-var-baby-carriage; } -.@{fa-css-prefix}-backspace:before { content: @fa-var-backspace; } -.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } -.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } -.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } -.@{fa-css-prefix}-band-aid:before { content: @fa-var-band-aid; } -.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; } -.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } -.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } -.@{fa-css-prefix}-baseball-ball:before { content: @fa-var-baseball-ball; } -.@{fa-css-prefix}-basketball-ball:before { content: @fa-var-basketball-ball; } -.@{fa-css-prefix}-bath:before { content: @fa-var-bath; } -.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } -.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } -.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } -.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } -.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } -.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } -.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } -.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } -.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } -.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } -.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } -.@{fa-css-prefix}-bezier-curve:before { content: @fa-var-bezier-curve; } -.@{fa-css-prefix}-bible:before { content: @fa-var-bible; } -.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } -.@{fa-css-prefix}-bimobject:before { content: @fa-var-bimobject; } -.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } -.@{fa-css-prefix}-biohazard:before { content: @fa-var-biohazard; } -.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } -.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } -.@{fa-css-prefix}-bitcoin:before { content: @fa-var-bitcoin; } -.@{fa-css-prefix}-bity:before { content: @fa-var-bity; } -.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } -.@{fa-css-prefix}-blackberry:before { content: @fa-var-blackberry; } -.@{fa-css-prefix}-blender:before { content: @fa-var-blender; } -.@{fa-css-prefix}-blender-phone:before { content: @fa-var-blender-phone; } -.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } -.@{fa-css-prefix}-blog:before { content: @fa-var-blog; } -.@{fa-css-prefix}-blogger:before { content: @fa-var-blogger; } -.@{fa-css-prefix}-blogger-b:before { content: @fa-var-blogger-b; } -.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } -.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } -.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } -.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } -.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } -.@{fa-css-prefix}-bone:before { content: @fa-var-bone; } -.@{fa-css-prefix}-bong:before { content: @fa-var-bong; } -.@{fa-css-prefix}-book:before { content: @fa-var-book; } -.@{fa-css-prefix}-book-dead:before { content: @fa-var-book-dead; } -.@{fa-css-prefix}-book-open:before { content: @fa-var-book-open; } -.@{fa-css-prefix}-book-reader:before { content: @fa-var-book-reader; } -.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } -.@{fa-css-prefix}-bowling-ball:before { content: @fa-var-bowling-ball; } -.@{fa-css-prefix}-box:before { content: @fa-var-box; } -.@{fa-css-prefix}-box-open:before { content: @fa-var-box-open; } -.@{fa-css-prefix}-boxes:before { content: @fa-var-boxes; } -.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } -.@{fa-css-prefix}-brain:before { content: @fa-var-brain; } -.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } -.@{fa-css-prefix}-briefcase-medical:before { content: @fa-var-briefcase-medical; } -.@{fa-css-prefix}-broadcast-tower:before { content: @fa-var-broadcast-tower; } -.@{fa-css-prefix}-broom:before { content: @fa-var-broom; } -.@{fa-css-prefix}-brush:before { content: @fa-var-brush; } -.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } -.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } -.@{fa-css-prefix}-building:before { content: @fa-var-building; } -.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } -.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } -.@{fa-css-prefix}-burn:before { content: @fa-var-burn; } -.@{fa-css-prefix}-buromobelexperte:before { content: @fa-var-buromobelexperte; } -.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } -.@{fa-css-prefix}-bus-alt:before { content: @fa-var-bus-alt; } -.@{fa-css-prefix}-business-time:before { content: @fa-var-business-time; } -.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } -.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } -.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } -.@{fa-css-prefix}-calendar-alt:before { content: @fa-var-calendar-alt; } -.@{fa-css-prefix}-calendar-check:before { content: @fa-var-calendar-check; } -.@{fa-css-prefix}-calendar-day:before { content: @fa-var-calendar-day; } -.@{fa-css-prefix}-calendar-minus:before { content: @fa-var-calendar-minus; } -.@{fa-css-prefix}-calendar-plus:before { content: @fa-var-calendar-plus; } -.@{fa-css-prefix}-calendar-times:before { content: @fa-var-calendar-times; } -.@{fa-css-prefix}-calendar-week:before { content: @fa-var-calendar-week; } -.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } -.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } -.@{fa-css-prefix}-campground:before { content: @fa-var-campground; } -.@{fa-css-prefix}-canadian-maple-leaf:before { content: @fa-var-canadian-maple-leaf; } -.@{fa-css-prefix}-candy-cane:before { content: @fa-var-candy-cane; } -.@{fa-css-prefix}-cannabis:before { content: @fa-var-cannabis; } -.@{fa-css-prefix}-capsules:before { content: @fa-var-capsules; } -.@{fa-css-prefix}-car:before { content: @fa-var-car; } -.@{fa-css-prefix}-car-alt:before { content: @fa-var-car-alt; } -.@{fa-css-prefix}-car-battery:before { content: @fa-var-car-battery; } -.@{fa-css-prefix}-car-crash:before { content: @fa-var-car-crash; } -.@{fa-css-prefix}-car-side:before { content: @fa-var-car-side; } -.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } -.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } -.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } -.@{fa-css-prefix}-caret-square-down:before { content: @fa-var-caret-square-down; } -.@{fa-css-prefix}-caret-square-left:before { content: @fa-var-caret-square-left; } -.@{fa-css-prefix}-caret-square-right:before { content: @fa-var-caret-square-right; } -.@{fa-css-prefix}-caret-square-up:before { content: @fa-var-caret-square-up; } -.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } -.@{fa-css-prefix}-carrot:before { content: @fa-var-carrot; } -.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } -.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } -.@{fa-css-prefix}-cash-register:before { content: @fa-var-cash-register; } -.@{fa-css-prefix}-cat:before { content: @fa-var-cat; } -.@{fa-css-prefix}-cc-amazon-pay:before { content: @fa-var-cc-amazon-pay; } -.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } -.@{fa-css-prefix}-cc-apple-pay:before { content: @fa-var-cc-apple-pay; } -.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } -.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } -.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } -.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } -.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } -.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } -.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } -.@{fa-css-prefix}-centercode:before { content: @fa-var-centercode; } -.@{fa-css-prefix}-centos:before { content: @fa-var-centos; } -.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } -.@{fa-css-prefix}-chair:before { content: @fa-var-chair; } -.@{fa-css-prefix}-chalkboard:before { content: @fa-var-chalkboard; } -.@{fa-css-prefix}-chalkboard-teacher:before { content: @fa-var-chalkboard-teacher; } -.@{fa-css-prefix}-charging-station:before { content: @fa-var-charging-station; } -.@{fa-css-prefix}-chart-area:before { content: @fa-var-chart-area; } -.@{fa-css-prefix}-chart-bar:before { content: @fa-var-chart-bar; } -.@{fa-css-prefix}-chart-line:before { content: @fa-var-chart-line; } -.@{fa-css-prefix}-chart-pie:before { content: @fa-var-chart-pie; } -.@{fa-css-prefix}-check:before { content: @fa-var-check; } -.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } -.@{fa-css-prefix}-check-double:before { content: @fa-var-check-double; } -.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } -.@{fa-css-prefix}-chess:before { content: @fa-var-chess; } -.@{fa-css-prefix}-chess-bishop:before { content: @fa-var-chess-bishop; } -.@{fa-css-prefix}-chess-board:before { content: @fa-var-chess-board; } -.@{fa-css-prefix}-chess-king:before { content: @fa-var-chess-king; } -.@{fa-css-prefix}-chess-knight:before { content: @fa-var-chess-knight; } -.@{fa-css-prefix}-chess-pawn:before { content: @fa-var-chess-pawn; } -.@{fa-css-prefix}-chess-queen:before { content: @fa-var-chess-queen; } -.@{fa-css-prefix}-chess-rook:before { content: @fa-var-chess-rook; } -.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } -.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } -.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } -.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } -.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } -.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } -.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } -.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } -.@{fa-css-prefix}-child:before { content: @fa-var-child; } -.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } -.@{fa-css-prefix}-church:before { content: @fa-var-church; } -.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } -.@{fa-css-prefix}-circle-notch:before { content: @fa-var-circle-notch; } -.@{fa-css-prefix}-city:before { content: @fa-var-city; } -.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } -.@{fa-css-prefix}-clipboard-check:before { content: @fa-var-clipboard-check; } -.@{fa-css-prefix}-clipboard-list:before { content: @fa-var-clipboard-list; } -.@{fa-css-prefix}-clock:before { content: @fa-var-clock; } -.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } -.@{fa-css-prefix}-closed-captioning:before { content: @fa-var-closed-captioning; } -.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } -.@{fa-css-prefix}-cloud-download-alt:before { content: @fa-var-cloud-download-alt; } -.@{fa-css-prefix}-cloud-meatball:before { content: @fa-var-cloud-meatball; } -.@{fa-css-prefix}-cloud-moon:before { content: @fa-var-cloud-moon; } -.@{fa-css-prefix}-cloud-moon-rain:before { content: @fa-var-cloud-moon-rain; } -.@{fa-css-prefix}-cloud-rain:before { content: @fa-var-cloud-rain; } -.@{fa-css-prefix}-cloud-showers-heavy:before { content: @fa-var-cloud-showers-heavy; } -.@{fa-css-prefix}-cloud-sun:before { content: @fa-var-cloud-sun; } -.@{fa-css-prefix}-cloud-sun-rain:before { content: @fa-var-cloud-sun-rain; } -.@{fa-css-prefix}-cloud-upload-alt:before { content: @fa-var-cloud-upload-alt; } -.@{fa-css-prefix}-cloudscale:before { content: @fa-var-cloudscale; } -.@{fa-css-prefix}-cloudsmith:before { content: @fa-var-cloudsmith; } -.@{fa-css-prefix}-cloudversify:before { content: @fa-var-cloudversify; } -.@{fa-css-prefix}-cocktail:before { content: @fa-var-cocktail; } -.@{fa-css-prefix}-code:before { content: @fa-var-code; } -.@{fa-css-prefix}-code-branch:before { content: @fa-var-code-branch; } -.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } -.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } -.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } -.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } -.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } -.@{fa-css-prefix}-coins:before { content: @fa-var-coins; } -.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } -.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } -.@{fa-css-prefix}-comment-alt:before { content: @fa-var-comment-alt; } -.@{fa-css-prefix}-comment-dollar:before { content: @fa-var-comment-dollar; } -.@{fa-css-prefix}-comment-dots:before { content: @fa-var-comment-dots; } -.@{fa-css-prefix}-comment-slash:before { content: @fa-var-comment-slash; } -.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } -.@{fa-css-prefix}-comments-dollar:before { content: @fa-var-comments-dollar; } -.@{fa-css-prefix}-compact-disc:before { content: @fa-var-compact-disc; } -.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } -.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } -.@{fa-css-prefix}-compress-arrows-alt:before { content: @fa-var-compress-arrows-alt; } -.@{fa-css-prefix}-concierge-bell:before { content: @fa-var-concierge-bell; } -.@{fa-css-prefix}-confluence:before { content: @fa-var-confluence; } -.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } -.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } -.@{fa-css-prefix}-cookie:before { content: @fa-var-cookie; } -.@{fa-css-prefix}-cookie-bite:before { content: @fa-var-cookie-bite; } -.@{fa-css-prefix}-copy:before { content: @fa-var-copy; } -.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } -.@{fa-css-prefix}-couch:before { content: @fa-var-couch; } -.@{fa-css-prefix}-cpanel:before { content: @fa-var-cpanel; } -.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } -.@{fa-css-prefix}-creative-commons-by:before { content: @fa-var-creative-commons-by; } -.@{fa-css-prefix}-creative-commons-nc:before { content: @fa-var-creative-commons-nc; } -.@{fa-css-prefix}-creative-commons-nc-eu:before { content: @fa-var-creative-commons-nc-eu; } -.@{fa-css-prefix}-creative-commons-nc-jp:before { content: @fa-var-creative-commons-nc-jp; } -.@{fa-css-prefix}-creative-commons-nd:before { content: @fa-var-creative-commons-nd; } -.@{fa-css-prefix}-creative-commons-pd:before { content: @fa-var-creative-commons-pd; } -.@{fa-css-prefix}-creative-commons-pd-alt:before { content: @fa-var-creative-commons-pd-alt; } -.@{fa-css-prefix}-creative-commons-remix:before { content: @fa-var-creative-commons-remix; } -.@{fa-css-prefix}-creative-commons-sa:before { content: @fa-var-creative-commons-sa; } -.@{fa-css-prefix}-creative-commons-sampling:before { content: @fa-var-creative-commons-sampling; } -.@{fa-css-prefix}-creative-commons-sampling-plus:before { content: @fa-var-creative-commons-sampling-plus; } -.@{fa-css-prefix}-creative-commons-share:before { content: @fa-var-creative-commons-share; } -.@{fa-css-prefix}-creative-commons-zero:before { content: @fa-var-creative-commons-zero; } -.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } -.@{fa-css-prefix}-critical-role:before { content: @fa-var-critical-role; } -.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } -.@{fa-css-prefix}-crop-alt:before { content: @fa-var-crop-alt; } -.@{fa-css-prefix}-cross:before { content: @fa-var-cross; } -.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } -.@{fa-css-prefix}-crow:before { content: @fa-var-crow; } -.@{fa-css-prefix}-crown:before { content: @fa-var-crown; } -.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } -.@{fa-css-prefix}-css3-alt:before { content: @fa-var-css3-alt; } -.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } -.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } -.@{fa-css-prefix}-cut:before { content: @fa-var-cut; } -.@{fa-css-prefix}-cuttlefish:before { content: @fa-var-cuttlefish; } -.@{fa-css-prefix}-d-and-d:before { content: @fa-var-d-and-d; } -.@{fa-css-prefix}-d-and-d-beyond:before { content: @fa-var-d-and-d-beyond; } -.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } -.@{fa-css-prefix}-database:before { content: @fa-var-database; } -.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } -.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } -.@{fa-css-prefix}-democrat:before { content: @fa-var-democrat; } -.@{fa-css-prefix}-deploydog:before { content: @fa-var-deploydog; } -.@{fa-css-prefix}-deskpro:before { content: @fa-var-deskpro; } -.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } -.@{fa-css-prefix}-dev:before { content: @fa-var-dev; } -.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } -.@{fa-css-prefix}-dharmachakra:before { content: @fa-var-dharmachakra; } -.@{fa-css-prefix}-dhl:before { content: @fa-var-dhl; } -.@{fa-css-prefix}-diagnoses:before { content: @fa-var-diagnoses; } -.@{fa-css-prefix}-diaspora:before { content: @fa-var-diaspora; } -.@{fa-css-prefix}-dice:before { content: @fa-var-dice; } -.@{fa-css-prefix}-dice-d20:before { content: @fa-var-dice-d20; } -.@{fa-css-prefix}-dice-d6:before { content: @fa-var-dice-d6; } -.@{fa-css-prefix}-dice-five:before { content: @fa-var-dice-five; } -.@{fa-css-prefix}-dice-four:before { content: @fa-var-dice-four; } -.@{fa-css-prefix}-dice-one:before { content: @fa-var-dice-one; } -.@{fa-css-prefix}-dice-six:before { content: @fa-var-dice-six; } -.@{fa-css-prefix}-dice-three:before { content: @fa-var-dice-three; } -.@{fa-css-prefix}-dice-two:before { content: @fa-var-dice-two; } -.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } -.@{fa-css-prefix}-digital-ocean:before { content: @fa-var-digital-ocean; } -.@{fa-css-prefix}-digital-tachograph:before { content: @fa-var-digital-tachograph; } -.@{fa-css-prefix}-directions:before { content: @fa-var-directions; } -.@{fa-css-prefix}-discord:before { content: @fa-var-discord; } -.@{fa-css-prefix}-discourse:before { content: @fa-var-discourse; } -.@{fa-css-prefix}-divide:before { content: @fa-var-divide; } -.@{fa-css-prefix}-dizzy:before { content: @fa-var-dizzy; } -.@{fa-css-prefix}-dna:before { content: @fa-var-dna; } -.@{fa-css-prefix}-dochub:before { content: @fa-var-dochub; } -.@{fa-css-prefix}-docker:before { content: @fa-var-docker; } -.@{fa-css-prefix}-dog:before { content: @fa-var-dog; } -.@{fa-css-prefix}-dollar-sign:before { content: @fa-var-dollar-sign; } -.@{fa-css-prefix}-dolly:before { content: @fa-var-dolly; } -.@{fa-css-prefix}-dolly-flatbed:before { content: @fa-var-dolly-flatbed; } -.@{fa-css-prefix}-donate:before { content: @fa-var-donate; } -.@{fa-css-prefix}-door-closed:before { content: @fa-var-door-closed; } -.@{fa-css-prefix}-door-open:before { content: @fa-var-door-open; } -.@{fa-css-prefix}-dot-circle:before { content: @fa-var-dot-circle; } -.@{fa-css-prefix}-dove:before { content: @fa-var-dove; } -.@{fa-css-prefix}-download:before { content: @fa-var-download; } -.@{fa-css-prefix}-draft2digital:before { content: @fa-var-draft2digital; } -.@{fa-css-prefix}-drafting-compass:before { content: @fa-var-drafting-compass; } -.@{fa-css-prefix}-dragon:before { content: @fa-var-dragon; } -.@{fa-css-prefix}-draw-polygon:before { content: @fa-var-draw-polygon; } -.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } -.@{fa-css-prefix}-dribbble-square:before { content: @fa-var-dribbble-square; } -.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } -.@{fa-css-prefix}-drum:before { content: @fa-var-drum; } -.@{fa-css-prefix}-drum-steelpan:before { content: @fa-var-drum-steelpan; } -.@{fa-css-prefix}-drumstick-bite:before { content: @fa-var-drumstick-bite; } -.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } -.@{fa-css-prefix}-dumbbell:before { content: @fa-var-dumbbell; } -.@{fa-css-prefix}-dumpster:before { content: @fa-var-dumpster; } -.@{fa-css-prefix}-dumpster-fire:before { content: @fa-var-dumpster-fire; } -.@{fa-css-prefix}-dungeon:before { content: @fa-var-dungeon; } -.@{fa-css-prefix}-dyalog:before { content: @fa-var-dyalog; } -.@{fa-css-prefix}-earlybirds:before { content: @fa-var-earlybirds; } -.@{fa-css-prefix}-ebay:before { content: @fa-var-ebay; } -.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } -.@{fa-css-prefix}-edit:before { content: @fa-var-edit; } -.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } -.@{fa-css-prefix}-elementor:before { content: @fa-var-elementor; } -.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } -.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } -.@{fa-css-prefix}-ello:before { content: @fa-var-ello; } -.@{fa-css-prefix}-ember:before { content: @fa-var-ember; } -.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } -.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } -.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; } -.@{fa-css-prefix}-envelope-open-text:before { content: @fa-var-envelope-open-text; } -.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } -.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } -.@{fa-css-prefix}-equals:before { content: @fa-var-equals; } -.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } -.@{fa-css-prefix}-erlang:before { content: @fa-var-erlang; } -.@{fa-css-prefix}-ethereum:before { content: @fa-var-ethereum; } -.@{fa-css-prefix}-ethernet:before { content: @fa-var-ethernet; } -.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; } -.@{fa-css-prefix}-euro-sign:before { content: @fa-var-euro-sign; } -.@{fa-css-prefix}-exchange-alt:before { content: @fa-var-exchange-alt; } -.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } -.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } -.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } -.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } -.@{fa-css-prefix}-expand-arrows-alt:before { content: @fa-var-expand-arrows-alt; } -.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } -.@{fa-css-prefix}-external-link-alt:before { content: @fa-var-external-link-alt; } -.@{fa-css-prefix}-external-link-square-alt:before { content: @fa-var-external-link-square-alt; } -.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } -.@{fa-css-prefix}-eye-dropper:before { content: @fa-var-eye-dropper; } -.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } -.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } -.@{fa-css-prefix}-facebook-f:before { content: @fa-var-facebook-f; } -.@{fa-css-prefix}-facebook-messenger:before { content: @fa-var-facebook-messenger; } -.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } -.@{fa-css-prefix}-fantasy-flight-games:before { content: @fa-var-fantasy-flight-games; } -.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } -.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } -.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } -.@{fa-css-prefix}-feather:before { content: @fa-var-feather; } -.@{fa-css-prefix}-feather-alt:before { content: @fa-var-feather-alt; } -.@{fa-css-prefix}-fedex:before { content: @fa-var-fedex; } -.@{fa-css-prefix}-fedora:before { content: @fa-var-fedora; } -.@{fa-css-prefix}-female:before { content: @fa-var-female; } -.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } -.@{fa-css-prefix}-figma:before { content: @fa-var-figma; } -.@{fa-css-prefix}-file:before { content: @fa-var-file; } -.@{fa-css-prefix}-file-alt:before { content: @fa-var-file-alt; } -.@{fa-css-prefix}-file-archive:before { content: @fa-var-file-archive; } -.@{fa-css-prefix}-file-audio:before { content: @fa-var-file-audio; } -.@{fa-css-prefix}-file-code:before { content: @fa-var-file-code; } -.@{fa-css-prefix}-file-contract:before { content: @fa-var-file-contract; } -.@{fa-css-prefix}-file-csv:before { content: @fa-var-file-csv; } -.@{fa-css-prefix}-file-download:before { content: @fa-var-file-download; } -.@{fa-css-prefix}-file-excel:before { content: @fa-var-file-excel; } -.@{fa-css-prefix}-file-export:before { content: @fa-var-file-export; } -.@{fa-css-prefix}-file-image:before { content: @fa-var-file-image; } -.@{fa-css-prefix}-file-import:before { content: @fa-var-file-import; } -.@{fa-css-prefix}-file-invoice:before { content: @fa-var-file-invoice; } -.@{fa-css-prefix}-file-invoice-dollar:before { content: @fa-var-file-invoice-dollar; } -.@{fa-css-prefix}-file-medical:before { content: @fa-var-file-medical; } -.@{fa-css-prefix}-file-medical-alt:before { content: @fa-var-file-medical-alt; } -.@{fa-css-prefix}-file-pdf:before { content: @fa-var-file-pdf; } -.@{fa-css-prefix}-file-powerpoint:before { content: @fa-var-file-powerpoint; } -.@{fa-css-prefix}-file-prescription:before { content: @fa-var-file-prescription; } -.@{fa-css-prefix}-file-signature:before { content: @fa-var-file-signature; } -.@{fa-css-prefix}-file-upload:before { content: @fa-var-file-upload; } -.@{fa-css-prefix}-file-video:before { content: @fa-var-file-video; } -.@{fa-css-prefix}-file-word:before { content: @fa-var-file-word; } -.@{fa-css-prefix}-fill:before { content: @fa-var-fill; } -.@{fa-css-prefix}-fill-drip:before { content: @fa-var-fill-drip; } -.@{fa-css-prefix}-film:before { content: @fa-var-film; } -.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } -.@{fa-css-prefix}-fingerprint:before { content: @fa-var-fingerprint; } -.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } -.@{fa-css-prefix}-fire-alt:before { content: @fa-var-fire-alt; } -.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } -.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } -.@{fa-css-prefix}-first-aid:before { content: @fa-var-first-aid; } -.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } -.@{fa-css-prefix}-first-order-alt:before { content: @fa-var-first-order-alt; } -.@{fa-css-prefix}-firstdraft:before { content: @fa-var-firstdraft; } -.@{fa-css-prefix}-fish:before { content: @fa-var-fish; } -.@{fa-css-prefix}-fist-raised:before { content: @fa-var-fist-raised; } -.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } -.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } -.@{fa-css-prefix}-flag-usa:before { content: @fa-var-flag-usa; } -.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } -.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } -.@{fa-css-prefix}-flipboard:before { content: @fa-var-flipboard; } -.@{fa-css-prefix}-flushed:before { content: @fa-var-flushed; } -.@{fa-css-prefix}-fly:before { content: @fa-var-fly; } -.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } -.@{fa-css-prefix}-folder-minus:before { content: @fa-var-folder-minus; } -.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } -.@{fa-css-prefix}-folder-plus:before { content: @fa-var-folder-plus; } -.@{fa-css-prefix}-font:before { content: @fa-var-font; } -.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } -.@{fa-css-prefix}-font-awesome-alt:before { content: @fa-var-font-awesome-alt; } -.@{fa-css-prefix}-font-awesome-flag:before { content: @fa-var-font-awesome-flag; } -.@{fa-css-prefix}-font-awesome-logo-full:before { content: @fa-var-font-awesome-logo-full; } -.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } -.@{fa-css-prefix}-fonticons-fi:before { content: @fa-var-fonticons-fi; } -.@{fa-css-prefix}-football-ball:before { content: @fa-var-football-ball; } -.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } -.@{fa-css-prefix}-fort-awesome-alt:before { content: @fa-var-fort-awesome-alt; } -.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } -.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } -.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } -.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; } -.@{fa-css-prefix}-freebsd:before { content: @fa-var-freebsd; } -.@{fa-css-prefix}-frog:before { content: @fa-var-frog; } -.@{fa-css-prefix}-frown:before { content: @fa-var-frown; } -.@{fa-css-prefix}-frown-open:before { content: @fa-var-frown-open; } -.@{fa-css-prefix}-fulcrum:before { content: @fa-var-fulcrum; } -.@{fa-css-prefix}-funnel-dollar:before { content: @fa-var-funnel-dollar; } -.@{fa-css-prefix}-futbol:before { content: @fa-var-futbol; } -.@{fa-css-prefix}-galactic-republic:before { content: @fa-var-galactic-republic; } -.@{fa-css-prefix}-galactic-senate:before { content: @fa-var-galactic-senate; } -.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } -.@{fa-css-prefix}-gas-pump:before { content: @fa-var-gas-pump; } -.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } -.@{fa-css-prefix}-gem:before { content: @fa-var-gem; } -.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } -.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } -.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } -.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } -.@{fa-css-prefix}-ghost:before { content: @fa-var-ghost; } -.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } -.@{fa-css-prefix}-gifts:before { content: @fa-var-gifts; } -.@{fa-css-prefix}-git:before { content: @fa-var-git; } -.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } -.@{fa-css-prefix}-github:before { content: @fa-var-github; } -.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } -.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } -.@{fa-css-prefix}-gitkraken:before { content: @fa-var-gitkraken; } -.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } -.@{fa-css-prefix}-gitter:before { content: @fa-var-gitter; } -.@{fa-css-prefix}-glass-cheers:before { content: @fa-var-glass-cheers; } -.@{fa-css-prefix}-glass-martini:before { content: @fa-var-glass-martini; } -.@{fa-css-prefix}-glass-martini-alt:before { content: @fa-var-glass-martini-alt; } -.@{fa-css-prefix}-glass-whiskey:before { content: @fa-var-glass-whiskey; } -.@{fa-css-prefix}-glasses:before { content: @fa-var-glasses; } -.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } -.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } -.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } -.@{fa-css-prefix}-globe-africa:before { content: @fa-var-globe-africa; } -.@{fa-css-prefix}-globe-americas:before { content: @fa-var-globe-americas; } -.@{fa-css-prefix}-globe-asia:before { content: @fa-var-globe-asia; } -.@{fa-css-prefix}-globe-europe:before { content: @fa-var-globe-europe; } -.@{fa-css-prefix}-gofore:before { content: @fa-var-gofore; } -.@{fa-css-prefix}-golf-ball:before { content: @fa-var-golf-ball; } -.@{fa-css-prefix}-goodreads:before { content: @fa-var-goodreads; } -.@{fa-css-prefix}-goodreads-g:before { content: @fa-var-goodreads-g; } -.@{fa-css-prefix}-google:before { content: @fa-var-google; } -.@{fa-css-prefix}-google-drive:before { content: @fa-var-google-drive; } -.@{fa-css-prefix}-google-play:before { content: @fa-var-google-play; } -.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } -.@{fa-css-prefix}-google-plus-g:before { content: @fa-var-google-plus-g; } -.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } -.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } -.@{fa-css-prefix}-gopuram:before { content: @fa-var-gopuram; } -.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } -.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } -.@{fa-css-prefix}-grav:before { content: @fa-var-grav; } -.@{fa-css-prefix}-greater-than:before { content: @fa-var-greater-than; } -.@{fa-css-prefix}-greater-than-equal:before { content: @fa-var-greater-than-equal; } -.@{fa-css-prefix}-grimace:before { content: @fa-var-grimace; } -.@{fa-css-prefix}-grin:before { content: @fa-var-grin; } -.@{fa-css-prefix}-grin-alt:before { content: @fa-var-grin-alt; } -.@{fa-css-prefix}-grin-beam:before { content: @fa-var-grin-beam; } -.@{fa-css-prefix}-grin-beam-sweat:before { content: @fa-var-grin-beam-sweat; } -.@{fa-css-prefix}-grin-hearts:before { content: @fa-var-grin-hearts; } -.@{fa-css-prefix}-grin-squint:before { content: @fa-var-grin-squint; } -.@{fa-css-prefix}-grin-squint-tears:before { content: @fa-var-grin-squint-tears; } -.@{fa-css-prefix}-grin-stars:before { content: @fa-var-grin-stars; } -.@{fa-css-prefix}-grin-tears:before { content: @fa-var-grin-tears; } -.@{fa-css-prefix}-grin-tongue:before { content: @fa-var-grin-tongue; } -.@{fa-css-prefix}-grin-tongue-squint:before { content: @fa-var-grin-tongue-squint; } -.@{fa-css-prefix}-grin-tongue-wink:before { content: @fa-var-grin-tongue-wink; } -.@{fa-css-prefix}-grin-wink:before { content: @fa-var-grin-wink; } -.@{fa-css-prefix}-grip-horizontal:before { content: @fa-var-grip-horizontal; } -.@{fa-css-prefix}-grip-lines:before { content: @fa-var-grip-lines; } -.@{fa-css-prefix}-grip-lines-vertical:before { content: @fa-var-grip-lines-vertical; } -.@{fa-css-prefix}-grip-vertical:before { content: @fa-var-grip-vertical; } -.@{fa-css-prefix}-gripfire:before { content: @fa-var-gripfire; } -.@{fa-css-prefix}-grunt:before { content: @fa-var-grunt; } -.@{fa-css-prefix}-guitar:before { content: @fa-var-guitar; } -.@{fa-css-prefix}-gulp:before { content: @fa-var-gulp; } -.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } -.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } -.@{fa-css-prefix}-hacker-news-square:before { content: @fa-var-hacker-news-square; } -.@{fa-css-prefix}-hackerrank:before { content: @fa-var-hackerrank; } -.@{fa-css-prefix}-hammer:before { content: @fa-var-hammer; } -.@{fa-css-prefix}-hamsa:before { content: @fa-var-hamsa; } -.@{fa-css-prefix}-hand-holding:before { content: @fa-var-hand-holding; } -.@{fa-css-prefix}-hand-holding-heart:before { content: @fa-var-hand-holding-heart; } -.@{fa-css-prefix}-hand-holding-usd:before { content: @fa-var-hand-holding-usd; } -.@{fa-css-prefix}-hand-lizard:before { content: @fa-var-hand-lizard; } -.@{fa-css-prefix}-hand-paper:before { content: @fa-var-hand-paper; } -.@{fa-css-prefix}-hand-peace:before { content: @fa-var-hand-peace; } -.@{fa-css-prefix}-hand-point-down:before { content: @fa-var-hand-point-down; } -.@{fa-css-prefix}-hand-point-left:before { content: @fa-var-hand-point-left; } -.@{fa-css-prefix}-hand-point-right:before { content: @fa-var-hand-point-right; } -.@{fa-css-prefix}-hand-point-up:before { content: @fa-var-hand-point-up; } -.@{fa-css-prefix}-hand-pointer:before { content: @fa-var-hand-pointer; } -.@{fa-css-prefix}-hand-rock:before { content: @fa-var-hand-rock; } -.@{fa-css-prefix}-hand-scissors:before { content: @fa-var-hand-scissors; } -.@{fa-css-prefix}-hand-spock:before { content: @fa-var-hand-spock; } -.@{fa-css-prefix}-hands:before { content: @fa-var-hands; } -.@{fa-css-prefix}-hands-helping:before { content: @fa-var-hands-helping; } -.@{fa-css-prefix}-handshake:before { content: @fa-var-handshake; } -.@{fa-css-prefix}-hanukiah:before { content: @fa-var-hanukiah; } -.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } -.@{fa-css-prefix}-hat-wizard:before { content: @fa-var-hat-wizard; } -.@{fa-css-prefix}-haykal:before { content: @fa-var-haykal; } -.@{fa-css-prefix}-hdd:before { content: @fa-var-hdd; } -.@{fa-css-prefix}-heading:before { content: @fa-var-heading; } -.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } -.@{fa-css-prefix}-headphones-alt:before { content: @fa-var-headphones-alt; } -.@{fa-css-prefix}-headset:before { content: @fa-var-headset; } -.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } -.@{fa-css-prefix}-heart-broken:before { content: @fa-var-heart-broken; } -.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } -.@{fa-css-prefix}-helicopter:before { content: @fa-var-helicopter; } -.@{fa-css-prefix}-highlighter:before { content: @fa-var-highlighter; } -.@{fa-css-prefix}-hiking:before { content: @fa-var-hiking; } -.@{fa-css-prefix}-hippo:before { content: @fa-var-hippo; } -.@{fa-css-prefix}-hips:before { content: @fa-var-hips; } -.@{fa-css-prefix}-hire-a-helper:before { content: @fa-var-hire-a-helper; } -.@{fa-css-prefix}-history:before { content: @fa-var-history; } -.@{fa-css-prefix}-hockey-puck:before { content: @fa-var-hockey-puck; } -.@{fa-css-prefix}-holly-berry:before { content: @fa-var-holly-berry; } -.@{fa-css-prefix}-home:before { content: @fa-var-home; } -.@{fa-css-prefix}-hooli:before { content: @fa-var-hooli; } -.@{fa-css-prefix}-hornbill:before { content: @fa-var-hornbill; } -.@{fa-css-prefix}-horse:before { content: @fa-var-horse; } -.@{fa-css-prefix}-horse-head:before { content: @fa-var-horse-head; } -.@{fa-css-prefix}-hospital:before { content: @fa-var-hospital; } -.@{fa-css-prefix}-hospital-alt:before { content: @fa-var-hospital-alt; } -.@{fa-css-prefix}-hospital-symbol:before { content: @fa-var-hospital-symbol; } -.@{fa-css-prefix}-hot-tub:before { content: @fa-var-hot-tub; } -.@{fa-css-prefix}-hotel:before { content: @fa-var-hotel; } -.@{fa-css-prefix}-hotjar:before { content: @fa-var-hotjar; } -.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } -.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } -.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } -.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } -.@{fa-css-prefix}-house-damage:before { content: @fa-var-house-damage; } -.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } -.@{fa-css-prefix}-hryvnia:before { content: @fa-var-hryvnia; } -.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } -.@{fa-css-prefix}-hubspot:before { content: @fa-var-hubspot; } -.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } -.@{fa-css-prefix}-icicles:before { content: @fa-var-icicles; } -.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; } -.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; } -.@{fa-css-prefix}-id-card-alt:before { content: @fa-var-id-card-alt; } -.@{fa-css-prefix}-igloo:before { content: @fa-var-igloo; } -.@{fa-css-prefix}-image:before { content: @fa-var-image; } -.@{fa-css-prefix}-images:before { content: @fa-var-images; } -.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; } -.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } -.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } -.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } -.@{fa-css-prefix}-infinity:before { content: @fa-var-infinity; } -.@{fa-css-prefix}-info:before { content: @fa-var-info; } -.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } -.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } -.@{fa-css-prefix}-intercom:before { content: @fa-var-intercom; } -.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } -.@{fa-css-prefix}-invision:before { content: @fa-var-invision; } -.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } -.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } -.@{fa-css-prefix}-itunes:before { content: @fa-var-itunes; } -.@{fa-css-prefix}-itunes-note:before { content: @fa-var-itunes-note; } -.@{fa-css-prefix}-java:before { content: @fa-var-java; } -.@{fa-css-prefix}-jedi:before { content: @fa-var-jedi; } -.@{fa-css-prefix}-jedi-order:before { content: @fa-var-jedi-order; } -.@{fa-css-prefix}-jenkins:before { content: @fa-var-jenkins; } -.@{fa-css-prefix}-jira:before { content: @fa-var-jira; } -.@{fa-css-prefix}-joget:before { content: @fa-var-joget; } -.@{fa-css-prefix}-joint:before { content: @fa-var-joint; } -.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } -.@{fa-css-prefix}-journal-whills:before { content: @fa-var-journal-whills; } -.@{fa-css-prefix}-js:before { content: @fa-var-js; } -.@{fa-css-prefix}-js-square:before { content: @fa-var-js-square; } -.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } -.@{fa-css-prefix}-kaaba:before { content: @fa-var-kaaba; } -.@{fa-css-prefix}-kaggle:before { content: @fa-var-kaggle; } -.@{fa-css-prefix}-key:before { content: @fa-var-key; } -.@{fa-css-prefix}-keybase:before { content: @fa-var-keybase; } -.@{fa-css-prefix}-keyboard:before { content: @fa-var-keyboard; } -.@{fa-css-prefix}-keycdn:before { content: @fa-var-keycdn; } -.@{fa-css-prefix}-khanda:before { content: @fa-var-khanda; } -.@{fa-css-prefix}-kickstarter:before { content: @fa-var-kickstarter; } -.@{fa-css-prefix}-kickstarter-k:before { content: @fa-var-kickstarter-k; } -.@{fa-css-prefix}-kiss:before { content: @fa-var-kiss; } -.@{fa-css-prefix}-kiss-beam:before { content: @fa-var-kiss-beam; } -.@{fa-css-prefix}-kiss-wink-heart:before { content: @fa-var-kiss-wink-heart; } -.@{fa-css-prefix}-kiwi-bird:before { content: @fa-var-kiwi-bird; } -.@{fa-css-prefix}-korvue:before { content: @fa-var-korvue; } -.@{fa-css-prefix}-landmark:before { content: @fa-var-landmark; } -.@{fa-css-prefix}-language:before { content: @fa-var-language; } -.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } -.@{fa-css-prefix}-laptop-code:before { content: @fa-var-laptop-code; } -.@{fa-css-prefix}-laravel:before { content: @fa-var-laravel; } -.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } -.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } -.@{fa-css-prefix}-laugh:before { content: @fa-var-laugh; } -.@{fa-css-prefix}-laugh-beam:before { content: @fa-var-laugh-beam; } -.@{fa-css-prefix}-laugh-squint:before { content: @fa-var-laugh-squint; } -.@{fa-css-prefix}-laugh-wink:before { content: @fa-var-laugh-wink; } -.@{fa-css-prefix}-layer-group:before { content: @fa-var-layer-group; } -.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } -.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } -.@{fa-css-prefix}-lemon:before { content: @fa-var-lemon; } -.@{fa-css-prefix}-less:before { content: @fa-var-less; } -.@{fa-css-prefix}-less-than:before { content: @fa-var-less-than; } -.@{fa-css-prefix}-less-than-equal:before { content: @fa-var-less-than-equal; } -.@{fa-css-prefix}-level-down-alt:before { content: @fa-var-level-down-alt; } -.@{fa-css-prefix}-level-up-alt:before { content: @fa-var-level-up-alt; } -.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } -.@{fa-css-prefix}-lightbulb:before { content: @fa-var-lightbulb; } -.@{fa-css-prefix}-line:before { content: @fa-var-line; } -.@{fa-css-prefix}-link:before { content: @fa-var-link; } -.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } -.@{fa-css-prefix}-linkedin-in:before { content: @fa-var-linkedin-in; } -.@{fa-css-prefix}-linode:before { content: @fa-var-linode; } -.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } -.@{fa-css-prefix}-lira-sign:before { content: @fa-var-lira-sign; } -.@{fa-css-prefix}-list:before { content: @fa-var-list; } -.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } -.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } -.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } -.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } -.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } -.@{fa-css-prefix}-lock-open:before { content: @fa-var-lock-open; } -.@{fa-css-prefix}-long-arrow-alt-down:before { content: @fa-var-long-arrow-alt-down; } -.@{fa-css-prefix}-long-arrow-alt-left:before { content: @fa-var-long-arrow-alt-left; } -.@{fa-css-prefix}-long-arrow-alt-right:before { content: @fa-var-long-arrow-alt-right; } -.@{fa-css-prefix}-long-arrow-alt-up:before { content: @fa-var-long-arrow-alt-up; } -.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } -.@{fa-css-prefix}-luggage-cart:before { content: @fa-var-luggage-cart; } -.@{fa-css-prefix}-lyft:before { content: @fa-var-lyft; } -.@{fa-css-prefix}-magento:before { content: @fa-var-magento; } -.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } -.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } -.@{fa-css-prefix}-mail-bulk:before { content: @fa-var-mail-bulk; } -.@{fa-css-prefix}-mailchimp:before { content: @fa-var-mailchimp; } -.@{fa-css-prefix}-male:before { content: @fa-var-male; } -.@{fa-css-prefix}-mandalorian:before { content: @fa-var-mandalorian; } -.@{fa-css-prefix}-map:before { content: @fa-var-map; } -.@{fa-css-prefix}-map-marked:before { content: @fa-var-map-marked; } -.@{fa-css-prefix}-map-marked-alt:before { content: @fa-var-map-marked-alt; } -.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } -.@{fa-css-prefix}-map-marker-alt:before { content: @fa-var-map-marker-alt; } -.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } -.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } -.@{fa-css-prefix}-markdown:before { content: @fa-var-markdown; } -.@{fa-css-prefix}-marker:before { content: @fa-var-marker; } -.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } -.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } -.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } -.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } -.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } -.@{fa-css-prefix}-mask:before { content: @fa-var-mask; } -.@{fa-css-prefix}-mastodon:before { content: @fa-var-mastodon; } -.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } -.@{fa-css-prefix}-medal:before { content: @fa-var-medal; } -.@{fa-css-prefix}-medapps:before { content: @fa-var-medapps; } -.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } -.@{fa-css-prefix}-medium-m:before { content: @fa-var-medium-m; } -.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } -.@{fa-css-prefix}-medrt:before { content: @fa-var-medrt; } -.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; } -.@{fa-css-prefix}-megaport:before { content: @fa-var-megaport; } -.@{fa-css-prefix}-meh:before { content: @fa-var-meh; } -.@{fa-css-prefix}-meh-blank:before { content: @fa-var-meh-blank; } -.@{fa-css-prefix}-meh-rolling-eyes:before { content: @fa-var-meh-rolling-eyes; } -.@{fa-css-prefix}-memory:before { content: @fa-var-memory; } -.@{fa-css-prefix}-mendeley:before { content: @fa-var-mendeley; } -.@{fa-css-prefix}-menorah:before { content: @fa-var-menorah; } -.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } -.@{fa-css-prefix}-meteor:before { content: @fa-var-meteor; } -.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; } -.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } -.@{fa-css-prefix}-microphone-alt:before { content: @fa-var-microphone-alt; } -.@{fa-css-prefix}-microphone-alt-slash:before { content: @fa-var-microphone-alt-slash; } -.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } -.@{fa-css-prefix}-microscope:before { content: @fa-var-microscope; } -.@{fa-css-prefix}-microsoft:before { content: @fa-var-microsoft; } -.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } -.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } -.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } -.@{fa-css-prefix}-mitten:before { content: @fa-var-mitten; } -.@{fa-css-prefix}-mix:before { content: @fa-var-mix; } -.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } -.@{fa-css-prefix}-mizuni:before { content: @fa-var-mizuni; } -.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } -.@{fa-css-prefix}-mobile-alt:before { content: @fa-var-mobile-alt; } -.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } -.@{fa-css-prefix}-monero:before { content: @fa-var-monero; } -.@{fa-css-prefix}-money-bill:before { content: @fa-var-money-bill; } -.@{fa-css-prefix}-money-bill-alt:before { content: @fa-var-money-bill-alt; } -.@{fa-css-prefix}-money-bill-wave:before { content: @fa-var-money-bill-wave; } -.@{fa-css-prefix}-money-bill-wave-alt:before { content: @fa-var-money-bill-wave-alt; } -.@{fa-css-prefix}-money-check:before { content: @fa-var-money-check; } -.@{fa-css-prefix}-money-check-alt:before { content: @fa-var-money-check-alt; } -.@{fa-css-prefix}-monument:before { content: @fa-var-monument; } -.@{fa-css-prefix}-moon:before { content: @fa-var-moon; } -.@{fa-css-prefix}-mortar-pestle:before { content: @fa-var-mortar-pestle; } -.@{fa-css-prefix}-mosque:before { content: @fa-var-mosque; } -.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } -.@{fa-css-prefix}-mountain:before { content: @fa-var-mountain; } -.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } -.@{fa-css-prefix}-mug-hot:before { content: @fa-var-mug-hot; } -.@{fa-css-prefix}-music:before { content: @fa-var-music; } -.@{fa-css-prefix}-napster:before { content: @fa-var-napster; } -.@{fa-css-prefix}-neos:before { content: @fa-var-neos; } -.@{fa-css-prefix}-network-wired:before { content: @fa-var-network-wired; } -.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } -.@{fa-css-prefix}-newspaper:before { content: @fa-var-newspaper; } -.@{fa-css-prefix}-nimblr:before { content: @fa-var-nimblr; } -.@{fa-css-prefix}-nintendo-switch:before { content: @fa-var-nintendo-switch; } -.@{fa-css-prefix}-node:before { content: @fa-var-node; } -.@{fa-css-prefix}-node-js:before { content: @fa-var-node-js; } -.@{fa-css-prefix}-not-equal:before { content: @fa-var-not-equal; } -.@{fa-css-prefix}-notes-medical:before { content: @fa-var-notes-medical; } -.@{fa-css-prefix}-npm:before { content: @fa-var-npm; } -.@{fa-css-prefix}-ns8:before { content: @fa-var-ns8; } -.@{fa-css-prefix}-nutritionix:before { content: @fa-var-nutritionix; } -.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } -.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } -.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } -.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } -.@{fa-css-prefix}-oil-can:before { content: @fa-var-oil-can; } -.@{fa-css-prefix}-old-republic:before { content: @fa-var-old-republic; } -.@{fa-css-prefix}-om:before { content: @fa-var-om; } -.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } -.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } -.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } -.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } -.@{fa-css-prefix}-osi:before { content: @fa-var-osi; } -.@{fa-css-prefix}-otter:before { content: @fa-var-otter; } -.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } -.@{fa-css-prefix}-page4:before { content: @fa-var-page4; } -.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } -.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } -.@{fa-css-prefix}-paint-roller:before { content: @fa-var-paint-roller; } -.@{fa-css-prefix}-palette:before { content: @fa-var-palette; } -.@{fa-css-prefix}-palfed:before { content: @fa-var-palfed; } -.@{fa-css-prefix}-pallet:before { content: @fa-var-pallet; } -.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } -.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } -.@{fa-css-prefix}-parachute-box:before { content: @fa-var-parachute-box; } -.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } -.@{fa-css-prefix}-parking:before { content: @fa-var-parking; } -.@{fa-css-prefix}-passport:before { content: @fa-var-passport; } -.@{fa-css-prefix}-pastafarianism:before { content: @fa-var-pastafarianism; } -.@{fa-css-prefix}-paste:before { content: @fa-var-paste; } -.@{fa-css-prefix}-patreon:before { content: @fa-var-patreon; } -.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } -.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } -.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } -.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } -.@{fa-css-prefix}-peace:before { content: @fa-var-peace; } -.@{fa-css-prefix}-pen:before { content: @fa-var-pen; } -.@{fa-css-prefix}-pen-alt:before { content: @fa-var-pen-alt; } -.@{fa-css-prefix}-pen-fancy:before { content: @fa-var-pen-fancy; } -.@{fa-css-prefix}-pen-nib:before { content: @fa-var-pen-nib; } -.@{fa-css-prefix}-pen-square:before { content: @fa-var-pen-square; } -.@{fa-css-prefix}-pencil-alt:before { content: @fa-var-pencil-alt; } -.@{fa-css-prefix}-pencil-ruler:before { content: @fa-var-pencil-ruler; } -.@{fa-css-prefix}-penny-arcade:before { content: @fa-var-penny-arcade; } -.@{fa-css-prefix}-people-carry:before { content: @fa-var-people-carry; } -.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } -.@{fa-css-prefix}-percentage:before { content: @fa-var-percentage; } -.@{fa-css-prefix}-periscope:before { content: @fa-var-periscope; } -.@{fa-css-prefix}-person-booth:before { content: @fa-var-person-booth; } -.@{fa-css-prefix}-phabricator:before { content: @fa-var-phabricator; } -.@{fa-css-prefix}-phoenix-framework:before { content: @fa-var-phoenix-framework; } -.@{fa-css-prefix}-phoenix-squadron:before { content: @fa-var-phoenix-squadron; } -.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } -.@{fa-css-prefix}-phone-slash:before { content: @fa-var-phone-slash; } -.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } -.@{fa-css-prefix}-phone-volume:before { content: @fa-var-phone-volume; } -.@{fa-css-prefix}-php:before { content: @fa-var-php; } -.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } -.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } -.@{fa-css-prefix}-pied-piper-hat:before { content: @fa-var-pied-piper-hat; } -.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } -.@{fa-css-prefix}-piggy-bank:before { content: @fa-var-piggy-bank; } -.@{fa-css-prefix}-pills:before { content: @fa-var-pills; } -.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } -.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } -.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } -.@{fa-css-prefix}-place-of-worship:before { content: @fa-var-place-of-worship; } -.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } -.@{fa-css-prefix}-plane-arrival:before { content: @fa-var-plane-arrival; } -.@{fa-css-prefix}-plane-departure:before { content: @fa-var-plane-departure; } -.@{fa-css-prefix}-play:before { content: @fa-var-play; } -.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } -.@{fa-css-prefix}-playstation:before { content: @fa-var-playstation; } -.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } -.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } -.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } -.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } -.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; } -.@{fa-css-prefix}-poll:before { content: @fa-var-poll; } -.@{fa-css-prefix}-poll-h:before { content: @fa-var-poll-h; } -.@{fa-css-prefix}-poo:before { content: @fa-var-poo; } -.@{fa-css-prefix}-poo-storm:before { content: @fa-var-poo-storm; } -.@{fa-css-prefix}-poop:before { content: @fa-var-poop; } -.@{fa-css-prefix}-portrait:before { content: @fa-var-portrait; } -.@{fa-css-prefix}-pound-sign:before { content: @fa-var-pound-sign; } -.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } -.@{fa-css-prefix}-pray:before { content: @fa-var-pray; } -.@{fa-css-prefix}-praying-hands:before { content: @fa-var-praying-hands; } -.@{fa-css-prefix}-prescription:before { content: @fa-var-prescription; } -.@{fa-css-prefix}-prescription-bottle:before { content: @fa-var-prescription-bottle; } -.@{fa-css-prefix}-prescription-bottle-alt:before { content: @fa-var-prescription-bottle-alt; } -.@{fa-css-prefix}-print:before { content: @fa-var-print; } -.@{fa-css-prefix}-procedures:before { content: @fa-var-procedures; } -.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } -.@{fa-css-prefix}-project-diagram:before { content: @fa-var-project-diagram; } -.@{fa-css-prefix}-pushed:before { content: @fa-var-pushed; } -.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } -.@{fa-css-prefix}-python:before { content: @fa-var-python; } -.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } -.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } -.@{fa-css-prefix}-question:before { content: @fa-var-question; } -.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } -.@{fa-css-prefix}-quidditch:before { content: @fa-var-quidditch; } -.@{fa-css-prefix}-quinscape:before { content: @fa-var-quinscape; } -.@{fa-css-prefix}-quora:before { content: @fa-var-quora; } -.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } -.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } -.@{fa-css-prefix}-quran:before { content: @fa-var-quran; } -.@{fa-css-prefix}-r-project:before { content: @fa-var-r-project; } -.@{fa-css-prefix}-radiation:before { content: @fa-var-radiation; } -.@{fa-css-prefix}-radiation-alt:before { content: @fa-var-radiation-alt; } -.@{fa-css-prefix}-rainbow:before { content: @fa-var-rainbow; } -.@{fa-css-prefix}-random:before { content: @fa-var-random; } -.@{fa-css-prefix}-raspberry-pi:before { content: @fa-var-raspberry-pi; } -.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; } -.@{fa-css-prefix}-react:before { content: @fa-var-react; } -.@{fa-css-prefix}-reacteurope:before { content: @fa-var-reacteurope; } -.@{fa-css-prefix}-readme:before { content: @fa-var-readme; } -.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } -.@{fa-css-prefix}-receipt:before { content: @fa-var-receipt; } -.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } -.@{fa-css-prefix}-red-river:before { content: @fa-var-red-river; } -.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } -.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } -.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } -.@{fa-css-prefix}-redhat:before { content: @fa-var-redhat; } -.@{fa-css-prefix}-redo:before { content: @fa-var-redo; } -.@{fa-css-prefix}-redo-alt:before { content: @fa-var-redo-alt; } -.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } -.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } -.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } -.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } -.@{fa-css-prefix}-replyd:before { content: @fa-var-replyd; } -.@{fa-css-prefix}-republican:before { content: @fa-var-republican; } -.@{fa-css-prefix}-researchgate:before { content: @fa-var-researchgate; } -.@{fa-css-prefix}-resolving:before { content: @fa-var-resolving; } -.@{fa-css-prefix}-restroom:before { content: @fa-var-restroom; } -.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } -.@{fa-css-prefix}-rev:before { content: @fa-var-rev; } -.@{fa-css-prefix}-ribbon:before { content: @fa-var-ribbon; } -.@{fa-css-prefix}-ring:before { content: @fa-var-ring; } -.@{fa-css-prefix}-road:before { content: @fa-var-road; } -.@{fa-css-prefix}-robot:before { content: @fa-var-robot; } -.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } -.@{fa-css-prefix}-rocketchat:before { content: @fa-var-rocketchat; } -.@{fa-css-prefix}-rockrms:before { content: @fa-var-rockrms; } -.@{fa-css-prefix}-route:before { content: @fa-var-route; } -.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } -.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } -.@{fa-css-prefix}-ruble-sign:before { content: @fa-var-ruble-sign; } -.@{fa-css-prefix}-ruler:before { content: @fa-var-ruler; } -.@{fa-css-prefix}-ruler-combined:before { content: @fa-var-ruler-combined; } -.@{fa-css-prefix}-ruler-horizontal:before { content: @fa-var-ruler-horizontal; } -.@{fa-css-prefix}-ruler-vertical:before { content: @fa-var-ruler-vertical; } -.@{fa-css-prefix}-running:before { content: @fa-var-running; } -.@{fa-css-prefix}-rupee-sign:before { content: @fa-var-rupee-sign; } -.@{fa-css-prefix}-sad-cry:before { content: @fa-var-sad-cry; } -.@{fa-css-prefix}-sad-tear:before { content: @fa-var-sad-tear; } -.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } -.@{fa-css-prefix}-sass:before { content: @fa-var-sass; } -.@{fa-css-prefix}-satellite:before { content: @fa-var-satellite; } -.@{fa-css-prefix}-satellite-dish:before { content: @fa-var-satellite-dish; } -.@{fa-css-prefix}-save:before { content: @fa-var-save; } -.@{fa-css-prefix}-schlix:before { content: @fa-var-schlix; } -.@{fa-css-prefix}-school:before { content: @fa-var-school; } -.@{fa-css-prefix}-screwdriver:before { content: @fa-var-screwdriver; } -.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } -.@{fa-css-prefix}-scroll:before { content: @fa-var-scroll; } -.@{fa-css-prefix}-sd-card:before { content: @fa-var-sd-card; } -.@{fa-css-prefix}-search:before { content: @fa-var-search; } -.@{fa-css-prefix}-search-dollar:before { content: @fa-var-search-dollar; } -.@{fa-css-prefix}-search-location:before { content: @fa-var-search-location; } -.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } -.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } -.@{fa-css-prefix}-searchengin:before { content: @fa-var-searchengin; } -.@{fa-css-prefix}-seedling:before { content: @fa-var-seedling; } -.@{fa-css-prefix}-sellcast:before { content: @fa-var-sellcast; } -.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } -.@{fa-css-prefix}-server:before { content: @fa-var-server; } -.@{fa-css-prefix}-servicestack:before { content: @fa-var-servicestack; } -.@{fa-css-prefix}-shapes:before { content: @fa-var-shapes; } -.@{fa-css-prefix}-share:before { content: @fa-var-share; } -.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } -.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } -.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } -.@{fa-css-prefix}-shekel-sign:before { content: @fa-var-shekel-sign; } -.@{fa-css-prefix}-shield-alt:before { content: @fa-var-shield-alt; } -.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } -.@{fa-css-prefix}-shipping-fast:before { content: @fa-var-shipping-fast; } -.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } -.@{fa-css-prefix}-shoe-prints:before { content: @fa-var-shoe-prints; } -.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } -.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } -.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } -.@{fa-css-prefix}-shopware:before { content: @fa-var-shopware; } -.@{fa-css-prefix}-shower:before { content: @fa-var-shower; } -.@{fa-css-prefix}-shuttle-van:before { content: @fa-var-shuttle-van; } -.@{fa-css-prefix}-sign:before { content: @fa-var-sign; } -.@{fa-css-prefix}-sign-in-alt:before { content: @fa-var-sign-in-alt; } -.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } -.@{fa-css-prefix}-sign-out-alt:before { content: @fa-var-sign-out-alt; } -.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } -.@{fa-css-prefix}-signature:before { content: @fa-var-signature; } -.@{fa-css-prefix}-sim-card:before { content: @fa-var-sim-card; } -.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } -.@{fa-css-prefix}-sistrix:before { content: @fa-var-sistrix; } -.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } -.@{fa-css-prefix}-sith:before { content: @fa-var-sith; } -.@{fa-css-prefix}-skating:before { content: @fa-var-skating; } -.@{fa-css-prefix}-sketch:before { content: @fa-var-sketch; } -.@{fa-css-prefix}-skiing:before { content: @fa-var-skiing; } -.@{fa-css-prefix}-skiing-nordic:before { content: @fa-var-skiing-nordic; } -.@{fa-css-prefix}-skull:before { content: @fa-var-skull; } -.@{fa-css-prefix}-skull-crossbones:before { content: @fa-var-skull-crossbones; } -.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } -.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } -.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } -.@{fa-css-prefix}-slack-hash:before { content: @fa-var-slack-hash; } -.@{fa-css-prefix}-slash:before { content: @fa-var-slash; } -.@{fa-css-prefix}-sleigh:before { content: @fa-var-sleigh; } -.@{fa-css-prefix}-sliders-h:before { content: @fa-var-sliders-h; } -.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } -.@{fa-css-prefix}-smile:before { content: @fa-var-smile; } -.@{fa-css-prefix}-smile-beam:before { content: @fa-var-smile-beam; } -.@{fa-css-prefix}-smile-wink:before { content: @fa-var-smile-wink; } -.@{fa-css-prefix}-smog:before { content: @fa-var-smog; } -.@{fa-css-prefix}-smoking:before { content: @fa-var-smoking; } -.@{fa-css-prefix}-smoking-ban:before { content: @fa-var-smoking-ban; } -.@{fa-css-prefix}-sms:before { content: @fa-var-sms; } -.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } -.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } -.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } -.@{fa-css-prefix}-snowboarding:before { content: @fa-var-snowboarding; } -.@{fa-css-prefix}-snowflake:before { content: @fa-var-snowflake; } -.@{fa-css-prefix}-snowman:before { content: @fa-var-snowman; } -.@{fa-css-prefix}-snowplow:before { content: @fa-var-snowplow; } -.@{fa-css-prefix}-socks:before { content: @fa-var-socks; } -.@{fa-css-prefix}-solar-panel:before { content: @fa-var-solar-panel; } -.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } -.@{fa-css-prefix}-sort-alpha-down:before { content: @fa-var-sort-alpha-down; } -.@{fa-css-prefix}-sort-alpha-up:before { content: @fa-var-sort-alpha-up; } -.@{fa-css-prefix}-sort-amount-down:before { content: @fa-var-sort-amount-down; } -.@{fa-css-prefix}-sort-amount-up:before { content: @fa-var-sort-amount-up; } -.@{fa-css-prefix}-sort-down:before { content: @fa-var-sort-down; } -.@{fa-css-prefix}-sort-numeric-down:before { content: @fa-var-sort-numeric-down; } -.@{fa-css-prefix}-sort-numeric-up:before { content: @fa-var-sort-numeric-up; } -.@{fa-css-prefix}-sort-up:before { content: @fa-var-sort-up; } -.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } -.@{fa-css-prefix}-sourcetree:before { content: @fa-var-sourcetree; } -.@{fa-css-prefix}-spa:before { content: @fa-var-spa; } -.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } -.@{fa-css-prefix}-speakap:before { content: @fa-var-speakap; } -.@{fa-css-prefix}-spider:before { content: @fa-var-spider; } -.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } -.@{fa-css-prefix}-splotch:before { content: @fa-var-splotch; } -.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } -.@{fa-css-prefix}-spray-can:before { content: @fa-var-spray-can; } -.@{fa-css-prefix}-square:before { content: @fa-var-square; } -.@{fa-css-prefix}-square-full:before { content: @fa-var-square-full; } -.@{fa-css-prefix}-square-root-alt:before { content: @fa-var-square-root-alt; } -.@{fa-css-prefix}-squarespace:before { content: @fa-var-squarespace; } -.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } -.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } -.@{fa-css-prefix}-stamp:before { content: @fa-var-stamp; } -.@{fa-css-prefix}-star:before { content: @fa-var-star; } -.@{fa-css-prefix}-star-and-crescent:before { content: @fa-var-star-and-crescent; } -.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } -.@{fa-css-prefix}-star-half-alt:before { content: @fa-var-star-half-alt; } -.@{fa-css-prefix}-star-of-david:before { content: @fa-var-star-of-david; } -.@{fa-css-prefix}-star-of-life:before { content: @fa-var-star-of-life; } -.@{fa-css-prefix}-staylinked:before { content: @fa-var-staylinked; } -.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } -.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } -.@{fa-css-prefix}-steam-symbol:before { content: @fa-var-steam-symbol; } -.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } -.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } -.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } -.@{fa-css-prefix}-sticker-mule:before { content: @fa-var-sticker-mule; } -.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } -.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } -.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } -.@{fa-css-prefix}-stopwatch:before { content: @fa-var-stopwatch; } -.@{fa-css-prefix}-store:before { content: @fa-var-store; } -.@{fa-css-prefix}-store-alt:before { content: @fa-var-store-alt; } -.@{fa-css-prefix}-strava:before { content: @fa-var-strava; } -.@{fa-css-prefix}-stream:before { content: @fa-var-stream; } -.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } -.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } -.@{fa-css-prefix}-stripe:before { content: @fa-var-stripe; } -.@{fa-css-prefix}-stripe-s:before { content: @fa-var-stripe-s; } -.@{fa-css-prefix}-stroopwafel:before { content: @fa-var-stroopwafel; } -.@{fa-css-prefix}-studiovinari:before { content: @fa-var-studiovinari; } -.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } -.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } -.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } -.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } -.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } -.@{fa-css-prefix}-suitcase-rolling:before { content: @fa-var-suitcase-rolling; } -.@{fa-css-prefix}-sun:before { content: @fa-var-sun; } -.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; } -.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } -.@{fa-css-prefix}-supple:before { content: @fa-var-supple; } -.@{fa-css-prefix}-surprise:before { content: @fa-var-surprise; } -.@{fa-css-prefix}-suse:before { content: @fa-var-suse; } -.@{fa-css-prefix}-swatchbook:before { content: @fa-var-swatchbook; } -.@{fa-css-prefix}-swimmer:before { content: @fa-var-swimmer; } -.@{fa-css-prefix}-swimming-pool:before { content: @fa-var-swimming-pool; } -.@{fa-css-prefix}-synagogue:before { content: @fa-var-synagogue; } -.@{fa-css-prefix}-sync:before { content: @fa-var-sync; } -.@{fa-css-prefix}-sync-alt:before { content: @fa-var-sync-alt; } -.@{fa-css-prefix}-syringe:before { content: @fa-var-syringe; } -.@{fa-css-prefix}-table:before { content: @fa-var-table; } -.@{fa-css-prefix}-table-tennis:before { content: @fa-var-table-tennis; } -.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } -.@{fa-css-prefix}-tablet-alt:before { content: @fa-var-tablet-alt; } -.@{fa-css-prefix}-tablets:before { content: @fa-var-tablets; } -.@{fa-css-prefix}-tachometer-alt:before { content: @fa-var-tachometer-alt; } -.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } -.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } -.@{fa-css-prefix}-tape:before { content: @fa-var-tape; } -.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } -.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } -.@{fa-css-prefix}-teamspeak:before { content: @fa-var-teamspeak; } -.@{fa-css-prefix}-teeth:before { content: @fa-var-teeth; } -.@{fa-css-prefix}-teeth-open:before { content: @fa-var-teeth-open; } -.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; } -.@{fa-css-prefix}-telegram-plane:before { content: @fa-var-telegram-plane; } -.@{fa-css-prefix}-temperature-high:before { content: @fa-var-temperature-high; } -.@{fa-css-prefix}-temperature-low:before { content: @fa-var-temperature-low; } -.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } -.@{fa-css-prefix}-tenge:before { content: @fa-var-tenge; } -.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } -.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } -.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } -.@{fa-css-prefix}-th:before { content: @fa-var-th; } -.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } -.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } -.@{fa-css-prefix}-the-red-yeti:before { content: @fa-var-the-red-yeti; } -.@{fa-css-prefix}-theater-masks:before { content: @fa-var-theater-masks; } -.@{fa-css-prefix}-themeco:before { content: @fa-var-themeco; } -.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } -.@{fa-css-prefix}-thermometer:before { content: @fa-var-thermometer; } -.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; } -.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; } -.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; } -.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; } -.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; } -.@{fa-css-prefix}-think-peaks:before { content: @fa-var-think-peaks; } -.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } -.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } -.@{fa-css-prefix}-thumbtack:before { content: @fa-var-thumbtack; } -.@{fa-css-prefix}-ticket-alt:before { content: @fa-var-ticket-alt; } -.@{fa-css-prefix}-times:before { content: @fa-var-times; } -.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } -.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } -.@{fa-css-prefix}-tint-slash:before { content: @fa-var-tint-slash; } -.@{fa-css-prefix}-tired:before { content: @fa-var-tired; } -.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } -.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } -.@{fa-css-prefix}-toilet:before { content: @fa-var-toilet; } -.@{fa-css-prefix}-toilet-paper:before { content: @fa-var-toilet-paper; } -.@{fa-css-prefix}-toolbox:before { content: @fa-var-toolbox; } -.@{fa-css-prefix}-tools:before { content: @fa-var-tools; } -.@{fa-css-prefix}-tooth:before { content: @fa-var-tooth; } -.@{fa-css-prefix}-torah:before { content: @fa-var-torah; } -.@{fa-css-prefix}-torii-gate:before { content: @fa-var-torii-gate; } -.@{fa-css-prefix}-tractor:before { content: @fa-var-tractor; } -.@{fa-css-prefix}-trade-federation:before { content: @fa-var-trade-federation; } -.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } -.@{fa-css-prefix}-traffic-light:before { content: @fa-var-traffic-light; } -.@{fa-css-prefix}-train:before { content: @fa-var-train; } -.@{fa-css-prefix}-tram:before { content: @fa-var-tram; } -.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } -.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } -.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } -.@{fa-css-prefix}-trash-alt:before { content: @fa-var-trash-alt; } -.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } -.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } -.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } -.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } -.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } -.@{fa-css-prefix}-truck-loading:before { content: @fa-var-truck-loading; } -.@{fa-css-prefix}-truck-monster:before { content: @fa-var-truck-monster; } -.@{fa-css-prefix}-truck-moving:before { content: @fa-var-truck-moving; } -.@{fa-css-prefix}-truck-pickup:before { content: @fa-var-truck-pickup; } -.@{fa-css-prefix}-tshirt:before { content: @fa-var-tshirt; } -.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } -.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } -.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } -.@{fa-css-prefix}-tv:before { content: @fa-var-tv; } -.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } -.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } -.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } -.@{fa-css-prefix}-typo3:before { content: @fa-var-typo3; } -.@{fa-css-prefix}-uber:before { content: @fa-var-uber; } -.@{fa-css-prefix}-ubuntu:before { content: @fa-var-ubuntu; } -.@{fa-css-prefix}-uikit:before { content: @fa-var-uikit; } -.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } -.@{fa-css-prefix}-umbrella-beach:before { content: @fa-var-umbrella-beach; } -.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } -.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } -.@{fa-css-prefix}-undo-alt:before { content: @fa-var-undo-alt; } -.@{fa-css-prefix}-uniregistry:before { content: @fa-var-uniregistry; } -.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } -.@{fa-css-prefix}-university:before { content: @fa-var-university; } -.@{fa-css-prefix}-unlink:before { content: @fa-var-unlink; } -.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } -.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } -.@{fa-css-prefix}-untappd:before { content: @fa-var-untappd; } -.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } -.@{fa-css-prefix}-ups:before { content: @fa-var-ups; } -.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } -.@{fa-css-prefix}-user:before { content: @fa-var-user; } -.@{fa-css-prefix}-user-alt:before { content: @fa-var-user-alt; } -.@{fa-css-prefix}-user-alt-slash:before { content: @fa-var-user-alt-slash; } -.@{fa-css-prefix}-user-astronaut:before { content: @fa-var-user-astronaut; } -.@{fa-css-prefix}-user-check:before { content: @fa-var-user-check; } -.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; } -.@{fa-css-prefix}-user-clock:before { content: @fa-var-user-clock; } -.@{fa-css-prefix}-user-cog:before { content: @fa-var-user-cog; } -.@{fa-css-prefix}-user-edit:before { content: @fa-var-user-edit; } -.@{fa-css-prefix}-user-friends:before { content: @fa-var-user-friends; } -.@{fa-css-prefix}-user-graduate:before { content: @fa-var-user-graduate; } -.@{fa-css-prefix}-user-injured:before { content: @fa-var-user-injured; } -.@{fa-css-prefix}-user-lock:before { content: @fa-var-user-lock; } -.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } -.@{fa-css-prefix}-user-minus:before { content: @fa-var-user-minus; } -.@{fa-css-prefix}-user-ninja:before { content: @fa-var-user-ninja; } -.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } -.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } -.@{fa-css-prefix}-user-shield:before { content: @fa-var-user-shield; } -.@{fa-css-prefix}-user-slash:before { content: @fa-var-user-slash; } -.@{fa-css-prefix}-user-tag:before { content: @fa-var-user-tag; } -.@{fa-css-prefix}-user-tie:before { content: @fa-var-user-tie; } -.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } -.@{fa-css-prefix}-users:before { content: @fa-var-users; } -.@{fa-css-prefix}-users-cog:before { content: @fa-var-users-cog; } -.@{fa-css-prefix}-usps:before { content: @fa-var-usps; } -.@{fa-css-prefix}-ussunnah:before { content: @fa-var-ussunnah; } -.@{fa-css-prefix}-utensil-spoon:before { content: @fa-var-utensil-spoon; } -.@{fa-css-prefix}-utensils:before { content: @fa-var-utensils; } -.@{fa-css-prefix}-vaadin:before { content: @fa-var-vaadin; } -.@{fa-css-prefix}-vector-square:before { content: @fa-var-vector-square; } -.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } -.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } -.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } -.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } -.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } -.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } -.@{fa-css-prefix}-vial:before { content: @fa-var-vial; } -.@{fa-css-prefix}-vials:before { content: @fa-var-vials; } -.@{fa-css-prefix}-viber:before { content: @fa-var-viber; } -.@{fa-css-prefix}-video:before { content: @fa-var-video; } -.@{fa-css-prefix}-video-slash:before { content: @fa-var-video-slash; } -.@{fa-css-prefix}-vihara:before { content: @fa-var-vihara; } -.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } -.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } -.@{fa-css-prefix}-vimeo-v:before { content: @fa-var-vimeo-v; } -.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } -.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } -.@{fa-css-prefix}-vnv:before { content: @fa-var-vnv; } -.@{fa-css-prefix}-volleyball-ball:before { content: @fa-var-volleyball-ball; } -.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } -.@{fa-css-prefix}-volume-mute:before { content: @fa-var-volume-mute; } -.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } -.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } -.@{fa-css-prefix}-vote-yea:before { content: @fa-var-vote-yea; } -.@{fa-css-prefix}-vr-cardboard:before { content: @fa-var-vr-cardboard; } -.@{fa-css-prefix}-vuejs:before { content: @fa-var-vuejs; } -.@{fa-css-prefix}-walking:before { content: @fa-var-walking; } -.@{fa-css-prefix}-wallet:before { content: @fa-var-wallet; } -.@{fa-css-prefix}-warehouse:before { content: @fa-var-warehouse; } -.@{fa-css-prefix}-water:before { content: @fa-var-water; } -.@{fa-css-prefix}-weebly:before { content: @fa-var-weebly; } -.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } -.@{fa-css-prefix}-weight:before { content: @fa-var-weight; } -.@{fa-css-prefix}-weight-hanging:before { content: @fa-var-weight-hanging; } -.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } -.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } -.@{fa-css-prefix}-whatsapp-square:before { content: @fa-var-whatsapp-square; } -.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } -.@{fa-css-prefix}-whmcs:before { content: @fa-var-whmcs; } -.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } -.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } -.@{fa-css-prefix}-wind:before { content: @fa-var-wind; } -.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; } -.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; } -.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; } -.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; } -.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } -.@{fa-css-prefix}-wine-bottle:before { content: @fa-var-wine-bottle; } -.@{fa-css-prefix}-wine-glass:before { content: @fa-var-wine-glass; } -.@{fa-css-prefix}-wine-glass-alt:before { content: @fa-var-wine-glass-alt; } -.@{fa-css-prefix}-wix:before { content: @fa-var-wix; } -.@{fa-css-prefix}-wizards-of-the-coast:before { content: @fa-var-wizards-of-the-coast; } -.@{fa-css-prefix}-wolf-pack-battalion:before { content: @fa-var-wolf-pack-battalion; } -.@{fa-css-prefix}-won-sign:before { content: @fa-var-won-sign; } -.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } -.@{fa-css-prefix}-wordpress-simple:before { content: @fa-var-wordpress-simple; } -.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } -.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; } -.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } -.@{fa-css-prefix}-wpressr:before { content: @fa-var-wpressr; } -.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } -.@{fa-css-prefix}-x-ray:before { content: @fa-var-x-ray; } -.@{fa-css-prefix}-xbox:before { content: @fa-var-xbox; } -.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } -.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } -.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } -.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } -.@{fa-css-prefix}-yandex:before { content: @fa-var-yandex; } -.@{fa-css-prefix}-yandex-international:before { content: @fa-var-yandex-international; } -.@{fa-css-prefix}-yarn:before { content: @fa-var-yarn; } -.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } -.@{fa-css-prefix}-yen-sign:before { content: @fa-var-yen-sign; } -.@{fa-css-prefix}-yin-yang:before { content: @fa-var-yin-yang; } -.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } -.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } -.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } -.@{fa-css-prefix}-zhihu:before { content: @fa-var-zhihu; } diff --git a/application/client/src/app/ui/styles/fontawesome/less/_larger.less b/application/client/src/app/ui/styles/fontawesome/less/_larger.less deleted file mode 100644 index 6cbb1ec6ec..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_larger.less +++ /dev/null @@ -1,27 +0,0 @@ -// Icon Sizes -// ------------------------- - -.larger(@factor) when (@factor > 0) { - .larger((@factor - 1)); - - .@{fa-css-prefix}-@{factor}x { - font-size: (@factor * 1em); - } -} - -/* makes the font 33% larger relative to the icon container */ -.@{fa-css-prefix}-lg { - font-size: (4em / 3); - line-height: (3em / 4); - vertical-align: -.0667em; -} - -.@{fa-css-prefix}-xs { - font-size: .75em; -} - -.@{fa-css-prefix}-sm { - font-size: .875em; -} - -.larger(10); diff --git a/application/client/src/app/ui/styles/fontawesome/less/_list.less b/application/client/src/app/ui/styles/fontawesome/less/_list.less deleted file mode 100644 index 1ff7ca7f59..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_list.less +++ /dev/null @@ -1,18 +0,0 @@ -// List Icons -// ------------------------- - -.@{fa-css-prefix}-ul { - list-style-type: none; - margin-left: @fa-li-width * 5/4; - padding-left: 0; - - > li { position: relative; } -} - -.@{fa-css-prefix}-li { - left: -@fa-li-width; - position: absolute; - text-align: center; - width: @fa-li-width; - line-height: inherit; -} diff --git a/application/client/src/app/ui/styles/fontawesome/less/_mixins.less b/application/client/src/app/ui/styles/fontawesome/less/_mixins.less deleted file mode 100644 index a4e93f90a3..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_mixins.less +++ /dev/null @@ -1,57 +0,0 @@ -// Mixins -// -------------------------- - -.fa-icon() { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - font-weight: normal; - line-height: 1; - vertical-align: -.125em; -} - -.fa-icon-rotate(@degrees, @rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; - transform: rotate(@degrees); -} - -.fa-icon-flip(@horiz, @vert, @rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; - transform: scale(@horiz, @vert); -} - - -// Only display content to screen readers. A la Bootstrap 4. -// -// See: http://a11yproject.com/posts/how-to-hide-content/ - -.sr-only() { - border: 0; - clip: rect(0,0,0,0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} - -// Use in conjunction with .sr-only to only display content when it's focused. -// -// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 -// -// Credit: HTML5 Boilerplate - -.sr-only-focusable() { - &:active, - &:focus { - clip: auto; - height: auto; - margin: 0; - overflow: visible; - position: static; - width: auto; - } -} diff --git a/application/client/src/app/ui/styles/fontawesome/less/_rotated-flipped.less b/application/client/src/app/ui/styles/fontawesome/less/_rotated-flipped.less deleted file mode 100644 index 1ee31db19f..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_rotated-flipped.less +++ /dev/null @@ -1,23 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } -.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } -.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } - -.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } -.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } -.@{fa-css-prefix}-flip-horizontal.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(-1, -1, 2); } - -// Hook for IE8-9 -// ------------------------- - -:root { - .@{fa-css-prefix}-rotate-90, - .@{fa-css-prefix}-rotate-180, - .@{fa-css-prefix}-rotate-270, - .@{fa-css-prefix}-flip-horizontal, - .@{fa-css-prefix}-flip-vertical { - filter: none; - } -} diff --git a/application/client/src/app/ui/styles/fontawesome/less/_screen-reader.less b/application/client/src/app/ui/styles/fontawesome/less/_screen-reader.less deleted file mode 100644 index 11c188196d..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_screen-reader.less +++ /dev/null @@ -1,5 +0,0 @@ -// Screen Readers -// ------------------------- - -.sr-only { .sr-only(); } -.sr-only-focusable { .sr-only-focusable(); } diff --git a/application/client/src/app/ui/styles/fontawesome/less/_shims.less b/application/client/src/app/ui/styles/fontawesome/less/_shims.less deleted file mode 100644 index 8a618a1813..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_shims.less +++ /dev/null @@ -1,2062 +0,0 @@ -.@{fa-css-prefix}.@{fa-css-prefix}-glass:before { content: @fa-var-glass-martini; } - -.@{fa-css-prefix}.@{fa-css-prefix}-meetup { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-star-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-star-o:before { content: @fa-var-star; } - -.@{fa-css-prefix}.@{fa-css-prefix}-remove:before { content: @fa-var-times; } - -.@{fa-css-prefix}.@{fa-css-prefix}-close:before { content: @fa-var-times; } - -.@{fa-css-prefix}.@{fa-css-prefix}-gear:before { content: @fa-var-cog; } - -.@{fa-css-prefix}.@{fa-css-prefix}-trash-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-o:before { content: @fa-var-file; } - -.@{fa-css-prefix}.@{fa-css-prefix}-clock-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock; } - -.@{fa-css-prefix}.@{fa-css-prefix}-arrow-circle-o-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-alt-circle-down; } - -.@{fa-css-prefix}.@{fa-css-prefix}-arrow-circle-o-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-alt-circle-up; } - -.@{fa-css-prefix}.@{fa-css-prefix}-play-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle; } - -.@{fa-css-prefix}.@{fa-css-prefix}-repeat:before { content: @fa-var-redo; } - -.@{fa-css-prefix}.@{fa-css-prefix}-rotate-right:before { content: @fa-var-redo; } - -.@{fa-css-prefix}.@{fa-css-prefix}-refresh:before { content: @fa-var-sync; } - -.@{fa-css-prefix}.@{fa-css-prefix}-list-alt { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-dedent:before { content: @fa-var-outdent; } - -.@{fa-css-prefix}.@{fa-css-prefix}-video-camera:before { content: @fa-var-video; } - -.@{fa-css-prefix}.@{fa-css-prefix}-picture-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-picture-o:before { content: @fa-var-image; } - -.@{fa-css-prefix}.@{fa-css-prefix}-photo { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-photo:before { content: @fa-var-image; } - -.@{fa-css-prefix}.@{fa-css-prefix}-image { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-image:before { content: @fa-var-image; } - -.@{fa-css-prefix}.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-pencil-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-edit; } - -.@{fa-css-prefix}.@{fa-css-prefix}-share-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square; } - -.@{fa-css-prefix}.@{fa-css-prefix}-check-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square; } - -.@{fa-css-prefix}.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-times-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle; } - -.@{fa-css-prefix}.@{fa-css-prefix}-check-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle; } - -.@{fa-css-prefix}.@{fa-css-prefix}-mail-forward:before { content: @fa-var-share; } - -.@{fa-css-prefix}.@{fa-css-prefix}-eye { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-eye-slash { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-warning:before { content: @fa-var-exclamation-triangle; } - -.@{fa-css-prefix}.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-alt-v; } - -.@{fa-css-prefix}.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-alt-h; } - -.@{fa-css-prefix}.@{fa-css-prefix}-bar-chart { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-bar-chart:before { content: @fa-var-chart-bar; } - -.@{fa-css-prefix}.@{fa-css-prefix}-bar-chart-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-bar-chart-o:before { content: @fa-var-chart-bar; } - -.@{fa-css-prefix}.@{fa-css-prefix}-twitter-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-facebook-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-gears:before { content: @fa-var-cogs; } - -.@{fa-css-prefix}.@{fa-css-prefix}-thumbs-o-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-up; } - -.@{fa-css-prefix}.@{fa-css-prefix}-thumbs-o-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-down; } - -.@{fa-css-prefix}.@{fa-css-prefix}-heart-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-linkedin-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin; } - -.@{fa-css-prefix}.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumbtack; } - -.@{fa-css-prefix}.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-github-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-lemon-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon; } - -.@{fa-css-prefix}.@{fa-css-prefix}-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-square-o:before { content: @fa-var-square; } - -.@{fa-css-prefix}.@{fa-css-prefix}-bookmark-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark; } - -.@{fa-css-prefix}.@{fa-css-prefix}-twitter { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-facebook { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook-f; } - -.@{fa-css-prefix}.@{fa-css-prefix}-facebook-f { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-facebook-f:before { content: @fa-var-facebook-f; } - -.@{fa-css-prefix}.@{fa-css-prefix}-github { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-credit-card { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-feed:before { content: @fa-var-rss; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hdd-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-o-right { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-point-right; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-o-left { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-point-left; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-o-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-point-up; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-o-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-point-down; } - -.@{fa-css-prefix}.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-expand-arrows-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-group:before { content: @fa-var-users; } - -.@{fa-css-prefix}.@{fa-css-prefix}-chain:before { content: @fa-var-link; } - -.@{fa-css-prefix}.@{fa-css-prefix}-scissors:before { content: @fa-var-cut; } - -.@{fa-css-prefix}.@{fa-css-prefix}-files-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-files-o:before { content: @fa-var-copy; } - -.@{fa-css-prefix}.@{fa-css-prefix}-floppy-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-floppy-o:before { content: @fa-var-save; } - -.@{fa-css-prefix}.@{fa-css-prefix}-navicon:before { content: @fa-var-bars; } - -.@{fa-css-prefix}.@{fa-css-prefix}-reorder:before { content: @fa-var-bars; } - -.@{fa-css-prefix}.@{fa-css-prefix}-pinterest { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-pinterest-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-google-plus-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-google-plus { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus-g; } - -.@{fa-css-prefix}.@{fa-css-prefix}-money { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-money:before { content: @fa-var-money-bill-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-unsorted:before { content: @fa-var-sort; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-down; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-up; } - -.@{fa-css-prefix}.@{fa-css-prefix}-linkedin { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin-in; } - -.@{fa-css-prefix}.@{fa-css-prefix}-rotate-left:before { content: @fa-var-undo; } - -.@{fa-css-prefix}.@{fa-css-prefix}-legal:before { content: @fa-var-gavel; } - -.@{fa-css-prefix}.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-dashboard:before { content: @fa-var-tachometer-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-comment-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment; } - -.@{fa-css-prefix}.@{fa-css-prefix}-comments-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments; } - -.@{fa-css-prefix}.@{fa-css-prefix}-flash:before { content: @fa-var-bolt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-clipboard { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-paste { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-paste:before { content: @fa-var-clipboard; } - -.@{fa-css-prefix}.@{fa-css-prefix}-lightbulb-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb; } - -.@{fa-css-prefix}.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-bell-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell; } - -.@{fa-css-prefix}.@{fa-css-prefix}-cutlery:before { content: @fa-var-utensils; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-text-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-building-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-building-o:before { content: @fa-var-building; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hospital-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital; } - -.@{fa-css-prefix}.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-mobile-phone:before { content: @fa-var-mobile-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle; } - -.@{fa-css-prefix}.@{fa-css-prefix}-mail-reply:before { content: @fa-var-reply; } - -.@{fa-css-prefix}.@{fa-css-prefix}-github-alt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-folder-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder; } - -.@{fa-css-prefix}.@{fa-css-prefix}-folder-open-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open; } - -.@{fa-css-prefix}.@{fa-css-prefix}-smile-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile; } - -.@{fa-css-prefix}.@{fa-css-prefix}-frown-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown; } - -.@{fa-css-prefix}.@{fa-css-prefix}-meh-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh; } - -.@{fa-css-prefix}.@{fa-css-prefix}-keyboard-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard; } - -.@{fa-css-prefix}.@{fa-css-prefix}-flag-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag; } - -.@{fa-css-prefix}.@{fa-css-prefix}-mail-reply-all:before { content: @fa-var-reply-all; } - -.@{fa-css-prefix}.@{fa-css-prefix}-star-half-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half; } - -.@{fa-css-prefix}.@{fa-css-prefix}-star-half-empty { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-star-half-empty:before { content: @fa-var-star-half; } - -.@{fa-css-prefix}.@{fa-css-prefix}-star-half-full { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-star-half-full:before { content: @fa-var-star-half; } - -.@{fa-css-prefix}.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-branch; } - -.@{fa-css-prefix}.@{fa-css-prefix}-chain-broken:before { content: @fa-var-unlink; } - -.@{fa-css-prefix}.@{fa-css-prefix}-shield:before { content: @fa-var-shield-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-calendar-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar; } - -.@{fa-css-prefix}.@{fa-css-prefix}-maxcdn { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-html5 { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-css3 { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-minus-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square; } - -.@{fa-css-prefix}.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pen-square; } - -.@{fa-css-prefix}.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-compass { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-caret-square-o-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-down; } - -.@{fa-css-prefix}.@{fa-css-prefix}-toggle-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-toggle-down:before { content: @fa-var-caret-square-down; } - -.@{fa-css-prefix}.@{fa-css-prefix}-caret-square-o-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-up; } - -.@{fa-css-prefix}.@{fa-css-prefix}-toggle-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-toggle-up:before { content: @fa-var-caret-square-up; } - -.@{fa-css-prefix}.@{fa-css-prefix}-caret-square-o-right { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-right; } - -.@{fa-css-prefix}.@{fa-css-prefix}-toggle-right { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-toggle-right:before { content: @fa-var-caret-square-right; } - -.@{fa-css-prefix}.@{fa-css-prefix}-eur:before { content: @fa-var-euro-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-euro:before { content: @fa-var-euro-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-gbp:before { content: @fa-var-pound-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-usd:before { content: @fa-var-dollar-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-dollar:before { content: @fa-var-dollar-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-inr:before { content: @fa-var-rupee-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-rupee:before { content: @fa-var-rupee-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-jpy:before { content: @fa-var-yen-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-cny:before { content: @fa-var-yen-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-rmb:before { content: @fa-var-yen-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-yen:before { content: @fa-var-yen-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-rub:before { content: @fa-var-ruble-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-ruble:before { content: @fa-var-ruble-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-rouble:before { content: @fa-var-ruble-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-krw:before { content: @fa-var-won-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-won:before { content: @fa-var-won-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-btc { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-bitcoin { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-bitcoin:before { content: @fa-var-btc; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-text:before { content: @fa-var-file-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-down; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-up; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-down; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-up; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-down; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-up; } - -.@{fa-css-prefix}.@{fa-css-prefix}-youtube-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-youtube { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-xing { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-xing-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-youtube-play { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube; } - -.@{fa-css-prefix}.@{fa-css-prefix}-dropbox { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-stack-overflow { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-instagram { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-flickr { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-adn { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-bitbucket { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-bitbucket-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket; } - -.@{fa-css-prefix}.@{fa-css-prefix}-tumblr { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-tumblr-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-alt-down; } - -.@{fa-css-prefix}.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-alt-up; } - -.@{fa-css-prefix}.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-alt-left; } - -.@{fa-css-prefix}.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-alt-right; } - -.@{fa-css-prefix}.@{fa-css-prefix}-apple { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-windows { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-android { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-linux { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-dribbble { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-skype { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-foursquare { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-trello { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-gratipay { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-gittip { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-gittip:before { content: @fa-var-gratipay; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sun-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun; } - -.@{fa-css-prefix}.@{fa-css-prefix}-moon-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon; } - -.@{fa-css-prefix}.@{fa-css-prefix}-vk { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-weibo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-renren { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-pagelines { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-stack-exchange { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-arrow-circle-o-right { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-alt-circle-right; } - -.@{fa-css-prefix}.@{fa-css-prefix}-arrow-circle-o-left { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-alt-circle-left; } - -.@{fa-css-prefix}.@{fa-css-prefix}-caret-square-o-left { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-left; } - -.@{fa-css-prefix}.@{fa-css-prefix}-toggle-left { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-toggle-left:before { content: @fa-var-caret-square-left; } - -.@{fa-css-prefix}.@{fa-css-prefix}-dot-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle; } - -.@{fa-css-prefix}.@{fa-css-prefix}-vimeo-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-try:before { content: @fa-var-lira-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-turkish-lira:before { content: @fa-var-lira-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-plus-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square; } - -.@{fa-css-prefix}.@{fa-css-prefix}-slack { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-wordpress { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-openid { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-institution:before { content: @fa-var-university; } - -.@{fa-css-prefix}.@{fa-css-prefix}-bank:before { content: @fa-var-university; } - -.@{fa-css-prefix}.@{fa-css-prefix}-mortar-board:before { content: @fa-var-graduation-cap; } - -.@{fa-css-prefix}.@{fa-css-prefix}-yahoo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-google { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-reddit { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-reddit-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-stumbleupon-circle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-stumbleupon { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-delicious { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-digg { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-pied-piper-pp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-pied-piper-alt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-drupal { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-joomla { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-spoon:before { content: @fa-var-utensil-spoon; } - -.@{fa-css-prefix}.@{fa-css-prefix}-behance { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-behance-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-steam { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-steam-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-automobile:before { content: @fa-var-car; } - -.@{fa-css-prefix}.@{fa-css-prefix}-cab:before { content: @fa-var-taxi; } - -.@{fa-css-prefix}.@{fa-css-prefix}-envelope-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope; } - -.@{fa-css-prefix}.@{fa-css-prefix}-deviantart { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-soundcloud { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-file-pdf-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-word-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-excel-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-powerpoint-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-image-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-photo-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-photo-o:before { content: @fa-var-file-image; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-picture-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-picture-o:before { content: @fa-var-file-image; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-archive-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-zip-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-zip-o:before { content: @fa-var-file-archive; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-audio-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-sound-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-sound-o:before { content: @fa-var-file-audio; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-video-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-movie-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-movie-o:before { content: @fa-var-file-video; } - -.@{fa-css-prefix}.@{fa-css-prefix}-file-code-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code; } - -.@{fa-css-prefix}.@{fa-css-prefix}-vine { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-codepen { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-jsfiddle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-life-ring { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-life-bouy { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-life-bouy:before { content: @fa-var-life-ring; } - -.@{fa-css-prefix}.@{fa-css-prefix}-life-buoy { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-life-buoy:before { content: @fa-var-life-ring; } - -.@{fa-css-prefix}.@{fa-css-prefix}-life-saver { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-life-saver:before { content: @fa-var-life-ring; } - -.@{fa-css-prefix}.@{fa-css-prefix}-support { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-support:before { content: @fa-var-life-ring; } - -.@{fa-css-prefix}.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-notch; } - -.@{fa-css-prefix}.@{fa-css-prefix}-rebel { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-ra { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-ra:before { content: @fa-var-rebel; } - -.@{fa-css-prefix}.@{fa-css-prefix}-resistance { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-resistance:before { content: @fa-var-rebel; } - -.@{fa-css-prefix}.@{fa-css-prefix}-empire { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-ge { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-ge:before { content: @fa-var-empire; } - -.@{fa-css-prefix}.@{fa-css-prefix}-git-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-git { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-hacker-news { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-y-combinator-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-y-combinator-square:before { content: @fa-var-hacker-news; } - -.@{fa-css-prefix}.@{fa-css-prefix}-yc-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-yc-square:before { content: @fa-var-hacker-news; } - -.@{fa-css-prefix}.@{fa-css-prefix}-tencent-weibo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-qq { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-weixin { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-wechat { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-wechat:before { content: @fa-var-weixin; } - -.@{fa-css-prefix}.@{fa-css-prefix}-send:before { content: @fa-var-paper-plane; } - -.@{fa-css-prefix}.@{fa-css-prefix}-paper-plane-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane; } - -.@{fa-css-prefix}.@{fa-css-prefix}-send-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-send-o:before { content: @fa-var-paper-plane; } - -.@{fa-css-prefix}.@{fa-css-prefix}-circle-thin { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle; } - -.@{fa-css-prefix}.@{fa-css-prefix}-header:before { content: @fa-var-heading; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders-h; } - -.@{fa-css-prefix}.@{fa-css-prefix}-futbol-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol; } - -.@{fa-css-prefix}.@{fa-css-prefix}-soccer-ball-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-soccer-ball-o:before { content: @fa-var-futbol; } - -.@{fa-css-prefix}.@{fa-css-prefix}-slideshare { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-twitch { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-yelp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-newspaper-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper; } - -.@{fa-css-prefix}.@{fa-css-prefix}-paypal { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-google-wallet { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-cc-visa { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-cc-mastercard { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-cc-discover { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-cc-amex { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-cc-paypal { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-cc-stripe { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-bell-slash-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash; } - -.@{fa-css-prefix}.@{fa-css-prefix}-trash:before { content: @fa-var-trash-alt; } - -.@{fa-css-prefix}.@{fa-css-prefix}-copyright { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eye-dropper; } - -.@{fa-css-prefix}.@{fa-css-prefix}-area-chart:before { content: @fa-var-chart-area; } - -.@{fa-css-prefix}.@{fa-css-prefix}-pie-chart:before { content: @fa-var-chart-pie; } - -.@{fa-css-prefix}.@{fa-css-prefix}-line-chart:before { content: @fa-var-chart-line; } - -.@{fa-css-prefix}.@{fa-css-prefix}-lastfm { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-lastfm-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-ioxhost { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-angellist { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-cc { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-cc:before { content: @fa-var-closed-captioning; } - -.@{fa-css-prefix}.@{fa-css-prefix}-ils:before { content: @fa-var-shekel-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-shekel:before { content: @fa-var-shekel-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-sheqel:before { content: @fa-var-shekel-sign; } - -.@{fa-css-prefix}.@{fa-css-prefix}-meanpath { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-meanpath:before { content: @fa-var-font-awesome; } - -.@{fa-css-prefix}.@{fa-css-prefix}-buysellads { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-connectdevelop { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-dashcube { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-forumbee { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-leanpub { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-sellsy { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-shirtsinbulk { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-simplybuilt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-skyatlas { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-diamond { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-diamond:before { content: @fa-var-gem; } - -.@{fa-css-prefix}.@{fa-css-prefix}-intersex:before { content: @fa-var-transgender; } - -.@{fa-css-prefix}.@{fa-css-prefix}-facebook-official { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook; } - -.@{fa-css-prefix}.@{fa-css-prefix}-pinterest-p { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-whatsapp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-hotel:before { content: @fa-var-bed; } - -.@{fa-css-prefix}.@{fa-css-prefix}-viacoin { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-medium { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-y-combinator { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-yc { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-yc:before { content: @fa-var-y-combinator; } - -.@{fa-css-prefix}.@{fa-css-prefix}-optin-monster { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-opencart { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-expeditedssl { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-battery-4:before { content: @fa-var-battery-full; } - -.@{fa-css-prefix}.@{fa-css-prefix}-battery:before { content: @fa-var-battery-full; } - -.@{fa-css-prefix}.@{fa-css-prefix}-battery-3:before { content: @fa-var-battery-three-quarters; } - -.@{fa-css-prefix}.@{fa-css-prefix}-battery-2:before { content: @fa-var-battery-half; } - -.@{fa-css-prefix}.@{fa-css-prefix}-battery-1:before { content: @fa-var-battery-quarter; } - -.@{fa-css-prefix}.@{fa-css-prefix}-battery-0:before { content: @fa-var-battery-empty; } - -.@{fa-css-prefix}.@{fa-css-prefix}-object-group { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-object-ungroup { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-sticky-note-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note; } - -.@{fa-css-prefix}.@{fa-css-prefix}-cc-jcb { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-cc-diners-club { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-clone { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-hourglass-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hourglass-1:before { content: @fa-var-hourglass-start; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hourglass-2:before { content: @fa-var-hourglass-half; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hourglass-3:before { content: @fa-var-hourglass-end; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-rock-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-grab-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-grab-o:before { content: @fa-var-hand-rock; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-paper-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-stop-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-stop-o:before { content: @fa-var-hand-paper; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-scissors-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-lizard-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-spock-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-pointer-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hand-peace-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace; } - -.@{fa-css-prefix}.@{fa-css-prefix}-registered { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-creative-commons { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-gg { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-gg-circle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-tripadvisor { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-odnoklassniki { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-odnoklassniki-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-get-pocket { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-wikipedia-w { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-safari { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-chrome { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-firefox { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-opera { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-internet-explorer { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-television:before { content: @fa-var-tv; } - -.@{fa-css-prefix}.@{fa-css-prefix}-contao { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-500px { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-amazon { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-calendar-plus-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus; } - -.@{fa-css-prefix}.@{fa-css-prefix}-calendar-minus-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus; } - -.@{fa-css-prefix}.@{fa-css-prefix}-calendar-times-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times; } - -.@{fa-css-prefix}.@{fa-css-prefix}-calendar-check-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check; } - -.@{fa-css-prefix}.@{fa-css-prefix}-map-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-map-o:before { content: @fa-var-map; } - -.@{fa-css-prefix}.@{fa-css-prefix}-commenting:before { content: @fa-var-comment-dots; } - -.@{fa-css-prefix}.@{fa-css-prefix}-commenting-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-commenting-o:before { content: @fa-var-comment-dots; } - -.@{fa-css-prefix}.@{fa-css-prefix}-houzz { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-vimeo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo-v; } - -.@{fa-css-prefix}.@{fa-css-prefix}-black-tie { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-fonticons { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-reddit-alien { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-edge { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card; } - -.@{fa-css-prefix}.@{fa-css-prefix}-codiepie { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-modx { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-fort-awesome { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-usb { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-product-hunt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-mixcloud { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-scribd { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-pause-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle; } - -.@{fa-css-prefix}.@{fa-css-prefix}-stop-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle; } - -.@{fa-css-prefix}.@{fa-css-prefix}-bluetooth { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-bluetooth-b { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-gitlab { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-wpbeginner { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-wpforms { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-envira { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-wheelchair-alt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-accessible-icon; } - -.@{fa-css-prefix}.@{fa-css-prefix}-question-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle; } - -.@{fa-css-prefix}.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-phone-volume; } - -.@{fa-css-prefix}.@{fa-css-prefix}-asl-interpreting:before { content: @fa-var-american-sign-language-interpreting; } - -.@{fa-css-prefix}.@{fa-css-prefix}-deafness:before { content: @fa-var-deaf; } - -.@{fa-css-prefix}.@{fa-css-prefix}-hard-of-hearing:before { content: @fa-var-deaf; } - -.@{fa-css-prefix}.@{fa-css-prefix}-glide { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-glide-g { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-signing:before { content: @fa-var-sign-language; } - -.@{fa-css-prefix}.@{fa-css-prefix}-viadeo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-viadeo-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-snapchat { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-snapchat-ghost { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-snapchat-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-pied-piper { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-first-order { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-yoast { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-themeisle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-google-plus-official { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus; } - -.@{fa-css-prefix}.@{fa-css-prefix}-google-plus-circle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-google-plus-circle:before { content: @fa-var-google-plus; } - -.@{fa-css-prefix}.@{fa-css-prefix}-font-awesome { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-fa { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-fa:before { content: @fa-var-font-awesome; } - -.@{fa-css-prefix}.@{fa-css-prefix}-handshake-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake; } - -.@{fa-css-prefix}.@{fa-css-prefix}-envelope-open-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open; } - -.@{fa-css-prefix}.@{fa-css-prefix}-linode { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-address-book-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book; } - -.@{fa-css-prefix}.@{fa-css-prefix}-vcard:before { content: @fa-var-address-card; } - -.@{fa-css-prefix}.@{fa-css-prefix}-address-card-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card; } - -.@{fa-css-prefix}.@{fa-css-prefix}-vcard-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-vcard-o:before { content: @fa-var-address-card; } - -.@{fa-css-prefix}.@{fa-css-prefix}-user-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle; } - -.@{fa-css-prefix}.@{fa-css-prefix}-user-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-user-o:before { content: @fa-var-user; } - -.@{fa-css-prefix}.@{fa-css-prefix}-id-badge { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-drivers-license:before { content: @fa-var-id-card; } - -.@{fa-css-prefix}.@{fa-css-prefix}-id-card-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card; } - -.@{fa-css-prefix}.@{fa-css-prefix}-drivers-license-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-drivers-license-o:before { content: @fa-var-id-card; } - -.@{fa-css-prefix}.@{fa-css-prefix}-quora { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-free-code-camp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-telegram { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-thermometer-4:before { content: @fa-var-thermometer-full; } - -.@{fa-css-prefix}.@{fa-css-prefix}-thermometer:before { content: @fa-var-thermometer-full; } - -.@{fa-css-prefix}.@{fa-css-prefix}-thermometer-3:before { content: @fa-var-thermometer-three-quarters; } - -.@{fa-css-prefix}.@{fa-css-prefix}-thermometer-2:before { content: @fa-var-thermometer-half; } - -.@{fa-css-prefix}.@{fa-css-prefix}-thermometer-1:before { content: @fa-var-thermometer-quarter; } - -.@{fa-css-prefix}.@{fa-css-prefix}-thermometer-0:before { content: @fa-var-thermometer-empty; } - -.@{fa-css-prefix}.@{fa-css-prefix}-bathtub:before { content: @fa-var-bath; } - -.@{fa-css-prefix}.@{fa-css-prefix}-s15:before { content: @fa-var-bath; } - -.@{fa-css-prefix}.@{fa-css-prefix}-window-maximize { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-window-restore { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-times-rectangle:before { content: @fa-var-window-close; } - -.@{fa-css-prefix}.@{fa-css-prefix}-window-close-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close; } - -.@{fa-css-prefix}.@{fa-css-prefix}-times-rectangle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-times-rectangle-o:before { content: @fa-var-window-close; } - -.@{fa-css-prefix}.@{fa-css-prefix}-bandcamp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-grav { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-etsy { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-imdb { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-ravelry { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-eercast { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-eercast:before { content: @fa-var-sellcast; } - -.@{fa-css-prefix}.@{fa-css-prefix}-snowflake-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; -} -.@{fa-css-prefix}.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake; } - -.@{fa-css-prefix}.@{fa-css-prefix}-superpowers { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-wpexplorer { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - -.@{fa-css-prefix}.@{fa-css-prefix}-spotify { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; -} - diff --git a/application/client/src/app/ui/styles/fontawesome/less/_stacked.less b/application/client/src/app/ui/styles/fontawesome/less/_stacked.less deleted file mode 100644 index 263b5c44fc..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_stacked.less +++ /dev/null @@ -1,22 +0,0 @@ -// Stacked Icons -// ------------------------- - -.@{fa-css-prefix}-stack { - display: inline-block; - height: 2em; - line-height: 2em; - position: relative; - vertical-align: middle; - width: 2em; -} - -.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { - left: 0; - position: absolute; - text-align: center; - width: 100%; -} - -.@{fa-css-prefix}-stack-1x { line-height: inherit; } -.@{fa-css-prefix}-stack-2x { font-size: 2em; } -.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/application/client/src/app/ui/styles/fontawesome/less/_variables.less b/application/client/src/app/ui/styles/fontawesome/less/_variables.less deleted file mode 100644 index 4726cc95bc..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/_variables.less +++ /dev/null @@ -1,1342 +0,0 @@ -// Variables -// -------------------------- - -@fa-font-path: "../webfonts"; -@fa-font-size-base: 16px; -@fa-line-height-base: 1; -@fa-css-prefix: fa; -@fa-version: "5.6.3"; -@fa-border-color: #eee; -@fa-inverse: #fff; -@fa-li-width: 2em; - -@fa-var-500px: "\f26e"; -@fa-var-accessible-icon: "\f368"; -@fa-var-accusoft: "\f369"; -@fa-var-acquisitions-incorporated: "\f6af"; -@fa-var-ad: "\f641"; -@fa-var-address-book: "\f2b9"; -@fa-var-address-card: "\f2bb"; -@fa-var-adjust: "\f042"; -@fa-var-adn: "\f170"; -@fa-var-adobe: "\f778"; -@fa-var-adversal: "\f36a"; -@fa-var-affiliatetheme: "\f36b"; -@fa-var-air-freshener: "\f5d0"; -@fa-var-algolia: "\f36c"; -@fa-var-align-center: "\f037"; -@fa-var-align-justify: "\f039"; -@fa-var-align-left: "\f036"; -@fa-var-align-right: "\f038"; -@fa-var-alipay: "\f642"; -@fa-var-allergies: "\f461"; -@fa-var-amazon: "\f270"; -@fa-var-amazon-pay: "\f42c"; -@fa-var-ambulance: "\f0f9"; -@fa-var-american-sign-language-interpreting: "\f2a3"; -@fa-var-amilia: "\f36d"; -@fa-var-anchor: "\f13d"; -@fa-var-android: "\f17b"; -@fa-var-angellist: "\f209"; -@fa-var-angle-double-down: "\f103"; -@fa-var-angle-double-left: "\f100"; -@fa-var-angle-double-right: "\f101"; -@fa-var-angle-double-up: "\f102"; -@fa-var-angle-down: "\f107"; -@fa-var-angle-left: "\f104"; -@fa-var-angle-right: "\f105"; -@fa-var-angle-up: "\f106"; -@fa-var-angry: "\f556"; -@fa-var-angrycreative: "\f36e"; -@fa-var-angular: "\f420"; -@fa-var-ankh: "\f644"; -@fa-var-app-store: "\f36f"; -@fa-var-app-store-ios: "\f370"; -@fa-var-apper: "\f371"; -@fa-var-apple: "\f179"; -@fa-var-apple-alt: "\f5d1"; -@fa-var-apple-pay: "\f415"; -@fa-var-archive: "\f187"; -@fa-var-archway: "\f557"; -@fa-var-arrow-alt-circle-down: "\f358"; -@fa-var-arrow-alt-circle-left: "\f359"; -@fa-var-arrow-alt-circle-right: "\f35a"; -@fa-var-arrow-alt-circle-up: "\f35b"; -@fa-var-arrow-circle-down: "\f0ab"; -@fa-var-arrow-circle-left: "\f0a8"; -@fa-var-arrow-circle-right: "\f0a9"; -@fa-var-arrow-circle-up: "\f0aa"; -@fa-var-arrow-down: "\f063"; -@fa-var-arrow-left: "\f060"; -@fa-var-arrow-right: "\f061"; -@fa-var-arrow-up: "\f062"; -@fa-var-arrows-alt: "\f0b2"; -@fa-var-arrows-alt-h: "\f337"; -@fa-var-arrows-alt-v: "\f338"; -@fa-var-artstation: "\f77a"; -@fa-var-assistive-listening-systems: "\f2a2"; -@fa-var-asterisk: "\f069"; -@fa-var-asymmetrik: "\f372"; -@fa-var-at: "\f1fa"; -@fa-var-atlas: "\f558"; -@fa-var-atlassian: "\f77b"; -@fa-var-atom: "\f5d2"; -@fa-var-audible: "\f373"; -@fa-var-audio-description: "\f29e"; -@fa-var-autoprefixer: "\f41c"; -@fa-var-avianex: "\f374"; -@fa-var-aviato: "\f421"; -@fa-var-award: "\f559"; -@fa-var-aws: "\f375"; -@fa-var-baby: "\f77c"; -@fa-var-baby-carriage: "\f77d"; -@fa-var-backspace: "\f55a"; -@fa-var-backward: "\f04a"; -@fa-var-balance-scale: "\f24e"; -@fa-var-ban: "\f05e"; -@fa-var-band-aid: "\f462"; -@fa-var-bandcamp: "\f2d5"; -@fa-var-barcode: "\f02a"; -@fa-var-bars: "\f0c9"; -@fa-var-baseball-ball: "\f433"; -@fa-var-basketball-ball: "\f434"; -@fa-var-bath: "\f2cd"; -@fa-var-battery-empty: "\f244"; -@fa-var-battery-full: "\f240"; -@fa-var-battery-half: "\f242"; -@fa-var-battery-quarter: "\f243"; -@fa-var-battery-three-quarters: "\f241"; -@fa-var-bed: "\f236"; -@fa-var-beer: "\f0fc"; -@fa-var-behance: "\f1b4"; -@fa-var-behance-square: "\f1b5"; -@fa-var-bell: "\f0f3"; -@fa-var-bell-slash: "\f1f6"; -@fa-var-bezier-curve: "\f55b"; -@fa-var-bible: "\f647"; -@fa-var-bicycle: "\f206"; -@fa-var-bimobject: "\f378"; -@fa-var-binoculars: "\f1e5"; -@fa-var-biohazard: "\f780"; -@fa-var-birthday-cake: "\f1fd"; -@fa-var-bitbucket: "\f171"; -@fa-var-bitcoin: "\f379"; -@fa-var-bity: "\f37a"; -@fa-var-black-tie: "\f27e"; -@fa-var-blackberry: "\f37b"; -@fa-var-blender: "\f517"; -@fa-var-blender-phone: "\f6b6"; -@fa-var-blind: "\f29d"; -@fa-var-blog: "\f781"; -@fa-var-blogger: "\f37c"; -@fa-var-blogger-b: "\f37d"; -@fa-var-bluetooth: "\f293"; -@fa-var-bluetooth-b: "\f294"; -@fa-var-bold: "\f032"; -@fa-var-bolt: "\f0e7"; -@fa-var-bomb: "\f1e2"; -@fa-var-bone: "\f5d7"; -@fa-var-bong: "\f55c"; -@fa-var-book: "\f02d"; -@fa-var-book-dead: "\f6b7"; -@fa-var-book-open: "\f518"; -@fa-var-book-reader: "\f5da"; -@fa-var-bookmark: "\f02e"; -@fa-var-bowling-ball: "\f436"; -@fa-var-box: "\f466"; -@fa-var-box-open: "\f49e"; -@fa-var-boxes: "\f468"; -@fa-var-braille: "\f2a1"; -@fa-var-brain: "\f5dc"; -@fa-var-briefcase: "\f0b1"; -@fa-var-briefcase-medical: "\f469"; -@fa-var-broadcast-tower: "\f519"; -@fa-var-broom: "\f51a"; -@fa-var-brush: "\f55d"; -@fa-var-btc: "\f15a"; -@fa-var-bug: "\f188"; -@fa-var-building: "\f1ad"; -@fa-var-bullhorn: "\f0a1"; -@fa-var-bullseye: "\f140"; -@fa-var-burn: "\f46a"; -@fa-var-buromobelexperte: "\f37f"; -@fa-var-bus: "\f207"; -@fa-var-bus-alt: "\f55e"; -@fa-var-business-time: "\f64a"; -@fa-var-buysellads: "\f20d"; -@fa-var-calculator: "\f1ec"; -@fa-var-calendar: "\f133"; -@fa-var-calendar-alt: "\f073"; -@fa-var-calendar-check: "\f274"; -@fa-var-calendar-day: "\f783"; -@fa-var-calendar-minus: "\f272"; -@fa-var-calendar-plus: "\f271"; -@fa-var-calendar-times: "\f273"; -@fa-var-calendar-week: "\f784"; -@fa-var-camera: "\f030"; -@fa-var-camera-retro: "\f083"; -@fa-var-campground: "\f6bb"; -@fa-var-canadian-maple-leaf: "\f785"; -@fa-var-candy-cane: "\f786"; -@fa-var-cannabis: "\f55f"; -@fa-var-capsules: "\f46b"; -@fa-var-car: "\f1b9"; -@fa-var-car-alt: "\f5de"; -@fa-var-car-battery: "\f5df"; -@fa-var-car-crash: "\f5e1"; -@fa-var-car-side: "\f5e4"; -@fa-var-caret-down: "\f0d7"; -@fa-var-caret-left: "\f0d9"; -@fa-var-caret-right: "\f0da"; -@fa-var-caret-square-down: "\f150"; -@fa-var-caret-square-left: "\f191"; -@fa-var-caret-square-right: "\f152"; -@fa-var-caret-square-up: "\f151"; -@fa-var-caret-up: "\f0d8"; -@fa-var-carrot: "\f787"; -@fa-var-cart-arrow-down: "\f218"; -@fa-var-cart-plus: "\f217"; -@fa-var-cash-register: "\f788"; -@fa-var-cat: "\f6be"; -@fa-var-cc-amazon-pay: "\f42d"; -@fa-var-cc-amex: "\f1f3"; -@fa-var-cc-apple-pay: "\f416"; -@fa-var-cc-diners-club: "\f24c"; -@fa-var-cc-discover: "\f1f2"; -@fa-var-cc-jcb: "\f24b"; -@fa-var-cc-mastercard: "\f1f1"; -@fa-var-cc-paypal: "\f1f4"; -@fa-var-cc-stripe: "\f1f5"; -@fa-var-cc-visa: "\f1f0"; -@fa-var-centercode: "\f380"; -@fa-var-centos: "\f789"; -@fa-var-certificate: "\f0a3"; -@fa-var-chair: "\f6c0"; -@fa-var-chalkboard: "\f51b"; -@fa-var-chalkboard-teacher: "\f51c"; -@fa-var-charging-station: "\f5e7"; -@fa-var-chart-area: "\f1fe"; -@fa-var-chart-bar: "\f080"; -@fa-var-chart-line: "\f201"; -@fa-var-chart-pie: "\f200"; -@fa-var-check: "\f00c"; -@fa-var-check-circle: "\f058"; -@fa-var-check-double: "\f560"; -@fa-var-check-square: "\f14a"; -@fa-var-chess: "\f439"; -@fa-var-chess-bishop: "\f43a"; -@fa-var-chess-board: "\f43c"; -@fa-var-chess-king: "\f43f"; -@fa-var-chess-knight: "\f441"; -@fa-var-chess-pawn: "\f443"; -@fa-var-chess-queen: "\f445"; -@fa-var-chess-rook: "\f447"; -@fa-var-chevron-circle-down: "\f13a"; -@fa-var-chevron-circle-left: "\f137"; -@fa-var-chevron-circle-right: "\f138"; -@fa-var-chevron-circle-up: "\f139"; -@fa-var-chevron-down: "\f078"; -@fa-var-chevron-left: "\f053"; -@fa-var-chevron-right: "\f054"; -@fa-var-chevron-up: "\f077"; -@fa-var-child: "\f1ae"; -@fa-var-chrome: "\f268"; -@fa-var-church: "\f51d"; -@fa-var-circle: "\f111"; -@fa-var-circle-notch: "\f1ce"; -@fa-var-city: "\f64f"; -@fa-var-clipboard: "\f328"; -@fa-var-clipboard-check: "\f46c"; -@fa-var-clipboard-list: "\f46d"; -@fa-var-clock: "\f017"; -@fa-var-clone: "\f24d"; -@fa-var-closed-captioning: "\f20a"; -@fa-var-cloud: "\f0c2"; -@fa-var-cloud-download-alt: "\f381"; -@fa-var-cloud-meatball: "\f73b"; -@fa-var-cloud-moon: "\f6c3"; -@fa-var-cloud-moon-rain: "\f73c"; -@fa-var-cloud-rain: "\f73d"; -@fa-var-cloud-showers-heavy: "\f740"; -@fa-var-cloud-sun: "\f6c4"; -@fa-var-cloud-sun-rain: "\f743"; -@fa-var-cloud-upload-alt: "\f382"; -@fa-var-cloudscale: "\f383"; -@fa-var-cloudsmith: "\f384"; -@fa-var-cloudversify: "\f385"; -@fa-var-cocktail: "\f561"; -@fa-var-code: "\f121"; -@fa-var-code-branch: "\f126"; -@fa-var-codepen: "\f1cb"; -@fa-var-codiepie: "\f284"; -@fa-var-coffee: "\f0f4"; -@fa-var-cog: "\f013"; -@fa-var-cogs: "\f085"; -@fa-var-coins: "\f51e"; -@fa-var-columns: "\f0db"; -@fa-var-comment: "\f075"; -@fa-var-comment-alt: "\f27a"; -@fa-var-comment-dollar: "\f651"; -@fa-var-comment-dots: "\f4ad"; -@fa-var-comment-slash: "\f4b3"; -@fa-var-comments: "\f086"; -@fa-var-comments-dollar: "\f653"; -@fa-var-compact-disc: "\f51f"; -@fa-var-compass: "\f14e"; -@fa-var-compress: "\f066"; -@fa-var-compress-arrows-alt: "\f78c"; -@fa-var-concierge-bell: "\f562"; -@fa-var-confluence: "\f78d"; -@fa-var-connectdevelop: "\f20e"; -@fa-var-contao: "\f26d"; -@fa-var-cookie: "\f563"; -@fa-var-cookie-bite: "\f564"; -@fa-var-copy: "\f0c5"; -@fa-var-copyright: "\f1f9"; -@fa-var-couch: "\f4b8"; -@fa-var-cpanel: "\f388"; -@fa-var-creative-commons: "\f25e"; -@fa-var-creative-commons-by: "\f4e7"; -@fa-var-creative-commons-nc: "\f4e8"; -@fa-var-creative-commons-nc-eu: "\f4e9"; -@fa-var-creative-commons-nc-jp: "\f4ea"; -@fa-var-creative-commons-nd: "\f4eb"; -@fa-var-creative-commons-pd: "\f4ec"; -@fa-var-creative-commons-pd-alt: "\f4ed"; -@fa-var-creative-commons-remix: "\f4ee"; -@fa-var-creative-commons-sa: "\f4ef"; -@fa-var-creative-commons-sampling: "\f4f0"; -@fa-var-creative-commons-sampling-plus: "\f4f1"; -@fa-var-creative-commons-share: "\f4f2"; -@fa-var-creative-commons-zero: "\f4f3"; -@fa-var-credit-card: "\f09d"; -@fa-var-critical-role: "\f6c9"; -@fa-var-crop: "\f125"; -@fa-var-crop-alt: "\f565"; -@fa-var-cross: "\f654"; -@fa-var-crosshairs: "\f05b"; -@fa-var-crow: "\f520"; -@fa-var-crown: "\f521"; -@fa-var-css3: "\f13c"; -@fa-var-css3-alt: "\f38b"; -@fa-var-cube: "\f1b2"; -@fa-var-cubes: "\f1b3"; -@fa-var-cut: "\f0c4"; -@fa-var-cuttlefish: "\f38c"; -@fa-var-d-and-d: "\f38d"; -@fa-var-d-and-d-beyond: "\f6ca"; -@fa-var-dashcube: "\f210"; -@fa-var-database: "\f1c0"; -@fa-var-deaf: "\f2a4"; -@fa-var-delicious: "\f1a5"; -@fa-var-democrat: "\f747"; -@fa-var-deploydog: "\f38e"; -@fa-var-deskpro: "\f38f"; -@fa-var-desktop: "\f108"; -@fa-var-dev: "\f6cc"; -@fa-var-deviantart: "\f1bd"; -@fa-var-dharmachakra: "\f655"; -@fa-var-dhl: "\f790"; -@fa-var-diagnoses: "\f470"; -@fa-var-diaspora: "\f791"; -@fa-var-dice: "\f522"; -@fa-var-dice-d20: "\f6cf"; -@fa-var-dice-d6: "\f6d1"; -@fa-var-dice-five: "\f523"; -@fa-var-dice-four: "\f524"; -@fa-var-dice-one: "\f525"; -@fa-var-dice-six: "\f526"; -@fa-var-dice-three: "\f527"; -@fa-var-dice-two: "\f528"; -@fa-var-digg: "\f1a6"; -@fa-var-digital-ocean: "\f391"; -@fa-var-digital-tachograph: "\f566"; -@fa-var-directions: "\f5eb"; -@fa-var-discord: "\f392"; -@fa-var-discourse: "\f393"; -@fa-var-divide: "\f529"; -@fa-var-dizzy: "\f567"; -@fa-var-dna: "\f471"; -@fa-var-dochub: "\f394"; -@fa-var-docker: "\f395"; -@fa-var-dog: "\f6d3"; -@fa-var-dollar-sign: "\f155"; -@fa-var-dolly: "\f472"; -@fa-var-dolly-flatbed: "\f474"; -@fa-var-donate: "\f4b9"; -@fa-var-door-closed: "\f52a"; -@fa-var-door-open: "\f52b"; -@fa-var-dot-circle: "\f192"; -@fa-var-dove: "\f4ba"; -@fa-var-download: "\f019"; -@fa-var-draft2digital: "\f396"; -@fa-var-drafting-compass: "\f568"; -@fa-var-dragon: "\f6d5"; -@fa-var-draw-polygon: "\f5ee"; -@fa-var-dribbble: "\f17d"; -@fa-var-dribbble-square: "\f397"; -@fa-var-dropbox: "\f16b"; -@fa-var-drum: "\f569"; -@fa-var-drum-steelpan: "\f56a"; -@fa-var-drumstick-bite: "\f6d7"; -@fa-var-drupal: "\f1a9"; -@fa-var-dumbbell: "\f44b"; -@fa-var-dumpster: "\f793"; -@fa-var-dumpster-fire: "\f794"; -@fa-var-dungeon: "\f6d9"; -@fa-var-dyalog: "\f399"; -@fa-var-earlybirds: "\f39a"; -@fa-var-ebay: "\f4f4"; -@fa-var-edge: "\f282"; -@fa-var-edit: "\f044"; -@fa-var-eject: "\f052"; -@fa-var-elementor: "\f430"; -@fa-var-ellipsis-h: "\f141"; -@fa-var-ellipsis-v: "\f142"; -@fa-var-ello: "\f5f1"; -@fa-var-ember: "\f423"; -@fa-var-empire: "\f1d1"; -@fa-var-envelope: "\f0e0"; -@fa-var-envelope-open: "\f2b6"; -@fa-var-envelope-open-text: "\f658"; -@fa-var-envelope-square: "\f199"; -@fa-var-envira: "\f299"; -@fa-var-equals: "\f52c"; -@fa-var-eraser: "\f12d"; -@fa-var-erlang: "\f39d"; -@fa-var-ethereum: "\f42e"; -@fa-var-ethernet: "\f796"; -@fa-var-etsy: "\f2d7"; -@fa-var-euro-sign: "\f153"; -@fa-var-exchange-alt: "\f362"; -@fa-var-exclamation: "\f12a"; -@fa-var-exclamation-circle: "\f06a"; -@fa-var-exclamation-triangle: "\f071"; -@fa-var-expand: "\f065"; -@fa-var-expand-arrows-alt: "\f31e"; -@fa-var-expeditedssl: "\f23e"; -@fa-var-external-link-alt: "\f35d"; -@fa-var-external-link-square-alt: "\f360"; -@fa-var-eye: "\f06e"; -@fa-var-eye-dropper: "\f1fb"; -@fa-var-eye-slash: "\f070"; -@fa-var-facebook: "\f09a"; -@fa-var-facebook-f: "\f39e"; -@fa-var-facebook-messenger: "\f39f"; -@fa-var-facebook-square: "\f082"; -@fa-var-fantasy-flight-games: "\f6dc"; -@fa-var-fast-backward: "\f049"; -@fa-var-fast-forward: "\f050"; -@fa-var-fax: "\f1ac"; -@fa-var-feather: "\f52d"; -@fa-var-feather-alt: "\f56b"; -@fa-var-fedex: "\f797"; -@fa-var-fedora: "\f798"; -@fa-var-female: "\f182"; -@fa-var-fighter-jet: "\f0fb"; -@fa-var-figma: "\f799"; -@fa-var-file: "\f15b"; -@fa-var-file-alt: "\f15c"; -@fa-var-file-archive: "\f1c6"; -@fa-var-file-audio: "\f1c7"; -@fa-var-file-code: "\f1c9"; -@fa-var-file-contract: "\f56c"; -@fa-var-file-csv: "\f6dd"; -@fa-var-file-download: "\f56d"; -@fa-var-file-excel: "\f1c3"; -@fa-var-file-export: "\f56e"; -@fa-var-file-image: "\f1c5"; -@fa-var-file-import: "\f56f"; -@fa-var-file-invoice: "\f570"; -@fa-var-file-invoice-dollar: "\f571"; -@fa-var-file-medical: "\f477"; -@fa-var-file-medical-alt: "\f478"; -@fa-var-file-pdf: "\f1c1"; -@fa-var-file-powerpoint: "\f1c4"; -@fa-var-file-prescription: "\f572"; -@fa-var-file-signature: "\f573"; -@fa-var-file-upload: "\f574"; -@fa-var-file-video: "\f1c8"; -@fa-var-file-word: "\f1c2"; -@fa-var-fill: "\f575"; -@fa-var-fill-drip: "\f576"; -@fa-var-film: "\f008"; -@fa-var-filter: "\f0b0"; -@fa-var-fingerprint: "\f577"; -@fa-var-fire: "\f06d"; -@fa-var-fire-alt: "\f7e4"; -@fa-var-fire-extinguisher: "\f134"; -@fa-var-firefox: "\f269"; -@fa-var-first-aid: "\f479"; -@fa-var-first-order: "\f2b0"; -@fa-var-first-order-alt: "\f50a"; -@fa-var-firstdraft: "\f3a1"; -@fa-var-fish: "\f578"; -@fa-var-fist-raised: "\f6de"; -@fa-var-flag: "\f024"; -@fa-var-flag-checkered: "\f11e"; -@fa-var-flag-usa: "\f74d"; -@fa-var-flask: "\f0c3"; -@fa-var-flickr: "\f16e"; -@fa-var-flipboard: "\f44d"; -@fa-var-flushed: "\f579"; -@fa-var-fly: "\f417"; -@fa-var-folder: "\f07b"; -@fa-var-folder-minus: "\f65d"; -@fa-var-folder-open: "\f07c"; -@fa-var-folder-plus: "\f65e"; -@fa-var-font: "\f031"; -@fa-var-font-awesome: "\f2b4"; -@fa-var-font-awesome-alt: "\f35c"; -@fa-var-font-awesome-flag: "\f425"; -@fa-var-font-awesome-logo-full: "\f4e6"; -@fa-var-fonticons: "\f280"; -@fa-var-fonticons-fi: "\f3a2"; -@fa-var-football-ball: "\f44e"; -@fa-var-fort-awesome: "\f286"; -@fa-var-fort-awesome-alt: "\f3a3"; -@fa-var-forumbee: "\f211"; -@fa-var-forward: "\f04e"; -@fa-var-foursquare: "\f180"; -@fa-var-free-code-camp: "\f2c5"; -@fa-var-freebsd: "\f3a4"; -@fa-var-frog: "\f52e"; -@fa-var-frown: "\f119"; -@fa-var-frown-open: "\f57a"; -@fa-var-fulcrum: "\f50b"; -@fa-var-funnel-dollar: "\f662"; -@fa-var-futbol: "\f1e3"; -@fa-var-galactic-republic: "\f50c"; -@fa-var-galactic-senate: "\f50d"; -@fa-var-gamepad: "\f11b"; -@fa-var-gas-pump: "\f52f"; -@fa-var-gavel: "\f0e3"; -@fa-var-gem: "\f3a5"; -@fa-var-genderless: "\f22d"; -@fa-var-get-pocket: "\f265"; -@fa-var-gg: "\f260"; -@fa-var-gg-circle: "\f261"; -@fa-var-ghost: "\f6e2"; -@fa-var-gift: "\f06b"; -@fa-var-gifts: "\f79c"; -@fa-var-git: "\f1d3"; -@fa-var-git-square: "\f1d2"; -@fa-var-github: "\f09b"; -@fa-var-github-alt: "\f113"; -@fa-var-github-square: "\f092"; -@fa-var-gitkraken: "\f3a6"; -@fa-var-gitlab: "\f296"; -@fa-var-gitter: "\f426"; -@fa-var-glass-cheers: "\f79f"; -@fa-var-glass-martini: "\f000"; -@fa-var-glass-martini-alt: "\f57b"; -@fa-var-glass-whiskey: "\f7a0"; -@fa-var-glasses: "\f530"; -@fa-var-glide: "\f2a5"; -@fa-var-glide-g: "\f2a6"; -@fa-var-globe: "\f0ac"; -@fa-var-globe-africa: "\f57c"; -@fa-var-globe-americas: "\f57d"; -@fa-var-globe-asia: "\f57e"; -@fa-var-globe-europe: "\f7a2"; -@fa-var-gofore: "\f3a7"; -@fa-var-golf-ball: "\f450"; -@fa-var-goodreads: "\f3a8"; -@fa-var-goodreads-g: "\f3a9"; -@fa-var-google: "\f1a0"; -@fa-var-google-drive: "\f3aa"; -@fa-var-google-play: "\f3ab"; -@fa-var-google-plus: "\f2b3"; -@fa-var-google-plus-g: "\f0d5"; -@fa-var-google-plus-square: "\f0d4"; -@fa-var-google-wallet: "\f1ee"; -@fa-var-gopuram: "\f664"; -@fa-var-graduation-cap: "\f19d"; -@fa-var-gratipay: "\f184"; -@fa-var-grav: "\f2d6"; -@fa-var-greater-than: "\f531"; -@fa-var-greater-than-equal: "\f532"; -@fa-var-grimace: "\f57f"; -@fa-var-grin: "\f580"; -@fa-var-grin-alt: "\f581"; -@fa-var-grin-beam: "\f582"; -@fa-var-grin-beam-sweat: "\f583"; -@fa-var-grin-hearts: "\f584"; -@fa-var-grin-squint: "\f585"; -@fa-var-grin-squint-tears: "\f586"; -@fa-var-grin-stars: "\f587"; -@fa-var-grin-tears: "\f588"; -@fa-var-grin-tongue: "\f589"; -@fa-var-grin-tongue-squint: "\f58a"; -@fa-var-grin-tongue-wink: "\f58b"; -@fa-var-grin-wink: "\f58c"; -@fa-var-grip-horizontal: "\f58d"; -@fa-var-grip-lines: "\f7a4"; -@fa-var-grip-lines-vertical: "\f7a5"; -@fa-var-grip-vertical: "\f58e"; -@fa-var-gripfire: "\f3ac"; -@fa-var-grunt: "\f3ad"; -@fa-var-guitar: "\f7a6"; -@fa-var-gulp: "\f3ae"; -@fa-var-h-square: "\f0fd"; -@fa-var-hacker-news: "\f1d4"; -@fa-var-hacker-news-square: "\f3af"; -@fa-var-hackerrank: "\f5f7"; -@fa-var-hammer: "\f6e3"; -@fa-var-hamsa: "\f665"; -@fa-var-hand-holding: "\f4bd"; -@fa-var-hand-holding-heart: "\f4be"; -@fa-var-hand-holding-usd: "\f4c0"; -@fa-var-hand-lizard: "\f258"; -@fa-var-hand-paper: "\f256"; -@fa-var-hand-peace: "\f25b"; -@fa-var-hand-point-down: "\f0a7"; -@fa-var-hand-point-left: "\f0a5"; -@fa-var-hand-point-right: "\f0a4"; -@fa-var-hand-point-up: "\f0a6"; -@fa-var-hand-pointer: "\f25a"; -@fa-var-hand-rock: "\f255"; -@fa-var-hand-scissors: "\f257"; -@fa-var-hand-spock: "\f259"; -@fa-var-hands: "\f4c2"; -@fa-var-hands-helping: "\f4c4"; -@fa-var-handshake: "\f2b5"; -@fa-var-hanukiah: "\f6e6"; -@fa-var-hashtag: "\f292"; -@fa-var-hat-wizard: "\f6e8"; -@fa-var-haykal: "\f666"; -@fa-var-hdd: "\f0a0"; -@fa-var-heading: "\f1dc"; -@fa-var-headphones: "\f025"; -@fa-var-headphones-alt: "\f58f"; -@fa-var-headset: "\f590"; -@fa-var-heart: "\f004"; -@fa-var-heart-broken: "\f7a9"; -@fa-var-heartbeat: "\f21e"; -@fa-var-helicopter: "\f533"; -@fa-var-highlighter: "\f591"; -@fa-var-hiking: "\f6ec"; -@fa-var-hippo: "\f6ed"; -@fa-var-hips: "\f452"; -@fa-var-hire-a-helper: "\f3b0"; -@fa-var-history: "\f1da"; -@fa-var-hockey-puck: "\f453"; -@fa-var-holly-berry: "\f7aa"; -@fa-var-home: "\f015"; -@fa-var-hooli: "\f427"; -@fa-var-hornbill: "\f592"; -@fa-var-horse: "\f6f0"; -@fa-var-horse-head: "\f7ab"; -@fa-var-hospital: "\f0f8"; -@fa-var-hospital-alt: "\f47d"; -@fa-var-hospital-symbol: "\f47e"; -@fa-var-hot-tub: "\f593"; -@fa-var-hotel: "\f594"; -@fa-var-hotjar: "\f3b1"; -@fa-var-hourglass: "\f254"; -@fa-var-hourglass-end: "\f253"; -@fa-var-hourglass-half: "\f252"; -@fa-var-hourglass-start: "\f251"; -@fa-var-house-damage: "\f6f1"; -@fa-var-houzz: "\f27c"; -@fa-var-hryvnia: "\f6f2"; -@fa-var-html5: "\f13b"; -@fa-var-hubspot: "\f3b2"; -@fa-var-i-cursor: "\f246"; -@fa-var-icicles: "\f7ad"; -@fa-var-id-badge: "\f2c1"; -@fa-var-id-card: "\f2c2"; -@fa-var-id-card-alt: "\f47f"; -@fa-var-igloo: "\f7ae"; -@fa-var-image: "\f03e"; -@fa-var-images: "\f302"; -@fa-var-imdb: "\f2d8"; -@fa-var-inbox: "\f01c"; -@fa-var-indent: "\f03c"; -@fa-var-industry: "\f275"; -@fa-var-infinity: "\f534"; -@fa-var-info: "\f129"; -@fa-var-info-circle: "\f05a"; -@fa-var-instagram: "\f16d"; -@fa-var-intercom: "\f7af"; -@fa-var-internet-explorer: "\f26b"; -@fa-var-invision: "\f7b0"; -@fa-var-ioxhost: "\f208"; -@fa-var-italic: "\f033"; -@fa-var-itunes: "\f3b4"; -@fa-var-itunes-note: "\f3b5"; -@fa-var-java: "\f4e4"; -@fa-var-jedi: "\f669"; -@fa-var-jedi-order: "\f50e"; -@fa-var-jenkins: "\f3b6"; -@fa-var-jira: "\f7b1"; -@fa-var-joget: "\f3b7"; -@fa-var-joint: "\f595"; -@fa-var-joomla: "\f1aa"; -@fa-var-journal-whills: "\f66a"; -@fa-var-js: "\f3b8"; -@fa-var-js-square: "\f3b9"; -@fa-var-jsfiddle: "\f1cc"; -@fa-var-kaaba: "\f66b"; -@fa-var-kaggle: "\f5fa"; -@fa-var-key: "\f084"; -@fa-var-keybase: "\f4f5"; -@fa-var-keyboard: "\f11c"; -@fa-var-keycdn: "\f3ba"; -@fa-var-khanda: "\f66d"; -@fa-var-kickstarter: "\f3bb"; -@fa-var-kickstarter-k: "\f3bc"; -@fa-var-kiss: "\f596"; -@fa-var-kiss-beam: "\f597"; -@fa-var-kiss-wink-heart: "\f598"; -@fa-var-kiwi-bird: "\f535"; -@fa-var-korvue: "\f42f"; -@fa-var-landmark: "\f66f"; -@fa-var-language: "\f1ab"; -@fa-var-laptop: "\f109"; -@fa-var-laptop-code: "\f5fc"; -@fa-var-laravel: "\f3bd"; -@fa-var-lastfm: "\f202"; -@fa-var-lastfm-square: "\f203"; -@fa-var-laugh: "\f599"; -@fa-var-laugh-beam: "\f59a"; -@fa-var-laugh-squint: "\f59b"; -@fa-var-laugh-wink: "\f59c"; -@fa-var-layer-group: "\f5fd"; -@fa-var-leaf: "\f06c"; -@fa-var-leanpub: "\f212"; -@fa-var-lemon: "\f094"; -@fa-var-less: "\f41d"; -@fa-var-less-than: "\f536"; -@fa-var-less-than-equal: "\f537"; -@fa-var-level-down-alt: "\f3be"; -@fa-var-level-up-alt: "\f3bf"; -@fa-var-life-ring: "\f1cd"; -@fa-var-lightbulb: "\f0eb"; -@fa-var-line: "\f3c0"; -@fa-var-link: "\f0c1"; -@fa-var-linkedin: "\f08c"; -@fa-var-linkedin-in: "\f0e1"; -@fa-var-linode: "\f2b8"; -@fa-var-linux: "\f17c"; -@fa-var-lira-sign: "\f195"; -@fa-var-list: "\f03a"; -@fa-var-list-alt: "\f022"; -@fa-var-list-ol: "\f0cb"; -@fa-var-list-ul: "\f0ca"; -@fa-var-location-arrow: "\f124"; -@fa-var-lock: "\f023"; -@fa-var-lock-open: "\f3c1"; -@fa-var-long-arrow-alt-down: "\f309"; -@fa-var-long-arrow-alt-left: "\f30a"; -@fa-var-long-arrow-alt-right: "\f30b"; -@fa-var-long-arrow-alt-up: "\f30c"; -@fa-var-low-vision: "\f2a8"; -@fa-var-luggage-cart: "\f59d"; -@fa-var-lyft: "\f3c3"; -@fa-var-magento: "\f3c4"; -@fa-var-magic: "\f0d0"; -@fa-var-magnet: "\f076"; -@fa-var-mail-bulk: "\f674"; -@fa-var-mailchimp: "\f59e"; -@fa-var-male: "\f183"; -@fa-var-mandalorian: "\f50f"; -@fa-var-map: "\f279"; -@fa-var-map-marked: "\f59f"; -@fa-var-map-marked-alt: "\f5a0"; -@fa-var-map-marker: "\f041"; -@fa-var-map-marker-alt: "\f3c5"; -@fa-var-map-pin: "\f276"; -@fa-var-map-signs: "\f277"; -@fa-var-markdown: "\f60f"; -@fa-var-marker: "\f5a1"; -@fa-var-mars: "\f222"; -@fa-var-mars-double: "\f227"; -@fa-var-mars-stroke: "\f229"; -@fa-var-mars-stroke-h: "\f22b"; -@fa-var-mars-stroke-v: "\f22a"; -@fa-var-mask: "\f6fa"; -@fa-var-mastodon: "\f4f6"; -@fa-var-maxcdn: "\f136"; -@fa-var-medal: "\f5a2"; -@fa-var-medapps: "\f3c6"; -@fa-var-medium: "\f23a"; -@fa-var-medium-m: "\f3c7"; -@fa-var-medkit: "\f0fa"; -@fa-var-medrt: "\f3c8"; -@fa-var-meetup: "\f2e0"; -@fa-var-megaport: "\f5a3"; -@fa-var-meh: "\f11a"; -@fa-var-meh-blank: "\f5a4"; -@fa-var-meh-rolling-eyes: "\f5a5"; -@fa-var-memory: "\f538"; -@fa-var-mendeley: "\f7b3"; -@fa-var-menorah: "\f676"; -@fa-var-mercury: "\f223"; -@fa-var-meteor: "\f753"; -@fa-var-microchip: "\f2db"; -@fa-var-microphone: "\f130"; -@fa-var-microphone-alt: "\f3c9"; -@fa-var-microphone-alt-slash: "\f539"; -@fa-var-microphone-slash: "\f131"; -@fa-var-microscope: "\f610"; -@fa-var-microsoft: "\f3ca"; -@fa-var-minus: "\f068"; -@fa-var-minus-circle: "\f056"; -@fa-var-minus-square: "\f146"; -@fa-var-mitten: "\f7b5"; -@fa-var-mix: "\f3cb"; -@fa-var-mixcloud: "\f289"; -@fa-var-mizuni: "\f3cc"; -@fa-var-mobile: "\f10b"; -@fa-var-mobile-alt: "\f3cd"; -@fa-var-modx: "\f285"; -@fa-var-monero: "\f3d0"; -@fa-var-money-bill: "\f0d6"; -@fa-var-money-bill-alt: "\f3d1"; -@fa-var-money-bill-wave: "\f53a"; -@fa-var-money-bill-wave-alt: "\f53b"; -@fa-var-money-check: "\f53c"; -@fa-var-money-check-alt: "\f53d"; -@fa-var-monument: "\f5a6"; -@fa-var-moon: "\f186"; -@fa-var-mortar-pestle: "\f5a7"; -@fa-var-mosque: "\f678"; -@fa-var-motorcycle: "\f21c"; -@fa-var-mountain: "\f6fc"; -@fa-var-mouse-pointer: "\f245"; -@fa-var-mug-hot: "\f7b6"; -@fa-var-music: "\f001"; -@fa-var-napster: "\f3d2"; -@fa-var-neos: "\f612"; -@fa-var-network-wired: "\f6ff"; -@fa-var-neuter: "\f22c"; -@fa-var-newspaper: "\f1ea"; -@fa-var-nimblr: "\f5a8"; -@fa-var-nintendo-switch: "\f418"; -@fa-var-node: "\f419"; -@fa-var-node-js: "\f3d3"; -@fa-var-not-equal: "\f53e"; -@fa-var-notes-medical: "\f481"; -@fa-var-npm: "\f3d4"; -@fa-var-ns8: "\f3d5"; -@fa-var-nutritionix: "\f3d6"; -@fa-var-object-group: "\f247"; -@fa-var-object-ungroup: "\f248"; -@fa-var-odnoklassniki: "\f263"; -@fa-var-odnoklassniki-square: "\f264"; -@fa-var-oil-can: "\f613"; -@fa-var-old-republic: "\f510"; -@fa-var-om: "\f679"; -@fa-var-opencart: "\f23d"; -@fa-var-openid: "\f19b"; -@fa-var-opera: "\f26a"; -@fa-var-optin-monster: "\f23c"; -@fa-var-osi: "\f41a"; -@fa-var-otter: "\f700"; -@fa-var-outdent: "\f03b"; -@fa-var-page4: "\f3d7"; -@fa-var-pagelines: "\f18c"; -@fa-var-paint-brush: "\f1fc"; -@fa-var-paint-roller: "\f5aa"; -@fa-var-palette: "\f53f"; -@fa-var-palfed: "\f3d8"; -@fa-var-pallet: "\f482"; -@fa-var-paper-plane: "\f1d8"; -@fa-var-paperclip: "\f0c6"; -@fa-var-parachute-box: "\f4cd"; -@fa-var-paragraph: "\f1dd"; -@fa-var-parking: "\f540"; -@fa-var-passport: "\f5ab"; -@fa-var-pastafarianism: "\f67b"; -@fa-var-paste: "\f0ea"; -@fa-var-patreon: "\f3d9"; -@fa-var-pause: "\f04c"; -@fa-var-pause-circle: "\f28b"; -@fa-var-paw: "\f1b0"; -@fa-var-paypal: "\f1ed"; -@fa-var-peace: "\f67c"; -@fa-var-pen: "\f304"; -@fa-var-pen-alt: "\f305"; -@fa-var-pen-fancy: "\f5ac"; -@fa-var-pen-nib: "\f5ad"; -@fa-var-pen-square: "\f14b"; -@fa-var-pencil-alt: "\f303"; -@fa-var-pencil-ruler: "\f5ae"; -@fa-var-penny-arcade: "\f704"; -@fa-var-people-carry: "\f4ce"; -@fa-var-percent: "\f295"; -@fa-var-percentage: "\f541"; -@fa-var-periscope: "\f3da"; -@fa-var-person-booth: "\f756"; -@fa-var-phabricator: "\f3db"; -@fa-var-phoenix-framework: "\f3dc"; -@fa-var-phoenix-squadron: "\f511"; -@fa-var-phone: "\f095"; -@fa-var-phone-slash: "\f3dd"; -@fa-var-phone-square: "\f098"; -@fa-var-phone-volume: "\f2a0"; -@fa-var-php: "\f457"; -@fa-var-pied-piper: "\f2ae"; -@fa-var-pied-piper-alt: "\f1a8"; -@fa-var-pied-piper-hat: "\f4e5"; -@fa-var-pied-piper-pp: "\f1a7"; -@fa-var-piggy-bank: "\f4d3"; -@fa-var-pills: "\f484"; -@fa-var-pinterest: "\f0d2"; -@fa-var-pinterest-p: "\f231"; -@fa-var-pinterest-square: "\f0d3"; -@fa-var-place-of-worship: "\f67f"; -@fa-var-plane: "\f072"; -@fa-var-plane-arrival: "\f5af"; -@fa-var-plane-departure: "\f5b0"; -@fa-var-play: "\f04b"; -@fa-var-play-circle: "\f144"; -@fa-var-playstation: "\f3df"; -@fa-var-plug: "\f1e6"; -@fa-var-plus: "\f067"; -@fa-var-plus-circle: "\f055"; -@fa-var-plus-square: "\f0fe"; -@fa-var-podcast: "\f2ce"; -@fa-var-poll: "\f681"; -@fa-var-poll-h: "\f682"; -@fa-var-poo: "\f2fe"; -@fa-var-poo-storm: "\f75a"; -@fa-var-poop: "\f619"; -@fa-var-portrait: "\f3e0"; -@fa-var-pound-sign: "\f154"; -@fa-var-power-off: "\f011"; -@fa-var-pray: "\f683"; -@fa-var-praying-hands: "\f684"; -@fa-var-prescription: "\f5b1"; -@fa-var-prescription-bottle: "\f485"; -@fa-var-prescription-bottle-alt: "\f486"; -@fa-var-print: "\f02f"; -@fa-var-procedures: "\f487"; -@fa-var-product-hunt: "\f288"; -@fa-var-project-diagram: "\f542"; -@fa-var-pushed: "\f3e1"; -@fa-var-puzzle-piece: "\f12e"; -@fa-var-python: "\f3e2"; -@fa-var-qq: "\f1d6"; -@fa-var-qrcode: "\f029"; -@fa-var-question: "\f128"; -@fa-var-question-circle: "\f059"; -@fa-var-quidditch: "\f458"; -@fa-var-quinscape: "\f459"; -@fa-var-quora: "\f2c4"; -@fa-var-quote-left: "\f10d"; -@fa-var-quote-right: "\f10e"; -@fa-var-quran: "\f687"; -@fa-var-r-project: "\f4f7"; -@fa-var-radiation: "\f7b9"; -@fa-var-radiation-alt: "\f7ba"; -@fa-var-rainbow: "\f75b"; -@fa-var-random: "\f074"; -@fa-var-raspberry-pi: "\f7bb"; -@fa-var-ravelry: "\f2d9"; -@fa-var-react: "\f41b"; -@fa-var-reacteurope: "\f75d"; -@fa-var-readme: "\f4d5"; -@fa-var-rebel: "\f1d0"; -@fa-var-receipt: "\f543"; -@fa-var-recycle: "\f1b8"; -@fa-var-red-river: "\f3e3"; -@fa-var-reddit: "\f1a1"; -@fa-var-reddit-alien: "\f281"; -@fa-var-reddit-square: "\f1a2"; -@fa-var-redhat: "\f7bc"; -@fa-var-redo: "\f01e"; -@fa-var-redo-alt: "\f2f9"; -@fa-var-registered: "\f25d"; -@fa-var-renren: "\f18b"; -@fa-var-reply: "\f3e5"; -@fa-var-reply-all: "\f122"; -@fa-var-replyd: "\f3e6"; -@fa-var-republican: "\f75e"; -@fa-var-researchgate: "\f4f8"; -@fa-var-resolving: "\f3e7"; -@fa-var-restroom: "\f7bd"; -@fa-var-retweet: "\f079"; -@fa-var-rev: "\f5b2"; -@fa-var-ribbon: "\f4d6"; -@fa-var-ring: "\f70b"; -@fa-var-road: "\f018"; -@fa-var-robot: "\f544"; -@fa-var-rocket: "\f135"; -@fa-var-rocketchat: "\f3e8"; -@fa-var-rockrms: "\f3e9"; -@fa-var-route: "\f4d7"; -@fa-var-rss: "\f09e"; -@fa-var-rss-square: "\f143"; -@fa-var-ruble-sign: "\f158"; -@fa-var-ruler: "\f545"; -@fa-var-ruler-combined: "\f546"; -@fa-var-ruler-horizontal: "\f547"; -@fa-var-ruler-vertical: "\f548"; -@fa-var-running: "\f70c"; -@fa-var-rupee-sign: "\f156"; -@fa-var-sad-cry: "\f5b3"; -@fa-var-sad-tear: "\f5b4"; -@fa-var-safari: "\f267"; -@fa-var-sass: "\f41e"; -@fa-var-satellite: "\f7bf"; -@fa-var-satellite-dish: "\f7c0"; -@fa-var-save: "\f0c7"; -@fa-var-schlix: "\f3ea"; -@fa-var-school: "\f549"; -@fa-var-screwdriver: "\f54a"; -@fa-var-scribd: "\f28a"; -@fa-var-scroll: "\f70e"; -@fa-var-sd-card: "\f7c2"; -@fa-var-search: "\f002"; -@fa-var-search-dollar: "\f688"; -@fa-var-search-location: "\f689"; -@fa-var-search-minus: "\f010"; -@fa-var-search-plus: "\f00e"; -@fa-var-searchengin: "\f3eb"; -@fa-var-seedling: "\f4d8"; -@fa-var-sellcast: "\f2da"; -@fa-var-sellsy: "\f213"; -@fa-var-server: "\f233"; -@fa-var-servicestack: "\f3ec"; -@fa-var-shapes: "\f61f"; -@fa-var-share: "\f064"; -@fa-var-share-alt: "\f1e0"; -@fa-var-share-alt-square: "\f1e1"; -@fa-var-share-square: "\f14d"; -@fa-var-shekel-sign: "\f20b"; -@fa-var-shield-alt: "\f3ed"; -@fa-var-ship: "\f21a"; -@fa-var-shipping-fast: "\f48b"; -@fa-var-shirtsinbulk: "\f214"; -@fa-var-shoe-prints: "\f54b"; -@fa-var-shopping-bag: "\f290"; -@fa-var-shopping-basket: "\f291"; -@fa-var-shopping-cart: "\f07a"; -@fa-var-shopware: "\f5b5"; -@fa-var-shower: "\f2cc"; -@fa-var-shuttle-van: "\f5b6"; -@fa-var-sign: "\f4d9"; -@fa-var-sign-in-alt: "\f2f6"; -@fa-var-sign-language: "\f2a7"; -@fa-var-sign-out-alt: "\f2f5"; -@fa-var-signal: "\f012"; -@fa-var-signature: "\f5b7"; -@fa-var-sim-card: "\f7c4"; -@fa-var-simplybuilt: "\f215"; -@fa-var-sistrix: "\f3ee"; -@fa-var-sitemap: "\f0e8"; -@fa-var-sith: "\f512"; -@fa-var-skating: "\f7c5"; -@fa-var-sketch: "\f7c6"; -@fa-var-skiing: "\f7c9"; -@fa-var-skiing-nordic: "\f7ca"; -@fa-var-skull: "\f54c"; -@fa-var-skull-crossbones: "\f714"; -@fa-var-skyatlas: "\f216"; -@fa-var-skype: "\f17e"; -@fa-var-slack: "\f198"; -@fa-var-slack-hash: "\f3ef"; -@fa-var-slash: "\f715"; -@fa-var-sleigh: "\f7cc"; -@fa-var-sliders-h: "\f1de"; -@fa-var-slideshare: "\f1e7"; -@fa-var-smile: "\f118"; -@fa-var-smile-beam: "\f5b8"; -@fa-var-smile-wink: "\f4da"; -@fa-var-smog: "\f75f"; -@fa-var-smoking: "\f48d"; -@fa-var-smoking-ban: "\f54d"; -@fa-var-sms: "\f7cd"; -@fa-var-snapchat: "\f2ab"; -@fa-var-snapchat-ghost: "\f2ac"; -@fa-var-snapchat-square: "\f2ad"; -@fa-var-snowboarding: "\f7ce"; -@fa-var-snowflake: "\f2dc"; -@fa-var-snowman: "\f7d0"; -@fa-var-snowplow: "\f7d2"; -@fa-var-socks: "\f696"; -@fa-var-solar-panel: "\f5ba"; -@fa-var-sort: "\f0dc"; -@fa-var-sort-alpha-down: "\f15d"; -@fa-var-sort-alpha-up: "\f15e"; -@fa-var-sort-amount-down: "\f160"; -@fa-var-sort-amount-up: "\f161"; -@fa-var-sort-down: "\f0dd"; -@fa-var-sort-numeric-down: "\f162"; -@fa-var-sort-numeric-up: "\f163"; -@fa-var-sort-up: "\f0de"; -@fa-var-soundcloud: "\f1be"; -@fa-var-sourcetree: "\f7d3"; -@fa-var-spa: "\f5bb"; -@fa-var-space-shuttle: "\f197"; -@fa-var-speakap: "\f3f3"; -@fa-var-spider: "\f717"; -@fa-var-spinner: "\f110"; -@fa-var-splotch: "\f5bc"; -@fa-var-spotify: "\f1bc"; -@fa-var-spray-can: "\f5bd"; -@fa-var-square: "\f0c8"; -@fa-var-square-full: "\f45c"; -@fa-var-square-root-alt: "\f698"; -@fa-var-squarespace: "\f5be"; -@fa-var-stack-exchange: "\f18d"; -@fa-var-stack-overflow: "\f16c"; -@fa-var-stamp: "\f5bf"; -@fa-var-star: "\f005"; -@fa-var-star-and-crescent: "\f699"; -@fa-var-star-half: "\f089"; -@fa-var-star-half-alt: "\f5c0"; -@fa-var-star-of-david: "\f69a"; -@fa-var-star-of-life: "\f621"; -@fa-var-staylinked: "\f3f5"; -@fa-var-steam: "\f1b6"; -@fa-var-steam-square: "\f1b7"; -@fa-var-steam-symbol: "\f3f6"; -@fa-var-step-backward: "\f048"; -@fa-var-step-forward: "\f051"; -@fa-var-stethoscope: "\f0f1"; -@fa-var-sticker-mule: "\f3f7"; -@fa-var-sticky-note: "\f249"; -@fa-var-stop: "\f04d"; -@fa-var-stop-circle: "\f28d"; -@fa-var-stopwatch: "\f2f2"; -@fa-var-store: "\f54e"; -@fa-var-store-alt: "\f54f"; -@fa-var-strava: "\f428"; -@fa-var-stream: "\f550"; -@fa-var-street-view: "\f21d"; -@fa-var-strikethrough: "\f0cc"; -@fa-var-stripe: "\f429"; -@fa-var-stripe-s: "\f42a"; -@fa-var-stroopwafel: "\f551"; -@fa-var-studiovinari: "\f3f8"; -@fa-var-stumbleupon: "\f1a4"; -@fa-var-stumbleupon-circle: "\f1a3"; -@fa-var-subscript: "\f12c"; -@fa-var-subway: "\f239"; -@fa-var-suitcase: "\f0f2"; -@fa-var-suitcase-rolling: "\f5c1"; -@fa-var-sun: "\f185"; -@fa-var-superpowers: "\f2dd"; -@fa-var-superscript: "\f12b"; -@fa-var-supple: "\f3f9"; -@fa-var-surprise: "\f5c2"; -@fa-var-suse: "\f7d6"; -@fa-var-swatchbook: "\f5c3"; -@fa-var-swimmer: "\f5c4"; -@fa-var-swimming-pool: "\f5c5"; -@fa-var-synagogue: "\f69b"; -@fa-var-sync: "\f021"; -@fa-var-sync-alt: "\f2f1"; -@fa-var-syringe: "\f48e"; -@fa-var-table: "\f0ce"; -@fa-var-table-tennis: "\f45d"; -@fa-var-tablet: "\f10a"; -@fa-var-tablet-alt: "\f3fa"; -@fa-var-tablets: "\f490"; -@fa-var-tachometer-alt: "\f3fd"; -@fa-var-tag: "\f02b"; -@fa-var-tags: "\f02c"; -@fa-var-tape: "\f4db"; -@fa-var-tasks: "\f0ae"; -@fa-var-taxi: "\f1ba"; -@fa-var-teamspeak: "\f4f9"; -@fa-var-teeth: "\f62e"; -@fa-var-teeth-open: "\f62f"; -@fa-var-telegram: "\f2c6"; -@fa-var-telegram-plane: "\f3fe"; -@fa-var-temperature-high: "\f769"; -@fa-var-temperature-low: "\f76b"; -@fa-var-tencent-weibo: "\f1d5"; -@fa-var-tenge: "\f7d7"; -@fa-var-terminal: "\f120"; -@fa-var-text-height: "\f034"; -@fa-var-text-width: "\f035"; -@fa-var-th: "\f00a"; -@fa-var-th-large: "\f009"; -@fa-var-th-list: "\f00b"; -@fa-var-the-red-yeti: "\f69d"; -@fa-var-theater-masks: "\f630"; -@fa-var-themeco: "\f5c6"; -@fa-var-themeisle: "\f2b2"; -@fa-var-thermometer: "\f491"; -@fa-var-thermometer-empty: "\f2cb"; -@fa-var-thermometer-full: "\f2c7"; -@fa-var-thermometer-half: "\f2c9"; -@fa-var-thermometer-quarter: "\f2ca"; -@fa-var-thermometer-three-quarters: "\f2c8"; -@fa-var-think-peaks: "\f731"; -@fa-var-thumbs-down: "\f165"; -@fa-var-thumbs-up: "\f164"; -@fa-var-thumbtack: "\f08d"; -@fa-var-ticket-alt: "\f3ff"; -@fa-var-times: "\f00d"; -@fa-var-times-circle: "\f057"; -@fa-var-tint: "\f043"; -@fa-var-tint-slash: "\f5c7"; -@fa-var-tired: "\f5c8"; -@fa-var-toggle-off: "\f204"; -@fa-var-toggle-on: "\f205"; -@fa-var-toilet: "\f7d8"; -@fa-var-toilet-paper: "\f71e"; -@fa-var-toolbox: "\f552"; -@fa-var-tools: "\f7d9"; -@fa-var-tooth: "\f5c9"; -@fa-var-torah: "\f6a0"; -@fa-var-torii-gate: "\f6a1"; -@fa-var-tractor: "\f722"; -@fa-var-trade-federation: "\f513"; -@fa-var-trademark: "\f25c"; -@fa-var-traffic-light: "\f637"; -@fa-var-train: "\f238"; -@fa-var-tram: "\f7da"; -@fa-var-transgender: "\f224"; -@fa-var-transgender-alt: "\f225"; -@fa-var-trash: "\f1f8"; -@fa-var-trash-alt: "\f2ed"; -@fa-var-tree: "\f1bb"; -@fa-var-trello: "\f181"; -@fa-var-tripadvisor: "\f262"; -@fa-var-trophy: "\f091"; -@fa-var-truck: "\f0d1"; -@fa-var-truck-loading: "\f4de"; -@fa-var-truck-monster: "\f63b"; -@fa-var-truck-moving: "\f4df"; -@fa-var-truck-pickup: "\f63c"; -@fa-var-tshirt: "\f553"; -@fa-var-tty: "\f1e4"; -@fa-var-tumblr: "\f173"; -@fa-var-tumblr-square: "\f174"; -@fa-var-tv: "\f26c"; -@fa-var-twitch: "\f1e8"; -@fa-var-twitter: "\f099"; -@fa-var-twitter-square: "\f081"; -@fa-var-typo3: "\f42b"; -@fa-var-uber: "\f402"; -@fa-var-ubuntu: "\f7df"; -@fa-var-uikit: "\f403"; -@fa-var-umbrella: "\f0e9"; -@fa-var-umbrella-beach: "\f5ca"; -@fa-var-underline: "\f0cd"; -@fa-var-undo: "\f0e2"; -@fa-var-undo-alt: "\f2ea"; -@fa-var-uniregistry: "\f404"; -@fa-var-universal-access: "\f29a"; -@fa-var-university: "\f19c"; -@fa-var-unlink: "\f127"; -@fa-var-unlock: "\f09c"; -@fa-var-unlock-alt: "\f13e"; -@fa-var-untappd: "\f405"; -@fa-var-upload: "\f093"; -@fa-var-ups: "\f7e0"; -@fa-var-usb: "\f287"; -@fa-var-user: "\f007"; -@fa-var-user-alt: "\f406"; -@fa-var-user-alt-slash: "\f4fa"; -@fa-var-user-astronaut: "\f4fb"; -@fa-var-user-check: "\f4fc"; -@fa-var-user-circle: "\f2bd"; -@fa-var-user-clock: "\f4fd"; -@fa-var-user-cog: "\f4fe"; -@fa-var-user-edit: "\f4ff"; -@fa-var-user-friends: "\f500"; -@fa-var-user-graduate: "\f501"; -@fa-var-user-injured: "\f728"; -@fa-var-user-lock: "\f502"; -@fa-var-user-md: "\f0f0"; -@fa-var-user-minus: "\f503"; -@fa-var-user-ninja: "\f504"; -@fa-var-user-plus: "\f234"; -@fa-var-user-secret: "\f21b"; -@fa-var-user-shield: "\f505"; -@fa-var-user-slash: "\f506"; -@fa-var-user-tag: "\f507"; -@fa-var-user-tie: "\f508"; -@fa-var-user-times: "\f235"; -@fa-var-users: "\f0c0"; -@fa-var-users-cog: "\f509"; -@fa-var-usps: "\f7e1"; -@fa-var-ussunnah: "\f407"; -@fa-var-utensil-spoon: "\f2e5"; -@fa-var-utensils: "\f2e7"; -@fa-var-vaadin: "\f408"; -@fa-var-vector-square: "\f5cb"; -@fa-var-venus: "\f221"; -@fa-var-venus-double: "\f226"; -@fa-var-venus-mars: "\f228"; -@fa-var-viacoin: "\f237"; -@fa-var-viadeo: "\f2a9"; -@fa-var-viadeo-square: "\f2aa"; -@fa-var-vial: "\f492"; -@fa-var-vials: "\f493"; -@fa-var-viber: "\f409"; -@fa-var-video: "\f03d"; -@fa-var-video-slash: "\f4e2"; -@fa-var-vihara: "\f6a7"; -@fa-var-vimeo: "\f40a"; -@fa-var-vimeo-square: "\f194"; -@fa-var-vimeo-v: "\f27d"; -@fa-var-vine: "\f1ca"; -@fa-var-vk: "\f189"; -@fa-var-vnv: "\f40b"; -@fa-var-volleyball-ball: "\f45f"; -@fa-var-volume-down: "\f027"; -@fa-var-volume-mute: "\f6a9"; -@fa-var-volume-off: "\f026"; -@fa-var-volume-up: "\f028"; -@fa-var-vote-yea: "\f772"; -@fa-var-vr-cardboard: "\f729"; -@fa-var-vuejs: "\f41f"; -@fa-var-walking: "\f554"; -@fa-var-wallet: "\f555"; -@fa-var-warehouse: "\f494"; -@fa-var-water: "\f773"; -@fa-var-weebly: "\f5cc"; -@fa-var-weibo: "\f18a"; -@fa-var-weight: "\f496"; -@fa-var-weight-hanging: "\f5cd"; -@fa-var-weixin: "\f1d7"; -@fa-var-whatsapp: "\f232"; -@fa-var-whatsapp-square: "\f40c"; -@fa-var-wheelchair: "\f193"; -@fa-var-whmcs: "\f40d"; -@fa-var-wifi: "\f1eb"; -@fa-var-wikipedia-w: "\f266"; -@fa-var-wind: "\f72e"; -@fa-var-window-close: "\f410"; -@fa-var-window-maximize: "\f2d0"; -@fa-var-window-minimize: "\f2d1"; -@fa-var-window-restore: "\f2d2"; -@fa-var-windows: "\f17a"; -@fa-var-wine-bottle: "\f72f"; -@fa-var-wine-glass: "\f4e3"; -@fa-var-wine-glass-alt: "\f5ce"; -@fa-var-wix: "\f5cf"; -@fa-var-wizards-of-the-coast: "\f730"; -@fa-var-wolf-pack-battalion: "\f514"; -@fa-var-won-sign: "\f159"; -@fa-var-wordpress: "\f19a"; -@fa-var-wordpress-simple: "\f411"; -@fa-var-wpbeginner: "\f297"; -@fa-var-wpexplorer: "\f2de"; -@fa-var-wpforms: "\f298"; -@fa-var-wpressr: "\f3e4"; -@fa-var-wrench: "\f0ad"; -@fa-var-x-ray: "\f497"; -@fa-var-xbox: "\f412"; -@fa-var-xing: "\f168"; -@fa-var-xing-square: "\f169"; -@fa-var-y-combinator: "\f23b"; -@fa-var-yahoo: "\f19e"; -@fa-var-yandex: "\f413"; -@fa-var-yandex-international: "\f414"; -@fa-var-yarn: "\f7e3"; -@fa-var-yelp: "\f1e9"; -@fa-var-yen-sign: "\f157"; -@fa-var-yin-yang: "\f6ad"; -@fa-var-yoast: "\f2b1"; -@fa-var-youtube: "\f167"; -@fa-var-youtube-square: "\f431"; -@fa-var-zhihu: "\f63f"; diff --git a/application/client/src/app/ui/styles/fontawesome/less/brands.less b/application/client/src/app/ui/styles/fontawesome/less/brands.less deleted file mode 100644 index 758d5e1897..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/brands.less +++ /dev/null @@ -1,17 +0,0 @@ -@import "_variables.less"; - -@font-face { - font-family: 'Font Awesome 5 Brands'; - font-style: normal; - font-weight: normal; - src: url('@{fa-font-path}/fa-brands-400.eot'); - src: url('@{fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'), - url('@{fa-font-path}/fa-brands-400.woff2') format('woff2'), - url('@{fa-font-path}/fa-brands-400.woff') format('woff'), - url('@{fa-font-path}/fa-brands-400.ttf') format('truetype'), - url('@{fa-font-path}/fa-brands-400.svg#fontawesome') format('svg'); -} - -.fab { - font-family: 'Font Awesome 5 Brands'; -} diff --git a/application/client/src/app/ui/styles/fontawesome/less/fontawesome.less b/application/client/src/app/ui/styles/fontawesome/less/fontawesome.less deleted file mode 100644 index 38e03027bf..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/fontawesome.less +++ /dev/null @@ -1,12 +0,0 @@ -@import "_variables.less"; -@import "_mixins.less"; -@import "_core.less"; -@import "_larger.less"; -@import "_fixed-width.less"; -@import "_list.less"; -@import "_bordered-pulled.less"; -@import "_animated.less"; -@import "_rotated-flipped.less"; -@import "_stacked.less"; -@import "_icons.less"; -@import "_screen-reader.less"; diff --git a/application/client/src/app/ui/styles/fontawesome/less/regular.less b/application/client/src/app/ui/styles/fontawesome/less/regular.less deleted file mode 100644 index 00141c450a..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/regular.less +++ /dev/null @@ -1,18 +0,0 @@ -@import "_variables.less"; - -@font-face { - font-family: 'Font Awesome 5 Free'; - font-style: normal; - font-weight: 400; - src: url('@{fa-font-path}/fa-regular-400.eot'); - src: url('@{fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'), - url('@{fa-font-path}/fa-regular-400.woff2') format('woff2'), - url('@{fa-font-path}/fa-regular-400.woff') format('woff'), - url('@{fa-font-path}/fa-regular-400.ttf') format('truetype'), - url('@{fa-font-path}/fa-regular-400.svg#fontawesome') format('svg'); -} - -.far { - font-family: 'Font Awesome 5 Free'!important; - font-weight: 400; -} diff --git a/application/client/src/app/ui/styles/fontawesome/less/solid.less b/application/client/src/app/ui/styles/fontawesome/less/solid.less deleted file mode 100644 index 7795cf12e3..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/solid.less +++ /dev/null @@ -1,19 +0,0 @@ -@import "_variables.less"; - -@font-face { - font-family: 'Font Awesome 5 Free'; - font-style: normal; - font-weight: 900; - src: url('@{fa-font-path}/fa-solid-900.eot'); - src: url('@{fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'), - url('@{fa-font-path}/fa-solid-900.woff2') format('woff2'), - url('@{fa-font-path}/fa-solid-900.woff') format('woff'), - url('@{fa-font-path}/fa-solid-900.ttf') format('truetype'), - url('@{fa-font-path}/fa-solid-900.svg#fontawesome') format('svg'); -} - -.fa, -.fas { - font-family: 'Font Awesome 5 Free'!important; - font-weight: 900!important; -} diff --git a/application/client/src/app/ui/styles/fontawesome/less/v4-shims.less b/application/client/src/app/ui/styles/fontawesome/less/v4-shims.less deleted file mode 100644 index b97276929f..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/less/v4-shims.less +++ /dev/null @@ -1,2 +0,0 @@ -@import '_variables.less'; -@import '_shims.less'; diff --git a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-brands-400.eot b/application/client/src/app/ui/styles/fontawesome/webfonts/fa-brands-400.eot deleted file mode 100644 index 46aeb5f83eea31890e1987865b7a73fca6e86b49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134396 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 BCsY6c diff --git a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-brands-400.svg b/application/client/src/app/ui/styles/fontawesome/webfonts/fa-brands-400.svg deleted file mode 100644 index 0469118e89..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-brands-400.svg +++ /dev/null @@ -1,1260 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-brands-400.ttf b/application/client/src/app/ui/styles/fontawesome/webfonts/fa-brands-400.ttf deleted file mode 100644 index 0a30775001081cbe22091160412e0a59865816eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134160 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 Kqpke~0000&iT#)W diff --git a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.eot b/application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.eot deleted file mode 100644 index 836e082a7855443dd1bb5d2f34ec3594d6011929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40308 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.ttf b/application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.ttf deleted file mode 100644 index b5414de98fee3f58ec006b58ce5d22f1cea04dc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40080 zcmdVD33y~zeJ6U(UF+7qS4k>KC6%g5t$iH^2z6 z9Rmj1hJYa?QRac;5E%M74$n9cWDkT61Br)Z@-Z1+(hvCZF(kuCvc(t%s^9N_&aF)? zb(=RY^L?YzxpnTn=bk#t|NQs!zl<}+Tx@}yQ2G(Z_#mzxx#?}4Jv(2% zr3L3t;r!_FGvhN~YBxU5n6{TO_x6)h51)9s`?pUq7I=}d1;?q$@rhvdfkl+Pgfwsp z7qlVeHRQjF)O701{6nek%ilnKKW0oBo0>j8zWYOsZpQozxYl!K{Gl0sf&B~eagnK z;Oc)0{GaiAeB0NUOA!UWzw7-^Q-;3r>{pfd@^9kQ!Q^dJjI(Fa4=++}et z?>ku+8)nMh{nsC1-l_5Vv#gqFW%tYTeCqVcanvuL0Mo>R~yHHjcLB7xyph3x#|1TXwyy)Rs~^%YK8N z8!0;%^ML-_*Tp@`GnwqR$a%vx(MH^t-}dj@W$79G=|}{dZAgG?JuYES3*st4VH>`& zdT?D+{|V=xXA6M(mSug}T#hX_E;lWAEDta5UA}$!?DEX=-152QcP%e0Ke7CQ<&Q7_ z?(*XDA1;4$`Qq}W<$qp&efiDh{7PV@dL^;ayRvs>|H|Q&8&_^wxoc%|<%yMNR=&9M zmn+|0`Toj}R(`tj^Oaw$I#&;^-mrS->N{5FS07pZ(CUX*zr6aD)jwPP+Ul#T-&_5` z>VJJ*dA<4dJ753Y>;K^m{~KR?_=S=ZJBXzLNQ_5Rg|MO**WZtE+n zuNB*R+q$+sy!M{8Ppo}*?N3T=#R&iJ@W%lMUs(6KzzUxiSo!BA_7Z!!;`8UM^jTux zV1L0bvTw8R;PZoZpG)i#`x!oOu%C<1n@oOw$?}B{*VcUup5$%3gLlyfgLx-=l6{QT zurq8BkUYkk*+*H7y$g`t%G@l;hS)Y1Wex1N*u5;x?qF|Yx3DAZW|jh^Kfzkq6tmb} z?41IW?_l?{V=TZPVY4jG-pd+UkVROSUSm5SwQqmIYnzWdp36^|2n-!8%z# z=*@lXA<&$2pc_rBmOa28WFKG&_6~NG-NfF`Ze+KyTiGakH}ipV`I(2EWp(Uf_Ca<# z+k%y-uxHra>>l>p>=W#h>~Z!q8y7T7$7(d$PBzCr&g$9wv05{1E8EUS*bQtK+rxH) zp6qA)*a3EsUB?cw!|ZxC$&RxLcAA}FC)p`B&1Tr6>^?w90xWf3~0RaD%+X&7E zd`gr3E1x7BA`_sAEdys#0$j0WQzk$dTaL*DSYykLG6Cw?GU}lO_+!f*G7(N)9+n9( z$(HxZ1n6YTZYYctW~xWkO`}nt;A&_PHctFkr;T!=rrAnDCai9@(km0zIa|TJ zP{N95EBj@_+Gi_=WdaspD>ujle85(2lnI!Dt&GY99Klx5XG*{pYz5;&33!98+$j?< z2wOoPC;^wSl?j=ERoKd;Ou#Q}<#CySY1j(Jh!SuPTX|Y0U>~;fj7-2oY~_nG0VA=M zS7ZWiVk@u81T4i?{+&#~S8U}QG68e370eMO;4rrG7cv2xu@%f0CEzu-g88BZ498af zQYPR!w(?z>fc4nQ_hkb9V=F(B37C+r{8T33M7HvCnTXF``GritlWf%~6EG%QJs=Zs zCtE!z6R;>-JtPzGDO!3Yen=9LrX3l?m9Et=b8Am#w~CCSYK;dYeqZ#ccI< znShnqD&U(E@H1P*d{F|XW~)>$5^y$Ky%WMU)uUXTe?lC8a0 zCeTZ^_CA?FIoTTh1`=o}TYF3f9);=c_=ssKf6PdsPu(cOu0x!VUUXlr10b6@jCh!Mr z?V?P?Dd6uc`#FDve?xIAN0miYQ;(?c(wel7Xg||;>t8UE#xdhLALc)`0avXViJb`Krt9`k?C{+#~MiJPyw@p6_^@z0Z07#dnwQ^M1uY>;J33(ZHVv zy}{oLz7g6RdO7sd@QLuxB0Z6@$Wk;DeIj}>c3bS#_|f=lRio9;>L+UAH5U_i*RtA2 zYJXC9u)o@ML4A@yDr$Qu(G&r}w7Mr+<+7bmo`YquK8_w>AIXman!P zZh52i-quTPx3v9vd!qfXI+{ApcQ$sO>ioA|eO({ydaZl7`-z^Wp6~Vko8BMy4fZ|I z_r3nZ{m&1y418kXjohQTUk*+UzP9zXZQ8buZS&hcyY0tAXNQ)yPwdckOzimK@X_I= zoyna~?0jM8w?{OL7t-Y={t90Lj_(Hj9R@D6Y z<V3!+do25Ot#ienPm0c7 z5=~F?OZlaZyZAq5sL`7p_#!&KC~89Y^D}(x!iN1F(N#aygTuyIjE9c#xX73JOW?(- zFyAA@1BDvBJY2_nhIwBHR~tKc-!Si~<6$q)HX5c;#|Lu5JQ}Ox!#vx;vnZG8{ASX$03JDcUq&)fZ?5=4LZQ8u6X$`Tg}eus)BwSSD#qbWdmO+s@J+`+jR1!0 zd9-IIACN1el{XrkZP>q~dmM&wTy<*4b;GeoKs?OQlgdXzJy^w6tNv8?nSH+kWL3r2!trVM-T) z1g*;T_YDjISqxyD!aiZvpE*m(9lqoHZ;M}R%-6V(0S21p-e>k7C@(*B(X>go{JIk&YFR~ z0T8HYgpcNdZkLu4;q&J;g@+Z5BcJb@nc=Sic^)}(gg>BYnu2+A2)eg~`h4KxI>GJT z1P*kLB&Lvn=N>F8T4#-!*gDi-AaaBWh`bFI38p+ZF=*xY);}MMG>BgaWJIgY09J3h zxA>#If%JmF9pdm5U{jvGvzU9lm^)A^czyBWSMs2aVeWJCn=Ky)jm@8*5#{dB|08cJ z7PG4*@;X+krj$FfQOS2THR&dQ$?5ev^9N1G9%|ek{(GFX2bdo~5aj19oVh+`r=wlFr9q<og6ER%@HaA&Tbr(J=SPV|nxQGl24z{NE|sUw%Z@uEUctRc$}3;UUaN zS^IsMjU9~T2q_Y>mcX6Lp_Sn9&|VvZ%R6PT*b`N$FM|Jj7q#Ld9o|)F#Jaw8^XifQBMSWCiIi!G({h(jwdXZ#xDalvOCQ`KW& zSNxl{;~nK=R`b@|kp>PgFl5&pk3D65J-2C7&KH_{Y13v1xd#?V{$88b?y^gA< z)}61X>ahj@4w3beINX<6UkU$kRChRZI{aBNH(AVG%#T>6-?Ty={u(G!{(<71F^B$7 z^rSfa1?9xy3CiKn#Yc#ONf{Lgg86v8pX?Ft4d_gN0XSzy4#`~h0`r#casE<>-Q`7!fbqbs= zVUT3+X0)lHG;{@-+g_t2#FQ{0KVLSJkbU`B(-+VN)JxS5eFO*4#4E(&vww_6Qd?DZ z$5WC55^lQ43vyoNs8mS0n+!mCZ_6c547p9S7QjD7!0QYW<|9s?#Ki)D$X*txD`aH} zQov0pVW>UPu+f<58{ng(kmyH+h@Zr@dEIP5_9<{%VXv1jKz~qOz7PcY z2Lb|1X6j864e{rxY#54O*~U`;2|E`Bxb?DrE?dSKK-edVev?sg+^U;;5(1;f)u6hm zcz$YFGd@cV`$!jNteTi^K@+hKUxD_amFzwQ6SWW)i$f+T^Kl&7a3AO<$>Ml=B01~V>~8LFodXqbYcuD zYrY`x#SXHtQA;WSGgNQPsYUTFN)cpqCW7C z7;30HQl%;Z$b;eby4u#TV({;&YS_M2ttbI*h+A!8l;I2LD!K(lTN3@e zfXc#DC4tpZO^bMfv8twy>Nu}b)jE|ceqP;Cs{|Fb=4vT$W&)+fo{nA&@yj zBtW2I>PTub`+@3lX3J$uc>%m*rlr37Jiyp#nTw<638nD`)8b2+>inhZ%n{vG?#@*6 zWOXLLXjVj|XqCS8rgQdIo5>e{gGP});F7Y7{{d{BI|aRjY7hFq4lLJo%>%k9 z46x7{q%ppg!<%Z%>LwH(H1vRr?6A_Gg^E!Lw{_gy9X~a)^`5~tr`N(jyUg7~USIs= zNL}6bU8c)Wbk*g}p9w^w4u4f$+o7X}+S(4aR>k?-;ywrA(Rfw!zG%-aoxFQwxHXsE z+itWCU~F@(p|IQXx*b_nX&W%J4!2iVyy0n=*YqaiwW+$^`ug7Oz4gXGyxwPeU7Ar7 z)7$qpJ6%Hugiich(35@z>pu>=GOUegIEYmp2c^P4h^j!{K;i19D3#xJ-lgx>OrOL4 zzSSvUB)Opqjt}qFUFRJ>Q?tK6WeJetdPxnMi~8Kjnz1_*aR zbQ>@aQr;~I=P@Dwmd-1T3Hcz$=;xCf|GRt}2J(`Yf6>$r5~;;u$<&{uEDn`C66jqE zC>=@YpZ~m~O*B)f$^+q|N*lodyeICus*PZvuM?^bus(vTB%abFoV*j_Y)@{(tM(IS z0cAr^yn(IYHp2)84Y!|;es@{^IpfM};{IdOyt3K!{rzUoLBG85FFhm;Es}33!Du7q zw49~Rl>=zmpx~3%+b(N3(e*PDC zgcFLBn}O~?YhZrc%jT~C(F)+M-&U`lOlq3(wBRGg!U-oH$uG{T-^u^NsU*U8;1N90 z-L>uIT_$(7s^Sr=lE>>NU5+ppp(O%=n&nKCD!T&J4p1uCq!=yUSTtfr3D*L{W5jfx26eal|Rvy@KrnSX%2$XS(MT`SSRJ9VHXgmE9~sMSxKr~ySdtj zlK!fj!LItiiQa7AzZtRuuc^Dqia7m#XT-X$!57W{LUh-N<^PM|m{dL&Fg+eK;MlTT zQFh~r-LmvAHVrI+uDSbo11x$EVEU19|Aqrp?FkGuiW z9ZD_+>MP9=K$!w*X4777#>9|kve1{%5ZChofnlRzGWiJ}tG_!68^ti^f#x06&d08Q zPr4yjGmc(5tkvddNNI@H>xbj-Bwj_lJc%n@+f-`km++-AUpW;gt2jO7c%C_0;m6- zu=j{};dhSZDySO28o6%$!+HyWA{zj5Xg&TS_8Pe-}>h)f*jCW59)d{IUdhus?z?bAOFuKseeS%mW1ty`d15Viut&*S7xeT zMW?7kfh<{9#n_W(9Edj(8|ceshDl3n8Xdf{8-3Tmwn#nj=}mI*n{?k6({x%@u5j2@ zWvy$v|N8s{Uqr(JaM0&9nfjpSXo8vZb~9``s~xV$wusA7MV?6&?I!;PcrsnROlmrF%8A)-<(_4$VYH z4LKC2?p5VAS4uNC@94786b-o&hTFLDMjRT0M#NQ3XMr7ty9_Q1{b>Qmc#R&xPAI6l zI26U-4cmX2U5bHX-IfJgnMTe}wGs(M?qs%0-w!R7?oCvBvq@!kO{aveNq zz!6?!+%qPq+W=`mOan4FK6O|`fV>=V@IW7l-;m6Ct|x3}aF&arP_L0PFjWI}8!xVm zr?<)tqj(VN4^Pt=%;}5zsL2rG`^&KsySq{T-i>_)hx5pjy*F3}()pUCOL4EUH zpZA!)ByaY5EGT8WIuh}y=~Gg#7shCG~ajroBq5`KB z@k(L-dW23(0$UljtiUU_35!hW*;K>}JlU9mxdI$CTsk(K$M2i^zC@}am^QhoRq1AT z%;oX8;+uDBJLp5Yw%u#-P7r~+d@*ldY3)cHUrXM-*O0!{N=F_cwiMyPVsR?sGU?GcEwy`n64*iP0Ve@d1u^t--QX#pkj;Dcnyz(s8>ci~ z*LpjRle%shPtwUj%Mm<4nI{c!$Tp7*dQ^a$YxH!(R&U-4VnL;z?p644z|z6NNYe+% zkd`D!0cczdMqL`C9fSZSvnSZWVGe$r^cx{8TIg-4JUA7zUls%FBqeP=>VtPj!e3pr zB@0QqIuNPzxP)yYSykU$xVLAA(;cq&?>Z8ys;v!2y}h1jxZz-|?5r-+P{U_56`DcA z=X3?)oF^ilsF}Z)6n}5?84h``*^IcC167upxXe6o41B{M=hf|AAVxw-$IG-6HnCG zsqv@sPu{@ac?ra2L~^2T*Mct|w^QmsD zCg>+zaAo^PuG)U06a;u>?HAOQyfk}?ZkikS;R)H8FBbYR5EkB;o>V5~5$>4bfzA5y zec6E#dlahT!u8VU_xptFWxR^|Vqo_(=}EqVc}_t8)dJZEdJEp60QGp4Se*hT-LL{p z5g0JE8cK?6e=eGhMNIHvP*-Gg^-4C^8v`=uKMoui1IIn`_S#4>H`doybs)E>G0LKX*D-n zW_+Xzf8sERv*u=8zXn`Mu!6%uk}AVt%rYH*hiQ$({c%cg-NF%;pwfDAVTPIjVbHNc zb`jz~gnw}Nr92sdif*(O7T+9cmkdY&#E+8VICIhGGa@=29xvvuD^uK+)Omed-nYec zD{3T|>&pehn&Q3~-5a&6%EK>8YQ1v3{U<#h)#-?Z0uka69pt7}?9&qbvg@%|X_WS` zpj}W^kWvHG8s3$nkwPgZo1G(CP9EA(pm0(bIdjN7Ts#A7a7X*sa1NA+$iI`_U5!fj7k zah`0fO6=3LeTk~Zn8tq}*(_9k` z7+R@p**Ho6b;9&FTx~5}Img+;SQUmLw*JD#5P#*2zi!yWQt0;|iVLt67A|ZC@e%-{ z;Q|2cSHwURx~f#37GdKh$h;}=bGvDeSo#X+%}Ti*Fim=Rc<0B`gUiKRAMK`w$KH6Semqg*nLD)lddAK?gE4rSFYZlk* zb^LQni)TvNRCy6vkC!iB#D0gDupUXO7y@kEL;Lp1*P{+Lny3`{W?=b14-d2?C~Y>A z9#&vIgH#^t-5nSI6<$6ve!a`&C}L~W_Gs*<$$b+M$|yN8Cl8{NETXsCy~f3Nd~ zwzeC(ICl)67#cb;?BEx!LH^p-6S)$9Ly;gxplv(89tO#6YzOJ2NpUNzV~P~xGsO{v z`$z`_Ifw*xWan4qqC@$@Dl~~m$fYUQY8fo5nf`PTdrcI@tEfuE6-+?6rnn2tK}_o& z5{$r*yK-$lS6HNCaaMrfOieml-D>GBm)kVmE|+fY^Sau?@d9HI54X9zRrhQajKILw zdpNsd#kQ0dFQ^EXEMT$7EBj$@C)sZh_KGPQFGBFZ=R)BPB3LFZ*|vzHh+jz+fAg_@ zHk?+u&v3djE+?Q|O@C%1vHy+|rF_f7%iZyy!!ob~4q9l3BN*@7NC$ACjB@^_!@LgH z6TBUw7zvd)?>8Tl;@}qjvi`q-*Z(c$)Q`!p|0#I-i4-v8QSemKzlY$4pk^QV?E=gc zFimk&YwQYc>nct^2iJqci?aFODzVnK&~SeVB+B+k(xgL?ZQ;*=+AzLdws}_>PZf$e zoIF!D?PZ%H%lJjw<0&;@>*lk#kr1-N2DJMM39@YN${KnlPyCAPsjXh9n6I)HuIGP; zE2c*1E-xt~@H?v|$u5n>OWyiYf+d@&u+L$RV0`R@X1xzS0%YBRGatlRq4O1|P%4q{ zAy8gKY5$lr8O;BEtf8~v8^PJ8zJ}Oinl^E%Ya!r0?(saP>aoDAFK)!mXy`wBLb}Q` z9`hOZ@BYvqXoxu)I=lLsVhu{>;Jcb;;=Z_^#V*@GEZ`jp)?-hps=Iy|#D+BG@~lx#iWiMj=(~-P8vq?wWdxI zpb})0yO-Gwl0_fDH?(9pip^R=RDlo!@Fq#e{`7*iq7R-mvR+RAs3Ih-?2VbPHFmq5 z{swPzuS0h`RLv1^|C2l5aCt&r)0c1sJDc3D?nZCK;X{}MFVKyp`$CRjG+?=v3*68w zr)DH;%?7Wh$sKvOR40#gH#RAT0?gCj5s6iK<9@^CP%Y007CjCYwDInMrC~R=Ki<-# z9Bu6Gigk6e7?MgW+bsrG7%Ra208zvUAwYv7$F5-F5Ca#n$C~g4 zwy)Das?ZA_`TtA0`lEk^Ndi5We!Db&IcN&Om-7_#NM!qweeR}JR{%U3L>M0>FwuYl zMj;{#-JzL+04@G8N)l?bWCSXF=rOWl0%Bo1fVNZaX6T9XFCJBTTH=1}%Ga!b+oP95 ziNj_1|X#Wx#qfQ^LDvH6+5`) zkkEn#zB6I@Cgc~3z*SBBW0l&2pR!@J5-4fAWluCzfWCYG6?(?c{4baj_~`%29=k@! zgwu%H@=-|*3Iw4@2#fYv3|a@*rD6H4P(UI8wZiWgPzjm=ha5@x1uhip`5Nc^gttB7 zs`F)YSxG$4I1~OC1nsE7R@$r3O(H8VSjHKU*AsBtF&yGR9y~f2bevyTy2?F4r{!{~ zhZEUs;twQ={j|p?=*p2;%5#Q@>k3hfFA?cTQ7%Qf2<0LLa&kli^>KU})cAeaJ7Hm? z_QnU$V8HD^LQh8i`qOgMq2~hgAsLV`XsZZ2P{5o0pt?kZBq;_!gO$Q~;)<9CP~xkQ z;X)}<8BIxqe=4xGDmoI4^`&^Mr8*KkrtpyGSDp}8Tdn%8dcD>0gYbB)x>`38*P|MY ziD|9>;`dj1ys?Ohn?d)mhJy*F6y=N2$QA;kvCp z5aKNk%`hFVdB58osHP#>;&*%e&6KMtUZaAAabo;AXj2h=O79gCG&)3lB>4)7$RMny2aeUbNCo}W1bDvYQ}VnVg*a7`EV;6`T+7ILJ)r`JdN(@LM=Gx{B&l;V%5 zb=<;=vv`Xd2&?Ui!|)gmrA3YS)eKaoPMp+WywrMCP5j_p#_oqLkMll%AZ-|rN3yX{ zoo?3FoPMmP*3cWH@l5#1fR-I>HS`{U%|7iDF0bx>0-lwQKc(C^$$|3oF5T;X*5Nkw z``x)aKYWRDq6;p}VX)ZPGcQ&}k6D`B~ z)@)P>TfSg07PO`mehLPglOA1jX5?rEG`kP1G^c<@a}8W+Bh@Atm64 zP0yEfda%IRB`3rHkJE(TrV?t>m1GFfOKw{jR#K6nDC~G#37BtJ%#5bJ&8>NKH@ssE zjwnFeUCQtU`K%aI0OSb9Gy=J`7E#kWOVXbN9T9{8D>dB^YtS3|8_WX7QOqd0)6jnB zSKSfgG~5OFC3p(l&b>G0kMeKk5rQcxWz8}9^|zmNx?Ijrx_uuYqvHpBPtIIeAa)kJ zbkHyQ5^Lm_z^exT9QM4m3A}2U!mSMoCaiaXJ+iPQ7=!_c5x`Y&Q8bYT|90Z=p_-aQ zhZ9Y1ceLh9{x<)YYN9UB&;?b!5cD|^e&wb_DwVjYw#wn~@rAfMUQ>fZeQWmS#0!4^ z3yGVvt-t$%ro9l#)zn7fMr|rpYs4e9H94XCS`zU#3h_(cfvAO_!YW=z|KQnCE^9>B zyLGL~pa$v1t{DiZ~^y;x?5OTzd=R47eq%bHKZl)bZnX3uMR(vFW4~)#N~F z6UzDsCfHr%b@Uh+C6dWIEq62d z-ZZ#E^eyZ#W!kw|kq5VUR9I@kN=6osA#?IV!?3&B% zyz)xVk)EC-`DerzV48HyOQQYc=TMK`*@#-ip=Bv^S`;zSO!P}mEBpuwdLg<<^pZph z2nKc!W#}Eb=ad|Ecyg)8tmHNhd?sS^jM3Vo{Tul%zBodN#%paH;Y>toEXH%ofMlg zrHC9uh*AlUPTB)e*u4b&P_Z~dwwAB3RC02ge4%)6tcdN!j%sm;VDtfO3j{-cCt(6U zuV{DVpDJWEjc&;T56Na86#Y4cP94l&O8N!(F|mE<4SLGSM>R#{aDWHgW!wXR;y5FR z<$mhnDOEiguviMm=r?! zHO|*RpI%pf{rPWN|N8RlDM-cgaO-M5Nr4FYB~{NqQ`&(tcCBpwLa79Hg^L|5bjX+G zuUSc1fn%oreZrkMtcPCFKGDkGllwKO+*NZoY;gCFHn?{6T0Z5cAEJZ6!P0Nh4{oOg zb}M0P2F)P573r-9`oU0u<=(`B3CaetSfC)q+@n|?^bN8*45}?QK2;brP}%cfq~XqE zdB~l|t)zBrXn;_*)Tuh>2KlFG8XXO|g4AsZ`Te2zx*B*h9C=io9C?KQ%K43r5+C=~ zD5`2I4hIB3#if`Q{CHJ2ukk}sZG@kztVH6Di~LvcBW!?w*EU#~p+`+$yTec;WXpV_ zvSBiJLKUOit}tM*i@q?$t;E7YYJ$AQ#0Gac;9%VQ!dc#Rm9aQr32R?-!TR?j$yD+) zM!g?8*F+!`)?={AzbzOr|8Prt!NtkxgTxWA$7xSrr|T&Uj;0!LfX1K{2gjq-_?*xR zhu?us4KM@25{Qfw$}S$ncBsGh`Ei}-qdFp(h70al$$FPZZR;pZZ$wct zW$@+zwB>-0h3^!((166pt~t1yo4ktd)6Yw$`JGo8w827~@Ld>@fxD{ZgWNBN@Ug3d z3m@1R%6MEpUVtAN=d>0P6^3aSTZK(C1gC@!rH@<@6sXYGuM|^I7qJ4xEul`9axEM? z%Isl>6Ng3*ZLO=@D!=Ynw?2L#UFWdYgeTq4ehgvA*w^9h*avTo3Io|YYm1doUH_@L zBy<%naMuf0Im*%XoMp6c-`+0w5)dy}@PDp_gfc{NF|O9v9OQZ%VL;i7o=P_z+8hP9 z43K20X9tgZm5v^6&{UUBemS~J)m|@T8tC$WdCR^0VlxSY!ZAlfE?CSp(~Y`fH!J(t z0qEU#^*$EnlO!}k2}Mrst@iH@X~nhN1*5)g#r^BI+_&%2iq%WDd)tmXQtXt?BbDZk zBwp-GyxQCqSnyOK^OpM~SD0-|f9t(?S}rMhtZ2ImUGG<+JNgFvRqrPJOjbXGELG5T zLstaSB<%xririlU*?3q8$kHA|#ZaPHSUhJ)5jvYG7AAE_ZlI2nCBh4rK`CTYMN$4^ zXxJS-XRNiVHQRYBbU$2EuqUKt!>g@M&fyoOdII}1^-Ym%5*931o!{8_@&)d+s&{p% z+!Jtey*4r0TNa$A4qs8N)?`wcBdsiCVb~>DSkZ20u%t`#7xRl?C>BK1?;R)FQ!6`m`mIjR+a8v+e~Ns zD-mc!dNJ>S7_y^ZXdZ-Am?6#X+ts*k-Dv4?b#b(3OSU5x@p=PhmlA4CriS(nH6~j_ zN|zb%dLyyUoB7P3&;eIx@Ob`lT}zv0TGLzkVpaU+j)oz4l-I^gb4PbmSJO~K<4~%r zse6ZM#%gh6sG;j-XrRO%$VcCrS{;?4RQgWsB6073qvGg zApbxipN#~3)|y1LH|Q+I9#zaTg%8EFldm=A6H)ZwZ-JP-xqyxXoG;bSf591cK5M~$ zit^zwW%Hk3Sh%pj#}*d&BHxMFa{Zd$nSTyD33l!<3_9U=nAWzA{0}=?ctczMhwe6B zhY5pxT%?E6C#({qR_p>$3zG3heoAEwioJ1WBTu9<&z1rMQeZ>M{L{!6rx9y+7{2}3 zJzIg}D_T@!rm*1*hQ-1X%EHuY6!$J=*WEyfV$f|VJZ`obt+B49WqV6YT_6@j93-z2 zj6F=}+goM|=Z&$YYi~pAvLC|sLAR!nmQ2&!;Xtg}uDsTFW7;)`8Z?? z6t3jCcg-$VZg0{rQ0wSW!DyAuSLL3j(zZFF-@7E@iOMy9)wsDN!mp1hIz`LqCv=#C z_F++I5XNMPk}n9=#1TdNtO%kf4&NyiSszkVtgXxNw|y`6h7czUPwa{aNl=TFa15ec zkQs|idxUUAT=)nA=T$29aM}R%T|aPh1C}Nqscx&TZtJ6iS64?!IQEmYhHd{oP+e8W zR?9bky#yA*qmX{Qwk9ouhV#XA4et_Ry~W{q`KX>#$aU0IoSLrQrmH^*dGg|Ej;Hg> z6wn(FBIY>REWghG1vI0IbnAEn12Lx*UI9b{xE}^6DUOADVni)q6!GGcctrt^4V`N8 zn#stPL+$DMkR#F--}k^i{D(p&I_c0%!M?Kk#+Z#=KMilmEP*~HpKWcVENa1KYaJ` zGKqUQU(A2zNrEvtG>ncmmm)tcnffWZv&n%k1hF*o%drM8)LjTe@zR@bV(N4Uk3Vnf zWAr2rqs zVw(#{8QV~_8ITGrkVVw*G!jK6quAeBQCL<$X12lu!Vj>Z#w{~EP=MA*iuSfq*~uLvE2n-D(wJ# z2e^+(jO%;Z|H1x{{V_Bnx+uyZ`mPXiuK593;PQd(LId)ZG|DZw0?}PymOI;3(8vhlcR-) zXwb$mNpXDB>1~C2ka1%YlgVPu7{|)lUMyU=^3G!N5}r)HiCR&LeuTcBEc`J2ns}I6 zc?kt+en=Mjb47(L6hmanCcwKcya+H#K*jck`4CVWM>vA46u`4-{!)G{;PeG&lUuy4 zGjOSNg|#6y(v<)2=?kBJN;mxG-%Nq`d3o6hOH0?0XpI`!-iZi_G5%Pn&dRs%@IUuj=1@I8fCw_C)%+f9{+Az-Z%)#!=JH;R-v)pA*(j16i*41ID|z+tA8-Hg2Q z_#zdqJP6t=zqd@s1Hbf59D(yDzvOD#<0~+bX|zpXv3! z=JlGBX2P|hl8NRC>qyddJ2u~M8fShZTF=K!9UzB*xVI5#6tiQSQvTPjC`*t1&gM)2 z@wDGU9OJKu_x2nR?`SFx6NapUgUs2^W(AT05+ft8kQ*R*0g~$hxIynESgL<6X78sv4{CzZoE0t_it3CajqT4UiS{ zTW)UYrsejVMgaRfA_%4iyLaTS{p1zwjheJb*(qxxvA|TlPjWsd9f3yDF60K`XY<6 zTXUdU?#XFB@VF-R(DsfLL(54O7j`O$-6?k!!X=8hRRz6P6?}^*F3y23S=58t>7VEfrQ>CtmY8U2?~X>g%mLu z`3$fExt^1frqApb_hPmKHMBAPF@$Oo?tx`iT=6Oqs)W{G!GVDITBYZ_FPk{j)nC`t z-W<%rr;#gLx)WL7dGFG}=I#JIZ2aL&{q`;U&p!y!-(A3$kHJMSjF>w|3zCw~8_#=d zB3o5oprLuF{kkfbD;25n_(R%2q{e&R+x*#6-07)HZu7@#n|fR(D@f;1t}<%)G$2D~2)Mj}BGhNGsgu7(10++8rp z!Casj*NbD(NVmS<1jmRRT!Eu1R%Z@=k?XsjDHqTsdMYT}H}3I>BWzsJ>F?T$biKBH zvz|T!sdQauub0}E?d#O->*kjH^gu;6?_;q$LRU$s2NEZC6;#gl#$Bt_I|Q!ir7yf$ ze{2ne?82dSJ@Y_32700W@BCHxqkj>cKD}Fys5g{r@YW*I=?CCsv=*U-TOk zOgpV}p^PIlaYQ~(rciKRWHPpc0Mb6t7#v{NU&HJYi0@Po&XIJuKn`U%O`wWSVr*rQ zfllzdqFwwYGOJ<1xs1_+2S*JTvg9xX9iKz>=*>=`9v`ko4sO$R7ea5r{OLEWD&(M9 z+IAqy-G4V2i|$*5ic)&+IZ{F{9!~-tUTgl&X6z?t3=& zF42tP5AjIkF}K6vwtx2-czqgs_Zsj3edeSU4}a)GyG6?$4O3er@Ba#4v|~rIH1s!R zgd0lM zo4qNKBbH7i8(Vl^NJ#phL0s@L1Pm;>F4pVK8IhD+LuJ z`BWef9I&Ahvq1BZ%f@oC9L~zcj1tH4v+Z8R@P?cRn%!-#Ee9fXns?Sa5{uU3aj z+!0p*l{mvDB2;X5IH`WkXX0147y)PW&|OsDUB!A&+7+VKMdE5Z8aAK-2!wbQ8c^V? zi;DIl`?)dVACRtnhb8`Aki={=TyHxy9+ai*fM9?d^1Q!)^DlUfAh{;S63X5bClZS^X63So(zPsW2v1+Fr}|8`-WF3fBi5*rRW`N!jaxPo{1U1r_yttikZw9uF{$oR3pvl`7ud#Fw zXoDl2)HW5m!KUdmO>K zaH<6xOtFc`Qv7=zPPgv&)~2g#{B>~{P_Q@C6^&qb9L7-5^m><}t6oJv<&T1j@cfH% zK>i?J-Pjk4_19D-{7qGwYbV|$g#m;SMm62KRTFRXHU;V;K8%YWZ<26gSLVxMS6#y4 z@;k#IwnoTZ?eRDgriaGNoxNAiVgWyv@E80LN{X2E8io+Ug_Ext?OrIn;V`@Ib#|M` z+g-!M@-0!r!}3*4>&`b@Jlxpi0oATx-CA!2FF$&@rDjvudV`osU7L0j9tR>CO)1tz zpIH{QMg+dt8jnP)3sD5Cqmj7iJMCGdxOMfw{?|cI%+~Apa%G?o@hk)XTB#y}P%52l zMPN9xPk$Tv?IuVIyf60LlKqSDK8-yl zt%Jv4{D41&h;s)N6ruNV7a0vqsZ{6jZJvnN@-_J^Z^Y9y+yn<^m>-*ld-99DDczUe z)8sW$y%(~(v)SD@(jhCmf8GQV2mUefOf}6#H8P9Usb0;c}WREEIsqo^z(^=U-B=<-_Fqx_9n2(VZ3PQMT9op$1DJ9Yqp;I(tZJ2dgyIdL9S z*LgRHxBbd@G@jYyi6REEd2PEdP(yCg6BwN;+%fF-K~=w4 zFD?KvG(+;WSkOvd$_pCHmq01(%}FRvyy_C#v1IRr5-ov!rCh&4L?0ZiihWS9t&q8= zpPIEK--H&XSDYa%YhpgX#7D;9$9{>AZ2TIu*JduED1J4_{()L5{z&wYd5#?-Zac3q z6Zl15R{^gXJFg+X%g*cQ<6U;%fIZ}-op(Y4f7H&qQ0E_^mmKfRVXy*x)y{L&__uam zfp`5c?YzncxWmqC$Pe3jokjV)oi|tq|Dc_BvZIJkCF^&wjN;uteRe*%>%qyn=`)k% z`DA}`|Lo-CEt4nDO^wfPa3^`~TSq5n=T1+bP4;&TPzCm{^q19pVDjwb?D+iTMDp0f z$+-tk_RPITK9i&eCa0#RlQXl^_f8(4?>IF-KeMf~^Mrl9XYjq*^(6dElDIpIGLwkrGl@Akhp0&7xboJXN&f%x)KUEMELwY7w4Ykl z0Uo!|g37-1Z_?fasN<}tXB;Ci2}^vE9fMUliFzMEzj|Fss zd=gO*=-$0}{y0i^uv6lx8F-d=;&WnM`3{t#5f=DBtOn4X4ga3yaFO5|*AcE30mit+ zo!rIU+yfOMUZ2VXJjg>ljJWPm9z%ffDqfA9w+UeMI>@<6;E_f|6mQ~bp5a;E%(w6s z1ZQaD?U0i@c^B{IJuq7L@qRvlw=E3vt$Z5@^L9k&9)>tR!gulAd=KBt_woJw06)kN z@x%N&em%c|-^g#`qx@!m3x69w!f)kA`P=zz{C0i^zmwm^-@)(Z_wX@3&X4iqe1cE% z6Z|AU#ZU8l`F(tfpW$cuG@s%3^I1N}=lMDQ0Dq7_#2@C5@OSce@ptn_`FpT`?7jSb z{Qdkf{y2Yv{}z9ee}I3Ge~3TDKg>VEKg!SZr};DdWBlX%xA`adC;7AdQ_MX+F)=$i zH`jh_diuWN$?@^o34Q$R$=Qb^)+H#I(YN~5fUe*Vn(?0t@7=T1*eoIZQfeSCas^6bR;Ed92( zcyj#Iw4&R~|l~pG>-f~^nPby5mdB^2kKaefvy%ZF=O!oG zkB`sH15Kf;E+CaNlV|6tr|v?2VtRhgv`-xNx41AfJ~yWwpPqTxqJwCo>-g;C#A(bB z{nW(iM;>|DiO21hX>`jodG>+Hsp*-?cBHe8!kIPs@T8mt6*nLd4XUY2>_^u(lH z$Ai9Z%#VZg+r{_;x?o<4h@tVNcQzf4y(D&{&hes-dL>hvR+Ag9RBjL%HY z+Sy6;!6&cMUjDRjN&xSb8IqsW$ zSb(>6AAX>n#@#1!)bDmtr$*<_squ3sPl@|(nYD*no=|CBWc8`ZGt+0SsnaJW+c9b< zkpuoXc5dpJW9syrSRd+{@fqvPBx;))KYO2_a`03q6$Y5c(1$p`1e1h}V<5tVO0IXiuB#%rIP1Kz`_OO$Az!S77EXU5OXP1*~} zg-Z{Y^5^F4pYq**ZgP&6w0+MxJ9!eVp2XTT=f*L9vkyDyn*d6i8-HNZjR^oM!eHRb zId_Iu9}S|N72_hVT61ToAH+hrZ_<#3tvSGF`>FA%6B^}Q_}Sz4J=}hFdVUi5=^48P z>fE`rj=6KQGqb1XCSCKV&Yd|nC!ou+^8g%yB<=G0{Ao1Snx6$)rqObt)3f$Hjq+}^ n3HZNVpfI0(a%TLY(`QaUGFd!7eO8=%?fW1v^V74FAlUyeM2bPE diff --git a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.woff b/application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.woff deleted file mode 100644 index 56acb37d5d91ad1ed998ad5038bba95a7c9810e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18164 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 We7)oRk5U^;OH2O&+MtMS0000{67i@2 diff --git a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.woff2 b/application/client/src/app/ui/styles/fontawesome/webfonts/fa-regular-400.woff2 deleted file mode 100644 index 4c5168fd996fc1d25d861d91c317de675c1c1a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14872 zcmV+zI_JfAPew8T0RR9106G`|3jhEB0GyBj06E400RR9100000000000000000000 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 KX+>+I_y7Qk)wZ|* diff --git a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.eot b/application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.eot deleted file mode 100644 index 18c554f4eb38fec37879b933d3f3a595f62be2b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209012 zcmeFad3@B>_5Xj)eb1g`vQ1V(GTFnLkOUG0VGtBlL=?mgH7F`pR76x%)S#%iji7s9a>u5%BaQ{OoG*}2E!{yN;xJL!xCOIGgp%qc`! z4MY>)I(6{{rxf4wNr>p!nPk?lS#msEjnY_a__-E zT!r{PC-To+eAY<|9KRXA8s)bO_p{GfuzZQ*c}5{~A^Zo=TyVz8yKY>+l}zt;l=}Be z&N^q=nQK41kSw!}Xyo&vJ9qYW;#qrdtT%41v2%lCuB~HQ<~P{ zwken2DZWG^>_&49zlB>5DpyJb5fdSFf`ay)1oGiS)N9|{&vD;ClgLavVCG!%FJ7?h zOe!YFpyz|HdGTqdE?sR z|AiC^Q}T1WJVqlgGvGmUV*8W~a3|sjNj$i2@7*Q$yVLuFX}3$W$Ao%&IMmzQ|6HyG z2`k8TSfs?!yG!CUxVEKS?*)x-AYMZnr$|M^ru^CQLf0Q`eP^Z$OZb#TetR@t4Qs~}NW``H4*QvVb z{lTtV(YL+tnfOf+Oyw2#c3wn=^clkaTk_d|-##cD{Po3Q>w++9N08!guwPt@TOWPl zY-#(0ZXrS9giMuz9fv#@@Z2tQ=+j?6?E|`NoN^Duj~xfDLnt?~aj92=>{N;8-wXZs zb{c)pL|2Ie_u?*)-rITYO!*T(q0}>6bC=kjrtwqK)+-gS*r=@+q^(yl)hkN0h4G{iyiXX)ehiiQ%=^(Dqz;l$<58}U1cY|krVYGfy zx=|`!Tf&dXcF6w$6H-5Re*64(LWjQVlr*6q$0crk`Ov!1azI{sB)t7x>RPU806gE- zSNFD`)H6GeDVwlutItNHEX9v4Q`aHr6BM2Lo(+C3Zg$ygeWv13n}d!WDP7R-*=dUG z^Rp9i_N7bk+jot0`mT4Aop2|K4>Dw@Yxn z$ZP7IA^EbyX&KmYru0YHL1ECR+wEtUZFfOC-c&!O{-j=1FWiSxki;#|_5R28j(oMl z5AuijcMa6*KzI|9YxwKb{D{61pKZ4xTnFLaF3;6pUs{Oo-*#E1$~;wO@C$$NZ-?ot zm%e%+xQFbr()TR52aoxEK9x zop9Y>F2RB4h}-T1xC{9RO23S_0rXDvr90SGG*9poOvORA-(GGTB*hKbc4_N}yo7KM z`oa$`AGx;EL>OCl+^aw6EMW$@a}f6-iCgnyKf}H4pCtd<9-zCFp^)r*hA`4M+jXeA z+2QQIwNGC>x9bzKzi(9AlKT{P8e&I?KV+w=abl!t`;mIIb&~is4fxY??i|SLK>0|1 z2I$MLT^AA$rNSV+zWV7eFVVr)L&FdFm2i^(RJ^wBrS$EK4|(lN%a$SWpNg+tb+_9a z{6qhL+j&9z>5sFsuMRX`yM0O7bih4?bO-Exr^IWQW4ol0io0EO+#BkzuUt$>{H5ZM zFztfqn##947bxWp+258CuCE^Kazi*<7u&zQTT^wNiqB4GP@7fzk$5G3wE+!-YY9WW z--(2qjESTVw6V(|_H*dg-gmF*+I7?MYvH;?E9`u=aJE9j2EdMQ0Q0L*B`KI@@Kh?<^Akio}EZki4M$G~T}Q z)3z)Aqz(tdq{>3tddg<-EF?ApNqeH>y#8k?ee8Q&+xm)IKej#^mpqp^ZK-~2UHkp+ z`CR-;`f%@1Y3mb0oI%iqy6+1MH(dAdzk1_+_0D)f7~9=`HqfuOi@RM$1AT$SgLHnJ zUr9^f6DEXk;s<{1az@?YpA%SMB)}Xtdz;QPv)+TNyrM=zVx|mtN7h4#VLsCE(EP9o zJH!5PZa6Po6fOyuh9`xmg=dA24IdvqGrS_)9=Cd!v74%!ab3+h(D4YDT$OuDk7sJVuJMwsBL*$9bbCEY9??kpmK8k!2`FrH+NFve`<)}NF7A=gHMn^@* zMaM@EjLwQ47hN1ZKYC&G+UWJso1?cye;&Ojx<2|y^r`4G(dVMiM_-P<6MZkbJ^DrT z%jj3pZ=%s?BKlplr`y?`-d);V*WKEEZ1-{9ZQUn!U)KF#_lw;xb-&vEM)%v@?{@#C zyQ}+)?r*xk@BX2?H|C0E#hPQ|V*A7<#wN$6#HPmfk4=vq9GexJ9h(z7Dt27#gxHC( zQ(|Ytmd2LFE{I(kyDWB9?Aq83v0Gzz#O{eb7JDN0Z0vy-b^u!s7vl7b^=Or#ktVmp% zSe3XsaeLyf#C?f}6Te72mUuexT;hd9XJT{W4~cgZe@y%-@j>Fl#3zZ*5`RzZNPLrs zCcaPXN>VaC=}+b*3zDVDisZ0leRAJqC^^8VyQ$zLTOPd=4=Hu-$AGx>7z)#RJWcamF^?U^ zyTe(qt^(V-%EME_Gs3fBU2Wkdu&&Ef)^!W4YhAb_{6Kg^xHG&p{AXC#r{OQd;qcA~ zMKU5;kwREkFj5t1h%`l7BKt-{u&#q5heT#aj*YZME{j|dxhZ8`>mt8`b^SK7G13`% z+qSOlk*>&Bu&$j^iaMgcXhF0%S{`kRwnjtIL!yVly3USXU|ZK3+q&+Kc0?bJ{w`%* zFGXLEZjFB2Z(WgS+_o;$?X|6|rTeIqb*+STz3?Bcs|nUMelONFAJ(-1*0m_M1lDza z?BdwU*eY1p^|3Xv+f&xHG4_1Qy55F${W+!eaTT|Bc$sp_6HORU~!@4HyW?ge&UB|(?7A8*Xx31-hi(p+V6Ia2y)+Rbq*7a1% zx?b7My8e>*)V8j#6JfEgL~k+;))h!uS6y;+a>8!bbxiVj+q#w}S0vk$mnW};b=_iH z*S)Z=^~ql(A4~o&`3$VQihLTcuXe8fWce&9jcO7UAM2P ztJ8Yfdd+&vddK=RKHIF1tgo%8wae;pI2@kT$LGkxC&y9f815Kpe;OPU9U**XI%YZM zI_5c!aUb2NjgDvS&kGLubUL;;-gLZ``n==V?&xxS+W-07@pt?4 zwFBKCJ~7Alsn0IQE=SLQ`ZzJbaGJe*98QPRg-@0b#98XB!l%YL+S!o$G&{$o zKCRAH=YGy<&I6naT}QbVyOz3^yRLMtc3tPX*>#WWA=e|WM^m52T?3yDu7S^!t|whj z?e=-r^{i_XKAo=3{h!xdTkv_u^&URkTpy)A+g>J|6qybNk$WcaA&Y&UY8$Q;biEyVPA_f9f!fJH-q) z>v_HTr*#_dXBAmPtYZ4PRc9VB_nXtqv$UBXqbIQQLHvqYX*qZYf6IsPeXywI)3_6OAHfPcKJeOwk8&-i;h|!#jyyWJ8nz6juI+tJKUF5KabDH^@E2tSZJ=J{9 z^SIJ{!|C)0{lXk?@~v9B!z|<1=`Yx@s-kMDp-S^BE}{3(0t#sa7xIbx2~X#84sww> zhR!q>(_5UNU(&SLq$I!>YC>TZi*s&0KT1br^kUZsdFDRJwt0 z;x&9T-$+3!rwS_LGprk}OrA;$Xqa_6|D9gsS@bFW*-S8Zna^oFf5rbW3F{!s&2ej* zDWjFNnl7Wu>2>q5`M`X{Io3=*o(?n5TL+pc{DpOb`PTfK_NQ0)x7bbca2-wME6oX% zNm-Ole#)f)*!26L<_pgYZh=9jb;dqP*ym7H%D z(N1%_b(2|R-N2K1nE9i5-~7q^*=#c(T2)ph*YZxY%T!_)>14WsdaPCarTGhITeElx z|Cy`k6#A8!MqTtbb1Ai>$C*T*aVt;a1|H9iJe)`HzC03pc8{5T_?LXI+1I>keqkP= z!}(b206NedXGU39VEb~KwJ&`@Be~3sql4)dx}9#bMp~n=7j-)Q&OA!j(lzFB>m*ZS z;{2d>HX6C#nt~cq8A+*Yj${*1rjf14arY)Z^w=2WxFJZ5>UG^@s%Yh6YA&;&Y$?x(wG9oM^=7=8XU;H- z@pk#O`Mu?|d{zbC7w1^**5%e3I+os~-_thwH}&$hd^KOgYxxc{(HvrqFsse==0Wp} zdEN3`A!|QtnRUH2$2!7(?;LF%V;yVFw~n{ktOeFW>tyQ`>s0G!bO<)5Po$IRCR#&} z(rfew`h@;U5&9>6P2bSB^e+t3W3-EY;9RcZBl$R9#7p^Xeu!V=_xW$!WztQyDK$e) zxe1!lrqxU`hnlm^CFWXltGUVCY;G~@%-v>#dD*;ax=qx?Owwww_O~vvF2&Y(F^$50 zY!f!Z=VG(`XLKR0rB3=I{fXYEk0?rUW_GfJt9caH^B8X8vE0o2@C2U7Q#i!a_&`3C zkK&X0H2xW%&gXDDFXQw0Tt1&K;N^TFU&NR23ci>x<(0gOJNSNnn4jP$`S<)sewW|l z?ffBs#2<5vzvu4^8MpBopQ$iaro~J))6EPs(;Q`vHfNeU%v$q1^Bmsu@8Lb)W&UQq zFkhPQO^@ld$YN`lHNtANW>{xhms!{0g;YkGs;rtS14XYy=5oR8tNcs1Y6Z}MCGHgDxW zanfX%YSUywW`A>}ISHeYpPAFm1*XH?XWliRnZKKVSjK9ynyvG!3#^-ICLKY`>3X`6 zo}uUIAM_O^*|3X!Jem*U1$-6%oY(Oq{0sgyKf})&m#H-)OtZP#+-B}EFPT@&C)Q|d ztaY4qF-9)e($ln&o~7q-M&JvcX)?`hv(T(CSC}`fTq|I$uvX%5!x%b<4y7eHFmVB0 zP1n)8>}3z<@kzXpPvymYIbX(C@B{oPKhB%D(-fIu<|2%yt~5V4cba?6Ci8;nG%uRX z<}LHK`GeVNc z)(;#u?LE!x$y^2)?i8Ug@8UmT7V0=PhXd=+hAu|*UqnWT@ zF%LjyDdv92Y{f`gISR%$6wXy>Gi08E@eYLx6nX*@=S&2g9HFr21dvS%mni%SWT|3S zLY6C*$w4V8zUboT(UzPwEL^EJ)#53eSU- zase!LdzfOrfjnHn$dd{7j;8Pe1tV$-pQvDLP2rOi68#q{=2ws>D;RlGSlTwA z_aIMIjKsZ2!ML2lrztc7@@I;i&kCQeu%x+I;ZGpXPSoLdA7nukV_Se z_$e%Q4{$V&!crChvj7TLmp;H44A1(2J0-D44xbc(a0e9EGJm0R0*AHN{AO^SWa0 zg509mZTt;f0~!zcrovxA{$AmKK#H9KBR2N7VjTo2^$jdH;22ZUr-93daQ853e zh^1gAP7#NKIXOj~3TEdNaVeOmQv`J>V8%`n=p+zqFXB}g^%n6dmbf7gf*Astp&0Z- z5lIi2<&dHiz`UO#q7$IUAqy3=1+qxtqalkGBXLW-fagP&DEtS=QiTtO3@TVhph&qw zFGE%+=5oj?1*;4csaCMwK#>}SUV^MutV1DD2ZA{la+t!R=WvBZ#}SG_{X|A82K5{n zrLdIkXvHjrY*382k5RC?L6IhfB&}wJ4}cu2VC{njXpBC?aVCIk_7-Ou>2$MGjZ!O2|11OFhn2u$n`WBNURdou`=FA&*q7 zn;?%;%o<3sAz+FAqBr2lkYYoCr9O{S%pW1qF9_y+$Tr3N337pA{tS7dB4@25Cn@Gb z$c2hk1$nY!RYG2-u-Me)3XA?%C}tO=TV5N#8H!IWw zd5dC6dETb*mymZT<}Z+UDx3|uPO+p;?pAmSDOe4o$m0r$-wg^@ z$SCq#g}NZ0Q0Q-v8x^ddQREqg+997+tSrdq6s)dMq*I~KAYW4C%zfl#g~iV+3O7J* zR(L$*s|q(lzNWCW(bp9o0V(Yku(XLc6qfe-wj$^6Bkw3A`Ib5cM%vRy3X45&SNL8? zDPLeD&QBC0x=2|7^9x8R3xKsjihQcj;gFI~z+#({Ho(duMZQo-+R@(?a~$MXiWvp@ zPX#NC6!}`gS|ddg3QdFDsbKw)BHt-kiKNK)3eF@@V2zWaE=5k>N8Jk6Jt^u_=y#B53f4j?TA*N6l%j@tS)!O4$f1gfLzXK1AY{2>oef!`7}2p(F@DG@#hL(Ftyrk{sKg7b zvmk2~Bl)gVEVP{{`VqlM84Op91vx@722#oe7?DygfZHIO6!Q=y`h3AU5pt}86<>;? zJ_OnivQ@D}!tMpE2U9epU}c!1QxvQbQ&hqLtQJ#rszTxy_8|~#Bf7t0Bu@t@{2b(T z#h|T4rT%~!0|~nnu;xtBLlmq&Q*@SsKfj^qVG2JD30oKVDabhrOTEukcq8Ny3f~Gj zPvPq!k5u?J$fFebyPN3I3f~TSjKX4{$0~dS>^6|9L(E79{6MmvdKpkR%iq8BQ(1yXDp7^xG<8!%zW zHH!HSH=L**BDSEep)q9HGqfk9$hk_M-ir%MSZJ(m|D_G^H z=mQGY`zg9!q0b>7R*cl$BMNsz{!ZaLA)ivPLqO4I6f%%vHvp%dDEho&NgckVu(-Xf z@QaYID^@9_lo7DXA>U9e^h?n<6)On&d&L?G`IdtH2#UU~&_u|06te(wt75H&d{?oq zhI~)4q;L6HF_M?RFBR(y$gdRZV90M2OVW)fmgGIE7;%d$M(jMH7%9K+ z6w?kVb_2}GMBOMyfl*G~h)Xa?tJ|TNgCL!XL3{1?Dvb8n?Nj6gUU!PEX0u%AQS$0{UoAE&Um zw<#>{Co0(Yq3)Fmc7Uk+GKF4%d{E&NAmtwLr;xA}fj@(UEeVXW?|xO`e?!7%1d{^^ zdk{=9B}gSKyn@{=iitmfeJ+Z@o&@Z8QEak;y)TMQQLqa}v8f97 z!zi}DLLHFP6}k@+b|bJG5`BcgM?lV2_)JLj5d!}T67?*Y^C0Id2IU_+PO&7fCn(r+ zqu2rkyKfXbQNcbO#ZFPMBS*1C3ijqGcA7$MkUvwfUq`Xi73|zm4DC(89v;QcP_Uav zu_X%j^(c0>LJ7#F3ikRawoDzE>(n@*#ErjOc!?Vtx&Iy<&b3d4pm(A=fCDl;=%~RRMXk zVo6?aQLJ+yZ&j>z$lDd`a>zRrOX3q-0odE57;IX=E+@sFP_W-gv5g9LJ}LH$f;~`* zJ*&uHc*dSrSn?s|0{CjkPKB?5d|BbOked}2UEWpfg1$);N4=UKjrg*u6{cMU?D6$w8uT-$dP4OxPyWJG8RKPVo^6p-$o>70!hmrLe?3THzxh(QXAk4zfYvMUZ0@ zMw^N^DttC%lfn-{HY+UUFjnFBA;&5FH^>%+yC7Q?lMXpvG1-v&C`QV4f?}k+Cn`qD za$m(r8BbD-%Vsa}(rr#oP=z zLov5N9;ldgkOwK|ZpecbvjK9ZVqS(6`vc}p$XSZ%h7|pPi9*g+jMV92ib+Bqu2@n( za}-PTovT=q7qm$M=Nc$3_6=~tf#Oof0B0R2j`k_w)C0xQJ_VeApt!V8fRhjum-Y#8 zCW7Mg6`YQsxY!4f9~Fonui(T4#ZORhc7oz<3Qkc_e1SrpkkZBgPF7G{+8DqY3yMoz z0H-Y|F6|lM+y%u?QDj0Lm-Y;#^N5RG0{N?j_-P6|Aw>_s4#?9Lu7+H!u;lj)g<+zh!?;e8;_QCRGBnZjbH=PE3Acb>u_$nzDR2Dw~ev7HMP zmim{n11$A(k-}0QD-@QzUaYX>Rq7kC=zSk)%I$p1^=yij_lKzbfcR;RD_-mCEUkfJN#?;!6}3_*(Cz_=mTE5-}?pkjQG4=JVsQt}2&7341!(*pS`#Y~2L zR58;bA5)CUtVYN;6-&xTYyw!4_qP@6GRSunoROmVRt2Y}C@!`FaBhm?l23pW zR22U}!C5Mbi+uo`s-n2$AK-iy#XnJS(u(4LRdD8t;!+j>r>`jfxq@?86qm99IFUv1 ze=5`s`K`jpe0-O}lKu}0|Ai=#rI+=h;F+SQw!Ovm=Pq|u`wv~WSU~GhD=w?ZIFJ&+yfa<%uA4Yia}W> z3lxKVCQB6yc~4d-)>z0o#X1ghm||TFDgJ-Hb4ZB`m^&d~R*d9tvtlIOR~7RDtg?e<%0K4$#&QB7#77@9jj|b`b(C4M$KJ9Cwbl6UMj3@(c8J+kIGY^;z z5Km@1ekUyppbWB`0c1`cK-{?wfUvm;8$j3q(#eDWJm{7`13XGpkPhIdU@L|(*I}C+ z@fR<~(sUb93EWE&N9kr9)k664X*ik%{}oRXRTko>)*8TiqU!lXHAu5&15qvf)#17h zX$?ah!w~QA5Wuq$LC}Fe-JS{XeAF@wm*Br1@ifduGb%x|T20hEk!UQ!j6>Svkao*j z98ZN?>lz%V+C;QZJJEzz{5BlIPuztqw{=955PlNeClh#-D1@*f$SFIp%@-q@3O%Ql z5bZx7(^Nb=0AZ&ijTx(m4n$lBLeGPs$HCBTChiaM5X~BiCXDB^X9L7@SO?MJxSz8E zKU)_7>xqtl+dPDuw*f;u=y}w2L`UQP7zg;AXg;1FcNEd_a{=;p{3h@L!J=; zNaHN%e%5B9B`b)|t^&KTCHDxro{8X5qH{|CbUhdD=gk1O0;GFB!kv%j%i93%FF<@3 zwSxDFR>X)dUIBJscsiTtQp9yBbZSQ&m%;z#SvZDLh$9uy>B^l%SA~gIuL6kY>SaXN zEGD`Z@n4JhuS4E%#IrSvz$T)b92nYq0G{146Ffq6>*qwbEeD9}c7(qJ{@2b2+lcO5 zgQMFsz!og;rI98R8p(xmZ^fzoL`VF4_wuGAiJmC|TZx`ULeE`?pDEl(^!y^C7aG78q8H)bxtZuCJbMLcZJrC@ z=T*f0D*U|`0y~Lbhrca&w&h8pHv(WSmYos*n|Stn$lrgBqpR@y)-DW>-zR!!IfxPc z0nfG`1>o;pT)+D{mQ_4p1%TW8aQhR|`qMTXZ+w*KgVp%OLgeQ|dmY$B z^q1KH;s1*Jt}3vF=x^fpE!%L_4ADcUjM4AhL_-a2Bu*V*dA@(=DEtB9R&b8RK| z1c|-#iPP|liD~%FiS&&)#s%qz|4ek>nRu2p1MDO@4#_zPle>W!eJkf}CeGhNT$oN= z1d6l3=hzm!mAC}y46OsJ!4Be5q+NC$aj*~|eEB-!iW$U}3&H!uRnx#*#MQHjYv88_ z{%aq_5ys^>W>o?<5)YpUwiAy){390=k6J=p5BG+(#AAZQjUIsOrny*>!gcc_#ABBM z#6PYMY$9%14iIHXP+5hJ@EwSJrQ!>qlhOVoym9}f-X~_>(mC~X?V7OGuTRe zKpWUbJRNb(SV(*zo*%dd!(==^2>Kn2_-C#qJ|qB;=ByGBCO&i;K)Bh^eK!0ZHk0^p zgqyRPWJ`_br32`6)H>p0aD7Y+#}(_q4lF%CLVWxT;uCHqZfgg4w%|$P6PFO5R0tj= zUWn%l5&y|>KcyAG?#X;Q zmjuCLu#xy|2iQTp6n@T`PrMAz&JBQ7#OH+o;yoYnoe!Ot!+rTC;tQb91xWkC6~q@+ zfi1)qafS=1BAzpevw~4@N;^&d}^GN4~M~GiM z3PV#5*hc))MjQ!1*q1lsPm>oDZ-&3k9mKC9>}x2O*Wms-+_z+bF5)*3$D3=3e_sf8 z5WfY#Z{ztpi0_^C#DBoEt*eROMcDTy0_gw8udxJx=YPVpKR1Id#2+jITZuoMLHrTY z|2Q2yLcF~S>>&QjM&eHv;^=-WaTftR`x~x5g&vrL@@!z4>mk9eM z^1fpe@js>!e}y=|LL6Up5&sim(ckhn@beAQ{TA{4s}8i|hma6HQUW&MC_@lzC+?mB zb`Zzr5@Y|1vDU*0&<6#uorzlS#wx@TTLLe?FN^gv|yy?~@4>f=y&F zel_`suK;lrR*@;fZ|N2x-eTMjnFbKo5cn^F9NJ6qQnoKZArd)tujA0G>T2p~% zmGD=&3(KhpUyZn`A0>nS*3>}vnk{5%*Mps8>gEE-Vav!2uL2v$j97%@XNYe!bgu6r z)36E0xvm57*NC{Aphq*pHOI(|gTIz`GOf5DUt%ADH2drzGhrFnPG;hKfH?PEOlA_& zo`kd~&jxRi2_gIxq%n0SnQ80D?2qRMOaq(9Om6^qK4T+}2`?mb5IFdKGKW+FJfDU5 z4lMzQXZ8v*hZO?ocldTPbLIo+Fn1Mz+YzhDpwBh)5dKI!J8~15qn;#lG~zsFB#tUO zzy|!((h4%ip)8L_xD)WKtqyD^vjF)!@m4Y?%_Ot13arQRn-G~(kmf0!WKNq+=4bGG zdH}%xVmvz&X`UG)bJkiiOBRwj8_&*0xTO=xoU<5zs#HSeTn|9J=Q#j$I=>ab&+*00-bVZ+PZbTWZL40cv*G=$ua}`)i<`(4VmUc3? zE+KQVZu_`NS>bcVG$Di0&)J(>o+)v=f{4&mWwFF#ns&&Cb^SGwQg0aox8@Bx2kNua08jw2W->FIJg^YWao49{I|uh)H-Cj(wxuHh4hJF3Ki@XwOb z8h-7e6MK&1WIcr&$L-6_H6wUzb4}%-yzR?P{Z9t2Y8&$dF3C@Uow*tWMW*r_TbhtD ze$wf7I|ERu(^e^jOWQ@iw-(pbG}qKzli_{Rn^9Zh%pIQVEUD$7+gayyH%JIAjt1Ky zq~Ada(p>Y6CoRpBTUg=oR1}g6dFV1B?!e!W6w*kVNHb|ZaxzGJsTt>g(p4)br9X5Z zJ2*c-ac{DEP{OFIE`0Y~_mf%aa$0LF=U%_K13B!lBWVkiwEZ|^6%sg0z8ZewO3ada zU+3?zf|*Vjjkg3!xp5LVkLC(L7i2ejU5i?-=W#Ft7ME%#aV>TG(#9O`P4{23M63=KjPE7a_|rGz!teE--*xGNT<;}m zX;KtvX_t6&7x?mmUU!@L!&fkmM~FYaw`U37EJP0E`(y6J>F7)qQlE-Ae=4 zTLvzrd{yU{2J4)S4gkGIKJ;@z&zgcgblg+tmOY*i)-7w0nuApye9epdb-sE)xxqTO z4>%9#{G)OfU8S9i?#{dcJCL&8Q|Ibb`NOZ4GwQXM>~h6-PuJe^z=M2w2Nm{J{aNUF zX+YWkxvX>dC~Nl~Wx1!`dzN(v6t&eB<=5<`upb`q;{E?x*q+`WdS668{1VQ|A53#` z+VB*d*j_GwWyrP(%ezC09j#FeX76{kquI}8_<<6!?a6ExyCq$;G|<|{RTP@ewR~Yu2qQASr%Us&R1iUWoxA{=K zCiC-h`#o2VZ7MKJviuAEfsuVL!mQTWt?i%z#n3Yhyb%NI&bbFUb6m=y#E$8mR?U;JD>C>$k@{yyrr}s5;8Fspw z@z%Yh^D208wM>BfR zQW+DpOyZ`Bn(BO4rh&U_G{bKT!lW*0V2_g+fnZIwHRIq_0u;22%P(+OxFkKKZAUbk zxiYIFvus3~JIn9Sa;J?bK7Oj(kDnWIxb_+599H4U_Zv?jqoOV?$MUBY>8c6fHJ>HQ&_L@;J$g9)C zyT?7<4(9es46s#$dg?U$p+At`03%K*Boy{IjI8iluBpgmc_B;PjD?GI3>dOaf*Fox zysq;L`rgtLI1lBnFLMorF{h5%GJl6$5)l;O+)Pnf8~Hb9)d<%oSWM=rlzt6|BcB+42U4Jwz$Ccf<0Pu`Wnk>Tg~{o zvPPfNc6q^7P+Z&Rk%JPxI9J{^rnk3uCw{YMHAXVSkl)&xX7pW+Ww1beG=vT%S==xDyKaTy~A1js8bFk`r>d@kLRYyl@ zVoALVDSr1 zb@s@%Kl6jE;U_A-?ML;1b!hpw!>&{M$r=s*D9}$-)$Z~9WUc(T0)C>nv0fwjnxgs2 z{i%}ui9+Nb>nORBG36HgLfJ-)|0~g-WA>Jdp@080z}?(pcfK+hkm+baK3-cGXQGFY z?iu~Cbo+j8aoZij*yffol@;i=QB3IdcMePxo=7WmyBulm*)EsmbsAHB{4g9kkL$D2)3ZE| zYIpF`MQ`kKqvOMCnd?SXS4=oyLPhl`OtXD$eqYe%Z^Pxy`NdiOoE(2vap#1wBlfGT z+;7C#3HH;q;&H8gxuK%8u&g)`C@w23t&o0d7shFu(JxoXUkWk`upl2vVOEb;siL+9 z-84RUgzs8;*yq$##!!q;s4dFJFFvMMjhK>^n-R>&&6+ZzDjhEQMYV;)tBQ)MhL`yZ zvT`$xapc+;>~!&DcV$`qh!N8p_VIZ{Q{?4INFU~UGtW0)1{a61>ts{mgd>mlRtZ(*Z z?J-L*4Ou;ewF#+s@ z|1D`BsJd!Qhhg5$F#A%jmiJ?-@6^E`M$|5b(f3W4d$v#axLoJprFf3Z<(ckwhMev} zljkwZGM(pG);Z41Wyt@YX*v57LZZ1CV%BJfosTzl%1D_88rbfUwGJr3RieaF$6zJ) zOiQxUpEauqjX_^fHJB)*ihYl?TuUu$smoS;a2x%p97{hVZE#RIwrB}zl1>?Y42(xo zEpgDQ!%yX4_hKBR&F*Op-=oelWlc(|Y3SeqKq|8pgX?b148JeS=bz!ubEmo8SKx(z zg&S9SgA%Tp`Lr~fr)SE8fP0l2{{?WlM}DEhZgpATSA8P}4*>dJ!h_3sZwU;l-My*# zV;y#@j?vTIJtnPnb+Jhmis%C3HmY0o}8Q+Zo-pi=OmvxMHj@^Hs;|_c(<3l*g zvjR7}mvfm^eb3*PyY1lt-pRdRU_I$BJB>ku98{|-llzxwFal@uAL6q1lD@Pd$;TI% z-`i>A4jRUw+VH~dUsAyf`$ZX`rqs>%K;53diMm_{b@}4|A&oAS)qRqWff2Mlc*Tq^ zJJr``%cN^B(cJqV($=vH-v0Gib;F9A^lGVbC}zv(*I*H;u`w1Y_`;Y!;GXBke*yoX zOU@rX+UFNn;P(x_=_{uf>0fxiB8?Wzp0UQ>XW6hf>9zYUzUI$^L+=*V0fSN;bP2Ul z*DvCo_>%l4QFW@W$6@+jDPtp~B%^Hkf!C(7G8V#(J^gTv;JhY`CHm$fqw({(m3d9* zdAaRSWaUs~rRijUuIEs<`%q7=|Kz5$493k~p5*s?Ls8hiJe-lXdjxwvA#y?YPL%&E z_+2AiC0Zn>x3M5mA>$kw^vGH~3cm%zK&cH3mh873Mnf_;&l`i4M%lP%!a6aAd-fs9a{x&H8RX?a)=4jsk_*>mUYirJeaOnH5M zIb^=y|4{v54Yo^5FxXOFl$%zWmQ$2p3g3v=<8!7LWDl)F!e2|o#kuV&HW{n+)R{RB zUw)n=|Ey^a#PBfU)^^v4-{*ZvMr+lz=qBp1-jRvU+kTUj;Z1@j?m}0B5|V-PWR#QL zvDIU|EJNWM{^W)myiRAXGvK+_Vt-mqnxCy}Jps5ly?cMObk;0quD8PLbj`g#&F@dU zf3C}k+g#^f-1Xh}I>sx{;C%iOP+iCJO^qp~WpJs(7YsT3#_@P7G-7^r{i~F3ynX0 zl+%+lygF3fJTfpm!I^rn@cY(8jq7=Qh?< zRyURv7F+CbWnPe;?RMtZ?mu$O`26eww_{Z8kMFSq zh1Iz<%=L;Xh>_|P{366W)K{g;jWwvzT$^7Y!)SLCM)YFIP2&n`YAdm(REeC*AiDtj zJF@=Vw-bl;5X>1{uq!cWY?O;$R+g=KQmskPD{(kV^3qL<+wFlxc-#$efqS~Cb(9<- z4*2JJ)1Th+?68)WVSGSZrq38(SLK8Xdoocm;gy~)e~yfT!^4L9s#^-GeM5&G>dq}F zEiK43zUqQuHx3E|$aF%A0AQ}+t^qC-fPUw7*VZ^|Y*Q$3 z)nGwRmf^5q)Pgym%#0>67Ab4xIVOPOAd?m;O+UkRTuUih20qfox%ztrzPrTb$Ve*) zHf9$VPbx0VZVVQr`JJv3an2c4I5g!vv~W}ooO`acJifFv%aK!1k(TE3xB{6j#|7>j zZ&prDmNy5J#?)17X?c06v4)nH54GB?f*gk>-g6|VD>LBotkVvp6Lnq~NY8TBmuC$_Z?OSBsSQ;nxfE}1glwcmZA9~$_%E?Av0kQ{-SF7xb zV3$#MMQWu@O1GkG@J$8wMN8l4RYy(_c#FM`U;6z8g+=%E?RCo5Z%=%@@m6`P@%TRj z40X8K)9kUlLtXBt$BrH^Q?2o%$G%%ynw528QA5!Q1G~K?u}3_fN3am-C@uB+=8bA{ zJ0Eeno1wY`dkZh%_mp48Z{rQ8E96%sTVz=lZ#yjG#aWBK(2w2`*R|;P zCv!pLI9Q78V)v1HMPfW55e$Gp^7>3gAdx5-L&@SDI@nUXe}%L#{6Uhnx+PIjvw)3d zxxE?bqb;Aex!RR&HD~9PvS)O9hSzObR(@$tcC(f3s&4lBE<(%k_%bcyaHcstPRx%T zSaR?<(wz9M`AnZP%M0f`NMDxImj`z*E1$bddXcavs&=q5zqxcS?};I z@%T-R%ks4QrY!Lx4XBvsYxh{L8sk6L=R`M|C8?!LYA#7FO;dCEvMhGEc2~~jV0d?_ za%rNROO#6&<+2c!Ghn%0F1PhK=CZR}TkSg2amp*?hP_S1T0Q0BJ&o6Td5b-%E5{md z|4Y6W&0bc0<%KUzdtj2;w-Hfo4-GIzxXD|dKB9ps+)!N8(;h4-uE6`;QGP(V1G1vH zBxvtS9G!Y&H)#{#UuU>{6>a0%YKlYEQ-`=ll-Muq3@<88u1ZF@hD@yv*>mrnH5vx1 z8gh}czZYSDFOdg-g;pc`wYk!4WYFPmNv$N>uesV54A5Qj_Ob_(wdnd&c7=fmEU5s4 zFqrBj?nJ8l)z=4#_8sl@G^7VI(lVUBv-d3;>T}{Uklx_&Hu{48VYMgL4)X_do&I43 zWgTS&!~9MTO2GZ`bx6X z%F5EROMF3e0kU>y+VK~%+4kB`dEe+)7gaEN>RTu7pF{k3;nIY9t}o8L!|S~xx0ufv zQeC~o>CAU#I44cQSH4r^?)TiDd%LgLcYAL25T+s3J$v!i7YyYs^R`~}S1a**nI+Ow zE$)$ z>1*WjGDl&Ky;5Xv;4Wcr{`ljv)6=t$nONZA{Hpx?s;Aau{e)|N)|xf#TK7K4 zGPAQY?Tg$}PtS*g7MxHna-ODdtt3x=Pbf8t(}Nl4Q(bPDZ@wkFW9T7kQo}KO(P?t9 zIHRzqw{qT`&*ci+Ve{q;o~fS~oHMVIxiF)+XS-bX^x_g}%9;fZTyYylQ@LniGJX7!empxdtJxb3cwf&S3m9uQU<-KYl4{12fA=(eY%&!tVv?E|u zP53pQ3DRGT$!_{T`e4AC}_&-_VFXr`3 z3hjBKV9(PXd*1(7Cpab!oO!_VXWvBqUFx1d9c*AXP0CTDIQuiAPribBAW( z9{*(z4X9Ij?&qcGJ$z;OdaKmOoK~8Fuett;A?1h8JG6XAxxc2Yyt=x)v?dcb;#5-Z zueF`ZYJ}qxqhS zd&&;3>(rgDc{IL#$9z!v!h{N#jLUWn-P}|Ddjnn5u&)nq}+yIQc?=1 zgm2`m7TB?@?{r~qexLl7U3EF8<2d1mH`%~y1qMeI7=+_LyMOENY)Yo1KD$jlbk&NUginYs1Z zSj0}ZtP`+|43X|}z^#0Z?Jt;D?Z=pEP-RR+Q@Hf~Kur6d0j z3HI5@O0?Kf7;E&6>-2z~ED_qP6F4Bdr-5TUvO!02yt2#f?HYKG8nUlTn>%%=){d9> zR(XH-bjWvuj8NU3rOkM|+Iyf~SXaFdJ6sibW8mZ>ORBps24Dq6#uskPM6jZmpXb(7 zJE^mGgKv0A16GE^(jpi;2#4hr*JpcMkfMwmaIEQ672H-QUV4_u_wXuTZQ;uD`geVf zqK#hnRy`spM+pb6psL+BzlitrOW4b7kl&ee*0#vvrtDJI)B@SrkWNjPqzYKqpQ_Ov z%g7BS=*9rQGLUaBJeIvyL0Zm?Rt&LA8*^@QW;g;4{Li-z(Tko^%rSB-Z;n6OSX|Ry z<2%5S?sF6t)J@)JURoXo<{5de@`5D@QRK>S^o-Yw_lA{b1uS1tZd>(`A!v$nCIc%o z(AS0cF<~w!iKDCCQ)5|-vNe=ZT634A7{N+;O25__IcWu=3%C1oLK5}uZ0)8?+Pr-x z*A)~xkaTX5jxD=TPWRzmT7y%`hv1|ZYSljYmNFyMWu@Jb%33DQ#GurgaU;yLtA%UQK_VDp(jh^aaS400} zz6I__xQeSijcMbD&rbOrc-*0}NK~yk`PJj9^K*(0Z76HbP4^Fa#98?{GyLhf&1DUT z7TMlG{lF+ZuYzPb^z~;r0&ly+q7>2^wcu7O-Sq(2KfTiPfupaSr=%oMR-efKBVh zofLUNU$y86bH1_~-BRN}vp`=>Q$xaVc&=2z}BZ9=7~oY1p2 z(=nn_=C5AQD39NNn78iQDpyru`;BEIO<9#|mDI)myOIxj)LNZ*i!}iS}-P`o{vY7vXY>2fTv&jMi?3wKdw&VsD}*7v30S zL6iV?$JyibXS>qbwyGek5%b85Htg%mWx6Zd@AUNiOT2oAg+jbWO06L@v^cA@vY@7Z zq%?*O*lR{^M~7UGtgk7kEX^vuTf5(0>VS%)~lvn13S43=c(xm=|an*xERi9@kpl35ZAwuVYF z{f>0YTl+6PjLEZoSw-2|MVa27XL5=Ht>sRues)$-&XC#lmNPj18NX}jkg|OWP>q3{ ziq`V-)`}eTkIsU9%7*+e*1iKkuIfB@&h2I9PVcj`Gdnvo+qAu@tTd_!fy9CklEFp` z2oM;^8ZZWf@!~3Xy$7*LVv{9KZ2aOl#7^>X9K+}l6Z^$^QJhBHSf@DT`NfuF$05a6 z@B7cWQ?(M1M4G+#+Ct+|d!WJ#8{y){9UDVX0Xs~ydeiA%OG8qzLO5Lv zLocLj`SCjia1&K64Ne9LPr>Kv#@eaL4o4^(d1X0 zA$2j;Hr1$59-r@M3ix9*6xw2ThJ-{QIWKSszdtNYYwLmDfNldJ0-TR&8UBJ_w_$gH zVF1_s1-hmf23SJyhqW45Lbn#eEqI{)7XCQBj2`FL_{%~r`lbR83C&7G?p!xnQ)JCl zG)*xz8Ja>}q;+Tw+s-e>awqw}T|8v2md z2srV{Fof7b_!a^X-x+xa?cN`G47=}UBum{82y9R-tWl|`RXc5r_7+F=v{h9Vw#{A3 zmSM*LVJQD920N5?Y^CO|);Q$5ee3>k8y4y+3H!S!;tS9^8E`U z-&xcFM@ZjnGT%Bi;r`nm8yrYiHrXm96DZ!7+RG}^D=RCa3}3|hkag%+!mv<5s#Xai z4aqa1!6=$XyHw={=bNlnO2E+tg#mVf&BZa42~;-&_%mt2fmC=v)}*%>>VuMWrr58h zQ?`0XB$MgSWPa^lj0(TLfC(lvtNPO^Wk)a82fay;hOpeEgax4W)3WyL)kplcmG-j- z=$Zb^rye!U%Z}1?w-|f>&jz5*_W#yxRrK+P49Oqkyu{}ro1Q{HoWq<9?LY5B$T+tc z3)LI1`8-g8n0KpQC(BDoG2Orztc!=hLAB0(+76qB69$=btZ~bkxO~IlmT-C#(=Ai0 zy?%$nISb|BiA6fG@t`V>H(v8CSQsaDzpSQ%BoMwtT=YvLd;3gt%jNr~{x5FBsNHc} zO*1Wh@x;N`G7D!c^@>fpVd-<%Y!v*_3s}SRacBj`e4Eg#$fC`uVT;jdC=VfefNs%c z2<5!c07GiPOOq@R)7V5h*I$Ul!s*|kX|PzN?e7g_tCN-A+m&?ufn0k38~m}$5B2m# zzv@i&_RquMDd9$Vu)qtYpqqxhbEG=|^SYJ^XL{@ELw!B*J`8rkaAOTp;^Dx*VveJ% zfl&qzgjo(6?e;cxMK@@f2o*OJE_q8Se)&8RAW2N`>7YW#u@NZNxf@W<(8$mKDq~u6q!U#3W1z z0%<`S3sTJ!rU_H7O3W8-!#luwOwO{;PiJ&J9GO3Q=h6B3qZ>C2hJkX(Oz%&TZHhMA z@n`9JPgvG1Ijk6FO|f(ZItX1p)J(bWtYoN~2j(GFvE$QOyd*rhVSWkk#ET&NrxB?)#g|bG+ga$$Xzn9t0I~w11yL$8Fpgmy(F_Ud zn)HnO)y5YXl?W31|Lm4|P8Y{We-GX_7#=$y(>k}heEs!UEL?-}Z_l1{&ir;m82UBw zMn-)Wzi+Q28?l9QHkdU7RGR@4$?|9Mc1M=k@Gz5+&{;lz&Y7nmI=v)bN^Oq1`<7G# zZR36j)Lp@gLWRP4HAvy)%*sifz&mi(jm}E>&C{1`(1XV4MdPyp7`nf;;gadiPAnXl z9lvPQ2(ne#4rUe8eFVcM={IH2l`EXc#%$1*S;TQad*reJ)DHyd@PdWfte`3tYW+0^)KhX^(W*ZU<+AsLI z>410(p`S=XKS6SouY4gXS*Uw3JSsEsF8p(&_h>Ozhg#<;!W6T;mSaM0bL$EgUkCTt zvH7X{*Tn3AWE_D&;LH!W^?`Y4PHn>m-TFS=AEV7kGxc3CMS%*@C7$mU)T`z5#XZbG zJY0o0aUqtg*Vt*A6y5P<+)HI_VEoCRgrU`m@oz{#a}8^H(|zxy7QXmd!5(?mTwt_0 zllRolCfNBY!LWe^q{Q3B5k3!{m3#Kv@E3a=$cHrM8($PN7sen)96EpsW|a>{8lK?e zFdiLH)G^|Ha1)(fz!068QZ(Z^)skQPuc|5SnSv9+zrI$s)aMNC`9MOi)$~L_*WTk; z&xeA4X*uuF*hg;G9jq3vsE-zydfUya$_kId!apxLw*;)$zupQ+)z8{tc~((o<*@zP zDpx~toe7^Cb#R+dBr#-1(;p2+ z>h(zQQN3`68sUtn1G2@}&|Wkix1yJo;#Hkwa_a0tuQ^>QH_30?#pHT-O5=-#!eWEo zy7#S7(mQog`=!;Tczg+}PP&dwjc=RhYRwcskFa%~eR>t+mH5;WeBo!1-;22HaXqbE z#j%3aQ<{(-S&ZoEN;9Itf7PWGD8KLndrsXc0F@e!-{~E7ocz*yC%f(xx75X3enE6l zwj@4L7l*6=fwML745zu&#;2f}y^h8hH$#&`f@>wHLnny=0@LPk1fX>!#CfV^vaoTr z25pAh`3m$A4b+l9J3EIL;0{1EPAB>_DO;A3StF9jCfHCOY*Qtf9}34IuSQa3b|?`s zvPr3&m9)M@ww#JUjE#qf^2rJqt^5#6WLZ5MFK6LtJCKfqt#Tp_Z&00I8OnbTPzO~B zX_A_c?gMP#bfRp9Bm9nRIi4+N_eJxnq=gjR=6o+d#Ir!J5_F$<%vFq`9-^vTqb}GA zbovIyj;5h9OhQS*6*njBrfAC*4n%T^$!4b)xrhZ(+lz1Eesg7IwawGDEy-$Jh8qVB ziiN`S>pHjc@d+CF0?%(0^l=#DQy`rQqT3kpC18mg8a6&~VWLAj%}gQKac zC*=m=ox%%=w8955`H?;Z2QduEH2NrB2*QQTE2depl}uK#N~WnGoQ70TY)T^RM!~yy z?qm1aKn~k)gY#7$zFQL?o{;@Wsq){A11uCU;v;bbjzyW-jH-Rg2$~xo*k}fgg`FeQ z*i}Y%Y&Pkf)Oq8vkWi$D+~+jE6p&Qyo_jPE3BUH(-FNdbC+e?<{DjJY{xtqqC+0B2 z%vORBvc>;0pK37YV7|eaL)jrm`wq*hVS&@B+_QNa3ZA2~rff;~#Pg}1c$|GOra0=0 zebC*duiC6Ba^H)p^mn(1W3gO37s{)$5{$)`0kBK#ONK2&k=WJW7S zo?!K8U~LT!Rv>6NPd8)>Cj?MJ@cf+bs?jQnyf?#yfu2DSJFV4``+%Lo{J)KX5MkVL z4Ig?Qq12}!`jI>cfMP->VDJ>|ZLr7&=9~pHnz3dFfDeQ~H8n76WuoSSGZ%~mzt7d%=N^U)MXw7w1+%(p<6DK(k3=7{93^cUjOn&d^?M5csU44y=syX803YB-*0 z&;ajx_c8m;7#O`LEeE55)phsxxqoukW_p0iN}G$k_%mHMbR8Dhm$_MR9$|0jy^k~= zSLd6l+gi`8UP)(kO9k>YA}UBA}0~3CG8Q7;87o-jUv@7 zS{^(YCM%2Fkf{g5 zOU1$Kr>CzUES?VMji0k1*6hk)>R8H_L!nJGh8a#-eZ!$pHnR)Dj`ed!{((%Pv{Wi& zIN$pF@J*%IG-*)Bu`a$<_Mq$>o=qLJ<+a-2XxsSLoji06Le)$hnrs2EOCst{J4DJ| z%0td?+r93 z&$;=tos>Nev%Z#*m%;wUCZFG0?P%y3khxu6LF#(kCzj$i9^O&4Mgz@ zyhm(<_9ysh9&&<*DRRFoxT$4sWg`30QXsnQaairT;92zJ%X~-v!}S6Y&Z`G8;-RZ~ z^>y%|D5Ok9!W4(?t131OwqR>BC|_WO9>%6sRBq#=SR<#<|BIe26!x07e$LsZ7QqsH zQgsqx!H6&EiD*xg!znBkC^8UnK9wP89(7K~LCHOQ8@1n2 zT2qwf!gh`jJ&`1AaK?fzchlXjVxL2&*SSv6dU_wVa-5xX!JmO!Tf)};mZ4TuqieI$ zb<7VtPP$*GhZr7ZVEkNq6=(n4{mqwM-AsL=nd&;nFYt3W(JdUaR_D4p;cvYWv-fMj z6TTZ#zTiXQc@2Fk%~v#H*VRM-75|^Q-p;Fc^&%XC`CcL;8xzx6YbxTYm9FFSpJa;y zDzL)U-(c5SJs0A%fRDCI@$hVHkat@DNDa#*Jpzdkm zI;f8T1Jvpn-9GuRtR;o`!ey8XGz!-?K+J*nzJO18+eQ_8`8tL1Ex0rq*RQ^gg;}A& zl1#m_>YbtLdx|!%s8;K(PD;FalfR^VAN~*ajdMvZ&C9LH88Z7TE6a9Wg|z~`e+!kT znS4bBdw=&+{00AIWrR3M5Y)CY&~zU6tO?auRz__co^u!s-Ibml-R~IUgN$<`s_>WDbMCT|=md^OG<>S}==Zw1n0nNSq(%bUw&6qFt1x+%_}l5r=g%cTDqTl7xi)GtvL3y`v@CeeHLm|4?D>?Bq{gec4y%1)E~y@)*qELH zCGbZ0Tyx6lV9Q}EYteYd2T>^Iy?Dg9o!@*xVG z^35Xo@WMG5j=cTT(|f0WJpi@=U~!-3D>YQ`q#9K ze-=#C|B3Ipyc}Q)y1bRSpRGnJ8>*4&IQ~92Y6eD~8=_`VkA;HVw*HJHp`4dPB8Kjj z)I^mM*B_B2=YgVn2wgh{t2^o0Py$lGkqQo}1U=Fu@r17-2M7|EK`Gfk7e)p$2v=n5 za;#+m*#+(bk2z(hLIf}9ZQAG zBVluFYawOY3}}wBvhTnEtmm151N)S6+OIO(Ocl0{nPK>n8%8h@HXTh1gli<4)xrTy zbIfoeh-%?6(rB(*lXgNc+Xp{R?$6Hc*E(&v@tO;=3*;(CN@{d|zymRI!3hDCf^uOL z^fGDq?V-tB|E7Rc+rafSTc-1x&d>E^(yDvI67U?)?(pjoe+br@?T>sRl^*QduvMsn zNU!s=K?~>Nk-05A>aGduAF)cwHsuIKF_ z#zAAS7ClH1;fgVqDYOzV1)v)L(;xG1?0aizqrVVAfFzP>nUC*6N%srDlf2bQtFg1b z0s=eb`T|CbZIs}+ALz?PBL6QpS*TPB2lQfWJQbNGp-qUgvys$zthf*ehXa$#FvS*O z4+Yr94i>pjHu=A?QCnDtra*U2d)}p z9z}y-TF2J?6IEWOK7kGMsqz5tXajVnnS`uP#KPn2qJgtM{y4TL=sqr=W7GK%f1cww zpO)SMoZ1M`x_4nU#P`8cL_R^i5f81r&wHLvYEKw$(aRaIfIH!xDC4F zuSY{s_+_8-{qFp2G&kz~9~%q%6?s}m9Z80g4CHrGrVKe~YC514k?^RKfOqgtkWpQc zRY@%>rZbc|=r13W{kb@R`OJ0()3drBr%V3f`;?SpYYG(Afm|F)R8A8JE8h?QiwSP; zL;u8F(>CHj@VIaAc>SYb3ic|>QZf1gi9xWm$LKb}r_Iod0>AZ`%kx;4A zcUAU}zh-}*IAXpNb|4XXGYnPBFd;QVlP(U-pAi_=GfVjArHN;uIHYGmzgM{3en0Um zZMnt-N!x71oBJF@fRQ)Ki(4dZ!A3svJu{bc?=y#i6uJ8M$=OZU%|3_&zVrPR(1NR6B5Bbhxa7h8nd`Jsv z51AJ8rIADmhHTtU8{aAR8vYD;9NbT#Y7+IvU2MDSww|WD#WSB0&%jzogO_~qD~(5> z3vPdc_}Vq_wG>A^i^tnIDPp!&AtpdOh3GzYAsl=9gpb`1dEkD;4*iLtvE^1!^W5tF z3eE?EoG)s7H}Rg7BYH1M>2QB1z!{$gNW;VVOK2)`s}IQX19(9}d`Wzj9eV&CZ4Zd= z37u}+yQxOoC4WR)BFTrdT;rtv@Uq@`btfb0e)K}`ZqGAunPsk35cazB<}kF*N1N?~ zeqd6Y0u@WdmI4fEtk~X^OO58DXC&}d#cJ4vWS~rWm{58LQQA>#$w?Aq z6ub?f_-v?pWp++A9c5}oF(SshCMdn}rfMXp_AdlOJ?W^EFcNcfvD8jhibf0biesvi z?!Q_pQ&1jeDh^E8iFJ1#K3@NY%G76?=1qy*Uk zM2WZ%S|OpK9_*#)TErJX!P%zrL?sZ9T4Dd42Lc~t%*-)}r7z>BSi;VTgLpg&T=01+Lu_0og zHmwyQtvBM*@_KG75905Zi~p(efQohL6Ho!Kwsf~ZDVxuP}c>ThiyV zz}iqusZ&6<2z{ln&V9i5G2gGD+Rr+%Jj`)- zQ#U*XxMCd6TFst77aL1rG;ZwH1<$pfCyIZL&5xbUN@4#$k-Vgz_0e|ekUzq*aDpK| z>P23BzA2#g#1R*<_|d)fN1JE8i&Wpww@f9e)(b>i@Z;U9{$QIHt`_vKs_HeweO;rT zXncmetQv1$Y$YEp6u#U#sx|H~If$S0Y`if1e69H|bWnx28(}nt5cze1#vHt?5Dc0l zburr$2}GZ3XyjUw4n+9MT#4`~bgc=#hdYNbsjyOiVRQfd01A+aRx(dgu+IWG(t>V= zgQI&Msnx&^P`QACyjbj*&yLStH9*dY#CSqF*I`OoI!PJ+Kgy=}*WN`e!MlKQ=1=i0 z%D_O&z6e?MS&CIq2C<@`$`wyg=9YeJyue(L*O1ZxDFf?>4FS-w;V^(I`-4%-2yBZe zF=uN?&RQEbm^nGL)rl#QZ2^MOoAaD-M3^~fB`~9sWHiN|wv>?Ve%KBvmKF=~I%ht< z3&q?|CnDqHu>5|j5X>%9MK6nO_HPsY_Lokd{*v9FSXtr5($b2L z`<~VjyW|u+weqBQoOu_lWs}>}7Rd05u7&2;m+YUc6H(Wx=C89=WM3v3e~Tc0=K0O$wc?yJx5l zxT*w!99G%A;Uun}DAX`A(R2BR=(@lNZpU|m&>S51`3701G6pL}a6ep{kLZf0tAWr8 zk%Xuf_#bboiieAy@fA7+j3p0Y4pyJ0att#Pe27p5N&UnY-8y9irWe!v3WfqLQxMY4 z-gLkU#HRa=a&|RaW(6ahtoHOxrhB2L{L^dYfXfZ#ARk4@v$HeA;Epo|yM$#wQ)(r~*e+CtyWW)2-v0`g(Da`hkA=b2^^W-z^ewg@#HSoq} z%Kh7BvUQRfF32+K22;gpG!V>%@1jTf=DU>Qn?01`o98HnO^uCHtGZ88Xke7q9 z6NB~*yu&&qbmpjf4e5 z*_{hkK=94NzI~>-Tf_?*MH06<);&Cn9M}7dR0KV+dxF=!ooDjKtr%EAqsb!&~5ak2HyOEb!@JGNc2MPusfW2%zdJE+^+ zH{Y-TAD}gB(?1xrnANQhynY*F!%9%){35MgM6sEvzX?ZB5v@`^*Hn?1Y!C12e(xz! z10UWaN_Sjw+TzJR_mtu&Nma#FHHqYL2+72s5-#JEhpF$j2F}46sJ1&*cnyc@5?Jp_bu4A+1723;@Xo=*aaH=rkutLoR( zAYJ|FZgICa)|zrwKZZk>EL2^$`0YZ`cg`(-hkSJXQ=(d^0w}f=Du9U(v$vxBZLwjw zgAfph5I{fkNy>WMSU!WImUZ3zOFdyyc~LB!Gy0KqzYaW?s7pkJI0YRaVwE8-nWx1f z8VP-|@EzJlzDVFm5GNLT9m2^HX>G8OM8@y;2b1CPP%7x}FWf6h4&oQQp(hmRd8#K6 z3WsLaKwh3F`oW04+^NI^MAHLtCB5-p+zMsR8@5fs{nFU9$%w`;9UD2|-pyWr7$zwfQ+pD0BXaX>J014$Z3 zFrt|fesL9>FpgEElZ|8Cqt{j2ls3bu4J_LN+yoy7r9@;g?j^C)u_Iuv;PKPr7xjh1c}4IiYVL?147K@ ze3?h{?U+HE)2oQ=3uzGKhpnRFALR{?>BCr^B%9JCHwua5YCNT1#X?uJO=y>IDwtY? zHHMZPgyr zB)=qOW#cgzyKjz|jPfj5gXz-5 zL@7OJ@x#rd2>7XD`N2lTQ@ayS^$hzr&QqlbpV6=^Vvuv8Pi|CQlJvTy&ad*h8fs!% z6o}8-jSJ*Zg5~R?MfgUNLAu!y^v|aXg|TAsw-if?Lo!sEt_~Wqo-U+y*%$wY z;E=MZ3@Ea63oG0r$;65@@+$d?qec9FL6((@W1}jJSUesxPzN?1MAT6^CL5}ImNC^p zp+vc;-&BEL1o9FdPDMnYXya4bv=$yy2-&q49i9qaBBqhFM2!(}IV-S2fo)JYdj!zQ zUMzIT)5-&oooYn!n&tib`|r5p{vk!Zm)d1yq_w?QRSuGLS^H?CV4!v!cZfDP1!kA=5RPj3w~X%9k! z_V#)k35PS9X=?eyHdgA8q@c~D5+zDtH^lgD!~*Q*arAX3c|cwp%TN3r*3tT7F31u7K+g3hvDnyYq^MdZ!~Uf zzHz=SGw(L^2+SWmGl<)Zub=z9jx`EkZ-lv-v$zd*09Mtm?@_sKywNbic=ZXr9mm^V zdc=+pAM7e$$9e=XSG63x6XEj929zks(U_zD9%X_Wymi8{_PBoNAa>7uN zJA008-1UYX81x&D?Fq<^*OwYJ!`Bh3w0*F)4^8+P(tOXc%^Sc?QFJcy=MWm>FZ%w_ z_brrUy@|2yTuV$Rol>{0e5Om!+kM=v7w*2^ef(`%LTHx|f;n2{MN4U8L^0D7Nr!;R|Xq0RI1!xCj2$ z`E^n+u5+$+--!!eb)Q=2GWr$QvvFEL`bPK-vl4e>1831t&``^_;?8n1)>ziX6HD3R zBK$TMxiPSS?JuK{aGrYmhhS~I0-!_S4@Yn1AVjtTUyw|@O)@2%sb2h`tQ_RXT_%s- z0!~7Oc(mmNkgeT0`D)JmHrcr#~iK^+rKc%X1u5CR7&lGzFx zVvSnOYd+8E?J7n3O=769fiiTJH|tU?$6Ib%WbIDwGfx}zq4xQ{fLyeDPsmkI1|sGX zG?Rpec8X;k!Ge?Hs$K(F1Yp&60_OfwP0^m9Zu?%sbXOE&*63S8R}dt96j_(r3OyAj zp1G~>E-=qYpBJ+@CIFEIj)QOWT6LGkil-ZuF^MD;-W#d%%Xzx7)_I!jXabQ2)sAzF{M{Zwz zxJ)c-({4tw=);)3ZYE2JC)lGUgoLlpBHR(Osp%C*f(JPHexn_dvvUC0!8?pY>wt;G z$`2&dh;q>i8z`9PG7dfhjWvb9Y7|-xyae?S;AYtS#r}PY8iphtOT|<>8CDf55U>>0 z^heNb>7=2C{U$&CvH1Z>8Y@O1qt0xd&PzSz`GH~0jOXK9@Mmhn1M>vfYyRxE_q9HO zRdJa_ACdfq`0mMpdEG3I1)W?GkUq=CTCD@~0W*$&mLF<8$ds@#KErMLY3TVb!ip?6 z`R+kG65J4lDq@6_-H$)N2kJZR7zTIV;#t)Sf7TU2hG#~$F~Hac2Y)pB`$7E~BIRvudsdb7i3 zWjYcV$qvl39vE=X6vu|1*>G@jump!@te|mZTC%WcF|L-w1AEhoel!%$R3gdj{D5Xn zpz+6QqZ`fseWQbWVse1Vc)%aPA~^E{sut>(%DpNqMPzptdh|TT^d64e8b8kvARRB5 zJ7{*u$r5G_0nCLUKuFwIat@)KS$E%OHP{>7lUmr6Rdjk)HX=}{J@zukWOeKA>@Y|E zBo2_TZO40h;dwRGIuF^KJCASbJnTD9Eg!)9mvO6P(DpxY@K5VjI?)#BD^P!ALr5dS z#3j&J-Rip!I;#s%7nK_kl9(buOFTCg)EU77$dX3bfGSqJrMUH=K0tcU0!G^28r5!+ z(sjA(kezK2oLql{;J6PW_Wj8A|UC0r@=NQP2r(i`QU#2Ti1tJCtEqO#U2ma4+wvp#A8RuLG&m_1qjQ=UH z8~DGK0mtBpXAQ|M+Bm~j5U072VewS3KZiAz)4e#RNW9qPl4>k!r`d446pgb~-aQQt z60jxMMrik!V#mgbEyxZTsSM&f!>FL2)Q7U-oc?7mnI1F^3qpvZSxJC1hHj-7IHtQI z_6R@IfJ3##hY!M1g&>y{UTZE&I!7Kdj=}Um7%7T=($KCZCIOuC9Q!y#iX3`iEl)0} zs&qm!RB!*LVdUYOYp^ucFl3&S3Vs&b$M>ever;PA53xUoJsWHPs4h&`caB2DUR=au zql)})#Zuladpn$HUO~H2tgtoEjK{H#OP2Imw5|^{aA1@LDvGQJkgRCXP)u@^jvEHi zoOJ|GD+sWXdoQA?vEw8a78bD#bilR{G;FV_T6Ul|Kfq%;IM$0`V+v3XVBr?aOvhqr z)8b?I6#D^thDW?YJQ>s)#m*gryAMXHP5{&e$W_4ckgEZ-r4?Erop+R8u0K@M|{8H z`v>1YVa%ZDC@1-DV6jBttt;p`B$lA)G&}&Po25`XkWWZ{CMhKmhr$}IL!e?l%+TGm zYJviaVBq~1)u&F8yQ>vActAWzsQ<;elza$=q(mGA0R*w)nhLK97z(l88X^ZOPDDYp zq)@2)78v9@@5n^Twu8T$`V0hwE^1-DC!O~jm5OQirh1I9TCfn(uBd56T(=4c=#A^P zS*aNQe7Z*uYXu9DiTbqrA-!)H*IgD`_4m=mrCu<&9uqG~}uUH9wgu8zFbvCC1%U;cDh2^*OKM92=u?LGr7 ztux2yv*Tez$*#i7PYD-#!)nOLR@d2qzJ`uiCCdN{Vy9tV|y{eq=g7GkMSC4C{m3!;fK>|FL&r>h7r-_O_Af;M&Nhl#-m^T7zDQd@pDfEMK=?h+zeNiJpaDBy0*I7<-xE*i*Rs+yrgEjOE7w*stdOY?kKiJ{8bjVPT;Aha zj)aimAiRT?V9V=XZZbrI?#zmCXET_fXvlLCOISjputak-&-f2sgJ^-qe0$!wJD)XD zeysedjtuo=rsi>G_ZvsKrkzH$64ne=D=4alHAt~!X!5*Q*eb#kmv`iPOA%YKB8YFr zLkqiKi;y}fB4HfhW$>_qM`}<_hf`(gyjQ@JwCX^_RrCpM&${(+E~>f(uWl3(u|+$I z_#6jZNAK#`waO4P+sfdDo*}$-P2jr**RCNNt4)FwR3w3$;}lAv=k2;vBf% zkT{uGXr_jmPuhWIwgxKh7ffl>UD^EZH|`lf+; z#Ii^gG%}k`L*r<}vsjGp9pKv%6sOB0qP*tdJ%j|HQ*)OP#E6#K7mbN5#ve7zaoB_fzgCXXwK6O_tDzwVs1eX1K1H% zjQ1yqzIpZ?*rqWi11(&|<{hei5}iWv_J0B6Htu=81+IAHq^<5y5VhIc^RknUt&YAt z2A=LHzD^1aPt(y35+)A29n(QZcH*+Zzc$b|;9NaqG2%%wjQJKWgAV~RF!z0V8Q|jL z4XT<3T=a%sK#HB4&OLQ&5ddPG2DZ5O2HcodRrhxrsT-OXSKF>P&eqmBcY=S1UfBFJ zdq-y`=pwI=HLOFm%CWm!fztG0__f)8z__B&nh3l>6@c2JS|DRo82SkTJECJxnw@Lm z0$O*n-+TZ$Au}n3<#Ye8nN)G!u^u3c(UtsUoo=AB{D@ZEYrB|gOFQnj8+Y+X#N*<2 zj63S+Xy=C@Edejl2E=M)Dh|Vck-8a76I3A5w@`aA;lH#*6Ip2X$Rw*z9{G6}_yo8Y ztYOO*07eh-t3b5t+m`0$mbU$b0}}X#WbA)E`#W$h{t}NVO%_mS-lQ2s<*P!0L!BC8 zr1+s@=EP8i|E@Nm5qFB>^W#%DXJh074X4?JdEF~ z&bQl^(XM>saQ%Fr>d0tUzN;6VFW&-7cnV`W%;PfqikMLd8wf586Aw@^Q&Ea2-7*ED zheJ}M@YRU*R)aPF4E4gj#pDy*)=#U`9k-nOcIcKS7NcVrEAI2jB0F*%cb}xYnc)oX z(3dnJ8#nOw@JaBvWWlvj5X2H%p3wIY2FXX5OO8T|N)v#P784zSu}Ldh9vR$Gu53Tp z7cpfiK@*XkNc0UvW2ICQOJpGKs?<(u-CyzBiOP=4ca$*)VLhypA}N~YAKso!JBAL{ zu1_|_kf8O8AA*fEOg51@j@E_UnX9G9@+{W80*055Y>eskLP~J`&?=Us%@jm%cJQ)n zwSbtbD{yGbRJ=6+*owClKxK{mkw{-v(Ga+BDFEj;M7_L^k0L&n?gIl){4mW;Yf=sL zNW^&qx?!dlq@QfyV~J1w}CM>!hQut_5M9e|j>IDn9}t9%`o z0rVaBGtH#MuPjlF#3lDB>Q@8&8U@I2q$%9Q67oSZN1e}IL{YdlQ7EebX4iS1h>~@G zeD0iVzBsU1_%3Yzle->n%Lz0;ZO2PL+AKUBHZMKQvaQ^>SW#x_VfSxaXQ+;_9td#C z#2=S%(1Au0vxPT1ERb}>$?Vb+V74e2NLHYgWVN;vYjkam-$vgMdUKk)$1ranr#b*h zZO%cEt(#?s#MAsBw3gmC$%9kOS9s1lH%tLEn)l+l<~uM>8-a}2kMs78dw3t&bE8es z#MSN-f61?oY_out26)=qHge7hLBH0{_lDLhf9w43@Lu{pLFh%_dXzYmm1!*Orb36h`$xN|O zu;LRMM;wt>Q5<39&tbJHEZ2nva6>Mili|W(nj2#|Wv@S@T@itqGIE8Mwf8DyrH>hV z*~(r61GhCHvsx}@S;M++e<+xs@tz2N2w|3nEei(&IdNwznsHGNe8Qz~w=zI{ zW+M+(eTITaAs11kW^_dK2LI}%lI-uV3s}bjfn!$SIxAqC$3mgw$3vlGrXBdep+jH2 z3IDDI{wr)RF7Bd0jxn;T4z+(@v* zCln>MCv|sPC(&U**NR0A%NgN7Pv4CTisJsV7y(#Ck%m?M6VR5Y(|4r_tAg8DvB>zN zkuXlCpR*c~%cK6>bj&4o`{Qkg+jw3$zQM`bVp0e2Sgw_tQUsYJNowV5}-dQMlL z52ZrTbz_S`n;O5IQanJLt@rD8KH(3A{5_LBy5dio;jzoVN#O|(i@=+Q757t$sXQWL z6k_+gbTb)guunM7C&n%x=Vy4Bx^&bo*^zW2j}PF5hNb$G;hq6}aT<{h5975tSw5^- z?u!au$-^H$g15s|!*LNbw@d>OdlP)d9;R_ZzTHr`V9%|h&_hsEBN7@#;5A4n7&OHh zep=AMvJSW^U)Tr(s4_c+3YhGb5U%Z2o>v>58V#T|g40WHiN<$U{@>+6EQ4vuLx`M2 zS}^Fpn8GeWNTDFYfcFMqIc7_ireLMUfSOfh_mfy9LXO2`tS12rMZyMF%u34aj#qV> zBGuJ&bCqx1)o1d({g(%a!Z1rAABxlGmlePeq#F=_3Co6?rP~g`F$XcwWCUIdL_dYmnESIv<@%4;D6&b9kkVo5PB=guGm zp78OYd5WeZ;$W&2zHbbR-Rad?U2N&;N)q3IlAuA%lJu}P$G1>s;S&2n*ysuSAv1z{LTqeu4!6LHYeh5 z;pbtWCu$dHyS$06YA?L1&s{K24}$dIyZo!0kQb%=8veO!`S}GwZQs&%`4Ht5S|7wy zq;`7<{e6t{dY&=A+5#Tx63HA5xr;vXJT^7dSPl?!>YkJzAm|vTlL_nK}t^|@fXRM&^-m>qiOeGkx z{cwPzh&W(?t`fTsi^nDXr^JouJT^jISeq9`NXy@~vD!!Unrot1=)=xhS;Gk=q`q_l z>t7=;mtLIUbDI5KqH(p+IlM2L0MS`!xG2)Q^gY`blskRp_2KVs6;WSDGZv zYqAPL#)}3f1>F+;7%`bhT!%_)ig$1jJrVrL^NZ4wQK($OOrRF^xk<$NC?)4!PmxAX zpT2ZI#76(KivCqux^fZFzK=-Kw{JfRl*mzbc>kqLQ;uFPNgq*7W()wi7n z>i7r8jvf2^k19su>NjI04EdL2>DI%Ns_Y=E!-rH;z8%-&PO*M3WIT#En(p3k@KGc5dy2uXxY0Cklq~5@Z<4IxyVopBeVy4Geoj@b z=fb__>r~5HyIWS#FE#M2f|sFnRf~uMGle*xKIYLe4$L9@PGf{Ok?T#ZO*7HFguod* zVg#$fUB&&|4(5eC4lzo-oyXCz)pEA=2;#Eijto{B;Jc-cop%zwle(Wm#;?l_`J}n*K=~#V*lFf>I>p~ogZp3ar!!C-on@Xe%aP)7WdrNYF@ffvw02G zSs@o}y>*+d^CY?-=L1{yME&oax@u|+n|W_0*3EKf7wfFd)sD{OWry-X@^*VZUO_I_ z{kT^{>wdK^KJGIx7m$D1DPIVvMIl4%0=IV+%3dNzzNU!YCb|mkN5eT0K_(g_vRN6; zhHNI9m!!ovS!Uz}544kehal_ozaAV2{<`Ccox3W|A~*<<>Q3(w?nGvNM>sFqFu)ob zufR$ZZP8TE`smFDZRUlojgl8k?WC8E)8@(Mv($G54@x{?kj4-6*d0O;=0`#nHcjeO zbW|gzk{J8vHF!#{nWos?aY(k7RJkCl@QAeJL(*R~FVP+H0T?7_YxM2KKy(%c#RC%g zq>?T{*j0$PDMFGHaxb}Mc|1wC;b9Fk16J|NirqKd6{>VbTXKlRuP%1uJR~pQ2wKsw zfYEZHB&&19XEG8*&gC^q#i#PJkMw zE0z1Y&wKZ@tEd0yoQK6tzeX>Zt~|T`2N1hT;1y4y9k)O`auFzk4>or)K7k)B<|Rsz zi5MIp7y)v^r~g8Ctx-e)!R;r(H*LY<*;8*K`!CG%G!c`PXh*peu%DVPoslQ;TzRi&Ni@rBYDKghFnewjRB$bDdBO z78v39LhUwrpaN8e%cszvL5Y zKNMt5iSfg12}>7c5iI<}qy1Pc4ZgS@FH6)p&^uxMIgKz81?}rFaUg4F5epqY*Qem8 zfS5OpFf~o?yj=qf)|@<5yv4zRCIUI${}Ey5n5U8ZHMcCH6^pD#sVStbTqoR|ELkO+d|cC{Em%5m zp}0`oiZnX_XD02>1C_)vIc)Jfz2>#Cn4%7Ep6+FTrfKdo$Ql%`|3eSYNPhjd@J#Gj z?1mVgI-SSCMd2u7qFR1YmhXkeviT7^IhMOfw%<(|>3H(Llf?E~w?)l`GuJX0M_=eAGf=^2O z`Y3J?Xq_EiVf%N#2TFQvC}~0;22#@q9k+-o@L9Z#-78NsAsr z{Kyc#0}DF;61RGJbcl4*ZC@otPJ=Q@%Zs_#GLKQ|o`QqwBK2vunBFEBDRx<`rv{KV zb#wO2q#Uu`hsD7Q2*vmPIaV3*XR>O&th>aV`4{!Bb+xG((Q=ke5#bxQ-{BB76<%yok(XrxY<;ZT!oLiWh z9IJ%j`xVl2(Tr@&4_`d8T3a#^G}?ismh7McrxHi)^TNE z3TPK1q5~)0GWQT>jC8iBZh}E?LogcTyQ#xrU#X7F&Eip@aTP6x81ucyHujZvDpTX7 zX+MOz}Nw~tBuY1?>-Xf ze@z13j`IVl#66L?swg4ZQTuWaY%&nj{{HCRt-sUkhs4W0!!h7t@K^9F-UfaNJP0^Q zF_&SAKp9}#6p&2PtUxp&OQQ!X!bC^h2bGeKP@3;5RXALXvdCwy!MyuI@ZQK!_>Gz^ zO&<$5wVdhnnot-6=y!<~`Uh~8Tem36mZ=R7y!E16bZ`;|`%&+FAA;fBGb%Yzr(W2t z#|DRn5BnwOjjCf6C-r2YoHQ+{d!zadaDSalL-UcoefB82tDTe(b>Hfl>MdcDEL9I1Kcs)>Gbp~mn=0#^L z!G{;73mU52kU}7H+osP)_G|s@E@R3luCp$vd1RbqoZIfrAJ%oHfPA)X!(3rx!ndAm0!VP-~ zj@Tq(Bb02qz^_1m?;y)O+Xx8ozi;xxsndSEI)DNcdofxz5wd8{CTx0(+r9&wC4Ty0 zzviUvk8j+y{SJ1~RxN{Zu%x08k0%DhOEh7=IU@fI?SDp&yqWe(;lae?y|cf)ti3~P?qEbw)GXu*!w`;&ARcqXS5l}=Sa*nY&jA;`l_lZ8`$xsY zhl}}OWWb18;Zh(HvGYO2up^Vh4g0GW?)g+NGZ$fSY5140u z=tgB!#WUw#_LyXP`Z%a{ibTy6M{OW-yO*%M3!lS&MO>p(UJ~5BbzGIlW%W4GZ!)f| z@RWc(iAzN5LE|wcEYsElLY)Le5PJHC?~#VtGYM&S0rX)BZ7@Lr6|sP(J~fv}qQa9P zgTqk7PZ6e)n0&R^!c(*m8B+oltm&l0Z${s#RtPG^12f=l6Bsxe`?z!CLi(O#nFqg^ zOWJxom13rPgWtXEy37r5TuLH5{eJfk6tKvMvKQk##2+U!x$niJy#v#`hA&2FgLHN- z)l-@BTRCN0)o}dm$ljIS>sIE|SzC)Hu2=Pioj?XH8U8{+us|VtStzr;l-;>Kni%LG zyS*~JcNo9?=;W8e6V+%UQdAF)Ik~Nv^7#5LYaAPGBD!)IXhRxdq*UiM!K(&!RBY8q zX>Q#*DK>?n23kcLM_|_!;21Y#ozn1424afq>nJ&`whoR8t15!$DEN&f zV4nCtUc6do`9vvK`4dzQiaSKI=P8sytWtOg@f*l%_~+pB^rY_#B<0a4<1-(ZzGo@; z6b2tLms|Pi?()kkpPWN9pGjI9# z@qO%WzVrWd3VzGOqdHUr4!q@`#&Yukz(zC;z>$Faf4Pv(H(-}*ls{}(?rI%0pkKpc z6L2~tFR6PheRLSH7^Y-++B=%@@qW+={c4RosbB@3Qk*Zgo^N~A_ua1(Jz*7T_@_LP z_50nwrPNO&o_w|){9FL~2%vYsqQ!!c%eP6hlijcaIgYU6V3)B_SexdZ?4+Or?BT0r z`5Ujb0?hh`Z2ZcEzhL*nuO6zte!K40zl*h!G|h1Tio{)7&?Bf0DC~B+{tb%-tk-@+ zj!oEj#K1Fnq~L!4CRURN)gUCBReI<#L(>KzPjY!)=-q8#{D=?vjd%GPQ$9noegTXmqMsXNsyjTQQikG;eUZns2mv~oijX)5_p z1q9K6k!Y`ozII&1SaaVd_I0u2ao2csHr&PQ`^&y35Vx6hhIntZY0wle>(kKDh5B%5 zofj};-EVog5*pj2TOI}N=H8>!HVyQ)XXtL6iYFmpU?2%$lB>=5#DsxLLJ}g*(F8}6 zFM`;|p!D5Iw5ytL)&xO!Y=@RM3Aa#W1Ygt-~*b$PP)9@A8iCk~IV+VA9>m zU}_*0Ox}$&2ahs6gLmFjJzq;V0c1V(RNE{zR62WVwD|(vdN;ENv|K9pWr1u?T&#yI zc*|KK{o+n{w(rg-^fXQPX+1Ho#^Vzoq=OHJXH-AM-t?<8)YU1^*svAMZoq`IS?&?g zP^);AEb^m^9moK6C87l2iBZ?Qy4g=;TK5;@TbGOXSt*Ctq;=2N0#Q3=JvgkI;;N~S z+;7EfD3D}D`6_jUufo|feZ-6y0o0;#=tipQYx)%3AEm2NzpnQ2Cg9^AIXuNK=Y1XV z;du^PT9K|}w%Qv1?X)0zvZZ7Pkth%)z=ppcyuS~;UJ@8VL=51#62$nXQZ{riz_ujy zQkDIq_0KwQd~*yq7@asQ`|2>p6v>Zm3?^pS^HYLC+YQZ$>bWV71< z<3b=dY-_6C7IXEDbg`2Cl@khlO;2bD*)Bt0U*|F)AxWxeSJ-_pK7kKJ5QIchKHpcR zO@@|mQX!$guxv>T-q7H&-<&+F_oerliEF%ITXc_I-|N7VWH@&g?Z@aCZe74rP zLbt`7<9Gx;fj@Mi``X{Y=j1hxmyN;N&Hb*ZPd2gyMXRvNf`NgisVN(XO6rm?MHi*z zB$~^o2zCGDY=`$0D>R&}_~}RB@z8X(BA2W-4=Uzw_pSQC1@7#4i`UMGc|!hm;}65-HAjlZT&yOFiPtBkEtzIEay`p-K`_yCU^wQ zYtIwqCteYR^$A?n`+uzC?wI}~-dgTi=+;jnGF1pI)Zh}Iv;&}Ryf2En57J0zkHAP% zE>~Z9io14yz|M8~j!;J_JgX?Z0Iohu3xzlxtMm1v1h{O;y$W6CjqiP1*gR~+A%W*3 zCio->DypVTgs00+%|l90MGJ-b4cX{}D{Kk@iuMOk%0XTKC9wQK&jJ zn~j)i;RWpXy~M>fzbSz0R+b!g`_t)2W=lF-nf#gRR?^3yk+-w^;O$@FYxxScl~hDr zJp{=USP|ir1s$BjJec*|gkY~r6DV^++Bm%LlF#xYH4^R`K3U$nk2X6Ou3GT(FDEm@ z3(sFXJR)-5Nc^mKA8tM|ys$8wN%Erl7x?^2bNoZp`@rvcqke9d5a+ao(UFYugf^$G zMx>1M2%k375&Day%}>)GKj~-3X@-3CV}=w7yn}DudH@k-KKgdP{Rpmhev^8E$LM9A2c`w*bvE_M^eEb8yYNaFe7fD;c+WacJTZGeZ|17I@f7Ziz3LHimZLu33 z)V`cdRy3t#gYfag#TX)zKg7WYH5^P3TByLZZcE&?UDqu+?+4LiS@STprc`bQaHF_eB`RZP(W+@@Q(c8 z_|R18`iIA^e|sNRj(E5b4TVPz4b`S+KHK{C4$}$sO^l7q&Q5#00Ig|Zz|XWL<&ts; z@p1a9=o%nF?eiWu&J}@+`S0ThxNS!&(8mU(aoO?DJ5~WvjrHgg+g12?ku>g)zo#(hmg>e!|BS5 z4F{G`=(~*~b+ku4a+i3go)bg!S_VDq{`bBUt^xP9yHa z=D1~~S8^9$oVAU#ojZ`j+1GoegMfr}79Zl{F$3;ko9{{tm`1OG;TuRfL99i)sSR$f zAw5yyNcBGhb03FiAkY;SjUXenSoH@3hznY5MdTU%uUTOC-oB3`efjXL`K1m^6!u?oRD^}-{X zHDrDvO?Ax2&;oEFjO+t6zjss{*O{QF0CPb?w#NohFgXfe*Ej=Fji~g@bVqFgl4(#K zaIh$cNg*}jr&9V=O-eZFNc+K#5J0D>h-et-uyB;8?^~zB-UTH-P5S(XT&xg74BUJ9 zfugdgzkmpgc#D_5H{P4c^v3C%@ytY2RihIbI{K)nLaxtk&~x(KSf~Er`bwh&MQ;j! z=t=7r`O+oieFbDG zrU?AiwXf3xT0G>B?MAqY`#kyteLL_MBvTrYnWjOT1gi+IcV26lRXRx&(JNX$9Ksb% zBiz?zn$hfp5mE-*w)REAP3f^cp(9!J2O5Y%LB*p zC)$|vktW9s5$0GZ0^l0VDL5_2;wikS#!xfOnYh{KLez7XX|SzOg-~ZgO?dO{&+#f; zaO1RWqNv zynv07ZA=UXGiEUchai@KaaaaIcs7qD3M2&k89XKlIQ%3}kK|7rNWx?xF(HrmPe^bG zZoTi^Th-mONH+Y>9#!31`_^5~J?nRtJBttMyD8m0&FA^~fTT8_XIJqLPW7xvPM7$$ zI0>dr`@e+!eiLx1^Ihoc15f3(p$v^-0T!HH;HX{(J{F_9({C@LExRO^X7}{^K!Wv* zBP*?}TrE2M1sja@byqH~NamZB)}LRfUB-!Y^0sO7fB;_n(jpB&+7M67F?69PdlEbs zSs-Z~V^;eEo0NORT6oJZ>G{BaZ91-52_G>_zxW1ITY2Y3XE1Pe$_LgpK&lpG?gyhsYfuO?9atY^ikpUJD#NckLBMG#dohdos=~XpfRztFBh2vW2JA8CL z2LrXlbeTa&#ds@_vK7ryF;39D-(rz*%h8S1&0XqO9L zUp>^8YrX3v9fEn?d|}@oP}M>~RRh3+!9IwBTA1?@uokk_NT`g{r^d;q^oN_R?~m9> zDAIYM?{sZr2TaQelFId6M3mr4~j| zy~#D@yACw)+R%j{4q%{@@p87#xhUjH985}D) z9%2$O&}KB?l0R)AnmKD`&C8DqsHo#F&*kofiQ=!#d)m-0zI@KiM$EanUtJ2?g;W{9 zK-FxxoGL7xHR%zaKO2uM;2AuU-KEnLkt{ty{mt6|{4Du*)KObLZ#xE(^Hz`j_{CJ| zA75M@1QSBO4^2>^tDqhDg}!$J2mHVF{Vvw|?yM|#W`U5=Hj&P=isIqwT(;I#|I z2Cen!L5<+L_pxWN{4`XU)A-JyNhZ#~U`7|{O#4<|JnsgO5*K*qKMMz^s5&J^IJCF>3^|kUk1ZMOg3@D@L}A zFyy@h;GFL0dmqLnbYlr(h|s&>ju7DqziK*DAhj_B8W?nNM0}8U9e$MJ4*wkTs??g~ zO9}7CnaP6GeR@<%j`G+D;%O(ir59Rg3RXe(ESw|73N$6VB(P!l+XWuRa-@O;IC4EG z7bPc97|Sq63PfEg#0um6kUS_^wZ?3=>mxADMPm%1Ui=JVlk%E$Ln37cRM!kgs;wH( zXoB$a2Z+tqE59MR(SU^L0ysagk?L)`r(brU3hz9`669wu8Jc=&L5+o#Z#dS?uR;){ zW!!qZm%fD@Js` zD!DPh(XfGC1KVbC$uV~9n7Cr%4OT#Ltz_K{fmcriVy~In!C39!)m!6M$T3s(L)(gs zO+Xa}m|LP9kQ&fe5zneptM~XCgE5sm&c?|m`axs!h3wF_i(bybo66b3O#krgkw~a< z-F8ijMc8|CrR~%6%QL%Py$gTYV?(3u|0lJ7Hd{=OzjLh*D%GcY=zPHKxlyrm6m1 zdCJJL5b`-2>g!Zvj2@$yBeIbYAMzw{;E`cgc>7|B#Q&gfT#-kHB3dzcn1i2ks$P3K zoX~(D=34oL;nb$9m^{f4vSI=GJrqobN)H&UhA zAaH{5H&QF)-9jk>zbfG$A+=zyA;0Pgvf88(I|DRN(AOwD2RIgF4`Jn=9BU=3=_)YY z1;x$92+eVcwc0D^lcW|n-lMSL!_?othOIocnII)U*9M>*c^>dJ>RcNg-(rh>C9J7^ z4BnAC6i?(nkl0PmhunmQF6YLhdaV<8jbMnKleMd?n3PUSG4n)ia_6q`iNRVa9*f1% zBohsERWuZ0i^zhqR}WaX-f9K(y~u$QcMF+ZI+Mv}3XzzHIKcI_f^Q4J-a;rkx1ly2 z&#{@wq;MSpOc>D&sD(5{NW#oUCT5PY47Y32{)r7J3+N-1RdCxPKssE&V4mEnqCG)w zyyFh}=^V2@t{O6oGqubq9pkSOROMpA&1i6aMA~pk%f_>IAW(`pPNZZQ(MXo{4Fp3a z{#Ys0eiDi|UN&#+lvwFBo&12jh%jb7hJ*+*D1_56kuA{xNVnODm>KwA%9p0cB5>Os z2o6L)|9X1lRLcbJCklMCOeJin->~s$Iq4Pl@k}@r@pL2d?Rp-LR($FBQkl@tJx& zfv4D?gbL2w?o=j}OW84GLwCqcED-EZ;bEqhEB=-7_P55ej$FARU6QLYgR zFfUi?{S9`iUWr8Qgj^b`-dd{+us0)P)xWvsAe=JJ@RoYHKUS?oi}`_u zVeOnuXWgQ>GScX;#E@0i*&LWoy3m63rIFVG_Ui?EK!{nH|tbQU`+h>(81^Nwf^5WQdF{PhG; zuFhB&Ib=vKNWv9EEKxmUy~!znuCbT7F*}tDWm1(g;vkBNRDTf47L47gUH+Bbb50?& zpS=|IF##+U2*%-cU&in=+V{{{d>ITXh9zr*ru%P^h+e`P`cteyzmGL2FL-_*_CQb| zs!p61QYeg(fr_dE{XVA2@7&3`*t7If<4(t@XW7R2Kn6=@Vi{s2)@p92l5MR;OTWSy!vZoof5;}CsHr?}x;*Iwp# z@;T9I+f8b-wk6lTlD8Sf(0&p)EU;3+S!c5A1?{h!GWoc`Q(8u!`CgjTXVIA^$bIF( zRQBDOBvt%=+GO7fm+3?BY<_FjKer8GN7~?ZrK3m1I!U%bb|*y)wIAp?6L#_6n>Zgu zWBXB1X%}8bWze(90Funx}dILx;bGG3rd`5ZR3B;}L-D-(Xf|Mm0V;m?OY z`0P16u85L$!BLIEVZqu})*iBdU*Ya@=92;YoG4l=0sAkO$wN>0<}F(VYuzEYb$l24 znNRWvZ0aYB6Y3L^{V=uplp|pk3?{k;8Q!SDX(832_Y#-un2dBoy|WOqC$y36Bih0{ zpg+kltUS@+WfeOWkJQ5@Eoew;C3hej4!H6!oTO_r*FNNg!%n7to1k6n<+*A#uV20Y z(B&C$U%}{jWEgwRPAgI%sAS@C+s#+*p)0RCZe&Y2-3es`86z@9`g9+kh~BOiWE6OO{&7@5q-_76gPTUFd~7-u30wEIn61>|6iCxi zSTqF-+FN6vJtZ&{&dl>wy90&-)`>4rozzgAU++Mvu;04Dj5zI*6ES}`ybu~Na>dJU z1%Soy;p4OcN-Y@fjW*BoCEH<{Q&u_}ORRGp?)_3avt+dZkf&u5jt4g`RkdeTnVI=lUWAgcwCB3M~;6RCzcMgj-8;rhH6SkpReYnQ25 zZLjcN87|Kyu1U<5`9b^Nb#;m>%ce*p)+v4oD?M;_c8DEYCXp5hUGUqgzV>$h zioT8jgNsutV*TNM%e{gyXNWUF`1>SVfZ7pD z8&r*^`JtmQ4%v!Q%f&!5rUr~!W*Mm@N`{-P=1ODd`j&;S0bkhIl}8oa>?pNe@uK`m zV)aS`Q!9jc&|W^3baVL;SspHZH@kO9=rTBOOL}ghImS$aO#rqZ?sx>RT8xw4L!sU7 z(JQn6q<{kTHZ&}9H|lTJd4Pf1II2PCeTNCZU%u0hHZ-~vHQuEEX9Aso2cQ7a^)~^0 z13Qf#!2MY~z;}4SyW`E2gjVBxcnh{J88+Gg*6AdzF~HBLSAc$B0iZ@4&?4FxE6Z?= z0wA${_EOp~f(XZ7%R9zNL90mT@KsQ%Efnn$ zMM@n=3|N)G%5cj8*a6y;PdRB?5kb&dmpWP79-BNq5z~EYRIr+D}RMyAqpqM=kx}VJM>6p*D`Al`0n0rs+pAw^Ks^s!Nb-0DdWn zoJNv{Uz(oQR1}bLD2ZRdMI`};e7rj3t|lt&e+)*KmH;fW91P^*$t)bKqS<6TXWKZp zw6qwEO0p3!Lt!MdmZfMg95MqQ?IZlFIrziw0}Y{e1dfY9S@Rl`2nhHB8trHav^Zgd zgRVe6#dZl<{%Jus&2jk+}ikx?x#k z`|u*X&b*0@){h)P@84wNM`anYe;SL9w(18D)?46b!Do=pW(6_5knj8`EMhYF=;sUs zC*#viy?Ptc>eSvH&mJR&bil29SWpy0xaCm9YZ(Q&f zHh=pjFQ$4E7KsGCFy->>!}0)(sFF+4udGBZyN9_k#Ay$nS1`bu&L?K?q?<wN?>L7)9!LU>NS&w)@tK^; zpv`a>T94KOej1PWTol(qfgqA%{Pl3xFEvAkjx1U-LM4K#VQQuvMYdt&8x91GkO7;B z35=kUZDm6d7PK8r8&fqCj-D$1heV^RjwTzbk=D$)s~sdE?PbURT(=bDRkRgE^M^FR z$mju8Ny`cn-~_`l+t6LWx0|J;69npb0F{u!%nX=#wW%wR%CQ2$6I+j)mv4tcS@5W$ z&93XaeVwEO>_yQ+m1)?7sBthk(F$W|5n$cm+h?$&RwT0|?a@Bi;($uLx%nl34Wj0Z z$C@-2N%G!JM|w}og$y8_NRkWvPY~ER#Y%`-Mt^9!k}^WJomU78O_60of}g2mDRKyL zD4Hz6UAJiHSg4Sf0*c>#L8vk>GS!HpAO~^~$(Fy=)lRh^LhLbGa7@iwMOdYPS>_^V zscBF4Pls&9G~qIl$6_9W6tCc)0R&Y=Eh5U>fJPc(g@#^591ngX7zJ={R&z80TNxS) zAi}q|J@;UpTPHbcl?k7hBXb6CBO=l$VTppCYAd{}sV%*$w5%n)cIB-pS`|IPThAMy z7^Y${;wft2o(8=Xy$&rc)UA+zEhQ-#a#YoK$url?6pNEGY@Bpa0-b$GHB}vHqoEH? zC>Bzu$XZ>NkW$yi+-7ic!^n{_FKxBAHJ>%`c8#>T=mT>LZi%XH2yeG)vWdhT)}_$y z%F+Wm-mV6rHC1g%wvefVNiGsXNbqJ-0R3ev(BJjS-M1oR%JRC_gU4Eh#uUEY54_`} z2%k@kdJSzu#EoXO*L*-C!$~nLX-=b+roEPeTLu1O7q8#%`YM*s)fJFBjK&r{8ISH zvfVW0GL7!&Y_g(TdZ6uYEb#OHCkw8CY}>yc^Z4d59B zs+(Y!2yhd2e;jPO=O;TGE`)%$hWVcY56M3tlY%^j5Do`n8PN;)Urb4;+`Wrk#CP^= z7-Nq99JAH)4_bWj2QdQuS1K)V_$RLn>eBu`7pZ5tqI~g`ZbIb17KeCl?e-Mj0aGeB zqAo8jE-o$OUYrwUewsviy|pw>yK(Sn&x3(@8+$vD#3(MJir{4=J1!D)K*`<`L}b7Z zP1R||Ya)GoO$9rldtL=~>DKo5lgak?Z9t2Ty9~-mX2KE2WEm$cMSnk;WJz3V|6{rQ zK8O1lV7MID_2Wu3s)XVhv){S{a6$SVR@q8AI}GDWT==+Ujocb;5!H+vh9MMYX5l`oe%u+^XHz2{QNdT#Mr{6H4-J()r8&J z{v$gLF2)Rg`#ZJ?28XSbea2j zmJ1?%T=FJe8izrI%;9UwaY+LrE>{9^l~rwe7lV3w?TJl3h&>g{4Z%xdC>JY_8M_Yq zmdIG(UD1lfg0dN`*_LcemG`VWzHXCmZRMiLrYtv;(OhY?>_i4VR&d|sxNHm-bVYL$ z2^gaF!rA~Q-FM2Uw*wdS*@d?m-_k2*# z(PkgiI}Qt2zvtI|4;E%v$993rkl;j$1oZRz5s1hO;*g+D04cx*Ezt8xf1_p`T~bm7 zSBWuAJ`i?(bz?W(Z~%IMnBs<=lp^U)Mg{fl`7RJJ1f2(6H5)pByl@dE_x<&q^M?`m zf*c5CWeMo0OtFJua&{vBN0DbO01f3dzV8ZTRCJIs+fm{-ar|AT32-6S?G6S`g zBf;gGJU(y>Tok1m#xgL6;zg`Xk1-yl0;j4!Nat)~a51(`&|{&{}g?))2x!r3L~l zi4+kJbV@J5`Dzkyh7l!sGq9-iM5(YVLG-zItYi@v2TpIz*heUipR0qobP6GdG(yq~ z*>^S>H$8)-yr2eTrCe6zfV!Z4Ozbpqa&hBu=^Yzi8HY5iHX7I{09Pn`ds&=bT|Z9N zen%DPa7WjF2MGa1Nqh?}@<5M-DspBMQq?5rneH6~GD#2ieAr)BLI~RmRUl?%G-fD8 zgwQZ8Bg-G(_*HMg9S|Y>JJimjy`TF@2o(xUh^Cybz{w`;LdvS7WwZU0^}&t#XP5wDRQC5*B9BS1lo>Hrbz+6T;kh734R`e zcSCnFNIJ%?#`v&3E#+bc94AGt$ZD!xPXqeF<8G7nw7@Am62Fo!O}L^pJVoCQ>Kccxy=w%A>G&t>;O4?3D1@Yni*>?ri2 z_gscc-@4$mqA^4=llXoEexzhQJPyk0J05Y5@(X=7^w1=l*FZ1%7y^M144lr{*tL!5 zdndj6d>?9sz$h zZfHY6OGF!xFYQ*!EJHN$g8jYGoV3{&6Ajt4n?0kww;NyofnU1tmpvm`QL%mJCSSCc zK9c_fc++Vi=U}knf zUOWjKdvBgJ_*w}ujU-DF(1M($w4hxTlOpg)NAFgq1vB zzjY!nykpmh!0g!#FX2W`Ndw z2^DkRE!$g)@py3y$m&GUP;%sBl2maoDG7fVnX1OlsbJVChtLXak1OzXxQKHoWODZu zeVq_HuJ&7dL~=Z&IpXrj{-r{=Az(-D>PC?wI=tOHUt{*X9JX4?ate946|HCA0(!Ho z-;lld*u~i!bh&*Ft0`H`BdKw}kP;;RJ*IV*ybbPCke2EbAHD4^| zZ`Gr(MEItQm@e1f_vHTc`{4HwKQ)U!;Ny~*Sng2(i7ct|(M$?`u9hT;4+kM1n*pPS zz7?6S9PKqJIh)*(2n6CglNmY5-fN`Im%2$FqH(DmlcZ>9d8jnjBm%{*PeeX!v#)8| z?dgL+QA^l%0yt_1(<_E?*nx^OWIM@BjUz-jZ!imjeqp?n(J#A!EeO9E3Rgm1>NT)L z1o;RKLJ%3AEgt-!(4>;~h9C;M0WREP{~|w3+N!BaNmC8YRaCgnk>_+W4=az`a{*?` zo-3?sB+V1y_$dO{J{*Wha@6^7y*NBg$Lwg_eXqsXcnDAg$QO^-+A#aTVrl9TshV=r z>Upnx`Mhl-Z18*f?j@W*jxb6sbHOf?reC;w?mFKOQcS@r_hGGpsf9k963~(RqDSfd z=xqO(Ol)jvCG@LW!ft=wa>~hnKomp*ip)1I&%AlU&nGKXX3KJFKm1a#awUz&_%p4CoB}eq(I&skPHd|N#Ep>PWIptyx6F$TAwov}D?sD}6Z zm^wrWXgp%{@k%`CCJi|E7$C;Zeq*2-){hjCa=fKQ0?#^#5RNbWv$zo+{e^)g zQrC6AC+RPD_y0WAVJrVX8US6QaGD|J>IC$d$iM)YZPLl2Pp~>bH(6wWobfK{O|0ds@(6m;WJJ-ss=|`jAryx4cazR zw581}7U@4MVweJ}7(1V&+JRDSMo~P@gO)ErUxlxO&rpNBOe3>JJ#Vc0=Y~#&9qU=k zF~$wHJC@JIFuwtIH%8lWUcO%+r-QxmTJXA1T&F22Mh@`(b%1Z8kjG7MrMbvqR&E96S zz_x||9?lt&@JIe9-~G*3!>*AJ|Hi%Hh>;6_BoG*Kf>(#4!FvK_vVoraGHjr~2b3k) zH8@fP+1Eh+f%q-f0P>TV5%F!FiI)=T5(kCWLT$Omi<2{a0(<5`gn#XE+=YOyE$ErR zjql3TU<9YIw|Dd78zbRz2qW)H$ujO?eX|H1E4;C8=H0O|EfaVE&+VvXAhmF!Q02!~ z+>G2qWA8*cnH$wI-0$lNX$drIfY4`2dryjI>OV{kf284z@OGmGtd8Xl-$d7W>;af` zul}^iQM4;x=KjdYBxIuo*O#E`C?~;d2W|r9lBvF3H#6*HFnUsP;JL}S7`fW=IX9AOO{tl|zEgvLV{M&Buou;k9)$7!7|G!0pAG`(bHn?FjkO?c+ zCH=#vbW_u8^PNHW+eqA@Vaz_yzbgUX>KgY~zLNTdi)7r@j~gS1Ue#-YV{|*pCC^K^ zqx?`IZt(CMdYpW-$&if?L6{Tq|qUp&(j>ypGAA#t& z=pC^C@ymteTtiA+ek^Dt*H1rrBDB z!L)Cc-sPC3XmE8!6r*p<#pK}~u_I=4^>P@FOWE_Yk;3U$y0}pv;*OvS@(Amw( z&%m9C1J+@CmY2u*_7Hb0Dzy*sBlaAG*l2Kt>or!qsNvbh${8-GEYtSPN@LbcS`J2{ zZ9C5+;8T>4``EGZpYt{U%wg|@zyECS1^zT$;RS|T-E|in!8U9Ws*RIN;sS;~Jf*1? zE67bx`%{hCR#yqrnr+~0DI7}%tavgO?i9vRiqjb?bguC;{*~SfojXK<%jeKWVQo4> zxuhV;Vh{-NPmAlo3g=^jOM-~iMQ@Y#03?A*!uewwNkTAEZI!L$fmPrZyl2Lknys9$+S(W z|7Au8wER4z+X17p*%E#dH%*!0-H zhi?L2fU@IeP1m)Xk)SqY+!SWPurhsxnMmD+RQFe3jl}o2r6lMsu9#NB!CUN^p`jVO zkv6vGCnxh;jWqESP_5u&TWksKO|*H8^J5%)keFZ6Kh?JqzBI{^A>^Y_efAOKidM;~ znnV%BB@&Jp0-49dp;wSR`6D}_y&@E5XM|$pHDY&qk?y0-4()wbAYi>u^AsOKtuFW* z*rJws1XqWM3A*LeDM9w=oS%7{Ry))egP**)1byqCBP0^`tjLk3*S=Y!>B=ccwc07J zKg~#q#)k@JXY$K!L60_^NB&1KcE5|U`$?|L-HR1`T}{?&wq=4Hg7YRmgjb*Y;Sp&T z$D5Y$3RXuS<1a=Gn!dE2E$Hg=Ep9h`uD3UI<5&sk__uLZOCx zMj7inaOZx@aHKt3QpB&Ol7nIH9Tpx;iW6J*07=N&e~ zfj}dLBmBhfEjlz1<9HzrO`jeJ{rknl^KuI3x6(9ZOuw3ZQ9ECoYQubZ(4g(ME@-#k zzGpZ<8a3SFy5>#0H*hrST(YgVAbsJX=LtGH;KyfGtupqf5{)qM1MArZLVN zx#{X>{I>on+FAkcj^KMDC7=gMf<(l`;z~*pu2o~-mirg${fpzL7xVR3^vkJ;6aP~+ zr2T2!iLlqp6+L%jYw2|Bs+?YtQ+xJhzN4z&$?V&MzWfQ~77g!*n*-@AmyWV#>`u31#(@IXA`bP1=b}ES5>w$;`!<zUIC$_%oO+r???C-Aa?@~LZ{6n$RBG>s4-<*;bmV$?Z5b%x6A4I{pnmT zy?;KCu1A+sbLxIm+P0?}1^#StD(L$)XoQs(Y5Q*4}JcI~)v z=Nan1_9AW1oE=t;20R~2%g3#yv3cvw-$_6>Z3o+r(PefZ9EioWRy4Tt#vQ#2|8~tb zZfV^SeB7KLdmsVyPEITo4T18V@mvNUC?nPoDJ|nktPXrN!3sfqY#mWBSZR`2mtR@g zw++tv!O6wRVGFDKud`S04iAUF{>W!TQmItg_gOt|4dY@^R*j)wzh`$y3VrsGuZM^6 zI|}sWgeSFvtifrK1tLi>XrP3lUmE4ogEPYH`0TFT=U2%e1#K;Z9CsZI_o$_hg~ zBG*nGmEp^zz&kfR6&sXvy}aGXU@>gz0T#hDsEoO(SV_%7nR*q`_OW=v3XXH4WxkWo zi(D$0ga#yV{q*)vAo;q{U%VF2hME3G+%<;DbF<-U$FHC%c||5Vb~I@|%NxF>o2@mr zlkbABUhd;rAvgwRUOU4JW$xW9d(xBen|L3x6zg02PfWnP{yPX@Fo0ziwwygi zj11QKj2_2ROl?eD`N}INGO0-&;VbWh%f;66z`onwZv(YXB>%X7QX?IkuwRm%&8E>z ziHxvNi1=`{ILs~_V+dB3+WtF#@y`9-P4mWUuf36#G9#JH$P{g6Z{_98t&Nc5P?9+n zWB76QRg7VglXWj4Xhi+-*A(1GKYTO25eb0^nlJ>VVVskO5*7tmBN9;UQBHDlY7-^+ z=2I3BJ_j%hP)&FOL8c}(T4E9pgP7prX)#LQF2))$IEd+1!p77#9k^G>br8T~hMbI8 zTbpzSL6Ct&5@%9>pGXD}9cjwCzHQ0~$4n~}Kt==$X%m`T&1e$owEDzbfyY7xzG>th zFioYXA;nlK5L0xC+4|P)RzS_e>s5;MilEObAg7c1bwJ^XQ^i||?}gd`9y0{9b4IYvKm zN~j(wMu7Q76brRQr;}=oT&Y?6KwxVrYC3QORKD@jMt?N;&ylDx*xwAvWa(k{SU!~) zGu^F7D5WWnV)6n(=yjhi4ru{5RZtY^NdJ|G-+D9{Erc&;QZ28lwk#>>63ozMLyz7m zoN>H5i+l+O`xdYYgM!jP!{mfB4Nc+cHOwi=4KSwq3>T5x4ru~kL+9y3raNCEwag#| zUn_T2=K7c8Rc8Pc3FH>8`k{=jrlHf>i#02ox{nj6QaGxn0%bD*qR9!=9YHe`KrmVV zTqP1>Qve(%6N4VoCtc{BjoHFp2uHO^&v!bCwi4&dD!<|z1+*{ZG1pl@6S2wxUpCb%?VGApq@3jtgsM8!>s9fL91Z5E# z4^757caJC|V<0p!i+tNtWGh{wjff>EK~9{Y?X%sYz_%B+z&uv5orvfqyxs>u#DQc; zzr|DSb?jW!Tad~U>yemXd|AWJQ$VUvhOL*SV3H9lo*)9#$Y$kp_MLZhH~{{Z7;=oZ zfw2pN*$Iwr4WKai82qB&>-w*EO0PkwrO$Pa-_Y%3YqLS1j1a0WC89k<>;55t>prNn zdiN;-?aPmsknHoAiX;nSEZ{d_Z}bj+w03Oy!_1p=q!%GDb={)BFZP95uUkA7z<#_#Ue4%5~5OS`NeVmy{5N$Cz6VJlASCq4{ z?2UeT-T5!9zSfNolkmlmWiHzOfEQjE<|7eXevCo6NwK|*=Vq!^=4eoO6eit7NVv5?4MJ+`40H@UZ{_05 zBRtoqDg=V^J%nd`4^C}ygYwVI~>sC;OO;|ETiw5-3y9Vu1$hJrs7 zf}VbJ2|B{7AnEyw-OQ*2vQ0V^!SQht0E?-&ZV4^E;CHox1X4gup>WRURDy?ndlaV0 zPSHFZ3P{e^CBuA0MFAvluV&{Qy?h^Iu`K)&q_rZD5BYGwi$o%|A8HPn_=>s!u*f zuz5epb$2s0qV~xs2}N8L#y2=@vU4)PT3X?#a)Q~?zzARuNBe2B7oE!<3MDh4_77F{ z&5vu^AG|};KG*)B2J@)!{a)evnh@mZ0j`b3PxNxoopGlnHzn4V?SA%*qZ5Zh&L}9Gz z(A}b%eL85*D(Xr2gQ7XU zDH_ADgPdPk<+8sH$-sq1xX9x=faT6Xbu_)KSG4#fEa(svCIN4NG`uv$Dv4$}4&^QS zYf>eS8oH25$H2^5Zs>4pSDl4c_ZAje-)|OPa(J<@w*`sn(@Lqmven&wV7t4u4YlZ! z@@ZCT%&yF`k4u&Qxzf&kEd7QpyW2n7w{v9?Jr()9Rh4pF=ae3LXxbzTFm2A!-z2TGIQpP9f= z5LyNVltE3xH}NuC#b{lkt_zQq*%|+U;Z%D?sD2iyT8;a$IniE*p_t}EUo3aFJhnjl zTJ?n9P3L!k;|iwVEU;>p5uqd(pM2Rt^>qQntiozj(fEs zhGqNOpI&))=~U_NZ+?PIaG$V4_tNj(8(LawweWrwYv^}iWBxU6$D*9Hz>sjk%TgZ@ zV@fTOgwCB)XZ$j)O!B(p=DK6}cJce5rh&$SEfZBDMf(|$aumX1&Oq29RlYY?ml$DA_LJol+Gjs*9BL?Eam!Om zaNr;)t;+C>CM6c9xAN|6ZE9}#B0s6L9S!yN>A?KD@Y%7!G3(X zi&ZwAzDQTOiUPO_SYcaSYVD05x|MF~Pq*o6ilk@S>gp?XRq*kBPeOJoz+wY5k_|uT zOFL8xxW5R^ZY&mq3#4(%u=)N$92^sf+^N$x+~;uZPrW@3*ux$|x9IEdvLWzT6|%v? z0TMP3-!Xz*A4uyUd?Lh^KkDB#2zMtPP#4P@RD{^~?}DoWFMR@gEJP(>W@;tf<{O}B zcFOoY&U2QqF5ZIK*n|f_1-@IH&Ef9wq=<%g8Kz#i2B7cB{6dx$f=t7Th!H454NaZ| zh_2vC{dO~*1I?0(TKEtX?}Qg5L9=1Zt3bZTS2fw{oXW-q1I-~t1(ds0$Z1SV$24QQ zDrE_tPl*lb`cO=<)M5b0S$09S{8NP5mz9RMfxw6*q?oza}$$%kM)=VYN5YVeA?bWzq(rJg` zG@*M%_L%cqGUE|E8r#vINgIxwKQ=Mw1|#vg{Z}a`i1-rCd4l^#k#E#Ia%`SN!*c&c zbeJGDXbPe@G-rw8fR`i<2hMU(qt1D>HC^_f())+Oqv1XTrg6LQZjj7e>D?sYmaO<*$By>~FvH`e?xgF<=3EAYP!w zxKQ2}304!ksJyo{`v>l9eemtJ4W)g6pWEdY%-G(VxOd{JAHF+5|8pY4=c~}0CHwA% zKA~^@`hqV8bVhTgO1>prn@qTn1WOHn5-dG17*dEW4{UBuZG}0J0{JrDdqVzhWkxfZHIfdQvnUPFbZ;mXPn_YE_0kBW3Qqbf=k; zbVaT{-~Kx%5)HEaNp`XAGzZ%&gH6W{o0dIgs^3e{Q<;(*iWH)5A_hb#AR$O08Sq{T z|Do3^$|(yt366qOgr3ICic*XvfEgD7RzQX-n}|44NdjCzyf!gWLuzuUd?ly-w~<^# z#KnCX{L$C=8n*?$co&gGhIS+=EYGSlNfqlukSw7vevrJilfZNc1%QYpSsS2*={x`nzAcx}jE?4eC=55#oT#eB# zsYw}elmQiJ07U`#5D1oG2}zq(R9xgo841#d#C2N?^s7SIhsb(|>?=AXORjJ4DBbbV z+^-x4zKU;rllsPvj=SL$Ftr@3!N;`zDRb=T;?c1)g3n>$@uOpM)@WD`{v7L4OaD|h zhjU{`1#d%mIjBU7^L$0Dqr2hR_Hv**y`}HHeV^$2&Auo4{^urqptpMaQ=L+j_>_UB z{?B?$z5Rdl`RWV2PY4TwAw$BWt~R(wG5mtX_L-mIx!#*uNmrkt^%+mMjE zuYWP6m%PX)E_@&SJN^r6K>+;1jmV^QH%25ST%*7;@NBeva+rN8kmU^QjWD6by`^## zxGT6_Xi|U@EBFcI{UM@Bjw1DGED@xzt`Iai`CO2R4v9N-vLa%oMnFgsL=+3lvI=i* zIbG|&cmxQFnPMTWD*D`bU`J~@(3?NKFpC{|{$K>}~TU`9v~j+ljSGlHt%qj@_Nxdm_?b4aB3MNr*?aiez6iSkz?AjmKT2FT)lG#ldJe z9Np6aMxxt#xy--pg#=PQh2;eZH--U!bqR?kOa$M^LB_IS_&8{>kFU8IJO=38Q|zZ4 z=VAof!DD@|#Cq$wb%ML{t*!Jm&|4&uTa(ZCzW$A34aEyTKv)WT*sb4|w!CmI&Zrd=08b?_m+d z#w-xn5DvygJunKOEXfQb)VLJ6LQz;kExT%{7)*vDDS2enXXN9@K0)uzL_d1rMth`# z7JbIsTwd13=r&ZaFw%j3Eh@$c&y4Ic8t-Q7=JI}E&-+TQ;6P#<348{RLzl$I4A zWBAt)H|$|ald2V@g1kKlW4k9rH8I(B4B|2xkfgym_S)Z*5ZHet^Zi7d3BHt(7i!Y8y3StHnRX+tv0AGRwjimbzh4I{IG6Z{iqB6E;>gx1il4fT# zHbMJ2Gcdv4Wk{y_wD2bQ$VH|rV!xmdp;+Js*SPr{O4lV?6&|mo*Mk2m*T_LD$2`H@ zH}SFm_(34>0|h}Fgg~IR4}^irw1Nt^7F&ym4KGn8=#t4^c~VhMN`}h4W2>rh?J}SR z$8~d={v&al--`{OQ&_w2WsA_Yl~BX2guPn@A1QP;I%mT%2hiqSiEFYB>I`4?CWfk~ z)*md5vU3?rY^(H7uAA*j+Kce@$4;K73+7y$Aja6pj&+h(Z|*Nvza zijv~kB|y&TdI>)PW6_UIOMApH9?>jSDc$0RK}zHQFGF-s`&rBRd%PC!=C6m>TR;KE zIow-?IeeTevOLW8vk-DY2_4PESGA{E5I0Qo~I${coM-hQro>9Zj>j^!&16=#OV z8rNjD&$OV55%W@fYZAIP==rKIs`}EY7pPk40zay7`cF7VHuTpNOSx{H=<4;`H29H(isw9JbOmPTKt{s*K|KB**gRt6crKM_OqhLbyUlrD_=&; z=kGyMDv+Kr%Fz>OfkjirC?F1UKGz;WP@S35*PpPz9|(Nk7F+hC?Vqw!_9y4OW1Am- zYP)}V@;Ew9qCnt!8r>|clOi()OwCWMwER)-TI0*)#oScE!} z8~w1-Qi5bbys;&nL`~{f;GK5a*aF;Y8N2flT7d32c?c?YHIPbMb^_T~CuT3*wPQZa zzGxYPW4I4c`p00P8Y<5YHte(&NW0~1HJ;YAEhDFoSC2q9PPi`$`+ayr&7($qorlg9 zYdzFws0QQ+s*Hq60F9Ja1)CXU)*vAOQ=ESRWt+k+1!xz(?+%57iC}3~*Q2*wqXZ7(` z9{P%a-ha3WHDnO8AImK0R}XG(Q{|!y!I=nSFd_YtIION)`I~Hu!+~;xK7ekp{Vf3K zvb%e5bN`8>7$J$}E(3R{Kj%bp3lly@?Yc{UCyee4b>QLWHKy_g;3$dvW_& z@nUv}UQBVVeqO8y>Rg8A5-}3w>eDLU%6AGKb&R{)e7t#2Whqdj;Avh{!Hj zvyz0Wk7fjsfT6Dr)|dVV@->D&pOT1f!|-oHBTd9t0QqAIF9L1d-Q@zVeR(k%cN`bd zQ?BF0ljBEUF<2ixQ>HZ5g{cB2ux1$<$H^F0?b-5NDx3m(2utQrm@7l&lTID&A1l*5 z$K7}aV;V6lk0EB|Yv3I(N84e>5yLks5r@a?M~8ylA^9F+C;7xfzs~RDchIer`kl+7 z0@f6tB|K+q>|j0?%g^U8y>t%ynjU39oYaGHh79QY;&Ihxc0viLfe$0?7;eKo@VE{r z37l8sxMRlG+;WE?x8|UyqO*gD8q)#V4H%vFj;l~uQ;S(YoZ})$M;5h2B1H?HcbWWBoOok*3T-7B`-MY~BSCd5`(7p}isK{8The4ylpKLOQ; zG6=GjFLX+i#LDisy$gXtr}QL5n^&qZwfpw=KGZ)1G;Ok+Zb$q&^!Fe{o7-;Tq%RbR zox*x`S-c|-h>u!-yw>3RQH0U=Ba(j2j)ipfDXRW?HYI4gz|#u10(KL8oP!rDW&Q>OIjs{W z46T5)G~x!b29kPH2D<#F@;COTbk1d=EZ>EZ-eTY6fPJhSly!QjIHa9 zv+Iv#I|Su9G9wsfT!$eIIZ5`xUIEx|4e2cm100f*iQu#z4zjv!&#Oqef)omRD6AUD z|Dqvxh#j=;?Y8DRAv>6gg^kl}ktTL~nYQOCvnjh_!BC)R1_DX!V>W*KV{znsg1X;O z3=P1ZQ8N$=2X%;Jwi(dW_gkhWyYM?QbVFql&INEEl2+Lf+rjT#+%@<@NcC;MJw@sx z(CL3cAHC0uBN5}X5AM-|EO!QBr?B35y}td{A1?}3_qb4K$Hea9^E5(l7&zpY9nvbGydKTYwx?`g!op~Q230=razrNzKCq840aiLM9BJ*hs7KnA%mwLN4 ze4Y<{LyLyM`8Mogzn9EMHvLW}VyyTZ@Xh{vdWz^%^2d5yQrREi`}-KBIN zZHdTY!jaJsFMfDv|KKXo3_&@@hvtTn2+?u|53rS?1A_;1u@$G^&(&Q7NW4_tm=FxC0BH=Txsd-V|BhCleT_`h_ButxAn z{F}bp_b;HsN$3qa$dp)6Xx*n(AF6AKdVIUN3B(6z_s=$Wu>{HlFGP;)W%UZEt^zs=-FP z)p%y(%c$R0@r|FPdPThy>4JNs_i)Z`^2CPcSZ3qfxv%I~U<3RrusDFX0w6=OvU@5g zo-sq80EQiG?Zl}inleV0;3|0DC=#>~V>BVi$m9e>jXEefQDte{@Zlp@4>hLYG#LbL z#PDEcAf@a1tDA2QhL`J&uS8-$^)C$_Na>G7BdU`gNT(x_p;$DPsqU&iebMlUbqLQ| zYRuRkFP4V_nZVYIqMwht-%}M93YzU->0I427|7h1P4CD?(s&E96Xi_20_Z$k=e+{` z+zR)F+XFv1L?v+#4BiW3*(J}fWZ4@qV!-p3?HEiZyCq?Ym%Zf~K^)NBO|F(o5Wd-K z5D|^ScpG}qMWO-YrhbJCnkIjZZ?C|)5A*QYU^;+X#6Vui+J6Lzn>X70)iQ90Dtf$1D^8n@P zDdGbwpMFr)&Ex=vJ zFF-q>PHoAiQrRt2G~pr{^U&N(sZc1*%pI~yP;wG25&jq?i=`k*@55IB6MGUB#4H=b z2u}zy$urLBT9Z#|vbmwgFqA-^pxjn9ah`lXCxmw)A~Z2vswCCnGU+A37cGY(R#=@J z0Ne}fLul5(q#Cv&x1B>dQrrv2<$z(uEoE;p68$%1@QyB~2W0G`TUxC)AP+E%_*qM{ zm4TdgAFc%N({clftywDw@ORQ9G#oIW&?yP_Vb>K~{X}(Ub4dv~b!$U)1ACLK$r8t|uR` zQvde;E%^rWxHj@zP!_&h?Y}bvj`40s|K&ueoLR|~LqB@=FX9wi!7bJK;c-nHAD*w` z;9=p#HI9J4pTMDL_xIC@6}M6SV(UMu4fpH2+pDwU3gufq=hwXeZ8d1kCN=+=E8PCp zi>>L?FIYvs=8712@_y|@*st)Wf~ry2Dj`B@{Y|n2lRWad%;45=(!;GthPUq1GeMDz zcc!-eP5z3kca{(A8%P~h3r~N8AKDAsb(UCG@@+;In7<+#$ zQQlA!nho#)X)Xx65QL*ix32Q(K;E1f^BCqUD=X~PV!R)2e}+aiTf#7Ie-j=jEw;N& z2NpYNh?rx3970 z3P<9B?T2C`VA}y#;%k)PyZ}zbTZ4VFKq>>etnlXL|r7Nt`Akl0py}y zrt0lgF&mcXdPFW4=#XABFxQXAyEoEzO6UFy-?qxG1m6W4MitJFV1v8kjAp4L32^S7 zs7?@G8hCZp6We0!FQMg2amSRLna>?Q+>FJVhY#oSW{#gsh16O2BmVCcPoMpVP3Q?z z2-8FaXrq915x5l(WD5;(E@fyMxn%E2@=p=;6!?QsD zzBgK^uWFD~J9PO#V0&@JW z`(63me*o9^-Dsx*)+%_MLeq(*lQ=B&B-#YN`y4!g+XCt}!U=~$kvJLXW_SuST_gTy z!%4R1%|{R9(~dnnvb``9N!xWh6PYf|jtn_YDtq8)`#-a(FpyG$;na*@`1g&c*ixgi zV`j&;S|gvWxo$0+Z`8KoM5XZ~ClE%kS(uE*=Pl4M;Ml4>M#7d|IOeK=-i)@Cd zL|34~D4u+38ctnODG^R>{vympLT_FB_X_wOEit!Dm&JMO`|Z|vxn8gLUd z;9J70v4+H{Qz;}tO(EeE+j)m!xW*@j-(wheSi_$%+-2?%$TuIWPJtUsBhimORYmST zV@%h_3`RbHC$kT7Ne^jg0^LhR6v!~6=y8m8FET>__I5lKJN!08 zcra@a;&JyPYeD6=j36gu9%n5tzNW<^FT$+Er4`5@$rB7PdW8KV$^?f*kz{CBFB*?5VM*)?rdByG%E9;eHM`&F->zumsPLY1UV26ceD zQ*Y(G3@0m8pCw^w`q&z!7-~+xD%k79wo$*Dg`Q(50S#t>>56&I&bLMNPxY@Ve`0ch?gA z*IvnLmZfDkZWqC&kRIz^@GCy9=p>KVxeE9IuZ8dAqi9dQIH96mW|s4nzzEY&;iIPV zf2quI1-dIck2CSuNfM*{b<<}W3BFG-H$=4JG{aiv)qMMCPx+!C9O2*!cg4@Rm$pF8 z;|wUeh3_{36eZ^-!1?K?p@-PGEk%QYTsoZ#P*?r@CH(#wdi|MbQ2fk#@KAmh6NGHO zE3AzEr5MJ(D$HE8Ch<0;1&mfC5Ay-iw@BFJw<_0&u8~#IzR*|+7smb?D`itKL!!qC z;!|;x2a>J=OHTtPAho8avb!e+h+P`s42URB?DjalXUp3F1vQ2g3`#T# zEw-&Zd1(Nv0C<+3r>6p!P71z3&@O==U53{{v#*622eT*yU3?Ik`(g!&ugUyN1%M9u z-E^>}>c07?gJsTsaP3J|a`dV3!wn^u&(9vZ_)t!+j~22p!$(Vb*=c_hfI0nh2WYcT z5QhqSfIz#R$d{tJreq7FbvcIzXY=`-(l|Um1$PeZ6S zNHXDh0bSNivyS-mQRp4xu=yvuQ%{gF>5U%;ep(ogx*2t3@X9MyO;f!s%=TY^2#9p$ z>i?nbO#s|F%X49UXVp29j`m%nkw&9sc8zB=(u~Kp?D06>Jx-j&*(c6svO0kz?1%t~ zA!+N9UK(f%6P7k@p>?6R3D7i3fR;-s*X91V@VEWR+-{fNpHf5VZRjP+ectaoN79TP z2;Bcq#z$w<(RaS}U7q)Or9)!ppBtgT7RjrRESj_BJ!71kX$_s!d~<2EO4CI(1y7rm z%kfZPu_gA5iTB|lNzJEp=EaUQBxz-Yam`mo^ob+0+7K@T-*o4c8_{QH!DGT@aP&e8 zkyKJ&WnAQKX!_u{fCjo(H5c0x)dj|#6})@7S<2P2{MY;6N^gwrsTjXeY4q2M*e6s2 zbK!l9+wzKB+L|Awx36q^l_72Vz&PqUuuoBw_XGjvoJ^_JT6>DDZMD)^n%$BXJ?(etN4bu?K=E!gr$JZlF_@v z7efLPk5AtG_%j`vJ%u~6^Gx3lU@Grj>b%tV6Si;fdDnUT24S@^u{rj9Ku6X(EvidK z+w(A$(*ZVo?)-PyIllm`4sml|@Xb0+j+jF%X^`b1q5xCgruswRtYK^cvwk$|uI)S6 zh$A0fZEsM`^?bX39#kXAR;dvW&F(9myE0M}{f0GR3nNSk`DoFxsU}FCp_)KN3pu84 z6D4tiF=D?6VD%E~*t=17C;>P1ARrsrE;>1}nBU3ktwCF-ecRpNe)V6z@Ru(BczULe zb>|hXXXIh^nuB$9FIZ84cp^_Qtv@99aD4mp<~4+zC>#1f4Q~lk6asPjg`#)?uKyZ@ z4S1^ps%$}&k{Ph;x?s*~qR+of>IhV`CblnsAzf@Xi~ri=-~6A=VjAbxK<)-yx{h{~ zqRogK#n|*6`c4T@CnI*!evH3*jE4C5peKAuT)C`{#vN~Td z14{3ZZ8HO%zoeC91-uf3mvG870SnNgYZtcyk;nHnluaeBsX`PrA1^_57UhIP0j~hv z5RtX7q0BFTEmD~} zAfEz+XfZdEy@&YFh@^t9W9p1WH@sSBiTCQD1*TH3;?>~;QI!cRlnlMf`ET{O;?{WP z3VYKzPpb(FAgW{y71QDsgKg)VIE801#H7g{WKIC)A3RY0P>Sxo=mkGNzj3qDJrw;{ z)Tx2ir7Xq!zyau*c9w>p$YTSaE7b(48&oqF@XpanGr;ngjKl;1dqmsz;;(`Mt4o&G zY2l5lRI<)F+McyHQuSqss#41kz2g+k{5jfiuE+r0b&588Z>77(jzg5FQY4YEo3&xf zra3=N{`}3kA7t`AlcPzO^W{w~j@1UgZ^M(WVD3Y3869$CN_DNc)jdQnhmBn%l#5;C zbstpKgKlr_tPdvxIjWU2IM5PouFyy0ylCg|9vu#%lOK&|njIV8L)R*d0 zy6lc8mLFJNexSK!Li0e6|^;|l7<03zW`c>%NFfIuTl7OA-N|(!)#cIKV3gZuX_elo_!GMDy=M1Y{ zRV7YjV!I;FuCCQfh@NN={y)D!Ci1diZIYG-jxUe7-DAtg2iUthtJF1U$!&U(Nz&^# zyiFYBaQ5Z@0zzHn#3K8mWqRopmYG&&aH%m?GtJsqV`(r0(+kE{ldd)QMqzyczl$#% z-7C)Ui>xWjZus6Kv0N?&P04ige$|~D54x^FM6nCD|8h@^Bnly00mK{>FQEK%$VCmn zv|$9G;04?d60134ktW)~F2LJici~NkXj{a+&em=4F-#Xw^Rd22EEdUMN^Z~zk6yx= z73!+HA|LWcljS-L`(`5-@J6EfMxL>u#lrZq=a}hdY#`%{CWf{yFAfzJI@e(;&THBT z;)RbI6?W&)me>{<`J6Oao(4l#RYG)lvEwc#V^GZ4Ltd%v}I@z!?34A(c0otDa-?C z8q`UisL4@fdRcl)XWbk!JL{_3Z%9qU@9wlOzr0!U!(|9QG(F@u41b8dZ41*W=cFXxAE>yuBf7aJ^b`?Minn=4JzKl%(T>u|fKrE`*btjxT{tlC(fB zL#+{#l=>{qL-bBxB!(yGs1(}~4PyG?z-drXM4f%)nM(yaZPOd{b48B1oSikW(A@xX zh|d2~2#1pX9|t}wcKYUm=XsRjWt@!=bAKW4Ogp_15$)E`X2}%xfc!|t88_3^%?Zx3Lo2iQ{kPu z|3v@3@e44mx0}tTm~Yo%H(f)YfCq-an^4m*-SzmjxA%ZGEXQ5iJEpnWa(c%ZTe=Kz zM|l|rO+c%FuksuousxYNHImeX-ynh(>T$xl7_Ti`%-x{2LGjg~o^zo@IHe*QGQw;) z2Fz%~@delWgc@4PrAnvDc{TEJ_Dz6~I+~22)_)YGMUnrsyZ2wad%bgNho598aVK$W zV(#snkLRIIHcYE?R+V3R36BF~BE9^E4LBn<9P>k*tk9j<@R$b5$@)BOqCK8VETLGz zG2FXd3W#>De)9BG099a#>CVh`!ReQnwXIv1cK(ri%by*1h(78w;C@NMaCX_h(cz~K z2xWE2wyE9DwboU>-E@wcj@H69=Ub%yv5Uu^fIJqO)~2TG1|o7c?XJ+;ZKtlBiuvLK z8eX=t0@v9J*U)p=ejG~xg28V`&=ThrYLFb%w|kb3v0*I=n(f!%6Cx&@WUkF$!uQW~ zKj#z^^O zH+iRJH$PEf^Ig_GL)V_7v)I5KKp%Te>lhv6Hh&971JRAT&w1=LeU&!X(9SFfwz;BC zzL6J!-+dB&3{mHZ-RFfANKijq68v<(_ux5rUmL~haks|0PbdngGz z8|$a3NVA*`p7VBNm*qB}X*-urLNMXTz|+o|-pwuNRQrOjJ13gmC-3D?!D!vn^;)45TI--D-Gq$T`sh*ev*q@oX=csi1?A9Z>~63Wy)E7Ix)9>4Cr4 zV)^I0_GrD)c%SAA`#pOgrors?UnTA3f2da3mjFKYxP2av&+TEkW|Hu~B%RWxn#7$q zctetR3JU#SfGA2)A2PPP9|vSPWX1xKU@#Jhb@>iR2e{kyFv{Npi9<>Nke%fJF$8>3 z&@H4+4sEyj^r%x41QiWPai=7S(sToHmcu+Ct3d1{tcOs8a04oUu8|EwL|E04K!m=B z#ez15u$G(wl!t_rC4fk|Dy(O$_Da4HVf;7-`Na7Jtj699t(QGp0 zL7Fy?Ka?-m3k!u%Y-Av5W}{KhR6+J2O3Vx)&-_GsD=Uo;=7J`&1xd0QE!~m{s#1u( ztNVlWyB{1#c!tZlNmccSG`|u7j{u|vzdPp!4NJ-L#Jp*^7qnci6iW|n-93n3iu!Lh z{9}r&l}s*QCn|}XN4CCg03qmx47!s1(3m4#OD;I9H9z2Bn77!TR$MI!pvg|8G28z%i z=sE(G!bg9Rf84#LQNhmygokdmp4n=JIJV>`b6Reg2rj~Dx#>F5`O$k)$Asp|^-too zJck$IZ)1G6chdNi?%6N?EPR$%ZQ!#MGCBDj17saVx5fX66GK-=A#3F@hc}_YC=eT` z$dwAHV(B-AVrff>6pidqb72qr(^zP1$F@*1U^KmEE}0(AZMAZb%2udkX7r`e$!5b~ z?+BFZwO}$Ei-c=(BwF8ccY1`&sG}-ou2F&c5g6)!L;NUXe+ph^VlS(? zwnO?SiynqA*h02Tl#-YmjVVG@c5HWDBVKnW?p*rn{=5CYNNB8baw?JnxqzpbSV@osHX|U{Hs7G9Ds@)iFc~mq*2BGJ9S1f z&In5jsFKh{vENx=Tf-l$Jm{FMTn=J7?euIU&Awd-)hHUK1YTa5eTi_lAjSmfpg0%P zWrz)!Suq|EfK_6D-I=x|>vlG%xaIF5Tw%xC%&4?iN+K}p2YOZ;e_7U*&R?#0ea4|# z)$3tr{X8a%Vu9Hgq4U6C8|OKGkw#h~?a)3zS4P~U6Ax^M`|ugvxl$U-M4|(K9^1Mw z?)S%@jx~|={TBek1=9A6%rNOa?H{Q4zn+@eoBX6W{mFqNheHD^M+UwT3k1fuZjF6D z&L(!m9!HX$818sn@#xCu0;5^~U!)JzQfF0u_G~s1<#i!^|M0>wQZ=z+L}&B@UvOu! zLLuJ|IF=znfQfg8z=V95V)X?RqgaM{vm$~YgI03slcPH_fl%fRAPT6Sii8#y7ekR# zRfrY$XF`F@j?qaSb|2%tz-5ssgt7M;&`pDLnut~=(F=1FfB`+H z*6%}x$Web?B_+99#d{D;p?61Ty-JtSbzy~W(ZHg9YH<0U^bghL;W`@efbRf?20oYY z%p3u`;o(Lc1x<_vG+cRxS`ZBshf%-4Lt6U1F5rw6>m5Xka=+iD4tZmeJye#wQ9xuf zQLlt-U~X8k-FkpF_|Lrqm&($kJYPwgCcE%;C@(Lx@n8>^0&ogQ)z)z(^d}TCC^D0Vq9$I{1Cp zv#vje9#+CCF^%YYh)!T7phaOjsau#=Xt}V!i$!&SYs9dJ_KLv%1zQiMRL41y|iId^O1sQqFWLY�P)>O0q4`=og#5c;cEb?uob&$&HM0 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 F`5$WB0%QOH diff --git a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.svg b/application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.svg deleted file mode 100644 index 7316c44f38..0000000000 --- a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.svg +++ /dev/null @@ -1,2763 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.ttf b/application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.ttf deleted file mode 100644 index 53c8f366b16285c4791f4deae8bbf6d78b54ecc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208792 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

{z9N*9Z?p5?ftytkHL)+ggO6ltdg3$@}*-Hwe@ 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≠asOOky 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

1Hd}c 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 diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-Black.woff b/application/client/src/app/ui/styles/fonts/SourceSansPro-Black.woff deleted file mode 100644 index 68cc29dba1cea8c1d3e0cd29ef7041f0b4df8630..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121756 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%0D^$B>?{gnbQksPS24!JwxaE0(T3A?_u{Y zehNPq+FM09c&?7h&7VtfpufC>>a{^WFTeg3R)_FWAo%wPJPGFd4B`Je5#PGMdkMf{ zT{f^b*^9_duw}`eBw6F3oj{FrEtXWPZv#K@h}*!Lgq*Csyz-LNm0VV}4JnYm{{7X% z{f_~)ao^Skx_*kRYdQR<6u!9*{v!(CQ3wAXg>R{Qu8qQX z)m{HKh3}?t0otTRI2i8$8ZW+&gaM?$!f&s` zN2E^@(?`S$toGdETj2M0z_Y?Yj{YIDl(|P969TIqU`vjYegbDj67_DOpM3OJKY`)Y z!(d$(Iv8CbUY91HpzKbnlRYG8KmhxP1dRZ}-2=_g0y>!_)lRm5^KfynyARr#uNy54 zmOTFC%Iy#G+-Y~Dv%IHR=D5=?L#DS_nfN3$GpEYMfyniJ&~DGVO+LdD_SOHoZUAvW zj=$XK)<5AuJ_Yd4%YZM~0hZTXwdc`=Mr62zwMC{uTV!a{0GQez7PS&dQH+-?Bx;1+ zIJAFVJM{aqw_bes;TLP4!T#U0==(+b;T^1wx`2rv z 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 SL`{+3r0kPh{WrGufBAnOP?nbf diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-Black.woff2 b/application/client/src/app/ui/styles/fonts/SourceSansPro-Black.woff2 deleted file mode 100644 index c36d5827a31a114902ee8dde247e4484f866e681..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82004 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 diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-BlackItalic.woff b/application/client/src/app/ui/styles/fonts/SourceSansPro-BlackItalic.woff deleted file mode 100644 index e529f83494995214f441e8a5704b9453a7e40f51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48156 zcmZr%V{|4>)4pRT8{4*RJK5N_ZEw7>ZQHi(jcwch^1Q#lKIfX5s;=s)uAVckX*YQ> zF#r(YCw1ZgkbiDKfkFRK|6dXkR1yUMIvRiSq<#=)JgNO4CZ;U=qx+vY&VTT}%mNh` z5fuXfas+` z6TFG3y_pRF0Q(~g1pEUhaE(lMGXtj|I)~#&2J%0Ae*-|wtUZ40q5Sybb^rj}`=fS( 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 Y%>SCDzmz}zlk>1RGXHZes9XPk0ML4>YXATM diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-BlackItalic.woff2 b/application/client/src/app/ui/styles/fonts/SourceSansPro-BlackItalic.woff2 deleted file mode 100644 index 50570d4b6054a4ec60909f907b0893a81bf52c58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35032 zcmV)6K*+y$Pew8T0RR910EpNC6951J0fU490Elh?0RR9100000000000000000000 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 E1^svs^Z)<= diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-Bold.woff b/application/client/src/app/ui/styles/fonts/SourceSansPro-Bold.woff deleted file mode 100644 index 53f6922109b4f7281f79b403c3eba42596a50293..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126204 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∨>K0$(`SzD7=xcA}DUtd{$0=q`^wyLfG_i4`z zube)?U88GTXIJR=!Os-0EN{PjMg+IAu9)tVp6OmW-hzBaySCP@NbjScsbAUN0^dg7 zC1|e%@3WqnUIA~xZ=-LR-+%VN;fnmo`Gtd;tH2(rkgHK2^4BopJryK|bht@hts!?! zySi}sH&qO}aFxDNLynqObe`z^!KYzwf z3_;TB6BD5nlgjVMF_f-JSkSblXvAI)jTj0`9}4%k>*He4tq(;q^kh+x!HDn2Vo^CJ zD-1m_3^K>%4NEahOlH^($>^If#H}e?kUeG$%N2DBV^qL!6l>c5Y*G`POzk0-wU3L< zLUxN4VE9A1zdD%-CnV4?R-OJ9!!z8wuhUSlri)96=o=aaVz_8u&L*>cGnWVvO%#Si zxKUrtCYOCXmvH(wISlG>rM{9)cKcQ?(R7*#46|^@zLrfs`_5(|?Qe`2xZ%=$1)Hq) zEzKg@G?nClxU@d-CV>N8OC+C+4OLT&#E{>%umfI;l(sYp_I&73KkBxwLsqlG3Z)HB zQ%qZb#U`hHTeIj2%_)X!xMyF-rht8yn-JeO5)AZkiN3r|mWyUL5k8ts4Eb=gzPe5B zi*`5R_HVivOyO#MWt$xDiwC0ZG^-f4;jVpcoBS7@_d;IZ1TaYB^ZKbbl`c~5wY|P{ zV(Eoe^#eAwE;8?OR^f`*wJ(VwnS;GRZ`C<5e}j5h&vdygsv#tP-*S#vXbXb$FW$9 zHp>j<%M91Ah}h6H#c7QKw;LUJQ(`qz;@vf3qKK#mM>)BLZJ4M>Bpqtg$%{sax7oRM zCSpz;B)F9(;_7yYTH;qUPRU&p+J+$}3NAx(i(jQ3DvuNSYw7P|u8gaW<6mmY5w|lP zexePR5+z>kz_k2ij0@k@iE8)DnhxU_bU;#13{o=n0WLf#R(G;|MbSJtIsN>Ur5 z+fli+bdPLT)upaV0t^xE$X=SdhqtS&QrRZC4)N~jT-vxtx2vsEpCzFWA?}D?8a#w} zDGN}MCdm&`?EqrR_uX zv)XG>NNyNS<*zs?nhFBtJWItqS(bE*um1h!CzCMB41UttXKtX zY3bY$q^VR^ltE5`U%YER81?E1)G+t04vF9OX;zd8pFzdNtOPVDr1;U zw4`fjSP}=8y&vgMP~lEcgWoB(w`{jm!koRe%uUUwDx7!C1OXgVT57trNJhL4$gtCiaG_As`JHGVCO>* z=YUoPNWP6~Q?V8pc|w@)u;P zP8OSi9S_}a{5=#p@^w|Kiq*hYht4-a9!ebrtEy+ku3*nY?;F3zpWgWbs#(SIV6#KV zo4`j!?}AR%wPIVa>!IgOz@x%TK1j8zSPyJ_=z0_UsPt0ss`^&!1NKQZFHPCiG%rb* zYZV3@Qt?Xxj&S%jqyHM+D0*0QMChtA6(!Bn?PK3ad6;yB>8ex}s?A&NbKGcp06U^| z)vAi-=Lz>wZ^S)}Izm^KZ40$-c6oC1mZn*NN6m8k`Em#Kt0J}~P19OO!0Sd2-i*H* z88hxWQ&A*EgGZeF!nRe^hmsz(nYl%W#MkWnI+If;9uoXYlhbwYOSJK;8fUq#;I;#Z zvx4is9HcdL9=bmpZs7x6mN<0tw-DaqW`4NS*Rrs?n-T@Txi=vB3| zqPuy-eb^h}M}6-Q0cFxc^m&PWiW`MTbMFWNRnns9dFp-48_7pw?=S(CtU~#DvwgN3 zjYn(mC;_#sqRDyOedHT4kLE6-P-F6LFHvXV0%vnK{o;}(Hg#I}LhhtUfbyd~*^JsT zQTg>zu5iKu9{o5|NiHIf(m`cIdQmun#17ABKt`{(qo*{ogfoJRQe~MUgNsYzW0`D5 zXUS!T*t|)SpVzogO(`-NywXTthKzts!8d&3$9 zOc5_nIL--b-{D<%NQ30j8N;n>0x!7FaL=wG--BN$o}RggD%I}VgN$l!fY!r`kYn-s z5dEfhtNT}~wZ}~w*)1+2tthx>L`c5F1R)u$#5^nIHsk`mUoUfje|pAinOYM`!P-yf%)tUt#i}_XT zCfhUJW?RVFEi&qE*2;?c;yDxK$qjD*&K%JP)@%TmJ5H+GIQAUPlSW}bcMv^qZvaT) zbG-!+>iwEMEV-H+~sc!*TK=a`6kL|*pi{XMvo(8xlVKsxAE zI5+zfO{8jfybU5`D20;S7(H^cve z!hPtjA3WK!CSEYS4~~=86i~Pc9)fdEf3C4E$`Ykg3 z5rRfK5&-M=40*U&S5GtIyigTNsOq4c`W_pB}@+ z)lbBsvyzo~`>nhj#O22^7;{!SxtM>JGjKohw1!zvGpF&5nI>>xRhO6uR1}dHCAB?; zd5PPri=t*NDebl_tR_HJ;A zPuE)^J;RlXwhhG_()2FDyP4%4qK+BE?yFNC9Xa^1i$q7HrpTiW{gD6xfdwTNGlxW? zO9YJyR1BDVA)s$YL)TJed2_5S8lv|Y22UE@h6N#-yjFh}XKxU%;6G3#6b+5csUP^M zXymT_8-8Y09HW}z#v2(AcBz|-8CnKLshgb{b_~X`o39#*9gsu}FBlgPxvfvZy`XR| z(L)OFgZ2D_gflKUa@&Byec}H@8{t9a=RitK!r?w~)|yxu>;FcPpMTK4`zdh=hx^}i zmc(jXm*1b@-N#xVb56(;7RD572 z{j&kQ;ocM}9U7rDh)~*#@S$HER8y1R6l-Qpe*oMjB$W0bbRQg;hA;}rL!Tg<>j^!H zbnp+TL3IVZ%E@4lV-)rZB|%?ti8vD`n`KY>x<}+7peUoF5GLDZ&va|UhQELn>h&>n zP~*Fan9=E>hyxVrqjNhX={X``fciwq(59%Vgk3=_WJ`ln0tjy`_W%G0bw=nu9Q-1z zhw^B>Uz0P4kcBEh=*4+&eZII}*JBpI6!mI<9lhn%4kGc`oWhiN-VD(rdfc2!^6iAX z{<0~ zAh`HJL1NKI5&4S0KOyA${_!}E_sc?gHeRQO6~ymj2xvC>)P%B`*wf60=UO;{4AD3@ z>&be5)t~)#fLt9kWZyH9-~e1xGqrrhei-=<&&d^wrXWT4`^v8qp*{_6$Fv(H_R_80v4`t3gN zU()&QK6gFbpXuW}iAf+fHW~EyL4J)bAU3ub{ButqF$t3eFJNqssIgMhZ3cc|7C_z# z_Y*__8G9pYtO?J##@rD9|7qwyer0Gxm2P2dyPxnx|Be28Yt8!uoqT`7om|g@8>A|K zgcIyG&q;&dxCU?s?|>UP6em(=G& zI?oy5DrQA1jfjWx!FZNDr|!vu``?hF?j#t!k6twA1^+8jdS%dF941HbY;m3^#Zw%I zR+=9`dyxGP{nuF3lZD{(ueX%v{gzgq;!3pAvVggnJjI!4rTnqt?Qv#nY{NR)y%0C0J&-)ZkAx4U%f#Z(o7|Uvo1>choDP z=BS)3jpX_F(GtMOh`I@oUkn&%N!Sop-+9L#xTx7J>b?B01`E6o#W;WI=5*yO~xG}?m^y0(~}IY%FnCJr}#Pj`P;#H zf>VU@bj`20s2tOF*^BFXCshx+7jF&*@a8)CUo8^))N^AD%WQUK-Y`i0e(AMq_@8rq zc!^JXj%D+ot_*E12n=;=Lz-F|tdgNq-NRA~q);)1*yI)Ju8R$FYuJ?;?y$=W7#%62 z*b2?(rW}kkPH50wIOYrw@I|?>5&yUoO^jDn5fu8R45T76CG(H3vg3KaAAtfbjO(t{ z7(EtDbtT?~2LvR*_rfkT5p=v%j=-E%q?x27WSMN#4lJ`F%O5fDRWzN~ul||wpwk`Q z2lqJC5N2*s#m~KuVX0R-FAD(BCKbgT^T+R=@duXXZkVR<8lp3d2DI%7ef5;%VSQ4m z5sIRiJ^mU`W1uHwtD$eRcw>o&EtVyQc*mR7fEsc~ zGa%>YLZN%!K4A62Q7vfbTqHQ+En zCs{qGjAU_Oy zx=@hx8u3+vq3O0rM`xqO;%qfK6nH1rax$hPQ)G&*U^8jP?=PMXkAUA|TQ6t9P# z9rt_P5U8^82+{)Rz&g)x$U@i?wE!J1HjwM3l-7fkLYwz3gw_MibpmrJ|9Va8iaE(L zXbUiP#bZ90$AW{b0wG@|YqpLrN-85yajzJT2s=|^l3f%H=UB=t1H1TSSj@y|#T<43mAU?#>aE*5a zxVtLZ0ixRQ_iP5*(l}k&dLY(kHdL)?lBcG%Z7G{Jg{^7CE9300Y!Jwp9pL2DRKk^Q z1~TRVsDq5BFBP&FvDR3n)U(cV^I(o>oFc_X1oNb^fjCJHt^eS9=px6@1@REF>WWlm z^t=grQY*{6S$PGD2~Jaw}&daXnA;&aD$fL=vFz{o`)?(?gCG_H)U% zd&#;KQIpXRjQcE%G=^=04*tm~gZD@bWa?m!@W&H1!#HVa|vKa@&Qb-k*&KeLDvHXnJ z6sf$ht9J_Az-xM7v9Wm4+u^1Tk^Z!uj=SCX`OD>;D90Sq8^!X=*z_3zvLT5h;tW?! zWs|)jm%u4v(kT?AiY|cUi=bbs`oIw|tjmWv*`7DqemN~<*jZ}KY=l?c%r;#cT^Ung z1Em#lqY0L#ao#6P5LW3KKbh45q41uK`77T)Ej-@MQ8_(f0fO%W&4rFVAFkdZ>~-b0 zSyfKJdcGO9LIr^2mcL-bXvcMBG~! zLMD7aKcQpwb&Rn>qR*~lFEToR@d|#K17$r3VEA4CDl0E&V_#4^K0DkezLd}B&%~#I zeD#+hK%M;x;~Yu`O}!G!-uRUCy^X2GJAd2dEzTTW59365)9TLZC$Hty!tL7|EfU5L z0g~k5ZW%;V&g8CjS{kd=fRL8V&mT}8`F;UCgh9{jQ z&+aGXF=N@gc-p(y4EAFiYR_d2lX&@&X18tSJKxkfC3{}ateBQ3wy@sS?@#TPmeKRf zX8MOe7n9z9!c$o`&PFVsq?s-(QkMG&OP}oLrtE^%3d?djSXR{>dq9|-1|P@F^)>zQ zk!5(9xBOB*j2Y_}!mtr1r*w}Ym@+b7`DuKR@hJt;OE47ydOLIc&+KD z`@b@-{>TPk>_@_R1aJfsBVCKbbi@kTQfhQHM{4wK2zgRYks#Gez?{VXzf`!fA^r>7 z&lEI-Bs7A2*q#F+4W5{Iq*fDuo0OjcLUNquX{bx4uwm9y47l~<@HG>N5?6lLUh7{- zLr^}J=zJi+5qN{hBHPyQ&&pb&4x2j-QreC#vQi_Jmh0} z6Yfx2>Y(LgcnQy+o0Zav1~VcH0y8@L1@7cH6QAH_I$&;zT(bUnSQyDb23r1lqN$ZO zculQAv{+@W+8X{GTHaV+eQT}jU+xJopAWYPsxvxzxPma$_&*zVGqisC3TxS$Eo;4rytN< z*Dr+BeEOfA?oa@)m3~>Ll@_2@!qE))stjIqU0ycKOpDz=R{P^YR)Lv2ZEYK752qlV zl=-!9SC5_}mR-+?{3e+jw2r9X9A)#y)GJx5GRnrR%znEUD(rGx|87zJkO{dNvEIghb~3o%&nsGg~Sceho4~Xe6%P z%E=6!r=Lr3VkQ7UIaT@pAfe^hdFYacE-fX9lA$%V;;XN$V4V6FVY%igPmt(adr`!KvhKj|4Fb$$x{Ug#0MQ4hX zdnM}(2f)?zT`XVxJD`D_N;Gb`qIkt#=5*(?puJ4y4(aP8i+ilR!j6iJ3ZlI*@_mu+ z7NK{Nj9|I=tV1GZlV(}(jcPPuIW$0%!lsrgy@}7J(PhPexOs-hKFN8*=BTG*F8t{j z@w5rVrypRbT1_4w7rFlTScJXp+JJ?L$C2qFq&fN#kK_(%H(nsL$SdrjUVaOoiB0cZ ztbJR0Ea?RhFW5P3JX+=kxL~45axg66wBP$JKi>ScVSR2kXnBU2v5=gxKf-)$Ak4Ui zpv;Yd@!UkahTUxI_GNn!3`^(<26U!`bMug1)f1Vtl638hTTfLi6!Kmqspg85DHM3t zNZc7^k@P|HM~Hf0NnCS99Z056&2SZ%*^5uMM1!E&#Rb)&-p@ONwcOj~Rp#}qPC6zz z+e|AD9ID(~O(hFsXq+H2UmQ1sWROzgVn(zjMMR2YwrLXbhtnyMN+>DCXeHgd%pi^` z7?aCa?LO_Dq*iYe)$@y{DosgeO#jY2YVx5_aQmG7^FIz3x{&Xnu?n>>RZc?+?+N zU-$>u`H$n~M$f%SI+&VnnfNNRr%Mv2$Twmm%dw>LSe>0Vl?O`cQBppuVHV>hWXCCo zNh#seO79f6>oUO|%vLUf3vco~!<87!(X3{L@aIbX=`1)>!nDhQqEAZDw8ds&g)XsQ z@EDBh!x>a^b!Vf4roW{Mq5ri`l?b=ss3?-HPjHzLevF!6wdaZ2XeS!{${lNEr(-iQ zyb|ka_Yr+JmM^pDTqbig+zq~JC$F(GWY>5Yval=50Oc(LF^G+GN|DyzH?f< zLYOd^cPUc}Uze#;mYO`lvSo;KWE<+vz5BB?!Du2saS^DTDbta+-kxiAt@cTf3*_-U za({9`jmcVIDK|uz@S-?sc%(F1n~_(mrd%n_fH_)}h~4&m=eT$!b*VOtmoBqJne#@w zKvjX8i56F4=e3wGMN?HSWCTrtn}c@m`%dm`t<>xQtz(`8NLhTo%rs<#UO|I`)=F%r zTbWLk7?U{bM}rc0ro^Nny=1TKYfSS*E%`lI+HR??i>7%!^CHE|G^^hX6?7HKKG(6c z>T=fX3h}fld+H;07+kTxYj~n+27Dv=jWmL=<9{g}m~Cn&J;kz*wL-9h9f2NqGjU$& zB>YGw8gmflx^}|Z#$c26gmO>xF8dAbg+v4|2eSsV1}z9n?R#~qc9+)nNxd5uKVVEa zipTV6O#koe9@*q}3{#)XQC6VX5pCc!VHkWlyT^qP zv)QKL_dhzpw!(V*^>j0@pXy^VBj6E7xF7~R!C=n9DEebHF$@tX!+1dP`{{NAh0d~@ zc-PV3ux8N@+w}Z@k@cLoJ_V=>EoU>-nKVQzev{RFy+g#@z&nW367 z@jgaCiNoAM#WVH<_;mLs=`VeC+eS|&G_8h^AWCY2m>%O?h@TB0Wq?P@?05rmTz{qsU_SRXth7p1*}5$sG6T3ePrQh zhlr0~UTp;bti5YF)x7HZWOc2{U!vb5vLK@?PJAEv23O`FOoR(RX}6x;(8F;Eb5P6{ zli3P|U(6d5tLQ7ko=5_Rm?9T#sFEd$Ts`p~gjD@nmF=wlqE{HX4x8rdan1QNYqkH- zo1YklXKJsT!3l5whr~Xfb8eMiSpIkQsc$Dp2V^{vTY7= zd%Wvkxz`xM9Q1oA(tPjr4{KAPnz&drDbry|3Cbp{qIgBQk-zXI^a;ZGhm!oJl5zI* zthz3aCW{mj?(OL@n9m{4l(_c_>Lo!V-%SL|Mm~bU_XV8Ds%t%@oz=6iHUe=N3s$ z$OH1s%=Px!IM5U)i{)x;2E$f0Sw(T6-Fh`9%(Tv3uad=c9J<6TD%r>(fEx%(H02!F zjh*A1NQ}|4&aGgC0Es<2t{WJv<4~$IPAXXYZW~^97b$^xfDdIaoeClCcL%-@Z z_9HzF9u*Osj{aTr{7p~_=Ya(j!FMwFU|+iseYa&2nzc?nq$v1T{fshfSXccCqF&bF-S(AHRYJ9 zipCg2#v=ZG$6gb!WdJY5c&5jRr9&nR-#jQq!L&Wax-fOov{J)7F?DZ@AYuUFs&UcM z#eg0ywRgAqVdB|*LaXM$8YgXLz>q#{xwbK`!oX@7p|J#Lvb+%0n05kuTI_LYCN`p8 zpmAySo}H)*KW1&4u536up=w(^t@k_zJ+<&#$}h3q66u=nvEA2p#^_k!feg5&x61w8=QV2O~1Ghz>TaPWo}fm zdk&C4Z?UM>iAvcOCVJZsf8b;9tL$#S`V{4J+3&5(yCx8>v2Q?>b@SCrpsiaVnA?Ij z%IEg0ce##v)*uQ8>foLiP1c%#iJD<&YSfmVmxUfwhgRUC6++bH6KiL-_fn+`CPb#X zXQz{V`=cJxrG_5`p}={iZaJ@iN~RebojtvaE%k2=3>BdmS6MD>B)7GJ}=lwE^! zh_?+ZVo1uXG+q$k#%YwF_;nJ$W$?6pRPB8Ud#d@BTKm2o{GRL%WI^Ns zVQ=md2lo&pDHjB+m+s{pX)++(;RPDiRY$hdT2t7fE`KZf!#Q$L9eL@!Ag)W?7~2#G z+{S%3MZ3{Vw>-xj=s*vlRFWA}so|-uITVnsxfFa^vo|4Ib2j<1=D0)F^d84#)XBYV z??bU|sz%}vUIx`N8K}y4CNlbR_+EEKMs@6}wPXHb`;Q%Ok~ubS#w_Zv4AED9FxEwU zg0DeK4e+X@F$M*%!UyWmnSc8%7{h83sHh1SItp<gz-9`_`PPl*E^kk$u{kMNz&%2 zco*L94eKoPLZ|jQq~6;if=fptf{zP5(f)Y2=qcl0_h-V(zWaFdtP!ww$fFfexWW#& z;LIIJ76XvqC65+E^7{Gx)iqc0LWcVJgUoeTi25!!NhJ7~Y#0MO++pnNn%zS(79+*I zuB$=NKVAkdl9-5^={Oj>*u$!XLX|&%b}{+BuTnywGWgLO6`XJNxkpa|wfGB1E@3eX zM^52vMCwfBtiPrrU2AAuF~`@L@!6myMPAEj>}QgSVimvg!h4rTGd4#Dyw`3JwT@&WI8jPkiJVHyk1I9BJK*qLjw4D+1g-zITUg0KT1 z<92KYI)&YVHEemf_rR;*E^bV9Ih-+%lXa$$pMTECACK)INincJ0j)u6l5S1t6h}fJ zw4>pU7@!@0;-)^hwpt(cJP)B7qy4wkrQDDdEn%6Aq6WqoIbWT0)#>zA4*jSnSy!;} ze!56qPx9Qf&0|cRovH=X_ylE2i? zAf0von#Zr-+9@t_$MNX*6&XtOXlM`li*n0QPIuOWIeNf2GrG?czdWyURggeonhr$U zPau?S2@uw{iy(%>VAg4R`Q5KeTtS7i^laCtdES`<2%?_cueG_$UVBg$DMHKWT7mP~ zbgQVdI9|Ck;z7Gzk>v;GQ|_68N%?t#nT7%O4%gJVG=fz^skMzbg1Y(v`U(~$tFc)E zw)z2-ik|ImD%Y#bp{B-O+Wx<*spr3O+^kyt+RzGE^v4_xN)q&k(wxRtgQ9G&=R525 z7}f6i`0sR6;bb*!Cb>rYQhQC!%Kj&0ZXjX?=1g^O)a%9*t@D+@x<18anq(Uv4?Yfhdp_{)>=wR3=oUU_Fo`^}G?9GW z;*FcB`legqc;TRTFUFuZFoLA$*ViZ|`Z=y;=HFhcbEy1(=a60?e5kg`HaNl)tn$Kg z9LQhHlHp@!#=M478bSMjM%{f$grlxAt6ky3XYkB8Ex1~dgRhDpQwfzpMHCr)UT&$L zL-4VC?a;_Lj#?4W>XZ#&H*F7=kSoC;7>7=}Q}ns2s|d?XV4<@b1EL7b+NnrG0m? zT>AD6!D3LLQ+uPc-4_UvY_Y)clQ9C)HU>So-=V;&EC-~WU)zj zk7M1i7|k}JC}de$bPzWdCN2XXi){~b1$4@;dYv~$466QKl;>4tinh`t`!L_fE~m1^7e{ZN9v7=WQy%ykT6ydl_KGmr{UFF`IMc(fD-|hiUCXtu2z)M-yUCS_? zYj{>ttnFRMstH*4Z_MR%TPF<7SB!)MNUlpRF#$kC;)F&XTA-8i>I`Rl8PH8)`Mj}l zg8|q}b;F}tMFH$hTMCNgp=N(hq)NzwyfUaIw&H+G*_QWxH+k zX>;|ickQTmNKtH5m_X$OK&OmG3@184qH}1XS)> z*Zwlo<7s&3Lz1^dkJ5LIuy26RCX~5+-+z0DIG`yM+7~oJih*?HOCL)b{Yxu+Ek~=C z3{|w)fLfS9Edg-)o$ZpUNCUPSuwPlr-!fbcD5j$I8T`q$zmW!c&^$bY)?Wod5|C)yTr9OOwF@oHoWTNS@)tmY(;m$d!+5#=O4LsLRK#m zndNJXwsU94z-wMlt(S?_C}LjA$xMFd_3QLZ8)2-hP#*HlF_8?eAfsY7v%O;{y1ni6 z*+54}o5K-zZYJj~^{9eVZC~V{=!|`V#nglLL^qqc+P`hK;N-GbwbR3APPF5s6-gP# z3rd)hc4~kB*=gZ}^n|AWcxlE^%YD^`XPJVk902djRrYY0lg)2iS$xtPod5f&ve()C z+x*_66K-y75PO8}I-z;<>Borm-Ia842V@)JJ3BfXu{^HOcyo4YN7l#<&Xu462VNVA zt!7x)Y|j=7*ZhkW{EK<-mB6+sxYGg1KIpWE-<5sUG0yC3_@B@ODM{g`%orWvzZ-MN{)%hYypy&;4}pwG4Yc%f@zDz2UY?M&g9=+LWka)kUd6lQ!$3DwCq)e9T&Dfoxmj=;It)ld9u_ zGvln|Jf&K_+ZhY)Z-@t;+?2ul5nha0Gw2TLXfx3c-=n7FVWu=5G(d$}JGc*l6T?-P zbT8z%+b|h}>ufKU=g}ax39eTC_6r%R4#~-KUZPxHq5)$Ljm1=JDnj1)-tG17ZPu2B zG(IZyBDMz^0Xf^twCD65EOvPAJR0kdj#Ns0SQ}$ht9_0*N@G}C<%Pd!dRPj7)ATRO z;41~yr8yK5?J;A^z)x7vriP`DDsv`qHT6HEFZoXozex~g6tO-MmQ zG-!%>=>nb13aU@b`wk|gKEGQ^dFd|Rb8hIz$+F_I0c8joZI)78wEs9U6F29-$1yt4 z%q%+XP8WtB{4tRM%tVf+k`y8)v31BWG1_{ht!npNvv_m;%}>U9PZoghR)MdNU}wTM zg|ba+T8%%ZGX9h8cUg*oDV`djcigVhKs+_pD-z#C++LP#AY#L6oQo~WD&@kIPtS}h z87U%UNoJeJv^HhTc^r!^@F*pCOjLVKhC}JWgAF3HhhSQmGK|^_A+y0cMX(RI1BArC zH%{^18`1BLr(bQtD@-e>n>iacpQ1my2Dphd6ZWA8wh8m~y3{va=DnLIQQytN&3C=w zkV~@ABsc)#o%E=_V)f4f`0xNAD`4Ssy8q;>tC`B|4bc1P+kE!u*F}UEuQ$45N8Q^e zl|w+aptsf27Wg){{TQsTMJem_8tp9urmvlaJOJiZnvPr^%3^K4=T_^AR13M5_7Wci z`V40zyQCb4c5Tb&@9GGp{h%6#o7NObHK$t8XnpGHq<(ev+_Gq$xy}ba6g};hxXQJ< zxh}0fz>xjUISuSK61t~r*nM8NxaKWOiChRDGwhQ&7_m{o9yw$@e@6F z4-sM+z14&tv}%oePebZboIZ!-#wn3=wQP4!>k?>>xYh{RVWBe9>-c$OOE$)7vgihXS$&pYvV3hA#&$^%cbG=4e9 z1Ef?5dH)()I3*uK6mPcV2N&i`9sNzu?(RE3cT%{mS0b6G4|um{yjo`6xs(36qGFOk8%*c57UAt8jLZxb`&-Ek-&WB%^Y$?<;~C7*zud|g%w{lY!W%ARhJ|^56GH+NE}dR?5G}) z>lCCpC6P=kc?<)mwQQ0ErqvX;(GI9zOng^pU`=9B62Gu2pT-$DG@&GYW>q|mRbbT| z7*elZ<UNk9fY?BlLEt!_7}bwetLHPmSize?kSkkBiEchM9~jt8XHjnFbdA8< z$-_<@^l-5G8=1m4jX}$$AZoJ;av2-g4Z7J4V62CkbbqGvB~(SAE+;Wv^hKJ3hqZ>< zoyUu);!f73V{SKQZgbIhBJSC4_3gQVay&vENQ5cmghBx_CoeKH*T(7_8g+LM1h~t> zZKc8#a$uuaQ6+=pO*=L8aZ-!M$gkMB=IVC2ui7;%RQ)VE4Cm6+#;tap>w4OuCmQ;# zIhMy<>Uxja&jP%?t#4E0$3TuyM8|ZFvqZ4SPpj!Hg2|-g^1I~^_+IpB<2H^9>6}U9 zz$@Pr>>4p(yKHs8wY?S$QAKWrG2Jq4V`+tHSwIE2;l|p#ub#nLdU<5^*AV9l#fh~o zysdPN>jJ1zuz4Bsz653<(WI1Y%*`3?MW`349Or+lbRsV-z&)pCFA4m!k1^89dLVOs!r2t z$}&w6c*M?4OV>x~7QRa?cSu$JJ*xLx4PpJTn#WKd=`!_n4ekAd^zYy`(o%e)+Br6H zUey8NW1`$&^lQwQ=iq05-x+&^i7^ds!o79v^x!Ld5aUo_%ZEWn7RGmZ9F(N3kJ_Da}$QZx-g$07p_Uss1Xns=SXDTefvXHk?3N zPsi{BV;c?~S=X7F6;m64_c(E3SIZ0vtLT`{t_|Ct6(jMqnq6JTtd=zyR`g`V@m|x^ z_o1p~g)v$y=+1+L<1O0#FZe30YAh|vpZg^c05APV1{R!AEV(A;*)w>Y(J6?dK07{CsLyTocdL#?dK&{M6J!0+g7qlfQkLq(S< zUSIS^)NCl})qdB$FNvmCt&cwC3anD!8+JA`ZAd>VcGfcm@Rm=2zH30|So{8cm=$k8 ze)!WF5`D$(&6u^kcj4|WKzelb1k<^WZDr(gi^@Jq-Xx!DYc*vv&oK z(lSQu-+2x)6GQe7nxOYJ{dVs-wGlwOnA}pqWrf#X+W%nfEuh-`y7fVdyB2qEp+IqW zcZUK2TBJC^0u(J)+}+(Fw75fCiWU#>Lxa1!CX?@*J2Q99y?OYaEr^%>k3OU#R;Sq#t)-gYV67w4J|pgm`gB{Sg;XSf;)I+eua)By706 z_{TeXa@YD;f+}R#F)ANO{!hg1+pb}$K+>^DN-0$s8+3`?X+j>C6xX;+Y6KfOP_=L{Ypx;wkQ ziLso)(NS9XN6>xTTz}zj%VqsaJUGJXz*UZ#&+6qNuoapjcGda*>g_Xi|GAgs_&QZt zpLBRDRoZ0wbu>7Q^JKKW5uB&)wPTKEyli;Q1z*4wVdF-h733Xw$N%_-=SFsu zweTm)o@{deJ>yH^+>W@PqZH~4$Ovzr&ymiqyZoGfV$f>5D7(YOAzpJ_))=o=AG=qU z>XnrtlzSH~PljDVar-uJdZt^*`HNV$`N4V6uJ^-vEmjNYi*8pvj$Ig=pHJ%kk(t=I z;wXtNYXqgET+bWcyh1=h?R|i-kKOkd56|xtlkQo?4ckZ2VhaVGF@0^BcA+krW~^Rl zZxaQ#fiKU&NKxXBM~HJ0$AK6DhKjfF>}>xt9LDRfAs@>kr-&J37#Mn@qGHg{aEug4 zWRGceiKvAP3=EE|_G@CT$cadQa>qs$Q^=VJeP)(Z_}BwK3$PsVcL?7-h23R7<@cPR(Pbj$@fqWAN5`Xd?-md}8XXax`SiT)$(m9kBo2rVv#f z9QpFoXAVg94C=$}@z**xmL`0z7v=DJj-LWroEy{9J(@GoHELzER8%UVoi#e74W5Md z(JG+_^OJoG^1%r1s>6j9yzV>=>G%n~>)me9(>z}`pkj1o#EPP&d9v_dPup7l@WRrH zdqT8v(P)e)@X<8}^7P~kX{RtoY5$&kRUIpyyE)N1qsr&*5>gODZH>Wi$}q)V(Jd1RJ$>{I2WDr}ZR7M(Zrw~KO_%JF z!qVPV3vqpJ`RDg~2Aqdo{>7+~;RS9~hpBo_56{cKlkwZyHWH!A7M$^O8iUNG;NwA& ze0O8Ih6o-YC#`crb?yq=Y3!-xO5YOT%5T{Koy{m~bkSd9$00zOcuOhn=n6I-7o0F! z{ZS0|vAf=xM%9)&O_QK|OMx<;CSW9RG7w6=CAlg2*{Om97hr$%*34#A#Wc(v{j}vk zONKf=btz@IbL6q8FJV9_upU-n^v}^;<{{_vUHqd_U}eT~>7jp%-b;~DHN9bhY5jav zzN7JaS$|glK?n}AXvj*xVn{4XCMq`$fUcd%&2T-Z9~AO7q&g%Qc@}vVr48*A^DpKK zZ9BUgaJ{$xZ~u!*@-WjB@lK+LNKZBs5F_WWx9gCM^sx?<&nR0OGub6{^l8PDv(ezjj` zL9yLoxE1Al4Y{6Vx$#L2?E8;O{6YZ>suY$6|#ZNmS z+hg9(HD1;)-%f&kS;_?@iv=`x1#e0UywxDaaZ!H$mSzbYA+~;*6LA5cShKN3uZ3V+1!Z^`1i4(T+)cAR*@pjuM-0p}-MlsJjbF`Hp_m)4I-m!&o{|3YyCBP^#BgpVBe|u!CCD<&EAOoLw0DEs4H}*oupBrPxS+;- zhvHNGRNOWEGHiYf_6YV0zB}~q>3Nl;NA4@SCUC}k_T@|wSa8>P7js9}d+@z~zkej; zM~FUhCAt<)98MmQ2)~=r`f>wL z1BHScQoUka%a;#uSIzI{QLf)h>d`k0?Yln$Ak8CHb_)l&2s$Fym#+o&g%Ho1u__?& zC<4Ja)B!VUfH--Dtd+!qqSsuSqxoAjOB}3nvV|(b4y+pgZhTInbWPx8&(Z&zy({5a z+%W*Kt;llN#rJH;wx#3O&L#iLxr=uNHnGXb;u-g78m;4})+|PB%x6i{3`P4KipA$u zXyH`W&yI|E`H8;dF-~CGrFo`!=6JSx_VSN({OuUL^@EWOEXHYDucW%y#P7IY?(s`~ zQ>J6F%)P)Igyk{9?zZ_*BCa}#LXxD|9<55Ttv`cM?3~EwfP_!k8<^E|WD|{B% zg1&5@3wls*mA-sSPJ@mfk-v8}dGyXcTwdF=rH(vZ`g>2`%_ezxBFt|j(Y4lK?Jq`` zZJ5)#P681vx1_y_r=_4DZMTMywlL#o<@S^9DVJ{v5BPIiR5UsVa9_Hl@;KIJD~atr1XyN|FzeG1-hZV6HNBp{w`|H+-5w z*&2>ciRV2ppD{KEgVSE^SAtW2%ESr}zXzpus(ve7=rl|)@TuoNS6SJJi5?NLKlhB4xhkjVRZkn~m4CU2R{dY*qp zLs);p>!~wv=bcZMxW>dc=K!;bkY}@ZnR4?t8Al8!gTpsTKB9boy5_nxUC&RiPgAIS z{JZ^abA)HREGzs8{0K%}*5udZJ;asVns)Gq2ZwCX%eD~zv^)k3ok$1e9D5!y2EF&q z%PTl^`_uzls7s%fJTN_unx~Gj2L(gj@s!G$C>AgW1(Ti-7)1-W0xQWU zkN?q`g0b12#Ck(d*hPtN8sjts7KZsGQvOBa{~ISTl*{`$Pjq2BYh)MOGrwbG<@2c! zLDu4~D*r;a^KNe2xZG9r!%BdYQI23mzccTjih*PAW|BRK_j_;S_~_xYsag@@?-YS# z4@(lg7C?rWmgoB0_LYi0#Q=8eHBt#M+4-8rV0_8FQFmLoJLA^gb;zcHLR5<}JP6HTjAF3Fh!clN=zakLg&{A&};+z;cr+FA0w z@&+^-qJ79)*gPpH)9#-Q@`%&95*H(MPw9^^{jtRW&QvnKcEsE>dJC9YmIZQj+@oe=gdY)7w}>9?@) z`@5~a1WS@W(cU*fX3rBjX6770S!3-K_2g6F^{2-8}jBnd1(*P$C z4{{&cH8;%CV6vJ#vE8Ic=;qs;c-tE34Y*dgX|3s|7u@!vS0z;Z&!i{tTz#cF=!ZXv zeGWWTeAV(qYMs2D;E{UOWSt&;{C2N1@gY~?OT*(IJ$Z|a-OHG=vD%{GuR-W9B-goR zwWTbp*C{z~LX6As!S>%cb2ehch!dZPcX%XbU)iB={AI{H`06jd-iy9V`PiPhnK4XgRN7u2Vfl*+C)ve|X%JaPU2Tb`S}SL-$v({iY^8>0XU1 zi51GnEHJc0sJIa6i(yvNFu5nGxhJW+^U=T)f1O+KcjncP+V(F_l;}SJcuDW1sSyLhnLru2DdIEMsOm{hn_*kZ`x*IA`9%3%p;v>0NqCaLhm zC;x7is7S>-gvp=#W*hSCPM=hEPK=yhN&a zs_3hv?UC#m>?a>S@w zE^LA;<6gxp)=H4hFfPCq*)}Ot&;41Kwzk^OR9CKE?>kKK7um^9hU|t)AqV0yAQF&9<3t+{93PDubZkT+sb3VNB%>4|0^^>WMKpv9aKDE zv);xZ)V1DLTWHrA%V$z#(GE`Rqit~&cU<*`be>d!mUWL>OXppb>z5Nu+x}C4^-IPI1ry5qUa}MB}?;?(?cFsJU!VbSWo6DDwCpNk3kA2wxV-s93t39D9+$lYk;YWJ{vr@mKfNhPSY@YF<%-!XNC^ZME zwX{Uxoh{7=U;W;^=*Fzr#y2u1e-%xfl}z5rz%o@VyX}(t3hEEuzzIZ&`q*P*gP^k6 zX+?shB>-$4?(wOd)?&bX>HpY_r&7p@@?biVOh5t@L5!AWE+v{YeXP-H)E$FR4-Q$; z^rAd99jzl>t)o)YaX&%2zP&9`;}BPjajWc?5WXiAghmG+r*4Bfv8gUE!U(;I&Ge{s z%$6MoWc!YbEWLFKSl>(%r`chRHlglx(EYE?`0FL7%mZoBGj?8X2yw*^nmw`EpHOU= z&^f;he~8tToB|s18+8m;@kAHo8(OXdT3(Sx!oYdH=eEDM7PlgV89i$Wiiu6bC;`Qg z_nt2;yI-boipXWvSw2dkSP?lK<-N(zpPn(HI`j@Io)}n+oFYJwt(z~qFLY#h#}rC>NhBpjzSx{9_qgDTHzOfc>Qv6$IxG#sJsEmhRWO z#0k&GOJRr+xpaN*NJEF-ae^NOuM5nJpK@bk&)m*w@hATg{+96A<@Ul&qZ!rBiL|o6 ziQ~N)EnYff)7K~JL133}btoPbM z@zz1)iGR`+C%)v@7M?#)YQhyIN0j;wZA_%^?@O(lBGF~@_1Zo^>)%X?6|=9L*z(rR z@hYnTfZ^B2Ps)N36i;cWCCZT&ynT^Zx2x9a= zXzmmxu2{EUYKtCV@9wysdr|x*p~u{}!S2$7585(?p&4Hh>X~RGW0ga{0OC4Mon z@PGD30-=JC%ft9&@@36s%w@BST#HVN=!)LyXzTFk2vrGJ5$wC^Sn5dY1WzGN$xJa! zVFow(ytZfAx1ZuIvX(8C843Yk1z&(MG+(VEOEM0hqRlka086_aG0LLbCIrw-k#=h&}zyE;x~Ed;P)$CVcm07k>D13XkJwUE_vZuDP1Uy8oFJF$-<#^A$gT>aq;yY~6@)Q5hFn zGYcfh4iK@Q{mHLK3D_CyLeUt*Hl6NdY*ToC~N2>(-? zq)z=XP$>Vl1-LZv)RR^E^X?hN&O2(C#Aj2B)u)(iUV$fzO>)PLlCyF|l+VIrjxhcA zgRVHeUt&%*T~y9RUgZ{u*4$Ef=I!JARgJbOE)Zgxc?Su+MhZ-ml1-f5+xM(?_h>1o zpocVFGe6?>$n;f1XMjg{*O7idU|F7pmis(6#+@=ify`Xa@wr`7&mI$JDWSqF?Qx~1 z5oe)bpEUlZj{XsMk9?f`?1`=k>3mDTLeFr|TK?wRx)uoN1@r)VS9Y|u&#peLVys}S znw-j?{yt?sb-vTRVNwC^wVtTWxxJ*{>y_!NZZe+ zx#eA#JDrR*{4*b5W!u;??e~;3XK~|-W~#3NHE%b`ABVO3hM~jfKGo-waJxT4tOtFk zRT;kEI*vP$JCW)Qx-+`OwF}fc)aldc)99quQuDah)zp<#mi2<;f;cjvLE5lhP@Om# zpT*et4EoPxZ_ETQSvMAvpUI4TxW+UgMK&U#8M>HC3Ci#JsD7fANKu~n;>yWr$wsA` z5z%D7O?tk3AIdyArrsXZ+Z}!Hg33(KFfbB{>E4L?GkKCQ?j5PP*oSW)w>?pndu85V zmVX$(ZXk>c2>ZA#j>;S?|Nc@kG?|_-?m6nCjbLc9AZ9|H;#4F4&*VbF=51z?Mmkyb zSE0<*gv~YejwpK&UC=;PCw9B`oc>M!f^k1%O^73slrC#1u!<@aSZ^9zt7piuDUklH z9YZHr=EgvhRSQoq%zcMY5Y;%rfcYnVeFA!Lj2PN;^`Sxcg#d`^es=CaL`tie+`z7i z-z^|C=WFFo4S=Rk#XRob5yZ851Oa(hD6Qhbh;E|V{VLbqDxJ-D5y6Y$GRIEz_9TTo zODwrI=bD=OycPKl7&ePPy<}FfN+Z6G^!qY??EE-D_&%FWe^Y~J7ROHeJ^T9O^k;$1 z)bWw1Au0%|XN@T7#Q{1(fh>!ku+VlwE}%e^0GR!e?W;62j{t`3`Rbk~6-8=co%3(R zuG~4vxWakrUzT(7?AU&7q12z2&gb#F#GY99>f`0>Jp7p)atDk_?$Qn1Wj_%@fv3vURXg*t;tu;l3e@)7 zLUK5&h?OoCk~X|0RWqMA-yuIve~4TrKP5xXxv#)z1vA4=wX+P#-a=$U&8RN)IVw2K z_~e0VM2`h>oXT>YP*a*!RUhP%i5ZhOnY~oZde{9Zbr#|Uo_M2Q&-tF!Hz>uw zULIOsH&652UJ>n~91Yw86q7k)IC@Kd!A?QJ9esS4(1dfzcIa(-L^40CNLwwH@%r)# z{|f&(DT#SnmH3Eav>$a({NHSEznTJ$mYeuTCGnd6`=9$}*Ib(i;y3xjVO=+?>u0lf zj0M$pYBJCUU8%=cFGvXzW%P0d?{`2)rG$n?QWW)3TG!(X!U|do_P^@k!?Vk^e+;rxx&q1yGMQ+lZs46m|AeeUT{O7GB$!r zodKo`k8%o{k!G}LSYTc&5?;^Fy=GgF6Ydda{pmmHukDDSe~(zt^i?MeJ_?Mz_doNm z-l@Nt4~4F~eBUy??%PTdCs|b$k~VE?v<*;^ogtn10G1Z)ogsGoU|~cJD8cXlRDM6gtvJz&sB2`q=UPh9h7+ zDd9OG@I}6iQl)2v#t*#j>2UHl1vFTk>}m^lS!?^gFc*v*OXG}lgEM-&QSP42&l&at zSoGM@M)vPNdwF*3gIXn>5jCI|(jP0r2F{?j(o>tQhJb`}Vw`K7C3Dt5KQ!%SvJ@}Q z7rgs%lpd#%Lh6n~^T990@ZFL)9G7vddE#J{@}l&xFLke$wjS z8Ng?W42X8DM}l=Eb2w>VMDO#rwDD+v!O1%Q@z^_qV4wQozxnX&^9!DSX*>B;`yg!< zOzAcqi#g^-1|W_0h+@cy9JJ%Cec>A84BlMJXtks{eJL6GG(9Q)U2p;#Cq#VgVlJ^N zip1I_3IS&tlcy54bhHPtj}_s5YeHPpe}iOuF|M z+|w?igWiWxbMc&>4kz~?7!{>{>iYUOrh{0&AO64wCl&oWm^9GEac2H(yOXS?@GZkY ztX9TkAK2)b3GaxS;KAS3X=!NKHaqqi{1}UJH~uGhUf4{-XNt(vs)oj`po`>5W_*tKKiOQWDn6J1vD*NI#%?eUa1a!HS}hO10t~2sW!sPq!dB z0m4c}OT03kP)<8WUk_F}ypC7J6@CCo?sy1|pfbL$b`?8|s$_M+Yh}A5=ja9XYvO4@ zsmeB$qWnwCD#>vEu2!nwsk2WjzZ^rZ)rRppqX443|0giBkw|NZx69LzKHQxTb0Yvux94_qj|`@>8^H`8@pvtV z*aqBlV-=0$9LXG2#msb<>>yZ3eH#7XDDjWs4$K!`Jv<2r=d@w^wd27hm!pwx=C%eF z-5c$}lx)Au8%y5fdoYP}iwTHx>kSA+V2qp80@$;|JO6jf5ddty=XN5N>9imU=$hDB0^uV< z+h*Z(fS(f^*xvZY-#yzy^M8{b(||wjxuJ2dlOaMKq4|GEj{)G1b|as| z3oZ%5M=tq)**vf#9%!E$ot3lRv0{>s0Wo{pH}l6x&uGBDdmewpBRSVP02dP*F+SYJ z-JS;ea|T+5Z#mH1`R8!mapsWSIp@?GI}q%hj-^Xq+iEv6Yg%i#e7l4Y9hFO}z&VSS z%rOIuxmN+ob3_5`b65eLY8ZvZeEmK~`9FPh&HH@}&41d}Xq>Ma2%oPS`Wy_U-}Z8- z+m0ZC+wP2e40z5LIm`yD*J|1T)sJr=N}zTzngGi=@&M^Mg6w><*m-#f2CWny|0#>&;DHhjiso*jOLr3t!2>!a3lKiWOgsL)^{Ae#HFxr=pe z9rmx%y7`zv%~W_W77+1$>fFfsP|XkD3Um16&SNmy0^G9$R`~k{4gkaLsy!j1?Uw)$ z_vNhwi0*RA5fxA~VZ2ug;npFa!j{IEY!*Wng%Azv8dul4%{yXm>*yEt<&;#cQ#r*3 zXLp*fCNvrOFeoGFr_q6enB0blRb#i?w>JVFyEjD{Ri+GBhnlslHMA$gik%r?)}e#W zPH0yDO@18nTQNng`N)IcWx1{uxvD;^a&1W@Uh1oQ zS~D(Q)HJGd)gI_4u*r4ohwRR-Q|{6Zt)Pt4a{rOV&O|AiALjhh%6AJdKbO<5wmO9S z7yYW}V(u{mQ8$VFP&bnw?FWXAw#sXzbPM0?9ZdT*)07YG^YW=C&RLiLK+rhHG;Ljr zs7~7*^4o?ZXq;oE?j!;WXlmK_v1XL^4gmmBRqbCS-1Fqjy$Y70UEFh-o8Yl)+Zh#0 zFi&RbP5Pr+b!Ef!!us*equ+{uSg)+9$H@}_9Jnwqe2`m?W!!({i5AdZ0IpQ8={1CM z)Yr|uomdjQkiW(aB=_y&ld^!8p1lGt3=Me(cE4R1;_r}>vXHK#PfPa8D2Q-6HvK~T z@;wN(+ng6zLqC@o(ss0qcS9qI(QPgXoS3`1c%*#6P54Lf`oa$!WWjbwevLB|!Fdq5 z|HY4PqPGqn`VY9q?$G$AcHMHeVT2d(Nm^ra;VPNkJ3p{HNWPCTzhkMO7%}hP81=d7 z8Xmd3_P-yzyLlQ;CAh}8pCP!36zNjok+WC?Jybkezwjmmlt}-aJ*Il`9qq$K7-FZB zM)WxXhHUv*4kLbWHaclrR<(-KXB^I z0rP$J6MoSYp4A-8KCS2iIQV7Jtv6|q`PL?SRv)^#dg6QKuk@}{W7*7jexm%p;*f&V zM6sV$_=%sVckR!IvaI{*of6QbN8^x#^F;Bx=LklNgLLq3!aNY4s{Bh4%^}8)j`W+z zM_JKb8qWj`p{;S>0VCr#nVoW?5Yo|duns;b!lRlqP2Rj1aEQI5^ZzN7_4aejwUBTY z^)?^>oCaEOX$R4><}Ta0aBl8TZT{JQsFmw0=~WGk;9A*4M_2x~kiOLwd>Fnb#=ZD> z{<>Wj!MYVZ1?PO3jfqAYSHD3JfuyLO8f)}2tPSCuT@Jd!A3N4OU1IXkY?}N2Yvls#*X10 zCy(af6mSekaH%NNOr*`j6iSZ=wie+7W`NurM4(u7yvua*Ibi(QvJu~8ThKDTuOC0~h11d01WbMNllRHAh zrkuD)$~ey_U)XS_$E?T9Hcj|uAZ(PxihIV#Lt!gZ@@m{3=-4t?!`4{(NO>2 zxHkpY1*q_}yVu|^^ZrIlUnajysyE(+-h~RRPw5?b**)^4?5D!-K^b7 zA@xm}MR7`BlZC*CpD-sakGas{Kkj}spG#dxp#fV`@NcB9q)_@GW-)s_R~aKRXP##` zG!LUsYTtY<{Vka#p}x@ds5wh9$kT)wJ`A`9P5MTyKuCUVmW->oHv8 zpqae7JO|bG%=tc10r3(()K|*)fY!v$rN2mTJR&zB9kluBfO_KB*l3`~E`#R5cd!JS zr^q`3nuoz6N4;CeA*`AzuqsR%%NazlH*Q6t=H=!@wa|`qmFcEdqyaY{o z6AcrRo`nCg>}c@Z_U8qg_mi$Lb)RiTO&A8M%5cy)P*MH)26to*j4oP=YJ2)a@i54! z?Gu_CxmR~xcny_!f2B!8`Z{ya}Bez=LLHV2k#d-}j@Ag5TIy`|?ezgji7L4$Qj zz0JFzUSn=4q{luv;Q|Ev4U)OA*C0! zjZl{{b6_*K`2fjZuAflUSTc(V6El1Xx?gltzw!Bz=+D*6wlz>U77lesYN2}&g2)Ct z`J&GjnpdzCBpg~AMI1h%gQ0cBx0E+-OfTx17Vf0r;h~F?sdopHM#fy%aSbo@Q(7D! z_AY|C^Le=EFlyE~RI0(O?QPEwDszot(tR|i+W6N?pmgmA$G$?H@0LD$5xtMgl1|)d z8TM6uc$r!HyKUVpO#t=+V5f2Q6BnfRG^%?_4XZU# zs&R$h8TO+*8{>(GOWuKkTgd<|@VunpG!gM){hy1Y@a4Xx#>}M}**v;~4I!hJ80GG6 z>0qqn0QXwkh)o)ZcS~alY!52nZ8j9(&XiU3t3ZIMF#j+>TM*hU_GWTwsIEz*qr?x8 z!%v!kQeq@sKNvvy{Ky1yk7dXfKH+La=8i8NJOCEcttEWw5TXj&D=@aO_H2B-#e?yg zcBfDAojPs1l+2wom;4Y3wzJ8j6{Ks-8G1HaCl6-l{Y$mdl_R#(Wi{yh2ey|+zw82~ zo5(~7Q?a(S?&!leEc#P&cwO^kGzmL`JDw_Ht&kocg$nr)#iI&WIoaH#tNR~*w{3^Z z+eW>q$gEm>626~(F@8yWA=erE{5ZtVWf|GLDUD_B=|f3Ls9-5wvetkd56;|JQ$NS^ zdD2%~CU!hB3KkVKROdL(<**N_J7}dPJ*`zb>}_7>fN#Euz17u^SQ{iRpQ8h-txWRZ zl{^~ZVqEfE6t$(_OKyygy3-zx3>|M}>d?JdfPfSQSD1g&i1U(HH_pDj8?6NxbJf`y zny*kFwzYjw|CtoOK3Pm=tKU^!!kb0QZ=fw)wPL7Me)1+OVLXWk?b!BRrx%At2T3gD zF&*iSl9~EgYt>BJ$2uK7Nw4@6zxQe2(2qPj(g58ABZrG7|H9>w`F*=5&gX+`l@HP> zC<_YaT@|5X2CpNC4!k{&>hhaAN=|!Xb4XHDX~W)>Jj4>|*%XOcZQRZtszQpL5NyOzhqmhz-&hv4$wI2K=CyV_|l zR+pbP`fpICR99%{v6~@7N^J6DNBY$UYfz95JE1Y@Nj2B(XzU55i}x&S{KK&()OaiAeHsS$U_*8qq9}XnYq8-^&@_0BN=;@7wEopL7FM*yh^hV>QFHtDVuXEt ztnLt*=WZbXFEU7@oS*}1E%PbVimXK46`$Lgw!$%d>~JQyQSWhNO394C01a95%#B%_YjDH9a@(2J8tw!#x1iHSVx>McXcE1f{_Es^8f30$tkuA5qo+;=RsX3X)RYRx&D!y)9p@^uil{|9tzq41+?sl=8 z$SZnoaQp*9f{8MYWDJ8+P`jnMje48V2GVnL6HdpL)6^t_R8`x96nBSx3_{9wN3V1!Phx_Y_gHbPl*-fNUmY4vO&-5%!=?=yo!DQ}wH04#PxP#z zF6~{qHO2Cl%Ji)1Q#dX#QrhVsjGB;Bb)yyHOEvh#r-56XQ8Gm$-$}~LpDkXyf8=c- zC*Liq=(pFNMB|0LUD8uTB>WQEGPENqSQSrWJP_G zQ~FC6b*mwc4itus5TlF?MS}yhizA-7gIQ}{MFZ_tW!+iY8fogqY%Yx}~B%=7hk1s7BP1l}{7m^?(kL+^QW-ZZ_ebr@F zTkw0U&0MkS?d&%9=1x$x#M)hJmlbmTm8=L*h^mxC zfLv6ip-J90v#QzSog_s0VG%>jx>@wa2Be>4Z2vf=k8C7EtK*5Mm zj%Atlx7S|$mZUJ&#MX$iq4QwwT~g=6*qpSAIlgU)$+b-o{&|y`=5yOf+Up2uhvGQC zD04KgYKa|HbyA&I=k6T%0eFTe0o^rNQnIWnIW^^uA#JxV4$VOI@<21HlVv>zXok{L ztHDy+pV?k6EkV8bvQ#kzS|(b96g6b%2SIeGLa|GgO*-z{Qa{KjlB1c#^cMoFfAZB;%@os4ZRGFV=#0q` z9*fOMM-Dxa#qa9!0W>GuR8v}Dx|8i0d-hB<@ecIn)Y{4k1G|!yNjZffgA0Ps?hsLO^^cx?O|e z!sb1Q@eDz{wT&)Fde%q=lB_3?JNKy(|2e6{@3ydd=sJK9BXhH<=%jDik-cHKH*qA> zvpPBHoLS>ezxDnN!8t@bs1Ba(i!Sxqr%kB|Ug%TLSu6Kpgk{1q2WF|>Cd{kg*~c3Y zXv(TGm&Rvgpa-whZhiHM=ZvJ9^i6R_WAuy-uC;ZJnr}-U|O!p-oD^uu%L@VP4IC zGxcf#Q?>FO`SIeJ5k#%~!AE@l$PnP?oDiUEP8jf$=~tkGX(-UvG^8!VFkh2;R%yn; za&EC%(B-EYXRT{<++1J*mwJKvI)Rf~0j^pBml}ckYJrm~0j??mmr8;93W1aIX3;eoo{Q$p7=HE~ zlAnncXSJz+RoAsE2y~$jDhM`Gw-J#Z4O>uJ_mBxPu z$MYUes+w&HX39C!R@JY#G7hJWsyXihr3N%X`sG9?8GfC=S2t3K8$aaiO_0cUu}%gq z2AV8&2D`(V1Xqk#j9Ef5G;UTGRu;+_PqL}H8oC8b1q$=Uu z_1blyN7#Rs5W1w9nh(gK8KoM=UtRSyFHg6RpIw(rkj5w@wpeVmxT)yU7 zet44(O?9P|Axx#2H`!k7?hVC&B(@)6*zJZE8fAa+P)M7K03t?^Y_HFxtH_e0%Hl_n zY|qa$O{P#%AEnSWA`<@Y^y5^7IE7b+DyB<^wgSrO=c#;q!CZR~(zGL=uEYOn*t*qY ztGFrcxw7a!{1gf-OOgM|`!7pXX(r{h=d_w~K6OY^V96Pm#7l`%ZtAF%CI0td^#AHF z>=8+Z8HmRj(8n1b|1zBZW!OZR2HU0v`+xPl$3v^Q=HRNaTaetx?|zh(7TVeM0}Q{>Ml9l76Xy;J_%j7%^Os6?UZZ zypVR^zMWOohLd^Xn zBB{djLi~LL$%UoxW}ntT@M;wN(H$6WW7Ugm)%)72SHr5;`7}Ohpoa*Z=z*2w!Ito$ zobbVx_NZ&|1118izhm(ftlA*->SEW9PN)JNoW_V z4e^yN(v^9X|49KB#+}A6!-SJ!UZ!ezCRVr)HMm)v{rdY_#n0sz627k|pF`VV zNRNcef;$P=l2PZci7eRe0uII`EtiN+K>Cv?CpWrR5Qzcr%82M0m6Hrr`44USew`V%J`37ssaMzu9MOcp3W(lz~WS*#kImzvm#LTqOX zB%?*%<=!5vDp>z}2;11dhnW0($mG9=1Z2qCWXNh{$O>f0(qzb@X2>3=%Rc;?cC3- zl#|j{2CiUQpHkLfDJ|d0P+8~Ui9RztZhUTqM;t4{aTa5x$Q#L-o#)V*kD-P&w1&0b zkCwa6b889NkU;yMyV`8;v?8)a-Oxu&!RlnwxFvprKr3aG8dT7Z;7zVL^eQd!Qe~#} zYXuNe8uF#`h(NJzr0MFP$etCwuac1-f-_(~vP`fHEb{q}nbTXRyu9)|*y?hs?@g zE@z>;Y%^7rW%VFqzicXRVAi4Ho||ps2YvzSULfa5z-5u7VbKydtHjS7m$niRkoZpAG|bXbv`N_}oX4I-^$i zDwflNvq69>x31zxpSLBK&~L6>zl4nfjxupWBYj(-e@J7F(2kEtmCkI14S}Rei@#HI zYUoGIyCB1T`yIpTX_DiXHpLtDX>B#!xoF$Dk+YXGPJ9(wrNqsKdWBSn6N~2amgKz` zi&pfrSilXr@<{$if&k+$fk#O+ZxUKN->xPJZgPQ@1tc=r^J!47y!Nzj6My zB+RCi`?(a37QFDMVxkY~nEBy&OFGfCX(pJb>QyLw-b`F5xEPLSdWY#0X5hzjcr5s`heoC0Lsn*Gplkx~T#2UMfZ|ut+kKj;X>&@r20v06&puK9` z?p%WX08Pu?Sc2qyZVNp6Mbj&h_@O2^wy*UckC>Txjtfog12SrjWbv8tXS2-|3_EX9nEGN_TN&pR$FSXT18N8)fQ^hENX9Bvv$>v)l#ddO|7U^ z#NIR1OU>2}LPf1gV#Ej`A-?qe&iBukbDisV=enNjdCqyxeV&v1$?tdFwg=SM@5=mx z?q?C4{plf0?iN#W#lw_m8q$BB}kdU8PxnXFtEJ4&$P@m z>2cLJymV%yerDatpBaUy4IKJZbj!oAGK}$5L6;GSlA~IU=)vU8D%5Du^i4Dz;t%LMu>nkiaV5VQ>pTBp+M}79WgoAuzX(f(w2*>9I=dS~*Ut6~I z<8jeRwh7GnOwYAZEWba|rP+zxKJx8a4gAPE+KzuWm;amnN84pp5LIbm;{u@V`0$aL z^rJxOtT{Afc+L6LD+zq^z+;EvhxeU5mcXAPHm<%wixV#9KV*A^n?gNNvPafC<@CW0 z;_j=iHqB>AC+cS&wSLTBG?+)@AIEz+KL>EcigoXp?)u4?v_qQbGj5OdKeQ61H#Brg zva^d_sG%o=&vIK5WaHXd0zU50#$=sbdo&+I0ppT0a?c+8jYbz&gNQ*lFy^uqe@YNy z%Zce$f;Z3V)~7rtAfIhDK*O6eVBN9AeunOGhgHCm36cAu@yYfKO-(YR>k(RGPuI5E zUr7qRhxW!E+E zOXyn599@9gL9#!;oBE`zl@Mx3*5Pu)zcjKSyQ|9kBYzxPt(+}s4rTt?0L_$uIAmrWY%qKRF-`D(dtX zP)2I5NLm}XWl;8hSK@xuPB*$Py-qUV{yzF^w>BRT!&wrF-@ORB38@8c5)*^kh2yYYJ>wM-((T^~dtKMBsDC zAJZx?J4qjHuH&}z7fboi{z$sL%+B-qW?j$r^QTU;l~taUOSIGH%wkNC)s~;4f_g46Q%NIn>EOVM&)Q1p7gi7YPd^o#K;Z}G2tTbF%*LTW;)BPh3-w&$e7Frycc8I&KCFN@ei z>={jV4|J=oLlvM3<;>w0*n|C}{q#Vr)AYaH!`)ODPy}=))lNKY}lOxZX9=x8kF?v!EG0~27KRLBat+L zFh)qu(2Jwp+(U!DwgpkQLX9i;R`Qn+afZv?^sP|I$~{tN8$@)~o-HY;SCzYxlm~}a z39TsT7|2J1W>%_%Y*RopwpG9o;Z~s?qtK%l?goKQ%iM$W%gMDe8RBhB%kCU)Gxt4n zb3HT27w_jcaGkm;)Qkpx{t*~_WBC<-+kimZzyO>q1Jwt}+H2rieihm_K<^oc!g^$l z%`axx8a7LPZIo(r^!VZ6;W;^vY?2Cm`FF6GSKCO^8@=+_?Vn#vK#)ayHBnqT1~_>5 zFS5_V*%cb40BuA5ZA1E=$t(XC`PwWMsOq7};MTC$z(~3hXa-%DGCh2cu8r%oEHcle zZAis4d2f;4i?rFX{O9kl<5m{Q6dL!+n_&SZI8wSR&@*7Kv)EmRB&P{@xx6#jmNU_| zkkIR81Sg|vq-b+p-ci3LQ-yt#p?ymxdXY>LPNvX63Wx3tWoJ)h&qs-i7uvl^hY!g& z+H&cy4AP?SbL*@OcFpP4sI3gDRpndcbR`5-=35Bq$TW%uFe(_!G>QZ;<{Qa0N-m?< zJgaLfix>0RKSHZWP`jYE1GU9Bt(-b^?~MmqC+@XLEPFY&EQj_lGw(EhKXp#r8)jZ+ z6+h+WZ1f7ax9qOC>`u1qZewCy+uxS=vu!EIOX_`uha$!ehx^QEj$~;yU-lLyOH$G=3r{}BSzI$J>SO27lQw6m2KI!3$z4LwB zh~=#O0kGeq{^4?EqWRG_dYubt$pXr?WIKJR*5bNA!|3=B!nomje=?F{d&kN^l67)X z>by(EK=Mbj!yJ{+X5#%j2KEWQi-GqBuD{^?^k&=M%?h3M$KY(tw7Af^TF%u>ex4R{ zhw;}V{w9c7k5HLyKVuN5jksXRPCzK)xDRcKY}$!~h4|#k4Dn!RY`EsCsWJT=HhV`b zar5;@^m9qNa~wID_PMgM$Mvkm;d_&(%1>A2l>-%%@XfXBttvJID-->@ab~-Tdw2mH zO=P)zXcNIFmT=fGMDAMfv2r*+&N1Xy$k{);R(dPU3PHUr3Yy$v$tyZU`e3e4#EIV# zrfEjv?Gjr>r>zr25TwzM(*}NH&z~(<+2BiG%f~=pv72ZE)2V^Eo3)VLl?QvyPiWMX zM*rRGBfif&q}>y5oj*f)y*iQ^RCk@62iU(piLk7h$AB9 zbmThU69z2d#Fv%+qA*L@hP_8-?cKY1KZww3|H7%dvBkEbQ#0k3d_POQcq!fxyxnz- z7^VH)S!sq?3d8d8rlMwYTCJifej#+bwNm0pCaI3)5$5)e*GmT3}YbVgl#*TZ; zv=~A2x}RAmi{_By4&^3(9r6Hcn7w_V&$r9HOTgUXM0F+YDP;hhNv~Rn1K+Mu7U`=B z^$MoysGPp0K{Fi+iQoz`x&wT0cW)A8YXTKZ2y>h!;@2TVp{_ahmtVMz7Vo?ICQUeN zOD#LT5o#W=ApNSf*nz)rsc)4kUNURJg|l139M(rLPtU(SsfYo!bOWH(Ns7y&w$X#` ziuDf{aUZb#IM5t($i!s%k^pPF_m?)@<%N%WW$%!C!epuU`Z1A_=t@+L?7WImrU_Hh zpyTLZXzITLf>@BiNRfrsXyT(jmCMSVTaKX?Y`?5$`w~5tMOA@ks#oV)I=lG!Kj<*t zpk>;9z(tDAxa^QaVry9lvd`9e!KL%G&-@Y$ORDQwxQUj(e)%=i&bI3Td(Cm^T1d7+ zFlFsn$!)tD<;6l%Tr^>&p4l`?QpPM+6;hZOqmrv;&|Vw?yP{Zi47y3@;qVM|3-4uO zRd6qsX74sW@x<8-c>P7AsUV@w{$JNp#dgYt)}Z~w2sW=PYRJ(aD{s#R=nTH6xumJ? zXwSpp&^<;tf&101AG9j3#kd{S+_%X9#F=PG(1X5e@5;J;j2}(OZI3XvBG+XAz4{;S9{NsGDr5Mr#jC!fz(-tw9S=BY z>4*dOtgl|CZ=x>VB?ing{qn%RaWw{y*U1erT)wj6q2u)tNL|QB6#;E>^2})(U1Gu? zeMq%r#bGG|X(PO-6#K}*g)D_sh6vEO!^u~|l>EQJ7pusX!!MJuwbj2ooGK&XAum9) z6ptjE%p#t+=+#9ZnmF7prn zmiu~%dfRoWJ;&NN5LRc5OrF>_ou5w;%0yns>;>9X0-Xtu24m)b%icp83U1m?iWI(2 z80-Ga^6ze03kJTwUO8(Bwdn-_346VYGnb#%XLS%&wS#3r#s452Tdj|vzx4^Gip}ayO@lohJaJH|`v$W3^(sNZ!y^XarT3Z&Vp$w=Bv*{nfLoh>xHw(7 ze=B?<`=bl$UBB6Gty4nb_dgxVJ&)V&%Kir8Sz1_K<;6S4tbE0tdi%U_8Y)-qLs$Kg zOIKpZ>C`sc{Ito?@^Lk;w%-seWu2lv%_*vwodFx$A@YR1UD~0z}+G&Af$&%~a^LZKlP7!>91CC0b|(?Afpd(tH;eI-0-) z=Lw6;|xs3U(G8 z!tT-~9Z52s(9B6Qo=21vHA&*FO$0X;>Al4iIZ*|$RZKo9-HSJw^?s*%~@g@=h0dhu>u&7i-QFByA|G`wmcxAdCr{WcO+2&qlrJVcEek zcm!Do=JcasL~=`fs4_XLMiOthX?N%gn@s&N5>>L;$YbqtNoL_HYiH!VI6QT|^kGC; z3$tl%z-TR>;b}vE$UoK5gN6Q=wXm5`F@VIDTIadndE@xCX?wcy;d)06TT!)Rxn)4^ zBs>KSB`ZAVVrr|C71>b>v>!^r6vHHFbXwmY%f&F2^ldpKI9M`fzQX{+bayTnxeP}P zRl%Dc z_`BM$3bZka+^$!2|K|w`?_a=GF{~XF9;-xtk&AymjTZ}V!_JY!o(C;{C!OiV!#jt; z;~{v(Us5Ut-{8k56dg*M+rPEyz&9e&!2-3|XL!DYj1#A-atRXQT`&i!TUOd@V*jz- z=Bq?T9{z23=aU(8r0Bt>=!t0u(LG%1%mXW>wbqKa;_TG7ry_!Y6q7wFtMB+_&>Y{9 z`B=RfwbdG*Y!E09e7_JYj%SurH&~e6dKg~a%jD`a+pcRJ9@k5*xjz^5zR!A9TpSC; zb03gejrFfqU^13KU%?`KCztq$(Yaelsy7!ZmtO?XmLO*EMQQ}=f^rGZHD&9`?0Hh} z8R1WgUwO!{I>6C8MN6mtWovGiEwX><@iV725zLd3`pQDrE=$01JN7dY+OC&P z5o}fXL?X>Th@^MJ^+N0^uJR)EnojIb?0vVwfIRk>T@hT9ktB}1-U%7>X&zGMBwskK z9cvv-T*iAHV30xI`l?r-iS$&g4rHt@U`qX!NIGU7W^{}!v6y&!m<9FhxAF|nd;1y| z{&wYgo{es$>7p-5BoQ57Ythc6;RBMuHkI5SE#dpq94~5foJ^z?xiX7PG&<9djN2Al z7(Xmv0#Ue+>p&R-HmEMi-@eSUqabQt@}DUd#?@QYns12CBT37|TDwFETN0`M%m6RM zIY}bbFYKKBrt!b#K0*n-7Sd$sbG=X7C;d6b5@TtI@I%;)9)WS-96W*sL6g1@MM8zO z|MH8U9FzFP|H5;ieOh^>o^I5ideE0l7hyiVEm%989o1DVE><9zria34ICM7DSU%V% z#7A2OX5C`tUif~(#IVAC0R_iQKx^3mVGwNo z-uzvr&w=#sk^4T3;AZ%8k_U1BlIy(fJAul`0?D+Vs~oDl;Ynf}AACnh%;>e`sfedG zzs9WOoFc;AFu=T1#5J_^lP^%5@KUG@2`rXE7b>9bx)?h~<%oN8w#2(HTMBw$BI{im1C!|>##Ip_x)*6b65NZT7$<1-U8s!t3KLz zZL0LqZ0pj^6p?DSH9SR_zm8wgsaUP`|6h2HUqS2HTW27RMe~(fn^49cWKcJ~FFdt3 zv0t+ES1nQ4ye$1l5=1g#!LYf$9c)4XS#8eE`cvlt)FBM{$=&^_E51l|>OtAEU$}GSFwv zv(_d)pv1A_qDoFs{8+Jhr9VEJ8WffHl;=eTk{nQoD2j?GisCMc>IFyHfghu0MUX#5 z3L^@lBILTKG>u(Bc4J?0WfLuX$^~tg++KuR6<$}lnbwRV?X+9-B!0w`v06sq_WMTO zTsJ$Vn8OD}QtcQ;ptNNRsNc1}*i|~E(%$X}jMVylvrfoTO^`}s*mBT3W-dW(mt{a_4k{sioKO#MZEDT9)%xbCVuI5uBGNoc~pki&PK2 zFr%yZnQyA1CmPzbxH@> zOLLHdZ)=FpBV*geX2)+^v(3jou90%KFdl1gx@;w~8#Fxjxxg~C|Foy=Ez$P>}R z-kvC;LH87CMuWD{s`WO7DBo%spttkvh8cah*VfdynJWmM_w>q&5ozf`7VfV1MTRtM zOQqg(x7?o!n!gVEnfEl(k`XCFN;>I%X(!FpK&b>o-3)3QP{>V!Wk8`_?F?!XPzbJ> zK@E^*S@jI6os=U%H7N&)B34C#tD=;uq7ao)5tT#|7o3OlS;)}gHWU|lOim_8#`}i% z=FK+?*`84oFW(77-B_y-xVS+^ht0bkA@%fQs;c_EoOe+ypAD3YK&~gQr{;V;&6lu(sU2lV6`4gPjYyJ6`O6CXrw>9`apygR@O7@r zb!f#$c&IyVr~y+mZjSX73~<3zJ=z7D{y-QzA~6p$i1g*ypob_-szzj-5nkalHb|?q zPmTSO%Vm1CxPV9xBW018ms6|7dC&^(FU6`=2|6p|y+-_Sb4Yx6 zxkh8D$xQ_vSVLmw_X)%7+}B^VfeM=9F73kOdngn(0peU#844GI#B-JCRAw_2XP;_+ zkQd377f~%V(Jp*)Qy#UwcvN!Ehn>-m8fXRrB$>@J|} z#@(6mbSEMuwTNm=CUp!}At~jv=E0d}aVnpQ)^X)uUuB|o2k^I!p2_F~b(PHB8IEA3 zivLbpHKkqgDDdvz(|w>8c^Y%~t16lz2206uQy;uAKXQrx0-0=B>Q)H(ta7&i0txo znsRoOR`52R_HYz&anU}DB|Q52T6rJ@!r)rI;7sR_b#wd1w(T<$k3&f%tYsBt*sseK z=4?!P=X`k-M!xSG>^TV&>6}pu?A)xZU*X--zf6*9Ig*InBGMC`v_5nG#B9OK45PK> zCNBEw=kZZjzMu3Ldw*~<9!lw`{n}t`3tBtdZQ>c)-YECT=_w#o(k;VS1?YHn?Qog}bMOW_Avj-N zxWHadZl7ddt)4O*ZR<1@+RA805PZ9#@4hat*RiZzZ5VNyu?=pQqptC9pCxUb(vc$- z>Af8wZmwPPV8(g-`7hH0T|JB)bO+pcO!N;%w+S6Q0C&89?_a03)jh@?Tv$|;2;SS{ z=Ej-{(RKWe(5Q=ufTen0-?QBzY{)u zF+W1nKssne>0c$k~e7k0vx8W4_mWzM63~chP}^#m@XF>ipuC+2MSO&LGNLH zSQtXs;7XA!X9I&{no6-Go5Loi)di zQcl2hdV5$*beca{X@D-<1s#C{{QK-Ehqr@qKyRo6I(u0kF7bO-{#V2rb362hwS?OH z9uJ9tPbma?8_lraVAEhavjwK@U1&hh?C8ax4ZkV{mY|f$@_lQJjhFw-belI|Gc~A4 z!Bl6;o5iOUPm;Y;6qOI1b)zkfQ5h;V{}3#%=?4x};qewHuo{xbnAYI#H|)DN>_aR) zq%5~|ow6hnOncQQeo49RClquF`Tp78_yJ6l#0gCN3NPp+$ok2UOwJGI_XqqgmvAc; z_ma53eF0PnQ(C2ixmW0~#7zcs6zxdQmzLJ3;8N4#&)X}NQe0%EkoC=ETrcUmbhy=@ zjH>4fFndh>d`vOTH+yH)=mFCVK=MxZ57m}2&kurrw`+|O7RTHJimhwGDZ=R#Nx@rP z)Q!fFJIl^A>)P{GrAM+3q>fWusXSu_Ze z7{0AnW3Rb|i@zU2@oH52gJ3 z)LKUD?})$Up5}|xEE|i9H#2Jw9br;$vQcXR80U^80Pe_H3i4M}-rXb#u`K{!$VS`% zbe%=$xL@`s!?omd|7?Dt<|C=NbL%OqRGLhktHhF;O{ItA08|_O?hl7L0W2GeS#iGR zbkHedH3{t86wOsNJ6=o5NTZrC7j85N0(~JK z92E7FGfbom^#*s)kY-JoiIi#H9IX`jvX8xMQT?BB=GLd;--xCV9jiIM)*HBwl{bc9 z5cc5;4cN<~@9vLIt4v!-uSMnsBa;xi~UavN$|@5w6?6-$48#w$@BR3?rvGN;EO%$O(=T1&kQ}C>HshqlCsMp4iPRkBQZi zZPJ#ypXT~`lMSl%xM}nugO&t0Z~K%0v$g>9mJ<_nM4)L@fMG-cpP~I+Fj-3|Zsh)Z zVWH6A_}y1@Rcc9dDrxf9wYdOVTrR2dgIZihT3ilg^eRSitRZTtJ+E$usL}s7pbk+> z>M54^>;DEx{_%fa{%^Ke=1Ui`Oka?Fm-kuis34GN{G=R-2t+lr_qU zmVA`;u@;L%8I6J#OS%>dK#OHeo5dwnbZ~^JX_SdFO?YsGA_^eVqqpW$Ij@g?E4n8cpT>NB^k&rN^_!d5<^I?Adh~iY zoRdhd{E=vaiP&CCsoQjwys1?H&k9v%{eEIW-7IOZPs*dGz}s@ht`1jXg)zRLCR8S1 zog-@4+ndFp${z~@*oSb4n*0Y}i?~PoC3j-D*$pd?1A3F@v)jtFSde5%Gy%Lr{MZ{w znCUZV!NwcG@z1ijt2D>--zEZV%Mu?3BA@Z1o|)tz8Qk~=;?abYOI8H|e#kJ&msLTL zggb|<3MTvzlBk|l!IK{{?$0(vzZQ=k1w9_3-;PIDv2PpAe5xd=aEKTZXs#A9YfJf}fepPnW3w$z2%FPoH@NKELI-=4y5JqZFv#G!@cN z>Yz|F4x@n&i9>F3m1G2Q7xpZi`&~qrXX_()Ba0(Hn9NQpq(mU-u*Y_q${5NkH6rzH z=TzSf_~AiB(*6qcGJu%Xl;C~d>VHH(E#4RFeGcRQ=759<%useuKl=A??=_j{M}Gj}eRRo>>V)-j3~xFLxiEj$C)F zZ!{lD+uF?7x|>R}^|_37k|&uM|93WD#_w#;J|25*#QUm$9DSRe@&Awed(c|3Z0V1H zKN=$U$1U~i4|)CBR-Z;5misf`nl%o)u`-x5rKk9u=kPoB&J`ehFm6^ej6ZzPd{*Vc z5EOT-BIxXPSFEy*S*C{0CO=P}Hhrcx*u|7K68Tp{e%g= zrUKJV8A}0~*%43547gJ|oc3OAuC{8%GwBR%>0|Mx+$<-_OD$)Y^s%zEey8;Q=aLfn zIa?~nA48rEHEr@heGgmpCiq~ z^CfhUlCi<>=DCl#!;+tU!xmnB`26Z(JaY6QkvxoxFdw|+_|oa+%isSvFjFc~e*KX- zcTsZjOOcY9MW*OBW!2_b2`6PVwq(wevb|t1T``uGQkwEMse%l>{_5og&(J@Q-#Zxo fV-RvX=%2rzYkwWAOz6g6oS|kt{_nf8P2>LnLy-^p diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-Bold.woff2 b/application/client/src/app/ui/styles/fonts/SourceSansPro-Bold.woff2 deleted file mode 100644 index 629967a1585ac300e6e114ab65ff69769f285dd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85604 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 diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-BoldItalic.woff b/application/client/src/app/ui/styles/fonts/SourceSansPro-BoldItalic.woff deleted file mode 100644 index 872ff6fdc63bb3ef43694e8cce19e7cb03b2c0e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49028 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⁢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

nQ#r7=p38dq%k@ImqE<);SJGFa} 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 S4CcRn4h~29|DN+{*8U$7S)Qi= diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-BoldItalic.woff2 b/application/client/src/app/ui/styles/fonts/SourceSansPro-BoldItalic.woff2 deleted file mode 100644 index 44bd9f6447aeb7aa52079a1de3be104a9dd9a9aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35760 zcmV)YK&-!aPew8T0RR910E@5y6951J0fYPi0Ew&ivZ37$ z$g4F~G}-_E|Np-tnaG%30$!4o3RpxD)z|r(Ak0BJBBZAYlWA(vJP^^bgi3V)Q7PSd ztO-YCkq+m`5pGkJ^C>_!VH|TgJ90JANb0n)_~nX3Zc`Nzh@03WFv`2bhlik%? zqw46uqiL4@F)vxnI}twUxtL<;FAig3D^6o>eXyw@o9g^H8YOBZiA~R}vQL z++%i5G4mzvSmDxcD#1_|RL%P>XG!dA*G?z3@qk8k=4~iVM)%a&nTZJDt{VH=&H8z= z^FO==m0kO|X=Vo2G9?mushJ^;?>R4+yZ-dsMq#}b`IS`8ofhTeaNYWySNzx5;rC#c zMw9i=Srn$5Bvq3}g?$Yt6zm(0k4S4T1m5law0Xv{-B3QQ{LQF8@qOcsvDOtneX*pp z&6{ITf0-|Nhaa%%lX~Z&ECb58^Dy{kivTZ^_tTOg88dBYIA%q{WG| z8|{w_3$*#zs91$yC5nlWM1>MH{d{E1=XGj7SBJGUjj1v&eUdwAF8EpzAV4o5@g!lN z*YUPYLvpFJ9vqqfsxGr2EV=3JOAbhxSWi69|GjVfocB^GS>EV>3uw21G^%9^>JSXk z2oB~>=Cq{QpVa=sPU;{mFvyl0mG=PPwVzKBgH4aa(6W2EnM2i?&f@3KY0vvd)sn1k z+3V8QyY_Cs_mx^ua3&}O1mF-HT-rzY^ZfrG@!RLzKaLd*6z738<1kT_SePanw<1jA zdHJt5z^~00?#RbGuJTQLw>$GSi~_-cG41h4-IH&=obFk{7Xns+ z0#OMgwN&hw4mNMff&1+IqG+L3s?@Oqc^B$il{U}@n#}R-hX&T!ptKOpx&;2aekc)Q zhzAmi(k34IUFzdbs1z81j$;(^?IlN1~-5%^!rQrd6+^xe#bvikbcDsQQ#N+}h0NPw7`nUL9@+0fTFN_#=OqfyAK zb2^>V$|atvkDuOZ)#!SEW@F zTBNmNEqiv?GaJpE$ysBg=z_5OSBdVb>PAwx#G-Ck1dNqt2P0CUpTw6%-UVT1+{=%sI8iif2O50Gvj@p|F_vOMu;5m3tp7Dl>Fqwf zG{xglN=2;$te13FDuP%3jpAGVq@zY#0nF}NvkP+A;n@GL=>u-lzFVT>Ntwx7wV69F zFSJdGWGewbg9G)QCir(N%=g3Ur9Ftap$uUN65L7eqfc_1wA%}$gySf|9L5-9JY$3^ zG-1S%{cfM%GG=B1LI!~z7`-3U`e(LX>wCFu z%f=oX0!o>I0X6%-r8(0S9LcH=Fj!!Cd{(ng+XsOG^(WGR0MG$YaNw7V&_)*u&(6yA z7H{qjCWrTA#2seu+$n`%HWB~;g3+;|H5CF00f4%p^p9gC02FNsAI9-v)q~{GAsfI$ zFJJ};1&~68up%vxR;{o$eUN_rumNhws8OP(f(EfbNIWqZSu7relsgOz9q}qD_?p*9 z#n-(-3eGT-RD9E$q~KfLA{F1Z2!x9*2ICUxeKUYnXKfuDo6goQ_70t+TcSaN?^}u4!=fl8f$bvm7Z^5D{ z+DGb9`)X#_mTeBzE}PsQsfWmX>-U&|0TBDC$C7LBfbukRp{TIgnrgO%mRn8no#$V901Fh>5rn#4zTO#4*x%#y`&Zp+qztke{sr#s7V( z;#30qqY2ETRTb41ZKyK8N~zZ@1&XBQG@bMV4KW^4r;FGQ#?;UYweGC{P7;7pCB@Sd>q3*h z=46@l18L~3xe0XV#*^P-Q{SsuQP-R;)JdCZmbE6;kRGLnQQScJ{;dsGNHvSEU=C~e z+rQ9e&4MK>)+B7$vSZJIBPY&WxN;*kmdrTrJb3cr&BuOcd{U(^Tv$uiUU&Hp_t$4p z3xE(T5=*2qk4lKLx~8_ST+hJB#LU9V0VN^;D*>#N{huA#-sA8z9~UO^WFDU zY$Ogo5mQ#|tysafRH)P9mp*@t1c!|1h=cgZ7%BFH9LKND4Iy; zij{gZ8z*1nDN&_C8@kX1(mj5K!UQt3jGO&uExmobQ)20$#pQ9dEShu`6Lv86K$d1H zScc0CK$FU13^LSRtH@KHso2bKF#SOF)I)W&USy2Ubb>V_wFc-?uQlcN`KOM)#FDY~ z)HP_Dc@pS>7#hu{1ZWcFiQPlB&j&Iy&%hAR&wL3^H8^ zWG*&Zlda52II?pwAM}`EGr6fa&WZjEfyr~=jiTj=*~vgS~#=9nwUVpSCF*U@2(>)EECz{D}MIy8qacOq5v@9Z=rRz zyW}aAoqb$6tJpx<*tqVU+rHT&gSI@jr)@swGx45zW=U+6;21aq%!=Asqj>@gBvb7g z`#U)bzA?l@4=(}Fi}@ZdGP0VcPKR?pd-KS#A|-}q7dKeu1(Tbakh3$yD-159>uUeYtaStioMaFg)jTLS4AC7w9!Q$6Kt@JUF@?%cX^ai zMHB7x<>9VyjT_wJ4)=J#BcAY#SG?f^pZLNze(}ft_mWZyO^W##-az=TY1NpUcf~*{ zKH3V5t%=M}-Kcx>KV-D4&0y{8Kfqc-Tco|qDtKV4o{V+Nty=e9ThTr6b z69Wdva=IG|hK;m}Hl(R?ws>S6Yq9`J@h4*Jx?R=i)Ljyuz}Eom7_ITF>LA*VomzMbY=;vgBmsm$BjAEV>N^Lz11DYm93ACu?qu zM41pBBy$vtU`m9fGZprW1r93$wgeoE;YvVCKt|g*RPIO~=sYob;qk`iLr3uB3lWAd zoSq1L6Hvt9Q{bCMXgZM@Xl7!Vg=_X?*=Zk+0|bsuBvl%LGgIKK3rH6y+Z8wPW!$lQHL~@uHQ$784v&hd^rV(v>*^iF4BgCgo0Wk7fG8) z+6<-5SlUcQWhNn(sKgTDh-4`d9#~l86A-W=BqCx*OhUqeRGvIeWGe?LCKoZdip@Ce+lT08BQcR=@(M+Om z2~s5x5nrhUqT-85+jLRQkWhsvW(k=qz9wn8D!v`!+a` z?+V^mE?2=FHS$#}P@_<_A~lLtD^Xvmddf8RnSw7Q)xtNDdf_`sqwu4oRrpELE zc6M5=PN&x!3_Fr|r_^>S4i1ivR;#nKi;JtPo7>(=x{s9iS-f~*x@%pz)oncqt@?C7 zuQi=sGYCO5gWp?yeP%TW-G1<+eD<3k<~{Q*1GhmJdY`WUr*xR}vxrg>eCsX>(EZzV zfjb8j(HD^4y9+Inxg@Z_7k zRfIOmE_YvWgGygLU&jLN#3328PXg@lLjh#sfybRgwf4T!NRrfY3?69O1EH0pivTY{ z=)ew3Q$kvF=B5POo+NR)zR)FOGJ60iTiVF_LNFDPkLcJiJ8?qnt|RbKQsvwe`s_@z zUpzRzP8nZ#_@kf3=AFAL;<%zZ4RChH4pE#6Mh>V`Xf^F|lUP(PM8qVfg??VqMAyOW<4oSwGb`?dX^E9I^#9x5Lc#y5Qr z{TucHK2Si~ey3p2ue7p$l(wIg5_{H2tV*^aW!pu@@=2fj|63|OpJ6Fmp?sWOh}&?< zbwbtW=QD7!iqoFGw=!HXCw^-uo!GBUuN!l3Bg|j;W|BqcAlx_T(`9QUVR5Ham4`Xs z&;id+Uq5j_)Gd?~f1+geCS-q&aLl(q!yf(h7Zy-`aH{TC{Limqv*G;TQE|X9p7faW*YWVZ%%WTV2a&A7+E~LLv1RSC({!id&VRaIk7$0D zt>(;X${rB}TDnAJaQv`*6V>;NnYf5kh0ZAMtM;Zg;y(yvO}*B(>jj!JLY0YGIdR(K zoM+N6{@_+61abGYWEBtV$b{}1eomh)wBvTx1aFT1`qA|(grW3_zobkU34A<3;7Zxzgt9HS4V%f4|3w@C=i3HHJndK4HdcNMd>|(3#XN;$q@+EA}O;=tE z_|;6LWC$N8%|4EtrScWle0*LXsf>s7fRcut9-cU*^QeR$c;(uoIKF^7a}fpue5Q6D z_Z6k^(-Id<;IP&^L{rRho|Rc1!HA7ya?B4#?{wq)?d06yNr}h1!Xc@ISV6Am ze0In^@REh+<4t3nQh#sh&^jsq!H4wcekhuuAg3n2S!PBvUulldNm4kidu*03-wj0A z^XD<24X3lGks0sr4ix=*jNp2oDt)g|s{ir5NpE#>_3+{iZ+XXi2G~S8?Arwii58s4 ziSBPfjy4y_)2lbV?cLf~n3$y+2Ul6J1^Wd|qXP)(Z6EOA-*J{h&lMPvz%@~q0~W!- z+q!WLhTf86onH0c0RY5XdT0|M3W1-lMGB@|EVCNme5ZQP0U|s<>UA#}ez2og`-t(?*`_}j10N_stC+JZ% z9sXolmpqMMcbAUT-c`e3I@b)R3YfhX`o zBJ|r@=uoh=U+tg(sN2lm8X(oqSN-E`VyECQiwpBjLuFK!U*48(=83rzb}{|7E%U;G zN5yLj=R*MKq4RoXC-%K~gsc~@;Qs!9P(hx|M@bHxR}`&Gr>2bp(Wh^74XDEEdxwt} zV!-ymT=4FDhmOQk7XZ9Se47|(x5F<_rXZ%0<=Hg3f1y6_L2#yTJzmn>A*B*fP&dNl z9zRUWVZYP<84aN15GNo8Bkt%#xVX|DURZDXRIs#QA&iBIWF}fPOLB8rS#7nk)>=zu zn{CF~X&-k79N_DiWBjB_TdI29(bwnLD3w!_e!DR5k1Namb7S3*JLjGNjr9Gflc6X2RlKBXc*E56 z2V2WuTy6iMBqSn?kb@+qAxD{53pvYm%%qAmnYZRzE>MY13(-}#MLSmC$qh7cGYvIt zv%KcD%`wBw&GnYIHs36Bw!ja5T&$n{wl)5+Y#Xe!a@)Kl2msU8ti4d!=-+UWyEY!2 zdSWKlvNW7Kc(=B0@z(sC1-V1QHP-Kmop(`DV*kC;1y26=z3&a@-et;>{#g|Ux4-^Z z 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 X-*Kow7RY?)&;Zw&&40G8bH)Dy?|L)` diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-ExtraLight.woff2 b/application/client/src/app/ui/styles/fonts/SourceSansPro-ExtraLight.woff2 deleted file mode 100644 index d6efa5ca0e57c1cffa1460cb7677faa0e2cd4eaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82716 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 z 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 diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-ExtraLightItalic.woff b/application/client/src/app/ui/styles/fonts/SourceSansPro-ExtraLightItalic.woff deleted file mode 100644 index aeea9b01930ed6cd95b49027f68403a512e6dfc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48124 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%0DQK=cod_Kr^5N?7WhiwgwIK$8$WeZ79unzlXD; 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 X{)a3TQp5dcokze|{BK!Ux9-0HJfbJM diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-Italic.woff2 b/application/client/src/app/ui/styles/fonts/SourceSansPro-Italic.woff2 deleted file mode 100644 index b28b0010c598aea8be8131e4e895ff4e72d8ff79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36020 zcmV)MK)AnmPew8T0RR910F1N%6951J0ftZj0E|fh0RR9100000000000000000000 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%0AQsc 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 E0J3hpuK)l5 diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-Light.woff b/application/client/src/app/ui/styles/fonts/SourceSansPro-Light.woff deleted file mode 100644 index e7df0df1dae6e2e50b49a73b1538a371bec63c8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126460 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

R2D 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 W`(Icn`Twf_&P{~Emj diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-Light.woff2 b/application/client/src/app/ui/styles/fonts/SourceSansPro-Light.woff2 deleted file mode 100644 index 346e99cf8c26e6195e15703a43e96a456829017a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86104 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

CHoXf5M`WJI zf0DjGUb;ac}gBEVkGDUTH>xdqlttnqKRk*rnN+?j7(hq$5 LL&uBXdfVWCamJ-O diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-LightItalic.woff b/application/client/src/app/ui/styles/fonts/SourceSansPro-LightItalic.woff deleted file mode 100644 index 7490d93c5057133f010426710d32aa40d8b68f23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49360 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 g7HrHho+59Y%`*QDNd9D*ylh diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-Regular.woff b/application/client/src/app/ui/styles/fonts/SourceSansPro-Regular.woff deleted file mode 100644 index 1df06b516812b5d67396596c7d752e91db50c6cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127484 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 N@hklQav77V{|8@$!r}k` diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-Regular.woff2 b/application/client/src/app/ui/styles/fonts/SourceSansPro-Regular.woff2 deleted file mode 100644 index 2545196a504ec6b0cba29feea3d8f603df2b7024..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87612 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≤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 SsnE5*h^Avb`LC~PSN}ho7!|1i diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-SemiBold.woff2 b/application/client/src/app/ui/styles/fonts/SourceSansPro-SemiBold.woff2 deleted file mode 100644 index 0d90128790201a780442d9e675397abd4be7f2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86328 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≠a@lSsv% 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%0Dy}1u{FIK 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 Z0DFz@vWb!Np07otupm6pmHux%{0BWZ_@e*- diff --git a/application/client/src/app/ui/styles/fonts/SourceSansPro-SemiBoldItalic.woff b/application/client/src/app/ui/styles/fonts/SourceSansPro-SemiBoldItalic.woff deleted file mode 100644 index 166665345c18275f245a61e7b321bbe363491f0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49232 zcmZr$V|1rIu>aR~yR~iGwry^0+qS#4wY6=#-P*S8_V&G>?uVOmekW%pGntv>7B(yIVK`Kf?H{Qsl=zak{4ED8Yhocy#&{UF?AQs+TTOhxubm*t1X`48Tg z+0f!5qGA9*fzA&-{?j3bslEk+xPrVg08kMR0HCS@032E>o4ZQl%Bn&DKp_PH0BH&U zAmH$&T9n8u(=!18z$8Dq+CMPRu1ZNZwlTE-k+B8OTN!z=N6Eo7n&Wuz!AR0{_4XTr-Q^%+Tpaw?O4b2J%0Ae*-|wtUZ40q5jBuE&%|K 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

r*w+uW8);zcpXyZpy0 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

&2{I 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 ZAW|PCr`Wg(XLM`IW|Ri_`Ahlk@&R}sbiDuo diff --git a/application/client/src/app/ui/styles/fonts/roboto_light_cyrillic.woff2 b/application/client/src/app/ui/styles/fonts/roboto_light_cyrillic.woff2 deleted file mode 100644 index 377218a4653b80027239f627b83396d17d19be0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6720 zcmV-G8o%XtPew8T0RR9102)954gdfE05sSD02%850RR9100000000000000000000 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 Wylx$uwCFXYMJ7R9K*6zZX=e%U3DUIy diff --git a/application/client/src/app/ui/styles/fonts/roboto_light_greek_ext.woff2 b/application/client/src/app/ui/styles/fonts/roboto_light_greek_ext.woff2 deleted file mode 100644 index ea768a18049caa005c5f4e20cce6910e5892c8b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 792 zcmV+z1LypAPew8T0RR9100S5R4gdfE00rCt00PDU0RR9100000000000000000000 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 diff --git a/application/client/src/app/ui/styles/fonts/roboto_light_latin_ext.woff2 b/application/client/src/app/ui/styles/fonts/roboto_light_latin_ext.woff2 deleted file mode 100644 index 3fb5f272b2262792eaea5f105a09f1275d291d37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8088 zcmV;JA7|iqPew8T0RR9103VnD4gdfE07H}j03SdA0RR9100000000000000000000 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 diff --git a/application/client/src/app/ui/styles/fonts/roboto_light_vietnamese.woff2 b/application/client/src/app/ui/styles/fonts/roboto_light_vietnamese.woff2 deleted file mode 100644 index b13f49e5b4f0ee658c65cf0ae1945c46d887534f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3384 zcmV-84af3#Pew8T0RR9101Y?*4gdfE03HYc01V>*0RR9100000000000000000000 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 OYS`tr@YrE1E|&&L6@hgC diff --git a/application/client/src/app/ui/styles/fonts/roboto_medium_cyrillic.woff2 b/application/client/src/app/ui/styles/fonts/roboto_medium_cyrillic.woff2 deleted file mode 100644 index 972c566b28fdf977e5a09fe1d1c4295798904efc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6864 zcmV;>8ZYH{Pew8T0RR9102390VW*g8&C08;UIj+!*TJ4g?9+ z+2|+)HV&XXb|8w1!F2Y2nV=nE+V27fHmHSAglI)W>68pRHBIiKTg60e$(iUJPcigT z_us5Z{?vRL!;~v)l1iaoN<1E(9ig#La^ZRYJF9bFy{bwjX%Oj2Ll{Eo^$2SXzm`UR z>Q8$CaH<31I}@*1AyP3(`piHbyNB#GH{cD$vH9 zSy;6wreFae7fh`X?thpxlLAlk244m7(obTg_c)8y|EB$ZTC#K7OhPHma}W|?Uhk2wX0OQ}961Ps zM@SGF{dc*&GWDBvUb`3V&&2vuqbb@~Vc1_;B9AdE7KFxd>kEQ<+C?Ij2b@B&^0 z5WtOJ6W#H>(TBv}_TvXg{A+c24~buT(*U;S+E^{^L3^B=>c1d5KGI^*Ev;^yJy;};MT z77-N_mync_mXVc{S4JRFSRACOrKj(c&%XQVmp}eGcj3ydJNF(942_IU%`B{}VS9SV z4RJKY)4D)Q!c9mtqRI11C-03f%n{SFSxjTrjA4wicZ@N{*w1K;v44zlz~;VZ z7>bQMY1Sz{2Nt-Q`6XB$7vz~#K+A$2y$js4crpxdEZ<)$$E`I4ttHkCA`x-!G~n+N zC+$@hi&;;5Gn1Q%uA{A^?WbxX!<3X)&oipfA(}xq3;BjUI_Fd_q`L`PJa$z&E}6re zwjiczZMYHCXq}NvnF69BwNSqqp=sH5%4yRao_06MGr?~g2AWf8UJvKMpoU>7;DZZz zCc!36fCq5$sG2N{7ED$`yjtKegHJw$MXnY0a#^8Or72}mRZ|a94kehdfVA{8fmxPq z*515F+^|}QY_ezrZZvw!CuSv2Sya{33(*n^XiQiXt^o*XLEps8+MD-j8M0Mf<1($o z99hBsQzKueN?!?$71Em)Bc?`^l}{E_RI5xp|Tf;q4P?I9s;SG17v7E0V8EWm8BXFIukEAWF#h-1?WVbnTQV27lFaW+js z*PP6-WrRqHOhYSvCz9zas!pZnD7Y(>V3h5kq7^7MrqN$*79W?<=O&3;-y~{lp)PxX zmJHGond;gs`TGA2k?O7{8VNv-W<33NoI1ijCg5}T3AtJ1S>Ag3+qp7E!t$v|QW5D0 zwo>Y|Ay+CPXDT6AvL`n=+c88iHeilYUx7LGfDot*W|C;2WsH^VB?4u#r_SVQMs5)9 z6k>2*zS)@ofD33U7#Ls}f}6JLZ6VotjXvuuXK;rMDN}z znY*-qVoYYk6>ZHu+TdP}SdTLV45BQ9)+YKY@MLSlW1@5L-h1CNI(-;wXbL<>W;L~l zaalV}Um2yCO$&Z^SMu$3h4l25flBMn1>^)eqee5d5U-o4G?&{RGG#5tDR+!rBMo15h_}73Ol86#sjb#+R*bOvmZ z3@yix#|`2|^CJ)`oPp9g8IsNn&-5I~>2I&#|Ip~%_|ugU*`HI--TykNoWMU%?2P^; z5`4=hfn8;Hnk>TATyx~LJo44~8nXD;tw#8Q4dam49+wHN#I9`CXgNQ1i*{%vZp`{Hb zH)&NzMw2$`n9`*63S>f?8@hn0(9UHZAgf7x>zLJ~LsnrIbm#^!8#)X=?a2)fpED65 zA(yboB_8h<6}{ds?jaCvBqaVEIN(2c?DqJHz{!)tQYHD5e*PAz_o~GuTme#wr zHrCPk7!vx4UhMdYhk=Y&ocS=3pm3prL16$40wff;5cU>$1|UlyV*r={fWkm#QtnyC z*i$yVd`0FOIb}qrJkOZ3=4O_h&`9uhWs%@5WDD7D{f+YSMT|a2c*Yzm$#o)#9G=s? z7*MdHir#Yt5CWI+;fqIb2kvo#T;BVHx2i_~e2c3D9Dw1)gCy{n^I%Zc%6&kogkyY+ zl(*uSEpmK$mlC{sb{}rTL&g|5p?r9nbDcEb=*d}ZHu9NmlBN|_YWYgGNTrVgJ2~+J zf8(i>K0u=P=ujae>UfB0-PU&0X($^hoN`Q(#$aD9Vl=sIDy@wdS1eLMrH~5}PwG(F zeRFdeD1@g4m#Jd;ST0)DR;5M1eS^czjjwLfuKXTj`659$cpyob;Q@g9_ zvS#Io!1lH_a&pRNC)}Kg;*r!p^?1TCX^6b9Ds@7cgg}{Bu2bfz4@>_qv^u6g%Zv1Uedp%nR&Nwy|@VZrI-|24U?lY`rQ7F)us!Y-kMXm=tHi zA={PN(`cy0!9D#?k90U3ayMeuQ%KIX7fK1mi{uN~Ap=e7^gOKx)v&g*<#=0e=A$3> zxesP}D7qD^j=i_g$^rVjS!XJzn|EzC#jsX{N738LZbn&r`$k>%7>Ww`Wh3wPV%Tqc zWnzrNG68SQONVH`%x>Gvb{zs26PgQ}90mDvDj05^%;l)hT|^;7KiZ8`%&-DnFszAd zAAUsZi&kfrZqZi`w`kTe+jXQ{8F*!GF<^lwtY>mc1qEv4q-EvVRkO67T)SHS)hzw6 z)FRxVQq&fortEbiHw$Cb%fG0{xHR>#61e=9Xb=#Rt4XqSAlEjc0hPl#p|nNXz^&7f z#TfHidvdCpC^X6wZe#6GKV?lG2XhGg9N^1N{X@V_+HKza*%6lhu}s6sX5msen*i@s zCawm@I=&P}Xb;U~K6R44#$v%I+)P_ZW27BEomben%DxiN4KW?J;9JMc0#N6ieDuu} z1#h-T%pDHSS3%6R1f_Y zvC6<-=Paegs+gsS#R&q1;{9VZK^0k6o~v-EYu;9R9i*IC#{avMFb$Hmia5wKAI zJ3f@O_4c<8W$T{Y|1m2Qc-*1?`)S%*Pv@n}`7Lk>v$guOHB`zQAb9MmYLl6VH>!^F z9#V(6jKv{*s#0uml3fFQ%!ZPuxJ?;eS5jHVxG*vgd8Xx3yW zrOC-XEl^%0J%#JjT-0M$*q-J0WHX~;v&?w3+zUn0T4i~(WXZ@?9}JC;VGBl++Z zxS_I+{FL-3q<0C~gD}R#liT6J{a@p>_Zo0KWigbcA_PTK&Vua8QV=hbY`z+W!V4&V zzA{U@PRx>rYa?lauB|T%#;i-PF2dBDaxD_YMKa4kIq77hAxpz9YUGAmBlG!rv>%0* z4)4E}GpzteZ^amD0vxB1y9{N;V>fjz2BqbT(!zlIS5K+9b3-(wgJ9=nYdZA>_F~mG#nVjR!a>J<6DSn_5S=}b z{jZQKBlt49)3-15u3%2-+DV+)GFvDi>~l~ieHAt9wwS$@9vSH+5)U3)eb#8ar>hd+ z=*2x{VH!Z$6|jB$eRctkzN_u8%?8PAfTOd)B`-RAcM!WV25(LGvTdwvERCq%cHpK> zMqzu+)6MhG&)L0p(DQi9`3vAs8(l(LQ{sl^)0U;j#oZ)e{c?#BJ#p9ZzA6LClV`@l zrG)cKi}CqUkHCP+=uw$4U9xa)jmyd|`+rl&!9!#G@95(C z;oZS8@ul4hT~~YpU8t1c0B6)~@Ei-b!#i+uj|Vsto_3Z0#FxRQ->2`0-W5I7{JV1S z1UM2g*u{TI6kzsvWvr>$>Ah8c1)y>z@~N5@Sy$CmWHbNxg;I)66ojD`@p zP|ii>Uyp~6kCuk4rV4m1GIRJC>u{RW-bA4P?^Oa?zs2p95N}5_@pgB5tov;d4>6hS z;4kRZAIWL|(FuG)AOt0TM^@hRsr;SWPvtyi<$zcQ6ql7zm`oga@bwjYv`0GL`NyVk zD%p8&$~WStAc1F=E5%_4_KTVpzOu*SqWRTs`ZiQ$1T@&&`PTv>T6kybTw{ru4GICc zALHDXW^R@3*aA~e})X2vUTJ4agrj&%jF-@`7n;ZZ)s&P$!sp!^uHVYe?ImOYTi!b<_+ zC#`nGR_H zVhdl3`0&7>)FPO3aHosS@hcZj43G2{NdQX2*ItbQ^ENKSgMD~5jJ*Zd6Rrtx>L07| zN_yP2N`q6|^vW3bz=6)ZAADzBLc(mVgM#c)fM6}-YRB!jIgWp<4T_j<1QvY{y)-~v}^*jGhjwqnHX0&S5V6@J8 z*;Yf<__09ONv|ko)yWSMIbyLAaX^t}lWxPd$t7FgJEY24o_&p^lc>wqje4zfwK(gL z2sZ?7wI0_GxBg@qYDHq(c~s3A1^&Z-Z#A&XG{0(Ak{`mp{pfq~wcCjh@yn^J4b3~$|_;d22g@j^q#oG~{knGyQ zsv8u=I;{=3!R`ri+}L)wv85roEW0=Lo&(5~dh3RK$ zfM7^x)-u`5DyBfjhz@e>k0X|IMI`@d>tFeA3(AY`b5VjH=hPYK-M_hny0GN$ePi>e z1P>31x^`cf6#o$~(A)JkAwC>;elo`2q7tLL!V_|*aAW8mH0M|PR7yaEzfdAuZ0Q6i zt8^bN>^A6e?7!>|FO9x^9xFNnK3L_=BWaw`i3j*=E3_v4g$9@6I%97LWE7NS(0`ix zMiI9+pux5%^Qf7ijfrGtgAw9q|4Fp49{>;RMKG&qY zl{6J~^dd$7NgU+t;peIG_NnJ6=0i3(AXB%@ncRF;PFl+uz{QL1%U#<1B|_nJz`I4x)Z4Ka}V6A zdGYgk*3kdDdg#UxWSH)qTFdce?V(#qS5ONvbH(^Th};* zNZT0K+iz7P=9oE0BL3>OCW_N@tP2^&R=?aA*@SrN&QG6E$BucHRkqVpZ7CW?&M~~c zYT2s%9?n6)!@EbKk9({8bysqT4}%}>YDFNV^7Kp3^0|N(P)q%9{$L$~Sbj;#ct&`x#wQ*^(t2B2aH}&#__YgRZ7_ z*i$zgQjnCFl#OKbf(Hd}?2K`WurjnOVi?%K_9--Bi}MWJxITd?hdFd?ZAkB&!np%T z*>A-~z@rSve!CeB*CeORHa4SXC=z(8Fh6an5GbG+cx4{hLhebCUKaFd>9z5zmvRP5 z>HsX0GUJgByZ+AnjX+2=@dj@V-#nK!P$hvgW#y7<-j1~()ew&;_s{iDMN%c1wX$9d zdTxXmDL{ZIz2xFffeY|gu0$6BH%lq=>kw$+E(_RyOwfze^ShK>*LbJCAxj~ls_9{E zQ(7TTmt?N2_}1J&S%+kyq)4*R7m3i~lf1#hvkq`{UP&@PKMP2`&;L+HzRG0(JcCG@tL-MOZA0V~HvuQB-J=^mSGB?77JvX7MUI=@fsqLjS3l zXWin=?zk*Uw5*&TxaLOq(l5GeTzxfBcXzG5wg`{rSbf!!?*CugfWy!O<8V22^)$L3 za&?`$4N!Z>!FLxATy&Si^w%keVa89D+Pje7b6h0MHp-x{cPY_+uLrmYVYoC~ix7|9 z=iS9RT#pXTX0-n*Ri6a}5}iT;=qqc|E@vmhjIM##4-G&^)>~SM9;COtcj8BJ@Bcr~ z>w%=f_|heJ!h9B=E*o0E=V>2-r*B49?<8 z-QJT&A*|LIJeQcG3i%)AXp!aRaMhZZfWP|P4(~SCXC+^GI6Si4FkoJ#IGlIR9>Nvu z!%8#8r1TrTJ#5_)JfF)9&rVyCp+6RB=QC+(A7^7>z9O|;;- zfbZGo@}8`;Zga3)>~D+gxlU|e$J8wj*R6czrnaXWUVk}Q7rJaNcYOYGyc5OuUoJ13 z{WZek8RMG#Aw647&OZCjBzyC_yj~|Yv4-ZjK$h8;lQP;s>X<+*a(*e-kfxTLTk-f)(tdN(L_a}B8(=R#bPx;`&yDV!hDtWH8?J2Rp@?DNn z_zm+a7H86WZUa(53#`JEi(YVK)VJW)cOw_5{FK_b=w0km&qbc{8;)BHf)>6-9b|2S z#G6+ioM%3)M1pD%nx4TD_J0 zYN3sMB5_TxP-n=UtxuPjX@z2TWy85jEVs&hEa5SGp_bXiY7`sLt6isIMrY+yp7b+V KU0ZOGIRF48byNxf diff --git a/application/client/src/app/ui/styles/fonts/roboto_medium_cyrillic_ext.woff2 b/application/client/src/app/ui/styles/fonts/roboto_medium_cyrillic_ext.woff2 deleted file mode 100644 index 30843410d3fa24e4d5926bc2b07f0cb66d668e50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10552 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 z×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 G&4Ux0^L!Wp diff --git a/application/client/src/app/ui/styles/fonts/roboto_medium_greek.woff2 b/application/client/src/app/ui/styles/fonts/roboto_medium_greek.woff2 deleted file mode 100644 index bafbf7b892d243e356469c884da56dc12248b69b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5080 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 diff --git a/application/client/src/app/ui/styles/fonts/roboto_medium_greek_ext.woff2 b/application/client/src/app/ui/styles/fonts/roboto_medium_greek_ext.woff2 deleted file mode 100644 index 7aae2e9bcd70cb82f8548dca042501ad4358786d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 824 zcmV-81IPS#Pew8T0RR9100TGx4gdfE00rOx00QO!0RR9100000000000000000000 z0000QCL3@ZHU?k-SP={gf*65$3lIPSHUcCA90VW*g8&C08@>bxE(UTkK2@T})}!9C z$7(@1I5_-XEgt@VfB!$%KIdG&_dcNHDpf$Cx&26t&MGH`M1=C4F8qJ?S9j$8(-S*ZOnpnls!G`GW>MGBFb~S@;@_kEq zdY}OYmgurcv^LPE7U0As7(*ZsrQNcY>r;;;IdifP5t44e04yaTgoFkf0)d*TdU5MU zr-HMRgDlpLb;*EpSx(K1>= zdjxHYZqZ&xZl)Q`T2Lt7H8 zP1+@RwQA){VA3xw)R2`S0_%e)+z5S^4u}arOG`&VPfe7RP5_^*>vo{b)-{PmRotU95Y` z1l$IotoS`6p*^f~v6J^Ikn(*#m%i-SqUiot8C(I+e)gUWyo%-TU*lS@svCt7Kve=k zdE~!Ab@+Q+dtP-LEC4_`bj(fw;*Vn1?vRcna@8J&g|d?dn8g#In_>C=`*^mbZLQrpp-Bd2d5|{3llRlr7-~k4qilQg5MDX zr2$@EN{g}=S+hw535z4g3>F0(3dkXVnes807@v}Ni19kmuquW{xIDiJ45?L{F0XN0 zsa|ild{j^;QK|q*;k(bL6;uk?8jHXQ(GGf+}5qcH|CLExXV;uk( CpKj9t diff --git a/application/client/src/app/ui/styles/fonts/roboto_medium_latin.woff2 b/application/client/src/app/ui/styles/fonts/roboto_medium_latin.woff2 deleted file mode 100644 index 5ab8a6561a35603d2223a320e335561134c3529e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11056 zcmV-0E6>z-Pew8T0RR9104p#64gdfE091Sc04mr30RR9100000000000000000000 z0000QWE+|u9D{rYU;u|~5ey3NNZ4!(gK_`?HUcCAhhPLC1%m(wAR9YIGXufK0RT{E zCZmxNY#aa-ZBP_tgR&*~KO|@ihTydat%(U^VhoC!DNAb+2xB0b!gzVDmL2l-!!Vdt%j?vIaViH7l!GCp6&+QYPiH^*Wh!})I z1So?)c=H24x87etOQ{IjpiRXHM~=vxl(C$^E=sO zAd}4lv3q5R3#fpnWqHC?nJRNYKrNlkQZF+{>H1|P!s8S|rL;>pM`^-jP{=q+wUR+s zS*lSIp}229&1O2;7r<%R^&jyU?nsw~IpdNIZZ})tf5dyhsz5maa0o&&smKGiBy3-W ztFrfh`+ckP7P0gR>65G^&ek;V&eNHB&%e!IQw?Q_UTNZzG;QLL_E0@Sh#m?dks~D0 zPzbRQX~5&wfA2l)22g@ zA!8;?S+HWmmOV!W3Kc8Sr{91#rXVV#%oKKtyuNNSKqALu!-Tj zANKr&kjpR(JU$A}Q*y*>M<95^Obl1s#M2H7hd?A^Z@u&0hhp(JOO~xz_0>1)Hf$DKzuLBAw_uFV zz8@iM52)8Zg<^$MZ2K3MTt2{Ol|t4j<(=0gjO%&Ya7_R1G-jAF%wiwgFZuQn(NApD z(9$9~RWLa4QNbNPTIP%whp_wB=bU2rBOH-zl5fqL^RM~Jqj0#eH8YR%ApT4X+H{%M zN2GK;D8Qvq6e~%KURuJk6|2P$T=x9D8&Q}-Y>3xsU9{;kmu}ILWh++i$I!vYiUeES zLkCPuFB^OOzSi`uShr!b5{oNTJc^VmuP<)Bidl31HDAe#xR4fYx&zYz%*(K4ezw@8 zTWL`&S+-)e_&UHh>o#n@9PM20vbx3g2WT8)jmqzw9s4zk&P`u`g@_HU=EORd_dSPm zyx6(WiD--StTf;C#=hG`eAadUO0*0}PQSAJvrpNtFbT3q2M3>fz^EP!z`i;0IgZ~g z2Y3uWSh=dIz%A$Cn`H;hXN|nCza(kTUh&ON|NaMKKfg68NwNPFNiDqI^Sx2EJBHe( zreXZH-%bYybUU@78gJ>FwFZDMb@w~Y-f#8o`Xhl;)s;KDXOune2BTT&6Xl@_*8Q^Y zUl;ATb_pDO{6%m+J)Q$Q-FM}@dcW662d=NgjVGg*Z{rB+FSv8e6J8Mw2lZE5A=de{ zq*mJiaN$bl;fiqodk)R#xZ3uMz>TSGt^DZZn#|t7vCg)xEkE_iZ_L~haSpe%NqfIC zW}nvgnf^@W+j{zCJQcW32M4BSAsEbR@P|XGXL$y|-}876w6^hZ`~HyqigxkdF5%~r z^Dj96e(OA__8v$y9E_~)TAQErx&NT1{J|Sd2TQWWjk7;&JWX{S+?P_$BqLbDdr0bl)9+=eMR(HCF+Y!<`{mmg(5Qp9>t?52!bI9BZFdh)!2x8MVuMe|`xRx$gsImTC;&@Y(8;z#Y#eIhqU6|zZ0hZw$P7Z#Zn z_ghlcO8s?Q&T92=+=Xf9V>C{)+112M1@|yfDOB9wP_Ibu02K>5#85wYn2D~mNx%vr zaVB{LErDq0UO|As9Fa(~JO_p+2?D5ra%zC4Lth;f{pi%kv5}0_ zOQY0Xbp~NZ9xt3g%WxhD4-Gn0163M4tBZKbyP_y!)uvU8yXe|=xTlju1%c0fUzl6S z9_aQ^k4GLuLGU>Nw7M_8!-D=mmjto8Zr9%9kpNm`yVkir*caCL5cWLKkO%}Y#u@wt zXH3Njry-95YNt+jx-Lfp$W>O1>i;)Z5KqFyoxolQu$X~GMXA)HRi9BWtl4tViHB)E z&e6nbA>XcnGBvZTeZAGGZuMJ_>J6S}PN#W0I2a!Q0N`+1r7Er3^cyqnlkE`iP8`0d zZM{_dQ}?Ii*t_aP261Nq92^w*^)#FKxx(XP*PSvKlj{)2Ek=tHF2s=76Z!D-!~gqS zq*)upM-cFw>Ppg2-*@uMWA%CQK0fqu;?0`#uX(RgC0OvrTkpL00Zrn2I+710Nw#I% zj$I5XzGDXfsNIwmQ4kQBqlI=_6wG*~UR7GSj<#c|_+?#2U*l>^zM=FY{c) zzvjhx?VVZgeL%J7qlLT%nooHvmbZ~;$DS{K`cINy`A={DiIgF#$ia?!Ew~)R| zrPMiVq8@6-2y>3)accl+t5Nh#WT{qh(Bw;~{SIR5+t53?T8f7aw732@NCxi%k|ogQ z43PJ;u%{_0%%S))l7)alHB4_a%#U%HBpR0h5T^J@Vx1$-3kfX7u^XJI`dvDlv0`WDdvZ#`;H!kBf?adbDx(1T_IcrTv9o&HLy4DHHAER^BouZ%k-Ao5^4PVC5g z(i*-D!Y{xat|I>dt6X!x+^zZO3Dr%C5|gL@*@-Rp!JV&{65FJ{InLI! zq#~UMPI_R1uhS$w!h8IJ?`YlYmD^*`r_uEu^n{;7;EZ|5S{~rV^CV-SfNDJz&UCza zw|!gC{+pknOgRz9OI2jk4+W?Z^A=jaxNV4kcY0ijfl_NfG08}}SWIQ#0JAJ6z~XG( zaixitik!C3O#sL19YP-X@Q5Wy_q+HE3KWoYv4Gm{)908&hLha*^RK$95*N&7^`i;- zme(YzUI?v7R`s#4<0g#zxwKW){Jd%M4QIgz_J47>tQ}pdx3+@Cg{-kXl8pX+Ch7K- zaIU`BTP(U>_*2XS9i9a39XmE_s+JcWdVYl)OKt4t0};~k0zjFrQ?dR8nA=M?$kjQy zEttjDjc6G*bAjH;j^i`9*dr)+;83}26tmRhD0@z(5bpTgw)jR;6Lg5qCi>f4?W@^8 zOD;O6@GhfbGb&%GSdY!mH`vzFjbHU_alsm2q$Fhz7oX94z-_iiQsz|dmd2XBe|BW} z+7?e0Z6#&~>if0ucC)VK(tbPpM$zbp&T5@d+=z9`Eg#po3Ge@`ncj)csL&#;%g18Q z_bm%OovHa$E#^AiW+{uvf7Sc9g<-TVj#NfDgAy&AljvL_8%duQJfr+vEJjEAwtti@ zVBQ2=KXq(SB7Dxmm&0IR%G{zR%uo+3Xip46%r8`*o4i}G4e|G`Zz&|VeLX5L<}W1E zFNwWAho8o0c?g;F70_Ki&$o>f`JFZPjn~L=9VOBH{xk`|Kpn2>gxAv_xP(lE;ycNz zdp3y38@jCy8EZm*HWt%$&`BNQZ)J&%;bS(*BB_%;n5iP8)&vp~;7Z)e+N7AfiAnvH zg?LxfY5U-zvEi>34am17wn8dVh zQR=exRS9ZoQ$eK+3b5(SP8`3|gEejfdA1V3+)j`~xYqddww1>(i1@svJHpym2T;i^ zAol(ZCMY~W6gf!1sfR8%shXcZ&Nt3hmx?ioA48OtwrGX};ZBfz8hb!bOWmzsP^hll zaTqV$D?bk?B(&(T)Kc$5KNP3s?1TPQoUK+QHU~k#A&h=~n|}F9b@6$M^_NT)f09Ov z9PlY*rw-3~|L6(L^#Mt=)J&wO5vvTydNE=~SFFEmTlMf@|A8CaY1%nSDL%%1mZ
  • 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 KJQoK`qQwB^)LPd7 diff --git a/application/client/src/app/ui/styles/fonts/roboto_regular_cyrillic.woff2 b/application/client/src/app/ui/styles/fonts/roboto_regular_cyrillic.woff2 deleted file mode 100644 index 814b9474cb292ac934a2196854131cbbd4f0feff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6720 zcmV-G8o%XtPew8T0RR9102)954gdfE05og>02%540RR9100000000000000000000 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 diff --git a/application/client/src/app/ui/styles/fonts/roboto_regular_cyrillic_ext.woff2 b/application/client/src/app/ui/styles/fonts/roboto_regular_cyrillic_ext.woff2 deleted file mode 100644 index 10cd611dd2089fc3412f86dea1bfec2a543c59e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10576 zcmV-WDX-RdPew8T0RR9104Y!a4gdfE08mr_04VtY0RR9100000000000000000000 z0000QfleEeLL4>*U;u{<5ey3R2;3G6gIWLqHUcCAhcE;n1%h-3AR7@v1>6{C*f;=a z#M>r{Qb8IMMdc(N{9i9{Lx#Q@=o1}<4qH(aMI#SFnN)AF48?`MEgGF0lr9`JMf zdmCe92@0)E2p@G8ScuX}#>gDeA|U06jhv)}AcNiz*aSpEkPbmVC}t2=zBP>iJTcer?VOw6f+=bx( zY^LpucJxl0)xCEUmMbgonW*SOMdzZ*OViB!UF~XSw32RR5Sb*C&J;-|SjninU>EKI zNOyq?0ar|~PwTEsTO$>99mK(Dvmy^b%C5__Mk1{d+%UJV`!;`*d^3Lc-CrU>f{3IN z9!J`}jLk;`NH{Q&4aegzn*@aifES=hI0FZvqa5fCwAAmSxLq)LMzB0^-zf*>P9cb(fHzBAO{6U6uW<2^w9kbR&xh+_e)zEuwX z^7jTd6~$uEQ^QevVL-Fz`X?D#T@Hrp+2oyfYcg1e=pqgscKE3k=!n+FjX%7kNsA}mSt5mAu$3@V`SbE&by^?{*J+j)=)V<;H8#hxLngVyQYk zlgZpV`$e7i4It`152qSjsgtU?;R}xQ*M|k%%f!n_uEL$UH|0yd0&x!3Q`ul06s9xd zIJ1%u+p|yV;nQ)|^>{U(H}pE{tZPNP>rWLFRc93ybb+F1Q{N4G!c974OZyzC=12`E zikvBOrO2OZ0n|vOh!n~%m2yj?ydF{km6TmA1q|DZ2?OVv@3(r(Bk)uocR0 zowC@ZLS9i}+lpgm^D4s|<#jT$6>C`Vz<$1`5ZbitRe)KYa5l6KZt-YofDGESJHCdi zSzT~85|9($U_4(qazvEEw6O%|5K=X^I57NFMBNMUcSA)*BY zo5Pw$$2>{xo0KN6$#=;6L%h+ry6(e({8&{%8cydHpK^ZZ2{hw&QWpKt*8+{$RdC=h zz@C%;fHdT3K+GwXH0fB~AzpzZjvvXi4NIC2j3SK%Dt5#tp}CukJV?wps@xTX+RG}=UY}kIsE!eSNIX6_}5hr-gTx@&2 zW(xBbR?UX%!bMoMwsam^q$ts1#EKK|jzvon+?A-)lND6Y^i+~)$$7~P%)-4Dc0+IA ze@KTp*Z~SW0ImrIkINHLb*IaI!5IJ+hlb5zag0ySS-$*~^B3g0U?CnNAgC59RFyDy z=}3~oT&h$X(qyofDa$L_$n50GQzKsyCln8CD^|@_jYn!frw-;lR{u1OKXVV1cNbcR{xC0L_{eZa-f0NA2mrRcyL z`b(;l{teu3xhtGg$hUf~p&lW3hjY)6KlI!S z_1?)n1%bi_RaLqJ{0T_k0AGP_b3xzRAkKr@FUuMFQ^<|YX()^M_!hKavo~9{*{Yi> z7>yB|+l*D5jiMSDZHZeITiC$CZu9=^S7=n~t;TMC(9PO?cdM(Wei^%i=5yb%LoxJ; zT7zSYntIuJl_7hrJrVf-TOp)q002ZuTa}%XIaV}?Y?sCxjp2UsR*yZ?zUqG+CI3m( zK?5^PaM8Yye?KqAG$*o<--I5tAF;=(N-z<^SYhn6(Y;`DCUIGwrp{Sgl&4));)|TS zU>5Vd;SdEjwIcJD9`tcc<1%&a+?VC$4gf9nRl}=>VR+3o%)zo*@q9T*H_cL{;n;O7 z2nykFgiIM;*4x~S@b!f+%KSgo^BC8LRRk!yRC~gqG_b)DSkEv9p+qKW0@BFDnW3s+ zXNCDzeSI$CKUhtEa|Wx%zk+)qjhaO{t1{Hjy|{`~nlErU$8nCBQLV98U}?YhMBwYCLeFG!)JPXVHzlnpmi~07%v58YGSs_v5^q}b!uT*7sC$oiNw{GR@z$ zukVtbD@?0!sM$&4ns+;Zc~#J`(m4Tjn60z613)pdA(NE49X&S_sm)0!Oqp7}fZZ}^ z6A;GN<5=}@Xc#^8@vs6TACXTU&Gxn6LqOq%!(Q+vrGSIfNi3ChsE5>ez-3lFP&mm-}8}c#qm}d=yTbIy9B65hd z-50MVt3j1z$8#pRrm||@A*UTLJgz;~6K7NX$ep~-Pn9Ra{KuH-bY|+53pL3l^C~-Q z9X>2ExDf)+Uuow=%d0NZEF_Uzm>frkt-lLU zT)dB)-<0_InXP2cVj^BxCX|8NSDq`A0~Af_5OJ-pTM#>CmNEyIsaQ_pT-SG?2+$ed zPQtZ<4AJ$2(g`X7xheYOJz({c;S^{h{`IR^0;D4LC>(a1NliX&FyO@&L7#X4$((lh z2jZ)(i{Si+0lfCP18s*o_ z!6nAUkVgPM+r1-;C#b%`E*Au`&0XRM^3si>zx)pzRnmFdG3G<-T%_f!a-*)6!`*(j zp32>8MmWu{ozm#sb$hVCx_V#i@pT9B?&|tocd&i$BpGM-jO~P##1YKH1%Y1mq!QUg zMm?Z)O_;speM@Slgr{Cbk*MPIEnQ<}q1NW^zyl?5*9kp(W9~g4(bYcmq)cv}@(2;8 zQ(Q;P(xY|AJ&FiOOiE(Ap0YfCX^}NJnWq^`=9Mr>D|GP^_lSPlrt%d`5P{7&(Tb_| z4X7T5_rb7Wy!Ec)<9=_J{bZAgvOtlZktp)7qKJ}h=Z}2}S)DDY!0ga~+ zy>Nt7WJa=ec2RU0G06@ap>t%0`_@P<;%^0Yl7S6?b&TIgZmJ+-Hf9PR1)Y=m7fQF& zDp%-YJBKD+;?$K^yB2zjGrCGPfmKeXBAj&m zSvA^6s=1{n8s5&q#hfGdjUi3MdPgigXNFA8ob9DvQdIYtdkIH zG$hElYFWpj?^U)C@eTuUZY;tfDg2piAGJz$irUw>Z|_?b=*EtSZ%O`qhf?=bPaV3i z%3faoS`;O+$rP)5SU_rj$@?qqZJ%gkam{^+Cb)nq31L|(Dgq2Oi!w180tPX_ELkpL z0EWu&U-oB0$fIfy7p5NQEq}@%kNZEx?|5LdAnU+nu7KSs!8ZjMWL8gST)N?@lh9N=+?-Mk^f%4M z_5uEWjtP!hbVGkquW4|{1RY)WF-O6a?{lhYfw`>KGVyl5X@EVPk8{il!J5~zSOrz~ zI(jd$90Vy!z?a#??AG^l*t&YGYx-TcwERJaTu0sj*eLwiQS9#Wj#Z-pE7Y(Bcqcx4 zva9;Nowc1jdY5WY^uZ{%Hi~K-js1V>?J0zI0&r9mM1(tBP_x_J?f60@bZjY|I&h! zuSAM7iXq4s0(k7yhV9l*VW@4nO@h;Uy}oGJ-otP-BP>^+XON`Gtvw(5o|X8{dXE0kf?2bzM2xgq!a!CKeGc`jV~} zX$!yI3`A1AZt1#N{fAZy$gbhLCoXj-Arp-0I66pu)?eg4_Cr1={M$@wD7<|A=S|=X z*2?1kBzl;~^@x-NzKtOVQkhT^w|Hby4xC7s2`$g$s>mXcuiezszNV+E1qxIDM!6KL zJr(=r6iFbpxmm5kzV?@$^o4x{E@K3`KqKbwHfl7eIB*t-)J@lLGx;7wecsKa@VGPG zw?z1kpmxO={7_mxoh??*1a?9G_=BCI&Bz>mRkY`4Cmc}H&9o2p%l9&*75r^~HvEm6 zMIY8Qm9r1k&fcmRqG7`#1l3>Nny-DhLb$B`##W=dolN zvIl3b90{yS%8RK@b!7xbwQV@x`^-JxgAcFpRs!RHy>hQU6L+2CJL4GvExD;hbRq%H zu{2Yfh^U-Mxcr4WoJ$VJCmouihUozMc z9}h60&_U>v?uxWpr)q$?9pR*RcQfkz_VKR(Q$ zmM54aKu$_1>+1cl6+~2R+&57FHhTMzH_PY~cK<_uFK3%UA;*O0rllfq>xD#9&HduK z=iJENdCK{>BZ73&!ve87rpTr!>NS<)VY=D?aUe| zV5rBy>Lcu^$_{9#;c)a4U*T+i5z<~6%Z;+j=Ipv19Df8y;OA#i^wn(~O;C74Fh=B- zygUu}9)LFTVT6vOPkor8!C7>(zBiIfDL^rTR!n4!s0r28^Wo8`l1OsJGN9gKVT zwINd-C8Y~J^g$eri!A8s=WcD`?eBi+c;Gfe;_nP-s zDyhzC_nbrW+Bl0zx!K&r94fdNQ)Qp6F7$ZSm?)d6nl+gCbxzO2(}PU8aKB^+|JbAm zxqi9G@I*KF(41m1G+4sn^I&$&2-SeZKo z0)7dOIN>x6#OTPxz>SHQt*B{SH@W*N{i>!$REL0@Z?KcScZ4GXqVXF2ER0MAOi}HY z*gw&2hS;NrMdaoY7R;I?SyFr~TBWQiQ=)+}Y88a~t9$9XVC3A*yZjeBM$iH34Y=MR zQ`w7J$Sv#-a%KvluTuN$ z%(I?dhuy7)sGNQ8Q69NH$9pyk%NwT270ea#5RZyGwcb zTPDXvK@46LK|?B3=f;FXV~6QD`g6kKZF5ENsKn=;3Dis!lK>gvv3W?sB{ybpUlJuY z44rz15rvxBnfP=xF`>~efp6dTRUoyZhX=;SFp|sNQp+zmddHE`I(h>_^p8pXue5>I zVRj)kFcQgbD6wQ~y&4341ZdQArDOwKc*p#1d=r~m9_zLXBWOCYAam=ey>H6hdZhNM zOK2}0M_(S3Tq<*en|BcJXe6_K`K~!pe$=}#I`L%gv1QCmqf1Pg|MA$vNwsmkY@4fU zsVFbESj~6Z5us|Sm5yQMaV4OZ0F?_1PaEKR>B+%o`Em>dBS%SEBBRTvB>_y;Kx69wbSSJL|y3 z(=V-_Ny5BnR5Bo_7yEBd*W8W%azgO>N zOmZLK*kq@K|5-`8zsz&;mkQ&GJy(8N8>*NlM~EzG=E=0-CzVp+Qjm14Yz$xg#gn9j z5SN!wqw!1fme`fV8mS!WOPD_^;wa`=D5>+IR_l;ZR{sI1?%x7gI%%SlxK60wYjTM9 zx@;^hdQ+0e7i8_^xr4SOgK2~{d6dtgF4omtwp3Yrnp37^DgTP~a+x4e(wXLzE<@s2 z2aAK_6Gz%*d}%&3so6tIe6x#(TK0R;JewqE4=!H4>mV64{D>GZ>Llerv$vP_8?DIn z9dwX!rh#rteaGzHG;VTsufw2#r%AEW8}S~JiHHU@pT!xiFf;G>K}6}az1Gh zSPxg^uT*u8+S_CI~qf<>@BQFuKMEM=BP>n^JKBIvODTMMOsf7XT?O;h=Qq(`|p3t^k+Y zzKREx73Gzegl-48Slb3V8~dqTRy;1Rto7A6(AnBnk`*de2Nl&=H~V>7@dS@Tl`zDZ zJNBRW?$_PB%pB&nEp%cqczL!i)X46t9lE@VxweMi;N2av2Qn%8=c!V$cfreccuaDWl(&h2K> znVLd^Hru@G85|zI!T0S7d>EoT`$Q&tI^W9;Qm+ydm)Ee2D=)l{*qt?VxU%1i;Drax zb^dp5B<~0>yjPgnsenG;2zDA^=BwF4d{YK`))iRW(QO42NmaM9F-BRBj9T&jUe4yu zD)#*G&W<(iKda2g_E~Hb$s}ex9fHB3iIJ8EobrCEZj^l5@3|+6o^i16uTBUQQX)o6 zhvbG58!B^sH#o};>MBq(8lL?5V4Y_0Is3C~I*Q-nSXamf-AgfWwH#-N1fSXw8b0|n z`zfAx^oyU$o;r#efHSCcYO%*uY$3NWj`S;b?-;}Q-7cs!yhwUMFDb|~9t?9ISgXap zRM`QMtP9Kj=W`>6GNWX<#M*{%!|B7+iM+rPHgZa!|4B2rN`cUBfe{V4;_p3uxag2j z{9Oh;qaaxNay3_6i5M;wmJ^xT@vyjjgI4mfgpR|5h4lWJ#_MUCwT%)D6wTh+hCrFI z(mPNdob_k!;qK1i?rRYQyLh3RjeM8iPf~+hU#b4tp?I_7ZCv(+#;N9p>;`JvYq@Nt z{b(S(aI_B{YXofuS7XZQAkB=_)$Az#O5BTH?gEOoRc+>JX4PJ@BArpfZ^NklKO?o_ z`-sCvbfKP*{rjqEN&wy;MGK0%UPQQ>3ZWq0A{IgpL6}G^IW~L*FoI0L@aFRWtF=7} zf`VlN8gMcTOui;o{K(&G+(COWEp?FPmCmTi~S0pI31D!LuFXCs||h6g?Afgym-E! z^s6_+h5I6sItE89a|J4TOLHysBTNLF(rwKB6#D@ZJshcg+#ims}m6`nKX&eJ`wspV`nH5_ZH1VYWY-1hpjYHAvC&#CZavNkJU(sHpn z)Z_jq4jjhxDmoJMZ}$~w2)9%oxL|fQ=rb1eNn)wu-kAZ#bgLp$0byMA5)03~itPOO z2B=I4+@p9vME2S&_v@`^JzU$XcjsM$I^!7r1$p7gr9?teMH(fI49YzvggiV1rM;Wr z-CphM;oMrjGmQ`Jil_S(Q6kgIvO{InvBhM-sRo>X3K*))CfkRh{=fgPpgpHf+ol%h z#Kci3$pBif*gg$BgWYwM`*|i{giXO4@gt(b&?Ofi(uFT8l2Bggr<>b7e1)g&(u+uc z$&@>2aAad!JJ;Lh7N<+=Mr>?C^pX(LDEbMSrZLk968OW<5Ij;v_&yt-`~j^?^JrOM zY>0n;rfir{l9;u;Tz9`KsnRG@7yb|^1r#JREdJMjb`+0y@ayHk>s|Z#D=cUOeIpCa z03_iBx*bi|n4yc9D$!BV=-*!s_g}*D=x7k`W&{FkO(LeYK1fhLDhZvdSYy*!#wH5pOF)DU2{0cqhiQquTElyqnj z<>72>bf={A`V%!6(89BCNc zfplLOqcz~$4z=@I;VJ)EQ!A|*R0T_}ic|;+6>O9vnq{|cv+F$M8W-WIU$HYM=zE5> zqHE9%8iP&3`btz(IFje_s*^x?+}H+G(95CT##?#cNIyH@0Hw&@NPt&CeD^YWeE34zL$iEZ#N6B_~`it(`{3|Hj)-)(85fB00IJ z1XP~d2wkC3zyd6g#IWZ}o?sAbi*bUVQ#SlhmV%d60S~ut15SY_{83`spMfS)*7l&3Rh25XuU;w{11LwH4a|;yvZg zq!g0JO-JhhU0)=)5S4@`U94+75+R<#i5}g4N2^9Rwqx7Dlt>sMQVWL2fz0^S&OgpY zn6sOG{{)RgloBfNz4G&{S)ZL!XhBRDMtWu?Gch=*Hlh^irSwvf=15R(Oo<>zfNWYr z`cH+OCXVzwcJCPT_S+qhcBTUzoXKCHvbvspR)xE8@pAIhH=w{`@b=@sfDd6XN**0x z47}Yv_(Nb@h~NLHN8Gi{+Q;O_UeT1UQEmuXmS3T-P{@?ty1Y-vybc}xz?ny`d=HvmDP|bN0`&Q_xA2>bbVuQb0rw(5HQ|>q_Qr-Vu^FNvr3eQ zD7m{vaRDjtY_xRj0Z}x%pOi!*cbBL{wjCgBMv{n{v15bW+6)mko>%0kk!wWV*cb3& z@U0zAoXkdXiLe=Qji?#LdBS1j4~eP~pL^2tH(LB#W4AKzGbdKHj6dnAHSb)ET}gzE zr-d9ga+RD6?c3#ANrqr~=Fo0bq~eU9BsYf^lXrq96cvg4fN*AVOuu$8TDl5vyQ`Gx zLkY_ zi94;sr%@?ScPEZ`Gt?0geKZ?6VpvItZ2MYWluSwji;buNiKE>{VkhcdyLKUTtoxGj z*yB|pnn3WW`Qu5%Uhj2xA6ERDF4y6c7um4?jP;BhHJ-mj-B@3Uv|%rJLYpGtkm0+kxk#lub1Li5KB9w2?-K#Xn-!H(kpMo}>eG2U$X=x9McHW6Am9T9y z=Y!MuA@@oi73zr{R{hCqH7-SG^nAxhFe@VIb-^x^+U6{!c0sG+$Kj<-hZA?;Lei|y z4^*TNHi~QCOkn&hGn-_y+s*ROo7pdvh->k2+!3_^d1Tb~b2wi{B7?+_^ZNb*(K)}% z(tn7TM)U+ro40a%8GH=mZr3#X8135V3K2XTw?g;c^_O@-_>3yH?e4!^7+D?*BW>ch0ZszWWi>*UF@NcXuM9r@FH6h_e>-320RXW{v}j zZ=#>4_L*%En|+o6A5`4WerEUWu5F(N5LLOS5Jbw4^5Hs`0|i%=y=<|J3pEHATm0Ex zJ{-O9K}FgxYv|{5fK&Hg<&Ejyoea$$k@n3^ZC&m>*kGTgx#n2^c?iTOzVaF|=06IbeBv3!} z;R5Km#1(4afJWohIDhU`PJS1s21xfgkWbs6{}Yl_)ooV&oX|GERX0X(o>9px&cq1b z*uX2wtP;;Q=UK;9YVNb#-yA6hh!ke~#?pcS! zoJ-6UMVHfIQ#i-O#^f%ZW7_&%UdA1cYk2FO4GgCzGbXERNN*OcXG}rl80-Z)_2ZHh zmgOK4Xo?$3+UOt(M_!c0b@rs7XmQFPfuQN4k)PgjM&~SSHU>| z-#T(x+O;|%4T@5Hbi5$RsJzBS)+V!PKHJ#)sTwbHmTzsrSisx?Pe2ba1atsV zzy`1Y4iE-BZE7P3NCT=c8lVWbcE4=_*a22H1?&N98wI-pihvj33Ai_IpxpHgAp;g=PhNri{8(04wme9iG2ncuo|h+J^%lfdEm?MNnMW zJF!XBUjR4dZH*O|sXFDXlh#u@y_|Rgb3Rvm;V3CBL?}9huNIE3N%0i<@aK~AWZn^4&kFqkftAneSoB#l~zG6xM diff --git a/application/client/src/app/ui/styles/fonts/roboto_regular_greek.woff2 b/application/client/src/app/ui/styles/fonts/roboto_regular_greek.woff2 deleted file mode 100644 index 23cb3ad4450dff905e3bacac981e5e9b66586e46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5004 zcmV;76Lai$Pew8T0RR91027P=4gdfE03-AO024O=0RR9100000000000000000000 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 a;>@Y0EGw^}E6>iu!9@kM4k7~p0000zWOnxe diff --git a/application/client/src/app/ui/styles/fonts/roboto_regular_latin.woff2 b/application/client/src/app/ui/styles/fonts/roboto_regular_latin.woff2 deleted file mode 100644 index 4fc449afdba7aeb19b03c1f216e369f20a3e2191..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11016 zcmV+jEBDlQPew8T0RR9104oRp4gdfE090@Q04lKn0RR9100000000000000000000 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 CxrlrK diff --git a/application/client/src/app/ui/styles/fonts/roboto_regular_latin_ext.woff2 b/application/client/src/app/ui/styles/fonts/roboto_regular_latin_ext.woff2 deleted file mode 100644 index 9b257dcbd4f2f4cc30cd63a7db9a668d6a0d1a3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8024 zcmV-eAE)4VPew8T0RR9103TQY4gdfE07BFN03QMX0RR9100000000000000000000 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 OV3-a4mMl<^oU|>n!IJm@ diff --git a/application/client/src/app/ui/styles/global.less b/application/client/src/app/ui/styles/global.less deleted file mode 100644 index 4b22371704..0000000000 --- a/application/client/src/app/ui/styles/global.less +++ /dev/null @@ -1,8 +0,0 @@ -html, -body { - height: 100%; -} -body { - margin: 0; - font-family: Roboto, 'Helvetica Neue', sans-serif; -} diff --git a/application/client/src/app/ui/styles/markdown.less b/application/client/src/app/ui/styles/markdown.less deleted file mode 100644 index cf6fce7292..0000000000 --- a/application/client/src/app/ui/styles/markdown.less +++ /dev/null @@ -1,45 +0,0 @@ -@import './variables.less'; - -& div.markdown { - & * { - font-size: 15px; - color: var(--scheme-color-2); - } - & h1 { - font-size: 18px; - color: var(--scheme-color-0); - padding: 16px 0 8px 0; - } - & h2 { - font-size: 16px; - color: var(--scheme-color-0); - padding: 16px 0 8px 0; - } - & h3 { - font-size: 16px; - color: var(--scheme-color-1); - padding: 8px 0 4px 0; - } - & ul { - padding: 8px 18px; - } - & img { - position: relative; - display: block; - max-width: 100%; - margin: 16px 0; - } - & p, - & li { - & code { - font-family: 'console'; - border: dotted thin var(--scheme-color-1); - padding: 3px 6px; - border-radius: 3px; - background: var(--scheme-color-4); - font-size: 12px; - color: var(--scheme-color-1); - white-space: nowrap; - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/styles/material.fonts.scss b/application/client/src/app/ui/styles/material.fonts.scss deleted file mode 100644 index e1c0d546fa..0000000000 --- a/application/client/src/app/ui/styles/material.fonts.scss +++ /dev/null @@ -1,213 +0,0 @@ -/* fallback */ -@font-face { - font-family: 'Material Icons'; - font-style: normal; - font-weight: 400; - src: url('./fonts/materialicons.woff2') format('woff2'); -} - -.material-icons { - font-family: 'Material Icons'; - font-weight: normal; - font-style: normal; - font-size: 24px; - line-height: 1; - letter-spacing: normal; - text-transform: none; - display: inline-block; - white-space: nowrap; - word-wrap: normal; - direction: ltr; - -webkit-font-feature-settings: 'liga'; - -webkit-font-smoothing: antialiased; -} - -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: local('Roboto Light'), local('Roboto-Light'), url('./fonts/roboto_light_cyrillic_ext.woff2') format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: local('Roboto Light'), local('Roboto-Light'), url('./fonts/roboto_light_cyrillic.woff2') format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: local('Roboto Light'), local('Roboto-Light'), url('./fonts/roboto_light_greek_ext.woff2') format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: local('Roboto Light'), local('Roboto-Light'), url('./fonts/roboto_light_greek.woff2') format('woff2'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: local('Roboto Light'), local('Roboto-Light'), url('./fonts/roboto_light_vietnamese.woff2') format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: local('Roboto Light'), local('Roboto-Light'), url('./fonts/roboto_light_latin_ext.woff2') format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-display: swap; - src: local('Roboto Light'), local('Roboto-Light'), url('./fonts/roboto_light_latin.woff2') format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: local('Roboto'), local('Roboto-Regular'), url('./fonts/roboto_regular_cyrillic_ext.woff2') format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: local('Roboto'), local('Roboto-Regular'), url('./fonts/roboto_regular_cyrillic.woff2') format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: local('Roboto'), local('Roboto-Regular'), url('./fonts/roboto_regular_greek_ext.woff2') format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: local('Roboto'), local('Roboto-Regular'), url('./fonts/roboto_regular_greek.woff2') format('woff2'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: local('Roboto'), local('Roboto-Regular'), url('./fonts/roboto_regular_vietnamese.woff2') format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: local('Roboto'), local('Roboto-Regular'), url('./fonts/roboto_regular_latin_ext.woff2') format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: local('Roboto'), local('Roboto-Regular'), url('./fonts/roboto_regular_latin.woff2') format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./fonts/roboto_medium_cyrillic_ext.woff2') format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./fonts/roboto_medium_cyrillic.woff2') format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./fonts/roboto_medium_greek_ext.woff2') format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./fonts/roboto_medium_greek.woff2') format('woff2'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./fonts/roboto_medium_vietnamese.woff2') format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./fonts/roboto_medium_latin_ext.woff2') format('woff2'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: local('Roboto Medium'), local('Roboto-Medium'), url('./fonts/roboto_medium_latin.woff2') format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} \ No newline at end of file diff --git a/application/client/src/app/ui/styles/material.less b/application/client/src/app/ui/styles/material.less deleted file mode 100644 index 47fb5a0a24..0000000000 --- a/application/client/src/app/ui/styles/material.less +++ /dev/null @@ -1,485 +0,0 @@ -@import './variables.less'; - -mat-form-field.material-mofication-normal { - &.stretch { - display: flex; - flex: auto; - } - &.black { - & div.mat-mdc-text-field-wrapper { - background: var(--scheme-color-5); - } - } - &.row { - margin-right: 12px; - &:last-child { - margin-right: 0; - } - } - &.stretch { - width: 100%; - } - & div.mat-mdc-form-field-focus-overlay { - display: none; - } - &.textarea { - & div.mat-mdc-form-field-infix { - padding-top: 16px!important; - padding-bottom: 0px!important; - & label { - font-size: 14px; - font-weight: 400; - top: 24px!important; - color: var(--scheme-color-2)!important; - } - } - } - &:not(.textarea) { - & div.mat-mdc-form-field-infix { - height: 42px; - min-height: 42px; - padding-top: 16px!important; - padding-bottom: 0px!important; - & label { - font-size: 14px; - font-weight: 400; - top: 24px!important; - color: var(--scheme-color-2)!important; - } - } - } - & div.mat-mdc-text-field-wrapper { - border-radius: 0; - } - & mat-select { - font-size: 14px; - } - & .mdc-text-field--invalid:not(.mdc-text-field--disabled) { - & .mdc-line-ripple::before, - & .mdc-line-ripple::after { - border-color: var(--scheme-color-warning)!important; - } - } -} - -button[mat-stroked-button][disabled] { - background: var(--scheme-color-3-15); - border-color: var(--scheme-color-3-15); - cursor: default; - & * { - color: var(--scheme-color-3); - } - & .mat-mdc-button-persistent-ripple, - & .mat-mdc-focus-indicator, - & .mat-mdc-button-touch-target, - & .mat-mdc-button-ripple { - display: none; - } - &:hover { - background: var(--scheme-color-3-15); - border-color: var(--scheme-color-3-15); - & * { - color: var(--scheme-color-3); - } - } -} -button[mat-stroked-button] { - & .mdc-button__label { - white-space: nowrap; - display: flex; - flex-direction: row; - align-items: center; - & mat-spinner { - margin-right: 16px; - } - } -} - -& mat-error { - color: var(--scheme-color-warning)!important; - line-height: 12px; - & * { - color: var(--scheme-color-warning)!important; - font-weight: 400; - } -} - -div.mat-mdc-select-panel[role="listbox"] { - & mat-option { - font-size: 13px; - min-height: 32px; - & span[class^="mdc-list-item"] { - font-size: 13px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - } -} - -mat-form-field.mat-mdc-form-field-type-mat-input.material-mofication-outline { - display: flex; - flex: auto; - height: 24px; - & div.mat-mdc-text-field-wrapper { - height: 24px; - & div.mat-mdc-form-field-flex { - height: 24px; - & div.mdc-notched-outline { - & * { - border: thin solid var(--scheme-color-3); - border-radius: 0; - } - & div.mdc-notched-outline__leading { - border-right: none; - } - & div.mdc-notched-outline__trailing { - border-left: none; - } - } - } - & div.mat-mdc-form-field-infix { - padding: 0; - font-size: 13px; - display: flex; - height: 24px; - min-height: 24px; - align-items: center; - } - &:hover { - & div.mat-mdc-form-field-flex { - & div.mdc-notched-outline { - & * { - border-color: var(--scheme-color-active)!important; - } - } - } - } - } - &.mat-focused { - & div.mat-mdc-text-field-wrapper { - & div.mat-mdc-form-field-flex { - & div.mdc-notched-outline { - & * { - border-color: var(--scheme-color-accent)!important; - } - } - } - } - } - &[error="true"] { - & div.mat-mdc-text-field-wrapper { - & div.mat-mdc-form-field-flex { - & div.mdc-notched-outline { - & * { - border-color: var(--scheme-color-warning)!important; - } - } - } - } - } - &[passiveborder="true"] { - & div.mat-mdc-text-field-wrapper { - & div.mat-mdc-form-field-flex { - & div.mat-mdc-form-field-infix { - & *:first-child { - transition: margin 150ms; - margin-left: -16px; - } - } - & div.mdc-notched-outline { - & * { - border-color: var(--scheme-color-5-00); - } - } - } - &:hover { - & div.mat-mdc-form-field-flex { - & div.mdc-notched-outline { - & * { - border-color: var(--scheme-color-5-00)!important; - } - } - } - } - } - &.mat-focused { - & div.mat-mdc-text-field-wrapper { - & div.mat-mdc-form-field-flex { - & div.mat-mdc-form-field-infix { - & *:first-child { - margin-left: 0; - } - } - & div.mdc-notched-outline { - & * { - border-color: var(--scheme-color-accent)!important; - } - } - } - } - &:hover { - & div.mat-mdc-form-field-flex { - & div.mdc-notched-outline { - & * { - border-color: var(--scheme-color-accent)!important; - } - } - } - } - } - } -} - -*.input-outside-border { - & mat-form-field.mat-mdc-form-field-type-mat-input.material-mofication-outline { - & div.mat-mdc-text-field-wrapper { - & div.mat-mdc-form-field-flex { - & div.mdc-notched-outline { - & * { - border: none!important; - } - } - } - - &:hover { - & div.mat-mdc-form-field-flex { - & div.mdc-notched-outline { - & * { - border: none!important; - } - } - } - } - } - &.mat-focused { - & div.mat-mdc-text-field-wrapper { - & div.mat-mdc-form-field-flex { - & div.mdc-notched-outline { - & * { - border: none!important; - } - } - } - } - } - } -} - -*.input-outside-border:has(mat-form-field) { - border: thin solid var(--scheme-color-3); - transition: border-color 50ms; - &:hover { - border-color: var(--scheme-color-active); - } -} - -*.input-outside-border:has(.mat-focused) { - border-color: var(--scheme-color-accent); - &:hover { - border-color: var(--scheme-color-accent); - } -} - -& div.mat-mdc-autocomplete-panel { - & mat-option { - height: 24px; - min-height: 24px; - & span[class^="mdc-list-item"] { - font-size: 14px; - width: 100%; - & span { - color: var(--scheme-color-2); - white-space: nowrap; - & span { - font-weight: 700; - color: var(--scheme-color-0); - } - } - } - & div.option-wrapper{ - display: flex; - flex: auto; - flex-direction: row; - align-items: center; - & span.caption { - flex: auto; - font-size: 14px; - color: var(--scheme-color-2); - white-space: nowrap; - & span { - font-weight: 700; - color: var(--scheme-color-0); - } - } - & mat-icon { - font-size: 16px; - height: 16px; - width: 16px; - margin: 0; - color: var(--scheme-color-2); - &:hover { - color: var(--scheme-color-0); - } - } - } - } -} - -& mat-checkbox.material-mofication-mini { - padding: 0; - margin: 0; - height: 24px; - width: 24px; - min-width: 24px; - top: 0; - left: 0; - overflow: hidden; - & div.mdc-form-field { - padding: 0; - margin: 0; - height: 24px; - width: 24px; - & div.mdc-checkbox { - padding: 0; - margin: 0; - height: 24px; - width: 24px; - top: 0; - left: 0; - & div.mdc-checkbox__background { - left: 4px; - top: 4px; - height: 16px; - width: 16px; - } - & div.mdc-checkbox__ripple { - display: none; - } - } - } -} -& mat-checkbox.material-mofication-outline { - & div.mdc-form-field { - & div.mdc-checkbox { - padding-right: 4px; - margin-right: 0; - & div.mdc-checkbox__background { - background: none!important; - width: 16px; - height: 16px; - } - & div.mdc-checkbox__ripple { - display: none; - } - } - } -} -mat-card { - margin: 6px; - & mat-card-title { - padding: 8px 16px; - color: var(--scheme-color-1); - font-size: 15px!important; - letter-spacing: normal!important; - } - &.small-title { - & mat-card-title { - padding: 4px 9px; - font-size: 13px!important; - } - } - & mat-card-subtitle { - padding: 0 16px 8px 16px; - color: var(--scheme-color-3); - font-size: 13px!important; - letter-spacing: normal!important; - } - & mat-card-content { - padding: 0 16px; - & * { - color: var(--scheme-color-1); - } - } - &.no-left-margin { - margin-left: 6px; - } - &.controlls { - & mat-card-content { - text-align: right; - & div.controlls { - text-align: right; - } - } - } - &.sticky { - padding-top: 0; - } - &.fill { - overflow: auto; - height: 100%; - } -} -.mat-mdc-menu-content { - & .mat-icon { - height: 24px; - width: 24px; - font-size: 18px; - line-height: 24px; - overflow: hidden; - } - -} -button.small { - padding: 0; - font-size: 12px; - height: 24px!important; - color: var(--scheme-color-1)!important; - display: inline-block; - margin: 0px 6px; -} -button[mat-menu-item] { - min-height: 32px; - *[class^="mdc-list-item"] { - width: 100%; - font-size: 14px!important; - } -} -button[mat-icon-button].material-mofication-mini { - width: 24px; - height: 24px; - overflow: hidden; - padding: 0; - display: flex; - align-items: center; - justify-content: center; - & mat-icon { - height: 18px; - width: 18px; - font-size: 18px; - overflow: hidden; - } -} -table[mat-table] { - & .mat-mdc-row { - height: 24px; - } -} -p.material-menu-label { - font-size: 13px; - padding: 0 16px; - color: var(--scheme-color-3); -} - -mat-snack-bar-container { - & .mdc-snackbar__surface { - background-color: var(--scheme-color-4)!important; - } - & * { - color: var(--scheme-color-1); - } -} - -* { - letter-spacing: normal; -} diff --git a/application/client/src/app/ui/styles/meterial.theme.scss b/application/client/src/app/ui/styles/meterial.theme.scss deleted file mode 100644 index b09ac80c77..0000000000 --- a/application/client/src/app/ui/styles/meterial.theme.scss +++ /dev/null @@ -1,38 +0,0 @@ -@use '@angular/material' as mat; - -@include mat.core(); - -// Dark Theme -$dark-primary: mat.m2-define-palette(mat.$m2-gray-palette, 500); -$dark-accent: mat.m2-define-palette(mat.$m2-gray-palette, A200, A100, A400); - -$dark-theme: mat.m2-define-dark-theme(( - color: ( - primary: $dark-primary, - accent: $dark-accent, - ), - typography: mat.m2-define-typography-config(), - density: 0, -)); - -.dark-theme { - @include mat.all-component-themes($dark-theme); -} - -// Light Theme -$light-primary: mat.m2-define-palette(mat.$m2-indigo-palette, 500); -$light-accent: mat.m2-define-palette(mat.$m2-indigo-palette, A200, A100, A400); - -$light-theme: mat.m2-define-light-theme(( - color: ( - primary: $light-primary, - accent: $light-accent, - ), - typography: mat.m2-define-typography-config(), - density: 0, -)); - -.light-theme { - @include mat.all-component-themes($light-theme); -} - diff --git a/application/client/src/app/ui/styles/reset.less b/application/client/src/app/ui/styles/reset.less deleted file mode 100644 index 472b7d10e0..0000000000 --- a/application/client/src/app/ui/styles/reset.less +++ /dev/null @@ -1,13 +0,0 @@ -@import './variables.less'; - -body, p, h1, h2, h3, h4, h5, h6, ul, li { - padding: 0; - margin: 0; -} - -* { - font-family: 'primary'; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - user-select: none; -} \ No newline at end of file diff --git a/application/client/src/app/ui/styles/rows.less b/application/client/src/app/ui/styles/rows.less deleted file mode 100644 index 3ca918de6b..0000000000 --- a/application/client/src/app/ui/styles/rows.less +++ /dev/null @@ -1,68 +0,0 @@ -@import './variables.less'; - - -.row span{ - display: inline-block; - font-family: 'console', monospace; - font-size: 13.5px; - font-variant-numeric: tabular-nums; - padding: 0; - margin: 0; - line-height: 16px; - height: 16px; - max-height: 16px; - white-space: pre; - vertical-align: top; - font-weight: 500; - &.match{ - background: var(--scheme-color-2); - color: var(--scheme-color-5); - font-weight: 600; - - } - &.accent{ - background: var(--scheme-color-accent); - color: var(--scheme-color-0); - font-weight: 600; - } - &.timestampmatch{ - color:inherit; - background: var(--scheme-color-accent-fade-30); - cursor: default; - position: relative; - &:hover{ - background: var(--scheme-color-accent-fade-60); - color: var(--scheme-color-0); - font-weight: 600; - } - - } -} -app-scrollarea-row { - &[data-selected="true"] { - & span.nested{ - background: var(--scheme-color-accent); - color: var(--scheme-color-7); - } - } -} -& span.injected-row-comment { - background: var(--scheme-color-warning-light); - color: var(--scheme-color-0); - &.pending { - background: var(--scheme-color-warning-dark); - } -} -& .console-content, -& .console-content * { - font-family: 'console', monospace; - font-size: 13.5px; - font-variant-numeric: tabular-nums; - padding: 0; - margin: 0; - line-height: 16px; - white-space: normal; - font-weight: 500; - user-select: text; -} -/// Menlo, Monaco, "Courier New", monospace \ No newline at end of file diff --git a/application/client/src/app/ui/styles/scheme.less b/application/client/src/app/ui/styles/scheme.less deleted file mode 100644 index 6125921ae5..0000000000 --- a/application/client/src/app/ui/styles/scheme.less +++ /dev/null @@ -1,16 +0,0 @@ -@import './global.less'; -@import './containers.less'; -@import './variables.less'; -@import './reset.less'; -@import './colors.less'; -@import './fonts.less'; -@import './text.less'; -@import "./fontawesome/less/fontawesome"; -@import "./fontawesome/less/solid"; -@import "./fontawesome/less/regular"; -@import "./scrollbars.less"; -@import "./codicons/codicon.less"; -@import "./material.less"; -@import './buttons.less'; -@import "./rows.less"; -@import "./markdown.less"; diff --git a/application/client/src/app/ui/styles/scheme.scss b/application/client/src/app/ui/styles/scheme.scss deleted file mode 100644 index 040a634bb7..0000000000 --- a/application/client/src/app/ui/styles/scheme.scss +++ /dev/null @@ -1,2 +0,0 @@ -@use './meterial.theme.scss'; -@use './material.fonts.scss'; \ No newline at end of file diff --git a/application/client/src/app/ui/styles/scrollbars.less b/application/client/src/app/ui/styles/scrollbars.less deleted file mode 100644 index 774db65d1c..0000000000 --- a/application/client/src/app/ui/styles/scrollbars.less +++ /dev/null @@ -1,14 +0,0 @@ -@import './variables.less'; - -*::-webkit-scrollbar { - width: 8px; - height: 8px; - background-color: var(--scheme-color-5); -} -*::-webkit-scrollbar-thumb { - border-radius: 0; - background-color: var(--scheme-color-3); -} -*::-webkit-scrollbar-corner { - background-color: var(--scheme-color-5); -} \ No newline at end of file diff --git a/application/client/src/app/ui/styles/sizes.ts b/application/client/src/app/ui/styles/sizes.ts deleted file mode 100644 index f7a25477e7..0000000000 --- a/application/client/src/app/ui/styles/sizes.ts +++ /dev/null @@ -1 +0,0 @@ -export const tabs_list_height = 1.5 * 16; diff --git a/application/client/src/app/ui/styles/support.less b/application/client/src/app/ui/styles/support.less deleted file mode 100644 index b1b072bf35..0000000000 --- a/application/client/src/app/ui/styles/support.less +++ /dev/null @@ -1,11 +0,0 @@ -.gradient(@type; @colors; @dir: 0deg; @prefixes: webkit, moz, ms, o; @index: length(@prefixes)) when (@index > 0) { - .gradient(@type; @colors; @dir; @prefixes; (@index - 1)); - - @prefix : extract(@prefixes, @index); - @dir-old : 90 - (@dir); - - background-image: ~"-@{prefix}-@{type}-gradient(@{dir-old}, @{colors})"; - & when ( @index = length(@prefixes) ) { - background-image: ~"@{type}-gradient(@{dir}, @{colors})"; - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/styles/text.less b/application/client/src/app/ui/styles/text.less deleted file mode 100644 index 608935c8ec..0000000000 --- a/application/client/src/app/ui/styles/text.less +++ /dev/null @@ -1,45 +0,0 @@ -@import './variables.less'; - -.t-normal { - font-size: 0.9rem; - font-weight: 400; -} - -.t-small { - font-size: 0.8rem; - font-weight: 300; -} - -.t-medium { - font-size: 0.8rem; - font-weight: 400; -} - -.t-large{ - font-size: 1.1rem; - font-weight: 600; -} -.t-console{ - font-size: 0.8rem; - line-height: 0.8rem; - font-family: 'console', monospace; -} - -.t-weight-600 { - font-weight: 600; -} - -.t-subselection { - & span { - color: var(--scheme-color-0); - font-weight: 500; - } -} - -// .mat-select-panel .t-small { -// .t-small !important; -// } - -// .mat-select-panel .t-console { -// .t-console !important; -// } diff --git a/application/client/src/app/ui/styles/variables.less b/application/client/src/app/ui/styles/variables.less deleted file mode 100644 index 1d396aba07..0000000000 --- a/application/client/src/app/ui/styles/variables.less +++ /dev/null @@ -1,162 +0,0 @@ -@dark-scheme-color-0: #ffffff; -@dark-scheme-color-0-fade-35: fade(@dark-scheme-color-0, 35%); -@dark-scheme-color-1: #eaeaea; -@dark-scheme-color-2: #c0c0c0; -@dark-scheme-color-2-lighten-5: lighten(@dark-scheme-color-2, 5%); -@dark-scheme-color-3: #979797; -@dark-scheme-color-3-15: #97979715; -@dark-scheme-color-3-75: #97979775; -@dark-scheme-color-4: #555555; -@dark-scheme-color-5: #333333; -@dark-scheme-color-5-00: #33333300; -@dark-scheme-color-5-15: #33333315; -@dark-scheme-color-5-85: #33333385; -@dark-scheme-color-5-95: #33333395; -@dark-scheme-color-5-lighten-5: lighten(@dark-scheme-color-5, 5%); -@dark-scheme-color-5-lighten-10: lighten(@dark-scheme-color-5, 10%); -@dark-scheme-color-5-lighten-15: lighten(@dark-scheme-color-5, 15%); -@dark-scheme-color-5-darken-5: darken(@dark-scheme-color-5, 5%); -@dark-scheme-color-6: #111111; -@dark-scheme-color-7: #000000; -@dark-scheme-bk-color-0: #424242; -@dark-scheme-color-error: rgb(253, 21, 21); -@dark-scheme-color-error-light: rgb(248, 133, 133); -@dark-scheme-color-accent: #74b9ff; -@dark-scheme-color-accent-50: #74b9ff50; -@dark-scheme-color-accent-fade-30: fade(@dark-scheme-color-accent, 30%); -@dark-scheme-color-accent-fade-60: fade(@dark-scheme-color-accent, 60%); -@dark-scheme-color-accent-lighten-20: lighten(@dark-scheme-color-accent, 20%); -@dark-scheme-color-accent-fadeout-50: fadeout(@dark-scheme-color-accent, 50%); -@dark-scheme-color-warning: #fffd71; -@dark-scheme-color-warning-light: #a7a547; -@dark-scheme-color-warning-dark: #676628; -@dark-scheme-color-warning-fadeout-50: fadeout(@dark-scheme-color-warning, 50%); -@dark-scheme-color-hover: #494949; -@dark-scheme-color-active: #6a7d8f; -@dark-scheme-color-active-15: #6a7d8f15; -@dark-scheme-color-active-75: #6a7d8f75; - -.dark-theme { - --scheme-color-0: @dark-scheme-color-0; - --scheme-color-0-fade-35: @dark-scheme-color-0-fade-35; - --scheme-color-1: @dark-scheme-color-1; - --scheme-color-2: @dark-scheme-color-2; - --scheme-color-2-lighten-5: @dark-scheme-color-2-lighten-5; - --scheme-color-3: @dark-scheme-color-3; - --scheme-color-3-15: @dark-scheme-color-3-15; - --scheme-color-3-75: @dark-scheme-color-3-75; - --scheme-color-4: @dark-scheme-color-4; - --scheme-color-5: @dark-scheme-color-5; - --scheme-color-5-00: @dark-scheme-color-5-00; - --scheme-color-5-15: @dark-scheme-color-5-15; - --scheme-color-5-85: @dark-scheme-color-5-85; - --scheme-color-5-95: @dark-scheme-color-5-95; - --scheme-color-5-lighten-5: @dark-scheme-color-5-lighten-5; - --scheme-color-5-lighten-10: @dark-scheme-color-5-lighten-10; - --scheme-color-5-lighten-15: @dark-scheme-color-5-lighten-15; - --scheme-color-5-darken-5: @dark-scheme-color-5-darken-5; - --scheme-color-6: @dark-scheme-color-6; - --scheme-color-7: @dark-scheme-color-7; - --scheme-bk-color-0: @dark-scheme-bk-color-0; - --scheme-color-error: @dark-scheme-color-error; - --scheme-color-error-light: @dark-scheme-color-error-light; - --scheme-color-accent: @dark-scheme-color-accent; - --scheme-color-accent-50: @dark-scheme-color-accent-50; - --scheme-color-accent-fade-30: @dark-scheme-color-accent-fade-30; - --scheme-color-accent-fade-60: @dark-scheme-color-accent-fade-60; - --scheme-color-accent-lighten-20: @dark-scheme-color-accent-lighten-20; - --scheme-color-accent-fadeout-50: @dark-scheme-color-accent-fadeout-50; - --scheme-color-warning: @dark-scheme-color-warning; - --scheme-color-warning-light: @dark-scheme-color-warning-light; - --scheme-color-warning-dark: @dark-scheme-color-warning-dark; - --scheme-color-warning-fadeout-50: @dark-scheme-color-warning-fadeout-50; - --scheme-color-hover: @dark-scheme-color-hover; - --scheme-color-active: @dark-scheme-color-active; - --scheme-color-active-75: @dark-scheme-color-active-75; -} - -@light-scheme-color-0: #000000; -@light-scheme-color-0-fade-35: fade(@light-scheme-color-0, 35%); -@light-scheme-color-1: #151515; -@light-scheme-color-2: #3f3f3f; -@light-scheme-color-2-lighten-5: lighten(@light-scheme-color-2, 5%); -@light-scheme-color-3: #686868; -@light-scheme-color-3-15: #68686815; -@light-scheme-color-3-75: #68686875; -@light-scheme-color-4: #aaaaaa; -@light-scheme-color-5: #efefef; -@light-scheme-color-5-00: #efefef00; -@light-scheme-color-5-15: #efefef15; -@light-scheme-color-5-85: #efefef85; -@light-scheme-color-5-95: #efefef95; -@light-scheme-color-5-lighten-5: lighten(@light-scheme-color-5, 5%); -@light-scheme-color-5-lighten-10: lighten(@light-scheme-color-5, 10%); -@light-scheme-color-5-lighten-15: lighten(@light-scheme-color-5, 15%); -@light-scheme-color-5-darken-5: darken(@light-scheme-color-5, 5%); -@light-scheme-color-6: #fafafa; -@light-scheme-color-7: #ffffff; -@light-scheme-color-error: rgb(253, 21, 21); -@light-scheme-color-error-light: rgb(248, 133, 133); -@light-scheme-color-accent: #74b9ff; -@light-scheme-color-accent-50: #74b9ff50; -@light-scheme-color-accent-fade-30: fade(@light-scheme-color-accent, 30%); -@light-scheme-color-accent-fade-60: fade(@light-scheme-color-accent, 60%); -@light-scheme-color-accent-lighten-20: lighten(@light-scheme-color-accent, 20%); -@light-scheme-color-accent-fadeout-50: fadeout(@light-scheme-color-accent, 50%); -@light-scheme-color-warning: #fffd71; -@light-scheme-color-warning-light: #a7a547; -@light-scheme-color-warning-dark: #676628; -@light-scheme-color-warning-fadeout-50: fadeout(@light-scheme-color-warning, 50%); -@light-scheme-bk-color-0: #dcdcdc; -@light-scheme-color-hover: #dbdbdb; -@light-scheme-color-active: #958270; -@light-scheme-color-active-15: #95827015; -@light-scheme-color-active-75: #95827075; - -.light-theme { - --scheme-color-0: @light-scheme-color-0; - --scheme-color-0-fade-35: @light-scheme-color-0-fade-35; - --scheme-color-1: @light-scheme-color-1; - --scheme-color-2: @light-scheme-color-2; - --scheme-color-2-lighten-5: @light-scheme-color-2-lighten-5; - --scheme-color-3: @light-scheme-color-3; - --scheme-color-3-15: @light-scheme-color-3-15; - --scheme-color-3-75: @light-scheme-color-3-75; - --scheme-color-4: @light-scheme-color-4; - --scheme-color-5: @light-scheme-color-5; - --scheme-color-5-00: @light-scheme-color-5-00; - --scheme-color-5-15: @light-scheme-color-5-15; - --scheme-color-5-85: @light-scheme-color-5-85; - --scheme-color-5-95: @light-scheme-color-5-95; - --scheme-color-5-lighten-5: @light-scheme-color-5-lighten-5; - --scheme-color-5-lighten-10: @light-scheme-color-5-lighten-10; - --scheme-color-5-lighten-15: @light-scheme-color-5-lighten-15; - --scheme-color-5-darken-5: @light-scheme-color-5-darken-5; - --scheme-color-6: @light-scheme-color-6; - --scheme-color-7: @light-scheme-color-7; - --scheme-bk-color-0: @light-scheme-bk-color-0; - --scheme-color-error: @light-scheme-color-error; - --scheme-color-error-light: @light-scheme-color-error-light; - --scheme-color-accent: @light-scheme-color-accent; - --scheme-color-accent-50: @light-scheme-color-accent-50; - --scheme-color-accent-fade-30: @light-scheme-color-accent-fade-30; - --scheme-color-accent-fade-60: @light-scheme-color-accent-fade-60; - --scheme-color-accent-lighten-20: @light-scheme-color-accent-lighten-20; - --scheme-color-accent-fadeout-50: @light-scheme-color-accent-fadeout-50; - --scheme-color-warning: @light-scheme-color-warning; - --scheme-color-warning-light: @light-scheme-color-warning-light; - --scheme-color-warning-dark: @light-scheme-color-warning-dark; - --scheme-color-warning-fadeout-50: @light-scheme-color-warning-fadeout-50; - --scheme-color-hover: @light-scheme-color-hover; - --scheme-color-active: @light-scheme-color-active; - --scheme-color-active-75: @light-scheme-color-active-75; -} - -@border-radius: 6px; -@border-color-offset: 5%; -@tabs-list-height: 32px; -@caption-height: 32px; -@status-bar-height: 1.5rem; -@func-bar-maximized: 20rem; -@status-bar-height-abs: 1.5; -@func-bar-maximized-abs: 20; diff --git a/application/client/src/app/ui/tabs/changelogs/component.ts b/application/client/src/app/ui/tabs/changelogs/component.ts deleted file mode 100644 index bbc188d6da..0000000000 --- a/application/client/src/app/ui/tabs/changelogs/component.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterContentInit, - AfterViewInit, - Input, - ElementRef, - ViewChild, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { micromark } from 'micromark'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; - -import * as dom from '@ui/env/dom'; -import { bridge } from '@service/bridge'; - -@Component({ - selector: 'app-tabs-changelog', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class Changelog extends ChangesDetector implements AfterContentInit, AfterViewInit { - @Input() markdown!: string; - @Input() version!: string; - @ViewChild('content') contentRef!: ElementRef; - - public html!: SafeHtml; - - constructor(cdRef: ChangeDetectorRef, protected readonly sanitizer: DomSanitizer) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.html = this.sanitizer.bypassSecurityTrustHtml(micromark(this.markdown)); - } - - public ngAfterViewInit(): void { - const links = this.contentRef.nativeElement.querySelectorAll('a'); - if (links === null) { - return; - } - links.forEach((link: HTMLAnchorElement) => { - link.addEventListener('click', this.redirect); - }); - } - - protected redirect(event: MouseEvent): void { - dom.stop(event); - const url = (event.target as HTMLAnchorElement).href; - bridge - .browser() - .url(url) - .catch((err: Error) => { - this.log().error(`Fail to open URL "${url}": ${err.message}`); - }); - } -} -export interface Changelog extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/changelogs/module.ts b/application/client/src/app/ui/tabs/changelogs/module.ts deleted file mode 100644 index 8331fbb090..0000000000 --- a/application/client/src/app/ui/tabs/changelogs/module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; - -import { Changelog } from './component'; - -@NgModule({ - imports: [CommonModule, MatCardModule, MatDividerModule], - declarations: [Changelog], - exports: [Changelog], - bootstrap: [Changelog], -}) -export class ChangelogModule {} diff --git a/application/client/src/app/ui/tabs/changelogs/styles.less b/application/client/src/app/ui/tabs/changelogs/styles.less deleted file mode 100644 index 75ac4c786f..0000000000 --- a/application/client/src/app/ui/tabs/changelogs/styles.less +++ /dev/null @@ -1,22 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - & mat-card { - margin: 12px 6px 12px 12px; - & mat-card-title { - color: var(--scheme-color-1); - font-size: 16px; - } - & mat-card-subtitle { - color: var(--scheme-color-3); - font-size: 12px; - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/changelogs/template.html b/application/client/src/app/ui/tabs/changelogs/template.html deleted file mode 100644 index 7a233fee3b..0000000000 --- a/application/client/src/app/ui/tabs/changelogs/template.html +++ /dev/null @@ -1,10 +0,0 @@ -

    -
    - - {{version}} - -
    -
    -
    -
    -
    diff --git a/application/client/src/app/ui/tabs/help/component.ts b/application/client/src/app/ui/tabs/help/component.ts deleted file mode 100644 index a57df7dee8..0000000000 --- a/application/client/src/app/ui/tabs/help/component.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterViewInit, - ViewChild, - ElementRef, - ViewEncapsulation, - Input, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { micromark } from 'micromark'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; - -import * as dom from '@ui/env/dom'; - -const HOME = `/readme.md`; -const PATH = `assets/documentation`; - -@Component({ - selector: 'app-tabs-help', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Initial() -@Ilc() -export class Help extends ChangesDetector implements AfterViewInit { - @Input() location: string | undefined; - @ViewChild('content') contentRef!: ElementRef; - @ViewChild('index') indexRef!: ElementRef; - - protected paths: { - index: string; - content: string; - location: string; - } = { - index: '/readme.md', - content: '/features.md', - location: '', - }; - protected history: string[] = []; - - protected url(): { - clean(path: string): string; - src(html: string): string; - } { - return { - clean: (path: string): string => { - return path.replace(/^\./gi, ''); - }, - src: (html: string): string => { - return html.replace(/src="(.*?)"/gi, (_match: string, url: string) => { - if (typeof url !== 'string') { - return 'src=""'; - } - return `src="${PATH}/${this.paths.location}${url}"`; - }); - }, - }; - } - protected fetch(): { - index(): Promise; - content(): Promise; - all(): void; - } { - const load = (dest: string): Promise => { - return new Promise((resolve) => { - fetch(dest) - .then((res) => { - if (res.status !== 200) { - return; - } - res.text().then((markdown) => { - const lines = markdown.split(/[\n\r]/gi); - const indexes: { found: boolean; count: number } = { - found: false, - count: -1, - }; - lines.forEach((line: string, i: number) => { - if (indexes.found && indexes.count !== -1) { - return; - } - if (!indexes.found && line.toLowerCase() === '## content') { - indexes.found = true; - } - if (indexes.found && i > 1 && line.trim().startsWith('#')) { - indexes.count = i; - } - }); - if (indexes.found && indexes.count !== -1) { - lines.splice(0, indexes.count); - } - resolve( - this.sanitizer.bypassSecurityTrustHtml( - this.url().src(micromark(lines.join('\n'))), - ), - ); - }); - }) - .catch((err) => { - this.log().error(err); - }); - }); - }; - return { - index: (): Promise => { - return load(`${PATH}${this.url().clean(this.paths.index)}`) - .then((html) => { - this.html.index = html; - this.detectChanges(); - this.bind().index(); - }) - .catch((err: Error) => { - this.log().error(`Fail to get HTML of index: ${err.message}`); - }); - }, - content: (): Promise => { - return load(`${PATH}${this.url().clean(this.paths.content)}`) - .then((html) => { - this.html.content = html; - this.detectChanges(); - this.bind().content(); - }) - .catch((err: Error) => { - this.log().error(`Fail to get HTML of content: ${err.message}`); - }); - }, - all: (): void => { - Promise.allSettled([this.fetch().index(), this.fetch().content()]) - .catch((err: Error) => { - this.log().error(`Fail to get HTML: ${err.message}`); - }) - .finally(() => { - if (this.location !== undefined) { - this.link(this.location, false); - } - }); - }, - }; - } - - protected bind(): { - content(): void; - index(): void; - } { - return { - content: (): void => {}, - index: (): void => { - const links = this.indexRef.nativeElement.querySelectorAll('a'); - if (links === null) { - return; - } - links.forEach((link: HTMLAnchorElement) => { - link.addEventListener('click', this.redirect); - }); - }, - }; - } - - protected unbind(): { - content(): void; - index(): void; - } { - return { - content: (): void => {}, - index: (): void => { - const links = this.indexRef.nativeElement.querySelectorAll('a'); - if (links === null) { - return; - } - links.forEach((link: HTMLAnchorElement) => { - link.removeEventListener('click', this.redirect); - }); - }, - }; - } - - protected redirect(event: MouseEvent): void { - dom.stop(event); - this.link((event.target as HTMLAnchorElement).href); - } - - protected link(url: string, track: boolean = true): void { - url = `/${url.replace(/^.*\/client\//gi, '')}`; - if (url.toLowerCase().endsWith(`/readme.md`)) { - this.paths.location = url.replace(/readme\.md$/gi, ''); - track && this.history.push(this.paths.index); - this.paths.index = url; - this.unbind().index(); - this.fetch() - .index() - .then(() => { - const links = this.indexRef.nativeElement.querySelectorAll('a'); - if (links === null) { - return; - } - this.link(links[0].href); - }) - .catch((err: Error) => { - this.log().error(`Fail to update index: ${err.message}`); - }); - } else { - this.paths.content = `${this.paths.location}${url}`; - this.unbind().content(); - this.fetch().content(); - } - } - - public html: { - index: SafeHtml; - content: SafeHtml; - } = { - index: '', - content: '', - }; - - constructor(cdRef: ChangeDetectorRef, protected readonly sanitizer: DomSanitizer) { - super(cdRef); - this.redirect = this.redirect.bind(this); - } - - public ngAfterViewInit(): void { - this.fetch().all(); - } - - public home(): void { - this.link(HOME); - } - - public back(): void { - if (this.history.length === 0) { - return; - } - this.link(this.history.splice(this.history.length - 1, 1)[0], false); - } -} -export interface Help extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/help/module.ts b/application/client/src/app/ui/tabs/help/module.ts deleted file mode 100644 index 8d5a376ad3..0000000000 --- a/application/client/src/app/ui/tabs/help/module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatButtonModule } from '@angular/material/button'; - -import { Help } from './component'; - -@NgModule({ - imports: [CommonModule, MatCardModule, MatDividerModule, MatButtonModule], - declarations: [Help], - exports: [Help], - bootstrap: [Help], -}) -export class HelpModule {} diff --git a/application/client/src/app/ui/tabs/help/styles.less b/application/client/src/app/ui/tabs/help/styles.less deleted file mode 100644 index 377b3bc254..0000000000 --- a/application/client/src/app/ui/tabs/help/styles.less +++ /dev/null @@ -1,102 +0,0 @@ -@import '../../styles/variables.less'; - -app-tabs-help { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - & mat-card { - margin: 12px 6px 12px 12px; - & mat-card-title { - color: var(--scheme-color-1); - font-size: 16px; - } - & mat-card-subtitle { - color: var(--scheme-color-3); - font-size: 12px; - } - } - & div.left { - position: absolute; - display: flex; - flex-direction: column; - top: 0; - bottom: 0; - left: 0; - right: 330px; - overflow: hidden; - justify-content: stretch; - justify-items: stretch; - - & .fill { - overflow: auto; - } - } - & div.right { - position: absolute; - width: 320px; - right: 6px; - bottom: 0; - top: 0; - overflow-y: auto; - overflow-x: hidden; - display: flex; - flex-direction: column; - & div.spacer{ - flex: auto 100; - } - & mat-card-subtitle { - text-align: right; - & button:last-child { - margin-right: -1px; - } - &:first-child { - padding-top: 16px; - } - } - & ul { - padding: 8px 0; - } - & li { - position: relative; - display: block; - list-style: none; - cursor: default; - height: 24px; - width: 100%; - & > a { - text-decoration: none; - cursor: default; - position: absolute; - top:0; - left:0; - width: 100%; - height: 100%; - padding-top: 2px; - } - &:hover { - background: var(--scheme-color-4); - &::after, - &::before { - position: absolute; - content: ''; - width: 16px; - height: 100%; - background: var(--scheme-color-4); - top: 0; - } - &::after { - left: -16px; - } - &::before { - left:100%; - } - - } - } - } - -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/help/template.html b/application/client/src/app/ui/tabs/help/template.html deleted file mode 100644 index ffa38289e4..0000000000 --- a/application/client/src/app/ui/tabs/help/template.html +++ /dev/null @@ -1,23 +0,0 @@ -
    -
    -
    - - -
    -
    -
    -
    -
    - - Navigation - - - - - -
    -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/module.ts b/application/client/src/app/ui/tabs/module.ts deleted file mode 100644 index b723638d68..0000000000 --- a/application/client/src/app/ui/tabs/module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ObserveModule } from '@ui/tabs/observe/module'; -import { MultipleFilesModule } from '@ui/tabs/multiplefiles/module'; -import { SettingsModule } from '@ui/tabs/settings/module'; -import { ChangelogModule } from '@ui/tabs/changelogs/module'; -import { HelpModule } from '@ui/tabs/help/module'; -import { PluginsManagerModule } from '@ui/tabs/plugins/module'; - -@NgModule({ - imports: [ - CommonModule, - ObserveModule, - MultipleFilesModule, - SettingsModule, - ChangelogModule, - HelpModule, - PluginsManagerModule, - ], - declarations: [], - exports: [ObserveModule, MultipleFilesModule, SettingsModule, ChangelogModule, HelpModule], - bootstrap: [], -}) -export class TabsModule {} diff --git a/application/client/src/app/ui/tabs/multiplefiles/component.ts b/application/client/src/app/ui/tabs/multiplefiles/component.ts deleted file mode 100644 index 81301f0620..0000000000 --- a/application/client/src/app/ui/tabs/multiplefiles/component.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - Component, - AfterContentInit, - Input, - OnDestroy, - AfterViewInit, - ViewChild, - ChangeDetectorRef, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { File } from '@platform/types/files'; -import { State } from './state'; -import { TabControls } from '@service/session'; -import { HiddenFilter } from '@elements/filter.hidden/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-tabs-source-multiple-files', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class TabSourceMultipleFiles - extends ChangesDetector - implements AfterContentInit, OnDestroy, AfterViewInit -{ - @Input() files!: File[]; - @Input() tab!: TabControls; - - @ViewChild('filter') filter!: HiddenFilter; - - public state!: State; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit() { - const state: State | undefined = this.tab.storage().get(); - if (state) { - this.state = state; - this.state.restore(this); - } else { - this.state = new State(); - this.state.init(this, this.tab, this.files); - } - } - - public ngAfterViewInit(): void { - this.env().subscriber.register( - this.filter.filter.subjects.get().change.subscribe((value: string) => { - this.state.filter(value); - }), - this.filter.filter.subjects.get().drop.subscribe(() => { - this.state.filter(''); - }), - ); - this.ilc().services.ui.dropfiles.state().disable(); - } - - public ngOnDestroy() { - this.tab.storage().set(this.state); - this.ilc().services.ui.dropfiles.state().enable(); - } -} -export interface TabSourceMultipleFiles extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/multiplefiles/file.holder.ts b/application/client/src/app/ui/tabs/multiplefiles/file.holder.ts deleted file mode 100644 index a13a9d716b..0000000000 --- a/application/client/src/app/ui/tabs/multiplefiles/file.holder.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Matchee } from '@module/matcher'; -import { bytesToStr } from '@env/str'; -import { File } from '@platform/types/files'; -import { FileType } from '@platform/types/observe/types/file'; - -import * as wasm from '@loader/wasm'; - -export class FileHolder extends Matchee { - private readonly _file: File; - private _selected: boolean = true; - private readonly _color: string; - - constructor(matcher: wasm.Matcher, file: File, color: string) { - super(matcher, { name: file.name, path: file.path }); - this._file = file; - this._color = color; - } - - public reverseSelect() { - this._selected = !this._selected; - } - - public select() { - this._selected = true; - } - - public unselect() { - this._selected = false; - } - - public get color(): string { - return this._color; - } - - public get filename(): string { - return this._file.filename; - } - - public get modificationDate(): string { - return new Date(this._file.stat.mtimeMs).toLocaleString('en-GB'); - } - - public get name(): string { - return this._file.name; - } - - public get path(): string { - return this._file.path; - } - - public get selected(): boolean { - return this._selected; - } - - public get sizeAsStr(): string { - return bytesToStr(this._file.stat.size); - } - - public get size(): number { - return this._file.stat.size; - } - - public sizeInByte(): number { - return this._file.stat.size; - } - - public get type(): FileType { - return this._file.type; - } -} diff --git a/application/client/src/app/ui/tabs/multiplefiles/module.ts b/application/client/src/app/ui/tabs/multiplefiles/module.ts deleted file mode 100644 index b1fcd15245..0000000000 --- a/application/client/src/app/ui/tabs/multiplefiles/module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatTableModule } from '@angular/material/table'; -import { AppDirectiviesModule } from '@ui/env/directives/module'; -import { MatSortModule } from '@angular/material/sort'; -import { CommonModule } from '@angular/common'; -import { DragDropModule } from '@angular/cdk/drag-drop'; -import { HiddenFilterModule } from '@elements/filter.hidden/module'; - -import { TabSourceMultipleFilesStructure } from './structure/component'; -import { TabSourceMultipleFiles } from './component'; - -@NgModule({ - imports: [ - MatButtonModule, - MatCardModule, - MatTableModule, - AppDirectiviesModule, - MatSortModule, - CommonModule, - DragDropModule, - HiddenFilterModule, - ], - declarations: [TabSourceMultipleFiles, TabSourceMultipleFilesStructure], - exports: [TabSourceMultipleFiles], - bootstrap: [TabSourceMultipleFiles, TabSourceMultipleFilesStructure], -}) -export class MultipleFilesModule {} diff --git a/application/client/src/app/ui/tabs/multiplefiles/state.ts b/application/client/src/app/ui/tabs/multiplefiles/state.ts deleted file mode 100644 index 83a4b5042a..0000000000 --- a/application/client/src/app/ui/tabs/multiplefiles/state.ts +++ /dev/null @@ -1,407 +0,0 @@ -import { FileHolder } from './file.holder'; -import { bytesToStr } from '@env/str'; -import { File } from '@platform/types/files'; -import { FileType } from '@platform/types/observe/types/file'; -import { Subject } from '@platform/env/subscription'; -import { EEventType, IEvent } from './structure/component'; -import { Holder } from '@module/matcher'; -import { TabControls } from '@service/session'; -import { IlcInterface } from '@service/ilc'; -import { Level, Locker } from '@ui/service/lockers'; -import { getUniqueColorTo } from '@ui/styles/colors'; -import { Sort } from '@angular/material/sort'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -import * as Factory from '@platform/types/observe/factory'; - -export interface IMultifile { - usedColors: string[]; - files: FileHolder[]; -} - -export class State extends Holder { - private readonly _filesUpdate: Subject = new Subject(); - private _ref!: IlcInterface & ChangesDetector; - private _tab!: TabControls; - private _files: FileHolder[] = []; - private _usedColors: string[] = []; - private _selected: { - count: number; - files: FileHolder[]; - totalSize: number; - typeCount: { [key: string]: number }; - types: FileType[]; - } = { - count: 0, - files: [], - totalSize: 0, - typeCount: {}, - types: [], - }; - private _sortConfig: Sort = { active: '', direction: '' }; - - public path: string | undefined; - - constructor() { - super(); - } - - public init(ref: IlcInterface & ChangesDetector, tab: TabControls, files: File[]): void { - this._ref = ref; - this._tab = tab; - if (files.length > 0) { - this.path = files[0].path; - } - files.forEach((file: File) => { - const color = getUniqueColorTo(this._usedColors); - this._usedColors.push(color); - this._files.push(new FileHolder(this.matcher, file, color)); - if (this.path !== undefined && file.path !== this.path) { - this.path = undefined; - } - }); - this.update(); - } - - public restore(ref: IlcInterface & ChangesDetector) { - this._ref = ref; - } - - public set sortConfig(config: Sort) { - this._sortConfig = config; - } - - public get sortConfig(): Sort { - return this._sortConfig; - } - - public get filesUpdate(): Subject { - return this._filesUpdate; - } - - public get selectedFiles(): FileHolder[] { - return this._selected.files; - } - - public get files(): FileHolder[] { - return this._files; - } - - public get selectedCount(): number { - return this._selected.count; - } - - public get selectedSize(): string { - return bytesToStr(this._selected.totalSize); - } - - public get selectedTypes(): FileType[] { - return this._selected.types; - } - - public getTypeCount(type: FileType): number { - const count: number | undefined = this._selected.typeCount[type]; - return count === undefined ? 0 : count; - } - - public selectOnly(type: FileType) { - this._files.forEach((file: FileHolder) => { - if (file.type === type) { - file.select(); - } else { - file.unselect(); - } - }); - this.update(); - } - - public isConcatable(): boolean { - // TODO: Needs some rework! This method should consider parser - return ( - this._selected.types.length === 1 || - (this._selected.types.length === 2 && - this._selected.types.includes(FileType.Text) && - this._selected.types.includes(FileType.Binary)) - ); - } - - public action(): { - cancel: () => void; - concat: () => void; - openEach: (files?: FileHolder[]) => void; - addFiles: () => void; - } { - return { - cancel: () => { - this._tab.close(); - }, - concat: () => { - const fileType: FileType = - this._selected.types.length === 1 ? this._selected.types[0] : FileType.Text; - const files: string[] = this._selected.files.map( - (file: FileHolder) => file.filename, - ); - (() => { - switch (fileType) { - case FileType.Text: - return this._ref - .ilc() - .services.system.session.initialize() - .observe( - new Factory.Concat() - .asText() - .type(Factory.FileType.Text) - .files(files) - .get(), - ); - case FileType.PcapNG: - return this._ref - .ilc() - .services.system.session.initialize() - .configure( - new Factory.Concat() - .asDlt() - .type(Factory.FileType.PcapNG) - .files(files) - .get(), - ); - case FileType.PcapLegacy: - return this._ref - .ilc() - .services.system.session.initialize() - .configure( - new Factory.Concat() - .asDlt() - .type(Factory.FileType.PcapLegacy) - .files(files) - .get(), - ); - case FileType.Binary: - return this._ref - .ilc() - .services.system.session.initialize() - .configure( - new Factory.Concat() - .asDlt() - .type(Factory.FileType.Binary) - .files(files) - .get(), - ); - case FileType.ParserPlugin: - return this._ref - .ilc() - .services.system.session.initialize() - .configure( - new Factory.Concat() - .asParserPlugin() - .type(Factory.FileType.ParserPlugin) - .files(files) - .get(), - ); - default: - return Promise.reject( - new Error(`Unsupported type ${this.files[0].type}`), - ); - } - })() - .then(() => { - this._tab.close(); - }) - .catch((err: Error) => { - this._ref - .ilc() - .services.ui.lockers.lock( - new Locker(true, err.message) - .set() - .message(err.message) - .type(Level.error) - .spinner(false) - .end(), - { - closable: true, - }, - ); - }); - }, - openEach: (files?: FileHolder[]) => { - (files === undefined ? this._selected.files : files).forEach((file: FileHolder) => { - switch (file.type) { - case FileType.Text: - this._ref - .ilc() - .services.system.session.initialize() - .observe( - new Factory.File() - .asText() - .type(Factory.FileType.Text) - .file(file.filename) - .get(), - ) - .catch((err: Error) => { - this._ref - .ilc() - .logger.error( - `Fail to open text file; error: ${err.message}`, - ); - }); - break; - case FileType.Binary: - this._ref - .ilc() - .services.system.session.initialize() - .configure( - new Factory.File() - .asDlt() - .type(Factory.FileType.Binary) - .file(file.filename) - .get(), - ) - .catch((err: Error) => { - this._ref - .ilc() - .logger.error( - `Fail to open dlt file; error: ${err.message}`, - ); - }); - break; - case FileType.PcapNG: - this._ref - .ilc() - .services.system.session.initialize() - .configure( - new Factory.File() - .asDlt() - .type(Factory.FileType.PcapNG) - .file(file.filename) - .get(), - ) - .catch((err: Error) => { - this._ref - .ilc() - .logger.error( - `Fail to open dlt file; error: ${err.message}`, - ); - }); - break; - case FileType.PcapLegacy: - this._ref - .ilc() - .services.system.session.initialize() - .configure( - new Factory.File() - .asDlt() - .type(Factory.FileType.PcapLegacy) - .file(file.filename) - .get(), - ) - .catch((err: Error) => { - this._ref - .ilc() - .logger.error( - `Fail to open dlt file; error: ${err.message}`, - ); - }); - break; - case FileType.ParserPlugin: - this._ref - .ilc() - .services.system.session.initialize() - .configure( - new Factory.File() - .asParserPlugin() - .type(Factory.FileType.ParserPlugin) - .file(file.filename) - .get(), - ) - .catch((err: Error) => { - this._ref - .ilc() - .logger.error( - `Fail to open file with plugins; error: ${err.message}`, - ); - }); - break; - default: - throw new Error(`Not covered type ${this.files[0].type}`); - } - }); - this._tab.close(); - }, - addFiles: () => { - /* TODO */ - }, - }; - } - - public onDropped(files: File[]) { - files.forEach((result: File) => { - if (this._files.find((file: FileHolder) => file.filename === result.filename)) { - return; - } - const color = getUniqueColorTo(this._usedColors); - this._usedColors.push(color); - this._files.push(new FileHolder(this.matcher, result, color)); - this.filesUpdate.emit(this._files); - this.update(); - }); - } - - public event(event: IEvent) { - switch (event.type) { - case EEventType.open: - this.action().openEach(event.files); - break; - case EEventType.select: - this.update(); - break; - case EEventType.sort: - this._files = event.files; - this.update(); - break; - case EEventType.update: - this._files = - event.files.length === 0 - ? [] - : this._files.filter((f: FileHolder) => !event.files.includes(f)); - this.update(); - break; - } - this._ref !== undefined && this._ref.detectChanges(); - } - - public filter(value: string) { - this.matcher.search(value); - this.filesUpdate.emit( - this._files - .sort((a: FileHolder, b: FileHolder) => b.getScore() - a.getScore()) - .filter((file: FileHolder) => file.getScore() > 0), - ); - } - - public overviewColorWidth(size: number) { - return (size / this._selected.totalSize) * 100; - } - - protected update() { - this._selected = { - count: 0, - files: [], - totalSize: 0, - typeCount: {}, - types: [], - }; - this._files.forEach((file: FileHolder) => { - if (file.selected) { - this._selected.count++; - this._selected.totalSize += file.sizeInByte(); - !this._selected.types.includes(file.type) && this._selected.types.push(file.type); - if (this._selected.typeCount[file.type] === undefined) { - this._selected.typeCount[file.type] = 1; - } else { - this._selected.typeCount[file.type] += 1; - } - this._selected.files.push(file); - } - }); - } -} diff --git a/application/client/src/app/ui/tabs/multiplefiles/structure/component.ts b/application/client/src/app/ui/tabs/multiplefiles/structure/component.ts deleted file mode 100644 index 14e6f10b0a..0000000000 --- a/application/client/src/app/ui/tabs/multiplefiles/structure/component.ts +++ /dev/null @@ -1,268 +0,0 @@ -import { - Component, - ViewChild, - AfterContentInit, - Input, - ViewEncapsulation, - AfterViewInit, - OnDestroy, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { MatSort, Sort } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; -import { FileHolder } from '../file.holder'; -import { FileType } from '@platform/types/observe/types/file'; -import { Subscription } from 'rxjs'; -import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; -import { State } from '../state'; - -import * as dom from '@ui/env/dom'; - -export interface IEvent { - type: EEventType; - files: FileHolder[]; -} - -export enum EEventType { - update = 'update', - select = 'select', - open = 'open', - sort = 'sort', -} - -export const COLUMNS = { - color: 'color', - type: 'type', - name: 'name', - path: 'path', - size: 'size', - modificationDate: 'modificationDate', -}; - -@Component({ - selector: 'app-tabs-source-multiplefiles-structure', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class TabSourceMultipleFilesStructure implements AfterContentInit, AfterViewInit, OnDestroy { - @Input() state!: State; - - @ViewChild(MatSort) sort!: MatSort; - - public data!: MatTableDataSource; - public readonly columns: string[] = [ - COLUMNS.color, - COLUMNS.type, - COLUMNS.name, - COLUMNS.path, - COLUMNS.size, - COLUMNS.modificationDate, - ]; - - private _sortConfig: Sort = { active: '', direction: '' }; - private _dataConnect!: Subscription; - private _sortChange!: Subscription; - - public ngAfterContentInit() { - this.data = new MatTableDataSource(this.state.files); - this.env().subscriber.register( - this.state.filesUpdate.subscribe(this._onFilesUpdate.bind(this)), - ); - this._subscribe(); - } - - public ngAfterViewInit() { - this.data.sort = this.sort; - this.sort.sort({ - id: this.state.sortConfig.active, - start: this.state.sortConfig.direction, - disableClear: false, - }); - this._sortChange = this.sort.sortChange.subscribe((sortConfig: Sort) => { - this._sortConfig = sortConfig; - }); - } - - public ngOnDestroy() { - this.state.sortConfig = this._sortConfig; - this._dataConnect && this._dataConnect.unsubscribe(); - this._sortChange && this._sortChange.unsubscribe(); - } - - public ngOnDropListDropped(event: CdkDragDrop) { - this.sort.sort({ id: '', start: '', disableClear: false }); - this._dataConnect && this._dataConnect.unsubscribe(); - moveItemInArray(event.container.data, event.previousIndex, event.currentIndex); - this.data = new MatTableDataSource(event.container.data); - this._subscribe(); - this.data.sort = this.sort; - this.state.event({ type: EEventType.sort, files: event.container.data }); - } - - public ngOnRowSelect(file: FileHolder) { - file.reverseSelect(); - this.state.event({ type: EEventType.select, files: [] }); - } - - public ngContextMenu(event: MouseEvent, file?: FileHolder) { - dom.stop(event); - const items = []; - if (file !== undefined) { - items.push({ - caption: 'Open File', - handler: () => { - this.state.event({ type: EEventType.open, files: [file] }); - }, - disabled: file.type === FileType.Binary, - }); - } - items.push( - { - caption: 'Open Selected', - handler: () => { - this.state.event({ - type: EEventType.open, - files: this.data.data.filter((file: FileHolder) => file.selected), - }); - }, - }, - { - /* Delimiter */ - }, - ); - if (file !== undefined) { - items.push( - { - caption: file.selected ? 'Unselect' : 'Select', - handler: () => { - file.selected ? file.unselect() : file.select(); - this.state.event({ type: EEventType.select, files: [] }); - }, - }, - { - caption: `Select Only [${file.type}]`, - handler: () => { - this.data.data.forEach((f: FileHolder) => - f.type === file.type ? f.select() : f.unselect(), - ); - this.state.event({ type: EEventType.select, files: [] }); - }, - }, - { - caption: `Unselect Only [${file.type}]`, - handler: () => { - this.data.data.forEach((f: FileHolder) => { - if (f.type === file.type) { - f.unselect(); - } - }); - this.state.event({ type: EEventType.select, files: [] }); - }, - }, - { - /* Delimiter */ - }, - ); - } - items.push( - { - caption: 'Select All', - handler: () => { - this.data.data.forEach((f: FileHolder) => f.select()); - this.state.event({ type: EEventType.select, files: [] }); - }, - }, - { - caption: 'Unselect All', - handler: () => { - this.data.data.forEach((f: FileHolder) => f.unselect()); - this.state.event({ type: EEventType.select, files: [] }); - }, - }, - { - caption: 'Reverse Select All', - handler: () => { - this.data.data.forEach((f: FileHolder) => f.reverseSelect()); - this.state.event({ type: EEventType.select, files: [] }); - }, - }, - { - /* Delimiter */ - }, - ); - if (file !== undefined) { - items.push( - { - caption: 'Remove', - handler: () => { - this.data.data = this.data.data.filter((f: FileHolder) => f !== file); - this.state.event({ type: EEventType.update, files: [file] }); - }, - }, - { - caption: `Remove All [Non-${file.type}]`, - handler: () => { - const removed: FileHolder[] = []; - const kept: FileHolder[] = []; - this.data.data.forEach((f: FileHolder) => - f.type === file.type ? kept.push(f) : removed.push(f), - ); - this.data.data = kept; - removed.length > 0 && - this.state.event({ type: EEventType.update, files: removed }); - }, - }, - ); - } - items.push( - { - caption: 'Remove All Empty', - handler: () => { - const removed: FileHolder[] = []; - const kept: FileHolder[] = []; - this.data.data.forEach((f: FileHolder) => - f.sizeInByte() === 0 ? removed.push(f) : kept.push(f), - ); - this.data.data = kept; - removed.length > 0 && - this.state.event({ type: EEventType.update, files: removed }); - }, - }, - { - caption: 'Remove All', - handler: () => { - this.data.data = []; - this.state.event({ type: EEventType.update, files: [] }); - }, - }, - ); - this.ilc().emitter.ui.contextmenu.open({ - items: [...items], - x: event.x, - y: event.y, - }); - } - - private _onFilesUpdate(files: FileHolder[]) { - this.data.data = files; - } - - private _subscribe() { - if (this.data) { - this._dataConnect = this.data.connect().subscribe((files: FileHolder[]) => { - if ( - files.length === this.data.data.length && - files.every((file, index) => file === this.data.data[index]) - ) { - return; - } - this.data.data = files; - this.state.event({ type: EEventType.sort, files: files }); - }); - } - } -} -export interface TabSourceMultipleFilesStructure extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/multiplefiles/structure/styles.less b/application/client/src/app/ui/tabs/multiplefiles/structure/styles.less deleted file mode 100644 index c20d3ab385..0000000000 --- a/application/client/src/app/ui/tabs/multiplefiles/structure/styles.less +++ /dev/null @@ -1,137 +0,0 @@ -@import '../../../styles/variables.less'; - -app-tabs-source-multiplefiles-structure { - position: relative; - display: block; - width: 100%; - height: 100%; - & table.files { - width: 100%; - border-spacing: 0px; - & th { - height: 56px; - font-size: 12px; - font-weight: 500; - color: #ffffffb3; - background-color: var(--scheme-bk-color-0); - position: sticky; - top: 0; - } - & tr { - & td { - font-size: 14px; - } - & td:last-child { - overflow: hidden; - } - } - & div.placeholder { - height: 35px; - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); - } - & .color { - padding: 0 10px 0 0; - } - & div.color-indicator { - width: 7px; - height: 35px; - } - & .type { - padding: 0 15px 0 0; - min-width: 45px; - max-width: 45px; - } - & .name { - width: 100%; - padding: 0 15px 0 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } - & td.path { - direction: rtl; - } - & .path { - min-width: 130px; - max-width: 150px; - padding: 0 20px 0 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } - & .size { - min-width: 40px; - max-width: 40px; - padding: 0 25px 0 0; - white-space: nowrap; - } - & .modification-date { - min-width: 130px; - max-width: 130px; - white-space: nowrap; - } - } - & .cdk-drop-list-dragging *:not(.cdk-drag-placeholder) { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); - } -} - -.cdk-drag-animating.multiple-file-draggable { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); -} - -.cdk-drag-preview.multiple-file-draggable { - font-size: 14px; - color: var(--scheme-color-0); - background-color: var(--scheme-bk-color-0); - box-sizing: border-box; - box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12); - & td { - vertical-align: middle; - } - & .color { - padding: 0 10px 0 0; - } - & div.color-indicator { - width: 7px; - height: 35px; - } - & .type { - padding: 0 15px 0 0; - min-width: 45px; - max-width: 45px; - } - & .name { - max-width: 150px; - padding: 0 15px 0 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } - & td.path { - direction: rtl; - } - & .path { - min-width: 130px; - max-width: 150px; - padding: 0 20px 0 0; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } - & .size { - min-width: 40px; - max-width: 40px; - padding: 0 25px 0 0; - white-space: nowrap; - } - & .modification-date { - min-width: 130px; - max-width: 130px; - white-space: nowrap; - } -} - -& .selected-multiple-file { - background-color: var(--scheme-color-active); -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/multiplefiles/structure/template.html b/application/client/src/app/ui/tabs/multiplefiles/structure/template.html deleted file mode 100644 index 47edb97c2f..0000000000 --- a/application/client/src/app/ui/tabs/multiplefiles/structure/template.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - -
    - -
    TYPENAME - PATH - SIZE - MOD. DATE -
    -
    -
    {{file.type}}{{file.name}} - {{file.path}} - {{file.sizeAsStr}}{{file.modificationDate}}
    diff --git a/application/client/src/app/ui/tabs/multiplefiles/styles.less b/application/client/src/app/ui/tabs/multiplefiles/styles.less deleted file mode 100644 index f35fbfd37b..0000000000 --- a/application/client/src/app/ui/tabs/multiplefiles/styles.less +++ /dev/null @@ -1,142 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - & mat-card.top { - overflow-y: scroll; - height: fit-content; - padding-top: 0px; - } - & div.controls { - text-align: right; - } - & h1 { - font-size: 14px; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px!important; - } - & div.left { - position: absolute; - display: flex; - flex-direction: column; - top: 0; - bottom: 0; - left: 0; - right: 330px; - overflow: hidden; - justify-content: stretch; - justify-items: stretch; - } - & div.right { - position: absolute; - width: 320px; - right: 6px; - bottom: 0; - top: 0; - overflow-y: auto; - overflow-x: hidden; - display: flex; - flex-direction: column; - & .mat-form-field{ - width: 100%; - } - & mat-divider.fibex-divider { - margin-top: 12px; - } - & div.spacer{ - flex: auto; - } - } - & div.filter { - position: absolute; - z-index: 1000; - padding: 6px 12px; - background: var(--scheme-color-warning-light); - top: 6px; - right: 6px; - box-shadow: 3px 3px 3px rgb(0 0 0 / 40%); - border-radius: 3px; - } - & .hidden { - display: none; - } - & .table-fill { - width: 100%; - } - & div.overview { - display: flex; - height: 30px; - margin-bottom: 10px; - & div.color { - height: 100%; - flex-direction: column; - } - } - & div.overview-summary { - top: 60%; - left: 50%; - padding: 2px 5px; - font-weight: 700; - position: absolute; - transform: translate(-50%, -50%); - background-color: rgba(0, 0, 0, 0.5); - } - & div.component { - display: flex; - margin-top: 7px; - & span.color { - height: 15px; - min-width: 15px; - margin-top: 2px; - margin-right: 1px; - } - & span.filename { - margin-left: 7px; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - } - } - & p.none { - color: var(--scheme-color-3); - position: absolute; - top: 65%; - left: 50%; - transform: translate(-50%, -50%); - } - & table { - font-size: 13px; - & td.value { - word-break: break-all; - } - & td.caption { - white-space: nowrap; - } - & td.select-button { - text-decoration: underline; - cursor: pointer; - } - & td.yellow { - color: yellow; - font-weight: 650; - } - & tr.empty-row { - height: 20px; - } - } - & div.dividing-line { - position: absolute; - width: ~"calc(100% - 38px)"; - left: 19px; - border-top: dashed thin grey; - } -} diff --git a/application/client/src/app/ui/tabs/multiplefiles/template.html b/application/client/src/app/ui/tabs/multiplefiles/template.html deleted file mode 100644 index c53455d1aa..0000000000 --- a/application/client/src/app/ui/tabs/multiplefiles/template.html +++ /dev/null @@ -1,90 +0,0 @@ - -
    -
    -
    - - Multiple files - - - - -
    -
    - - Summary - - - - - - - - - - - - - - - - - - - - - - -
    Files in total:{{state.files.length}}
    Selected files:{{state.selectedCount}}
    All files from:{{state.path}}
    -
    -
    {{type}}{{state.getTypeCount(type)}}Select
    -
    -
    - - Concat overview - -

    No file(s) selected

    -
    -
    -
    -
    - {{state.selectedCount}} / {{state.selectedSize}} -
    -
    -
    - -
    - - Actions - - - - - - -
    -
    -
    diff --git a/application/client/src/app/ui/tabs/observe/action.ts b/application/client/src/app/ui/tabs/observe/action.ts deleted file mode 100644 index a4beea8239..0000000000 --- a/application/client/src/app/ui/tabs/observe/action.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Subject, Subjects } from '@platform/env/subscription'; - -const DEFAULT_CAPTION = 'Run'; -const DEFAULT_STATE = false; - -export class Action { - public subjects: Subjects<{ - updated: Subject; - apply: Subject; - applied: Subject; - }> = new Subjects({ - updated: new Subject(), - apply: new Subject(), - applied: new Subject(), - }); - - public caption: string = DEFAULT_CAPTION; - public disabled: boolean = DEFAULT_STATE; - - public destroy(): void { - this.subjects.destroy(); - } - - public setCaption(caption: string): void { - this.caption = caption; - this.subjects.get().updated.emit(); - } - - public setDisabled(disabled: boolean): void { - if (this.disabled === disabled) { - return; - } - this.disabled = disabled; - this.subjects.get().updated.emit(); - } - - public defaults(): void { - this.caption = DEFAULT_CAPTION; - this.disabled = DEFAULT_STATE; - this.subjects.get().updated.emit(); - } - - public apply(): void { - this.subjects.get().apply.emit(); - } - - public applied(): void { - this.subjects.get().applied.emit(); - } -} diff --git a/application/client/src/app/ui/tabs/observe/component.ts b/application/client/src/app/ui/tabs/observe/component.ts deleted file mode 100644 index 813e864348..0000000000 --- a/application/client/src/app/ui/tabs/observe/component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - Component, - ChangeDetectorRef, - ChangeDetectionStrategy, - Input, - AfterContentInit, - OnDestroy, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State, IApi, IInputs } from './state'; -import { Observe } from '@platform/types/observe'; - -@Component({ - selector: 'app-tabs-observe', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Initial() -@Ilc() -export class TabObserve extends ChangesDetector implements AfterContentInit, OnDestroy { - // This method is used only to highlight inputs of component - static inputs(inputs: IInputs): IInputs { - return inputs; - } - - @Input() observe!: Observe; - @Input() api!: IApi; - - public state!: State; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnDestroy(): void { - this.state.destroy(); - } - - public ngAfterContentInit(): void { - this.state = new State(this, this.observe); - } -} -export interface TabObserve extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/component.ts b/application/client/src/app/ui/tabs/observe/config-schema/component.ts deleted file mode 100644 index e7340e3291..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from './state'; -import { State as ParserState } from '../parsers/general/plugin/state'; - -@Component({ - selector: 'app-tab-config-schemas', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class ConfigSchemas extends ChangesDetector implements AfterContentInit { - @Input() parserState!: ParserState; - - public readonly state: State = new State(); - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.env().subscriber.register( - this.parserState.selected.subscribe(() => { - this.state.reload(this.parserState); - }), - ); - } -} - -export interface ConfigSchemas extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/entry/component.ts b/application/client/src/app/ui/tabs/observe/config-schema/entry/component.ts deleted file mode 100644 index 4719e84c4e..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/entry/component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, ChangeDetectorRef, Input } from '@angular/core'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { PluginConfigSchemaItem } from '@platform/types/bindings/plugins'; -import { State } from '../state'; - -@Component({ - selector: 'app-tabs-config-schema-entry', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -export class ConfgiSchemaEntry extends ChangesDetector { - @Input() public config!: PluginConfigSchemaItem; - @Input() public state!: State; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/entry/styles.less b/application/client/src/app/ui/tabs/observe/config-schema/entry/styles.less deleted file mode 100644 index 3919c9833a..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/entry/styles.less +++ /dev/null @@ -1,6 +0,0 @@ -@import '../../../../styles/variables.less'; - -:host { - position: relative; - display: block; -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/entry/template.html b/application/client/src/app/ui/tabs/observe/config-schema/entry/template.html deleted file mode 100644 index e18cc543e9..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/entry/template.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - diff --git a/application/client/src/app/ui/tabs/observe/config-schema/module.ts b/application/client/src/app/ui/tabs/observe/config-schema/module.ts deleted file mode 100644 index d1e9030a11..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/module.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatCardModule } from '@angular/material/card'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatButtonModule } from '@angular/material/button'; -import { MatSelectModule } from '@angular/material/select'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatIconModule } from '@angular/material/icon'; -import { MatDividerModule } from '@angular/material/divider'; - -import { ConfigSchemas } from './component'; -import { ConfgiSchemaEntry } from './entry/component'; -import { ConfigSchemaBool } from './renders/bool/component'; -import { ConfigSchemaInteger } from './renders/integer/component'; -import { ConfigSchemaFloat } from './renders/float/component'; -import { ConfigSchemaString } from './renders/string/component'; -import { ConfigSchemaDropdown } from './renders/dropdown/component'; -import { ConfigSchemaFiles } from './renders/files/component'; -import { ConfigSchemaDirs } from './renders/dirs/component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatCheckboxModule, - MatCardModule, - MatFormFieldModule, - MatInputModule, - MatButtonModule, - MatSelectModule, - MatChipsModule, - MatIconModule, - MatDividerModule, - ], - declarations: [ - ConfigSchemas, - ConfgiSchemaEntry, - ConfigSchemaBool, - ConfigSchemaInteger, - ConfigSchemaFloat, - ConfigSchemaString, - ConfigSchemaDropdown, - ConfigSchemaFiles, - ConfigSchemaDirs, - ], - exports: [ConfigSchemas], - bootstrap: [ - ConfigSchemas, - ConfgiSchemaEntry, - ConfigSchemaBool, - ConfigSchemaInteger, - ConfigSchemaFloat, - ConfigSchemaString, - ConfigSchemaDropdown, - ConfigSchemaFiles, - ConfigSchemaDirs, - ], -}) -export class ConfigSchmasModule {} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/bool/component.ts b/application/client/src/app/ui/tabs/observe/config-schema/renders/bool/component.ts deleted file mode 100644 index 029545a83f..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/bool/component.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Component, ChangeDetectorRef, Input, SimpleChange, AfterContentInit } from '@angular/core'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { PluginConfigSchemaItem } from '@platform/types/bindings/plugins'; -import { State } from '../../state'; - -@Component({ - selector: 'app-tabs-config-schema-bool', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -export class ConfigSchemaBool extends ChangesDetector implements AfterContentInit { - @Input() public config!: PluginConfigSchemaItem; - @Input() public state!: State; - - public value?: boolean; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngAfterContentInit(): void { - const input_type = this.config.input_type; - this.value = this.state.isBooleanItem(input_type) ? input_type.Boolean : false; - this.state.saveConfig(this.config.id, { Boolean: this.value }); - } - - public ngOnCheckboxChange(event: SimpleChange): void { - const val = event as unknown as boolean; - this.state.saveConfig(this.config.id, { Boolean: val }); - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/bool/styles.less b/application/client/src/app/ui/tabs/observe/config-schema/renders/bool/styles.less deleted file mode 100644 index 3abbabe199..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/bool/styles.less +++ /dev/null @@ -1 +0,0 @@ -@import '../../../../../styles/variables.less'; diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/bool/template.html b/application/client/src/app/ui/tabs/observe/config-schema/renders/bool/template.html deleted file mode 100644 index 432b9b22a3..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/bool/template.html +++ /dev/null @@ -1,9 +0,0 @@ - - {{config.title}} - -

    {{config.description}}

    diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/dirs/component.ts b/application/client/src/app/ui/tabs/observe/config-schema/renders/dirs/component.ts deleted file mode 100644 index c50d7e7ae6..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/dirs/component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { PluginConfigSchemaItem } from '@platform/types/bindings'; -import { State } from '../../state'; -import { bridge } from '@service/bridge'; - -@Component({ - selector: 'app-tabs-config-schema-dirs', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -export class ConfigSchemaDirs extends ChangesDetector implements AfterContentInit { - @Input() public config!: PluginConfigSchemaItem; - @Input() public state!: State; - - public paths: string[] = []; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnAddButtonkclick(): void { - bridge - .folders() - .select() - .then((dirs: string[]) => { - dirs = dirs.filter((added) => { - return this.paths.find((exist) => exist === added) === undefined; - }); - this.paths = this.paths.concat(dirs); - }) - .catch((err: Error) => { - console.error(`Error while opening folders: ${err.message}`); - }) - .finally(() => { - this.update(); - this.detectChanges(); - }); - } - - ngAfterContentInit(): void { - this.update(); - } - - public ngOnRemovePath(dir: string): void { - this.paths = this.paths.filter((f) => f !== dir); - this.update(); - this.detectChanges(); - } - - update(): void { - this.state.saveConfig(this.config.id, { Directories: this.paths }); - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/dirs/styles.less b/application/client/src/app/ui/tabs/observe/config-schema/renders/dirs/styles.less deleted file mode 100644 index 2d749f42f6..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/dirs/styles.less +++ /dev/null @@ -1,27 +0,0 @@ -@import '../../../../../styles/variables.less'; -:host { - & mat-form-field { - display: block; - } - & div.controlls { - text-align: right; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } - & .chip-listbox { - display: flex; - flex-wrap: wrap; - gap: 8px; - } - & .chip-path { - max-width: 220px; /* Set a fixed width */ - overflow: hidden; /* Hide overflowing content */ - white-space: nowrap; /* Prevent text wrapping */ - direction: rtl; /* Align text to the right */ - text-overflow: ellipsis; /* Show ellipsis at the start */ - text-align: left; /* Ensure the visible part of the text is left-aligned */ - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/dirs/template.html b/application/client/src/app/ui/tabs/observe/config-schema/renders/dirs/template.html deleted file mode 100644 index 813e81934c..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/dirs/template.html +++ /dev/null @@ -1,23 +0,0 @@ -

    {{config.title}}

    -
    - - -

    {{ path }}

    - -
    -
    -
    - -
    - -
    -

    {{config.description}}

    diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/dropdown/component.ts b/application/client/src/app/ui/tabs/observe/config-schema/renders/dropdown/component.ts deleted file mode 100644 index 82f444c341..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/dropdown/component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - AfterContentInit, - SimpleChanges, -} from '@angular/core'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { PluginConfigSchemaItem } from '@platform/types/bindings'; -import { State } from '../../state'; - -@Component({ - selector: 'app-tabs-config-schema-dropdown', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -export class ConfigSchemaDropdown extends ChangesDetector implements AfterContentInit { - @Input() public config!: PluginConfigSchemaItem; - @Input() public state!: State; - - public selectedOption?: string; - public allOptions?: string[]; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngAfterContentInit(): void { - const input_type = this.config.input_type; - if (this.state.isDropdownItem(input_type)) { - this.allOptions = input_type.Dropdown[0]; - this.selectedOption = input_type.Dropdown[1]; - - this.state.saveConfig(this.config.id, { - Dropdown: this.selectedOption, - }); - } - } - - public ngOnSelectionChange(event: SimpleChanges): void { - const opt = event as unknown as string; - this.state.saveConfig(this.config.id, { - Dropdown: opt, - }); - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/dropdown/styles.less b/application/client/src/app/ui/tabs/observe/config-schema/renders/dropdown/styles.less deleted file mode 100644 index a77a7220b1..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/dropdown/styles.less +++ /dev/null @@ -1,7 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - & mat-form-field { - display: block; - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/dropdown/template.html b/application/client/src/app/ui/tabs/observe/config-schema/renders/dropdown/template.html deleted file mode 100644 index 2f43bba2b7..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/dropdown/template.html +++ /dev/null @@ -1,7 +0,0 @@ - - {{config.title}} - - {{option}} - - {{config.description}} - diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/files/component.ts b/application/client/src/app/ui/tabs/observe/config-schema/renders/files/component.ts deleted file mode 100644 index f1a5abb640..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/files/component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { PluginConfigSchemaItem } from '@platform/types/bindings'; -import { State } from '../../state'; -import { File } from '@platform/types/files'; -import { bridge } from '@service/bridge'; - -@Component({ - selector: 'app-tabs-config-schema-files', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -export class ConfigSchemaFiles extends ChangesDetector implements AfterContentInit { - @Input() public config!: PluginConfigSchemaItem; - @Input() public state!: State; - - public paths: File[] = []; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnAddButtonkclick(): void { - const inputType = this.config.input_type; - const exts = - typeof inputType === 'object' && 'Files' in inputType && inputType.Files.length > 0 - ? inputType.Files.join(',') - : '*'; - bridge - .files() - .select.custom(exts) - .then((files: File[]) => { - files = files.filter((added) => { - return ( - this.paths.find((exist) => exist.filename === added.filename) === undefined - ); - }); - this.paths = this.paths.concat(files); - }) - - .catch((err: Error) => { - console.error(`Error while opening folders: ${err.message}`); - }) - .finally(() => { - this.update(); - this.detectChanges(); - }); - } - - ngAfterContentInit(): void { - this.update(); - } - - public ngOnRemovePath(file: File): void { - this.paths = this.paths.filter((f) => f.filename !== file.filename); - this.update(); - this.detectChanges(); - } - - update(): void { - const files = this.paths.map((p) => p.filename); - this.state.saveConfig(this.config.id, { Files: files }); - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/files/styles.less b/application/client/src/app/ui/tabs/observe/config-schema/renders/files/styles.less deleted file mode 100644 index 39952dc702..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/files/styles.less +++ /dev/null @@ -1,14 +0,0 @@ -@import '../../../../../styles/variables.less'; -:host { - & mat-form-field { - display: block; - } - & div.controlls { - text-align: right; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/files/template.html b/application/client/src/app/ui/tabs/observe/config-schema/renders/files/template.html deleted file mode 100644 index 92dc2a7fb7..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/files/template.html +++ /dev/null @@ -1,19 +0,0 @@ -

    {{config.title}}

    -
    - - - {{path.name}} - - - -
    - -
    - -
    -

    {{config.description}}

    diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/float/component.ts b/application/client/src/app/ui/tabs/observe/config-schema/renders/float/component.ts deleted file mode 100644 index 262c53b3a1..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/float/component.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - AfterContentInit, - OnChanges, - SimpleChanges, -} from '@angular/core'; - -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { PluginConfigSchemaItem } from '@platform/types/bindings'; -import { State } from '../../state'; - -@Component({ - selector: 'app-tabs-config-schema-float', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -export class ConfigSchemaFloat extends ChangesDetector implements AfterContentInit, OnChanges { - @Input() public config!: PluginConfigSchemaItem; - @Input() public state!: State; - - public value?: number; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes['value']) { - this.state.saveConfig(this.config.id, { - Float: parseFloat(changes['value'].currentValue), - }); - } - } - - ngAfterContentInit(): void { - const input_type = this.config.input_type; - - this.value = this.state.isFloatItem(input_type) ? input_type.Float : 0.0; - this.state.saveConfig(this.config.id, { - Float: this.value, - }); - } - - ngOnInputChange(event: Event): void { - const target = event.target as HTMLInputElement; - if (target) { - this.state.saveConfig(this.config.id, { Float: parseFloat(target.value) }); - } - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/float/styles.less b/application/client/src/app/ui/tabs/observe/config-schema/renders/float/styles.less deleted file mode 100644 index 873d484f6b..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/float/styles.less +++ /dev/null @@ -1,12 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - & mat-form-field { - display: block; - } - & input::-webkit-outer-spin-button, - & input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/float/template.html b/application/client/src/app/ui/tabs/observe/config-schema/renders/float/template.html deleted file mode 100644 index 6b510c4ac6..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/float/template.html +++ /dev/null @@ -1,11 +0,0 @@ - - {{config.title}} - - {{config.description}} - diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/integer/component.ts b/application/client/src/app/ui/tabs/observe/config-schema/renders/integer/component.ts deleted file mode 100644 index 6b1180a1f5..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/integer/component.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - AfterContentInit, - OnChanges, - SimpleChanges, -} from '@angular/core'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { PluginConfigSchemaItem } from '@platform/types/bindings'; -import { State } from '../../state'; - -@Component({ - selector: 'app-tabs-config-schema-integer', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -export class ConfigSchemaInteger extends ChangesDetector implements AfterContentInit, OnChanges { - @Input() public config!: PluginConfigSchemaItem; - @Input() public state!: State; - - public value?: number; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes['value']) { - this.state.saveConfig(this.config.id, { - Integer: parseInt(changes['value'].currentValue, 10), - }); - } - } - - ngAfterContentInit(): void { - const input_type = this.config.input_type; - this.value = this.state.isIntegerItem(input_type) ? input_type.Integer : 0; - this.state.saveConfig(this.config.id, { Integer: this.value }); - } - - public ngOnInputChange(event: Event): void { - const target = event.target as HTMLInputElement; - if (target) { - this.state.saveConfig(this.config.id, { Integer: parseInt(target.value, 10) }); - } - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/integer/styles.less b/application/client/src/app/ui/tabs/observe/config-schema/renders/integer/styles.less deleted file mode 100644 index 873d484f6b..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/integer/styles.less +++ /dev/null @@ -1,12 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - & mat-form-field { - display: block; - } - & input::-webkit-outer-spin-button, - & input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/integer/template.html b/application/client/src/app/ui/tabs/observe/config-schema/renders/integer/template.html deleted file mode 100644 index 6b510c4ac6..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/integer/template.html +++ /dev/null @@ -1,11 +0,0 @@ - - {{config.title}} - - {{config.description}} - diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/string/component.ts b/application/client/src/app/ui/tabs/observe/config-schema/renders/string/component.ts deleted file mode 100644 index 321e1a88dc..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/string/component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - AfterContentInit, - OnChanges, - SimpleChanges, -} from '@angular/core'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { PluginConfigSchemaItem } from '@platform/types/bindings/plugins'; -import { State } from '../../state'; - -@Component({ - selector: 'app-tabs-config-schema-string', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -export class ConfigSchemaString extends ChangesDetector implements AfterContentInit, OnChanges { - @Input() public config!: PluginConfigSchemaItem; - @Input() public state!: State; - - public value?: string; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes['value']) { - this.state.saveConfig(this.config.id, { - Text: changes['value'].currentValue, - }); - } - } - - ngAfterContentInit(): void { - const input_type = this.config.input_type; - this.value = this.state.isTextItem(input_type) ? input_type.Text : ''; - this.state.saveConfig(this.config.id, { Text: this.value }); - } - - public ngOnInputChange(event: Event): void { - const target = event.target as HTMLInputElement; - this.state.saveConfig(this.config.id, { Text: target?.value ?? '' }); - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/string/styles.less b/application/client/src/app/ui/tabs/observe/config-schema/renders/string/styles.less deleted file mode 100644 index a77a7220b1..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/string/styles.less +++ /dev/null @@ -1,7 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - & mat-form-field { - display: block; - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/renders/string/template.html b/application/client/src/app/ui/tabs/observe/config-schema/renders/string/template.html deleted file mode 100644 index 01ce426b67..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/renders/string/template.html +++ /dev/null @@ -1,10 +0,0 @@ - - {{config.title}} - - {{config.description}} - diff --git a/application/client/src/app/ui/tabs/observe/config-schema/state.ts b/application/client/src/app/ui/tabs/observe/config-schema/state.ts deleted file mode 100644 index 7a1af2d44a..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/state.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { - PluginConfigSchemaItem, - PluginConfigSchemaType, - PluginConfigValue, -} from '@platform/types/bindings/plugins'; - -import { State as ParserState } from '../parsers/general/plugin/state'; - -export class State { - private _parserState?: ParserState; - - public schemas: PluginConfigSchemaItem[] = []; - - public reload(parent: ParserState) { - this.schemas = parent.selectedParser?.info.config_schemas ?? []; - this._parserState = parent; - } - - public saveConfig(id: string, value: PluginConfigValue) { - this._parserState?.saveConfig(id, value); - } - - public isBooleanItem(schema: PluginConfigSchemaType): schema is { Boolean: boolean } { - return typeof schema === 'object' && 'Boolean' in schema; - } - - public isIntegerItem(schema: PluginConfigSchemaType): schema is { Integer: number } { - return typeof schema === 'object' && 'Integer' in schema; - } - - public isFloatItem(schema: PluginConfigSchemaType): schema is { Float: number } { - return typeof schema === 'object' && 'Float' in schema; - } - - public isTextItem(schema: PluginConfigSchemaType): schema is { Text: string } { - return typeof schema === 'object' && 'Text' in schema; - } - - public isDirectoriesItem(schema: PluginConfigSchemaType): schema is 'Directories' { - return schema === 'Directories'; - } - - public isDropdownItem( - schema: PluginConfigSchemaType, - ): schema is { Dropdown: [Array, string] } { - return typeof schema === 'object' && 'Dropdown' in schema; - } - - public isFilesPicker(schema: PluginConfigSchemaType): schema is { Files: Array } { - return typeof schema === 'object' && 'Files' in schema; - } -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/styles.less b/application/client/src/app/ui/tabs/observe/config-schema/styles.less deleted file mode 100644 index b372fafb5e..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/styles.less +++ /dev/null @@ -1,10 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - display: block; -} - -.itemspadding { - padding-bottom: 20px; -} diff --git a/application/client/src/app/ui/tabs/observe/config-schema/template.html b/application/client/src/app/ui/tabs/observe/config-schema/template.html deleted file mode 100644 index 8438e44a78..0000000000 --- a/application/client/src/app/ui/tabs/observe/config-schema/template.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/application/client/src/app/ui/tabs/observe/error/component.ts b/application/client/src/app/ui/tabs/observe/error/component.ts deleted file mode 100644 index 529738611c..0000000000 --- a/application/client/src/app/ui/tabs/observe/error/component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Observe } from '@platform/types/observe'; - -@Component({ - selector: 'app-tabs-observe-error-state', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class TabObserveErrorState extends ChangesDetector implements AfterContentInit { - @Input() observe!: Observe; - - public error: string | undefined; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.env().subscriber.register( - this.observe.subscribe(() => { - const error = this.observe.validate(); - this.error = error instanceof Error ? error.message : undefined; - this.detectChanges(); - }), - ); - } -} -export interface TabObserveErrorState extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/error/module.ts b/application/client/src/app/ui/tabs/observe/error/module.ts deleted file mode 100644 index 55fc1bf05e..0000000000 --- a/application/client/src/app/ui/tabs/observe/error/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatCardModule } from '@angular/material/card'; - -import { TabObserveErrorState } from './component'; - -@NgModule({ - imports: [CommonModule, MatCardModule], - declarations: [TabObserveErrorState], - exports: [TabObserveErrorState], - bootstrap: [TabObserveErrorState], -}) -export class ErrorStateModule {} diff --git a/application/client/src/app/ui/tabs/observe/error/styles.less b/application/client/src/app/ui/tabs/observe/error/styles.less deleted file mode 100644 index f3d8b743a2..0000000000 --- a/application/client/src/app/ui/tabs/observe/error/styles.less +++ /dev/null @@ -1,14 +0,0 @@ -@import '../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - top: 0; - left: 0; - width: 100%; - overflow: hidden; - & p.error { - color: var(--scheme-color-error-light); - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/error/template.html b/application/client/src/app/ui/tabs/observe/error/template.html deleted file mode 100644 index defc7f64f1..0000000000 --- a/application/client/src/app/ui/tabs/observe/error/template.html +++ /dev/null @@ -1,6 +0,0 @@ - - Error(s) - -

    {{error}}

    -
    -
    \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/module.ts b/application/client/src/app/ui/tabs/observe/module.ts deleted file mode 100644 index cf01954940..0000000000 --- a/application/client/src/app/ui/tabs/observe/module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; - -import { FileModule } from './origin/file/module'; -import { ConcatModule } from './origin/concat/module'; -import { StreamModule } from './origin/stream/module'; - -import { TabObserve } from './component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatFormFieldModule, - MatSelectModule, - FileModule, - ConcatModule, - StreamModule, - ], - declarations: [TabObserve], - exports: [TabObserve], - bootstrap: [TabObserve], -}) -export class ObserveModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/concat/component.ts b/application/client/src/app/ui/tabs/observe/origin/concat/component.ts deleted file mode 100644 index 0b9946a465..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/concat/component.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterViewInit, - Input, - AfterContentInit, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from '../../state'; -import { State as ParserState } from '@ui/tabs/observe/parsers/state'; - -import * as Origins from '@platform/types/observe/origin/index'; -import * as Parsers from '@platform/types/observe/parser/index'; -@Component({ - selector: 'app-tabs-observe-concat', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class TabObserveConcat extends ChangesDetector implements AfterViewInit, AfterContentInit { - @Input() state!: State; - - public parser!: ParserState; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - const origin = this.state.observe.origin.as( - Origins.Concat.Configuration, - ); - if (origin === undefined) { - throw new Error(`Current origin isn't a stream`); - } - this.parser = new ParserState(this.state.observe); - this.env().subscriber.register( - this.state.updates.get().parser.subscribe(() => { - const parser = this.state.getParser().embedded(); - if (parser === undefined) { - return; - } - this.state.observe.parser.overwrite({ - [parser]: Parsers.getByAlias(parser).configuration, - }); - }), - ); - } - - public ngAfterViewInit(): void { - // - } -} -export interface TabObserveConcat extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/concat/module.ts b/application/client/src/app/ui/tabs/observe/origin/concat/module.ts deleted file mode 100644 index c8521eed1d..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/concat/module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatCardModule } from '@angular/material/card'; -import { ParserGeneralConfigurationModule } from '@ui/tabs/observe/parsers/general/module'; -import { ParserExtraConfigurationModule } from '@ui/tabs/observe/parsers/extra/module'; - -import { TabObserveConcat } from './component'; - -@NgModule({ - imports: [ - CommonModule, - MatCardModule, - ParserGeneralConfigurationModule, - ParserExtraConfigurationModule, - ], - declarations: [TabObserveConcat], - exports: [TabObserveConcat], - bootstrap: [TabObserveConcat], -}) -export class ConcatModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/concat/styles.less b/application/client/src/app/ui/tabs/observe/origin/concat/styles.less deleted file mode 100644 index 7066106ca8..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/concat/styles.less +++ /dev/null @@ -1,37 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - & div.title { - position: absolute; - display: flex; - flex-direction: row; - align-items: center; - left:0; - right: 0; - padding: 0 8px; - background: var(--scheme-color-5); - box-shadow: 0 3px 3px rgba(0,0,0,0.4); - height: 32px; - overflow: hidden; - & > * { - margin: 0 8px; - } - span.filler { - flex:auto; - width: 100%; - margin: 0; - } - p.info { - color: var(--scheme-color-1); - white-space: nowrap; - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/origin/concat/template.html b/application/client/src/app/ui/tabs/observe/origin/concat/template.html deleted file mode 100644 index 19eafb4b94..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/concat/template.html +++ /dev/null @@ -1,6 +0,0 @@ -
    - -
    -
    - -
    diff --git a/application/client/src/app/ui/tabs/observe/origin/file/component.ts b/application/client/src/app/ui/tabs/observe/origin/file/component.ts deleted file mode 100644 index 970234317c..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/file/component.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterViewInit, - Input, - AfterContentInit, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from '../../state'; -import { State as ParserState } from '@ui/tabs/observe/parsers/state'; - -import * as Origins from '@platform/types/observe/origin/index'; -import * as Parsers from '@platform/types/observe/parser/index'; -@Component({ - selector: 'app-tabs-observe-file', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class TabObserveFile extends ChangesDetector implements AfterViewInit, AfterContentInit { - @Input() state!: State; - - public parser!: ParserState; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - const origin = this.state.observe.origin.as( - Origins.File.Configuration, - ); - if (origin === undefined) { - throw new Error(`Current origin isn't a stream`); - } - this.parser = new ParserState(this.state.observe); - this.env().subscriber.register( - this.state.updates.get().parser.subscribe(() => { - const parser = this.state.getParser().embedded(); - if (parser === undefined) { - return; - } - this.state.observe.parser.overwrite({ - [parser]: Parsers.getByAlias(parser).configuration, - }); - }), - ); - } - - public ngAfterViewInit(): void { - // - } -} -export interface TabObserveFile extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/file/module.ts b/application/client/src/app/ui/tabs/observe/origin/file/module.ts deleted file mode 100644 index 12d44af104..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/file/module.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatCardModule } from '@angular/material/card'; -import { ParserGeneralConfigurationModule } from '@ui/tabs/observe/parsers/general/module'; -import { ParserExtraConfigurationModule } from '@ui/tabs/observe/parsers/extra/module'; - -import { TabObserveFile } from './component'; - -@NgModule({ - imports: [ - CommonModule, - MatCardModule, - ParserGeneralConfigurationModule, - ParserExtraConfigurationModule, - ], - declarations: [TabObserveFile], - exports: [TabObserveFile], - bootstrap: [TabObserveFile], -}) -export class FileModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/file/styles.less b/application/client/src/app/ui/tabs/observe/origin/file/styles.less deleted file mode 100644 index a4b66d866b..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/file/styles.less +++ /dev/null @@ -1,12 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/origin/file/template.html b/application/client/src/app/ui/tabs/observe/origin/file/template.html deleted file mode 100644 index 19eafb4b94..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/file/template.html +++ /dev/null @@ -1,6 +0,0 @@ -
    - -
    -
    - -
    diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/component.ts deleted file mode 100644 index 40a8d6c5b3..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/component.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from '../../state'; -import { State as StreamState } from './transport/setup/state'; -import { State as ParserState } from '@ui/tabs/observe/parsers/state'; - -import * as Streams from '@platform/types/observe/origin/stream/index'; -import * as Origins from '@platform/types/observe/origin/index'; -import * as Parsers from '@platform/types/observe/parser/index'; - -@Component({ - selector: 'app-tabs-observe-stream', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class TabObserveStream extends ChangesDetector implements AfterContentInit { - @Input() state!: State; - - public stream!: StreamState; - public parser!: ParserState; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - const origin = this.state.observe.origin.as( - Origins.Stream.Configuration, - ); - if (origin === undefined) { - throw new Error(`Current origin isn't a stream`); - } - this.stream = new StreamState(this.state.action, origin.instance); - this.parser = new ParserState(this.state.observe); - this.env().subscriber.register( - this.state.updates.get().stream.subscribe(() => { - const stream = this.state.stream; - if (stream === undefined) { - return; - } - this.stream.from({ [stream]: Streams.getByAlias(stream).configuration }); - }), - this.state.updates.get().parser.subscribe(() => { - const parser = this.state.getParser().embedded(); - if (parser === undefined) { - return; - } - this.state.observe.parser.overwrite({ - [parser]: Parsers.getByAlias(parser).configuration, - }); - }), - ); - } -} -export interface TabObserveStream extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/module.ts deleted file mode 100644 index cf58383024..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatCardModule } from '@angular/material/card'; - -import { TabObserveStream } from './component'; -import { StreamsModule } from './transport/setup/module'; -import { ParserGeneralConfigurationModule } from '@ui/tabs/observe/parsers/general/module'; -import { RecentActionsModule } from '@elements/recent/module'; - -@NgModule({ - imports: [ - CommonModule, - MatCardModule, - StreamsModule, - ParserGeneralConfigurationModule, - RecentActionsModule, - ], - declarations: [TabObserveStream], - exports: [TabObserveStream], - bootstrap: [TabObserveStream], -}) -export class StreamModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/styles.less b/application/client/src/app/ui/tabs/observe/origin/stream/styles.less deleted file mode 100644 index a4b66d866b..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/styles.less +++ /dev/null @@ -1,12 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/template.html b/application/client/src/app/ui/tabs/observe/origin/stream/template.html deleted file mode 100644 index 12f9c26228..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/template.html +++ /dev/null @@ -1,17 +0,0 @@ -
    - - Connection - - - - - - Recent - - - - -
    -
    - -
    diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/component.ts deleted file mode 100644 index 676a432b2f..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/component.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit, HostListener } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Session } from '@service/session/session'; -import { IMenuItem, contextmenu } from '@ui/service/contextmenu'; -import { ObserveOperation } from '@service/session/dependencies/observing/operation'; -import { stop } from '@ui/env/dom'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-transport-review', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Transport extends ChangesDetector implements AfterContentInit { - @Input() public observe!: $.Observe; - @Input() public observer!: ObserveOperation | undefined; - @Input() public session!: Session; - @Input() public finished!: boolean; - - @HostListener('contextmenu', ['$event']) onContextMenu(event: MouseEvent) { - const items: IMenuItem[] = []; - const observer = this.observer; - if (this.observe.origin.files() !== undefined) { - if (this.observe.parser.instance instanceof $.Parser.Text.Configuration) { - // Text file can be opened just once per session - return; - } - } - const stream = this.observe.origin.as<$.Origin.Stream.Configuration>( - $.Origin.Stream.Configuration, - ); - if (observer !== undefined) { - items.push( - ...[ - { - caption: 'Stop', - handler: () => { - observer - .abort() - .catch((err: Error) => { - this.log().error( - `Fail to stop observe operation: ${err.message}`, - ); - }) - .finally(() => { - this.detectChanges(); - }); - }, - }, - { - caption: 'Restart', - handler: () => { - observer - .restart() - .catch((err: Error) => { - this.log().error( - `Fail to restart observe operation: ${err.message}`, - ); - }) - .finally(() => { - this.detectChanges(); - }); - }, - }, - ], - ); - } else if (observer === undefined) { - stream !== undefined && - items.push( - ...[ - { - caption: 'Restart', - handler: () => { - this.ilc() - .services.system.session.initialize() - .observe(this.observe, this.session) - .catch((err: Error) => { - this.log().error( - `Fail to restart observe operation: ${err.message}`, - ); - }) - .finally(() => { - this.detectChanges(); - }); - }, - }, - ], - ); - } - stream !== undefined && - items.push( - ...[ - {}, - { - caption: 'Parameters', - handler: () => { - this.ilc() - .services.system.session.initialize() - .configure(this.observe, this.session); - }, - }, - ], - ); - contextmenu.show({ - items: items, - x: event.pageX, - y: event.pageY, - }); - stop(event); - } - public description!: $.IOriginDetails | undefined; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - const description = this.observe.origin.desc(); - if (description instanceof Error) { - this.log().error(`Invalid description: ${description.message}`); - return; - } - this.description = description; - } -} -export interface Transport extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/module.ts deleted file mode 100644 index f5de015b8b..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatIconModule } from '@angular/material/icon'; - -import { Transport } from './component'; - -@NgModule({ - imports: [CommonModule, MatIconModule], - declarations: [Transport], - exports: [Transport] -}) -export class TransportReviewModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/styles.less b/application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/styles.less deleted file mode 100644 index 29299fddc9..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/styles.less +++ /dev/null @@ -1,57 +0,0 @@ -@import '../../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - padding: 12px 12px; - flex-direction: row; - & div.icon { - color: var(--scheme-color-2); - padding-right: 12px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - justify-items: center; - & mat-icon { - display: block; - font-size: 18px; - width: 18px; - height: 18px; - } - & span { - display: block; - } - &.running { - & mat-icon { - color: var(--scheme-color-0); - } - } - & span.type { - font-size: 11px; - } - & span.state { - font-size: 12px; - &.running { - color: var(--scheme-color-accent); - } - &.stopped { - color: var(--scheme-color-2); - } - } - } - & div.info { - position: relative; - overflow: hidden; - & p.major { - margin-bottom: 2px; - } - & p { - overflow: hidden; - text-overflow: ellipsis; - direction: rtl; - white-space: nowrap; - text-align: left; - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/template.html b/application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/template.html deleted file mode 100644 index 54d84787ff..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/listed/template.html +++ /dev/null @@ -1,10 +0,0 @@ -
    - {{description.icon}} - {{description.type}} - {{description.state.running}} - {{description.state.stopped}} -
    -
    -

    {{description.major}}

    -

    {{description.minor}}

    -
    diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/process/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/process/component.ts deleted file mode 100644 index d14950e302..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/process/component.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterContentInit, - AfterViewInit, - Input, - ViewChild, - OnDestroy, -} from '@angular/core'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { FolderInput, Options as FoldersOptions } from '@elements/folderinput/component'; -import { - AutocompleteInput, - Options as AutocompleteOptions, -} from '@elements/autocomplete/component'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { State } from '../../states/process'; -import { components } from '@env/decorators/initial'; -import { ShellProfile, ShellType } from '@platform/types/bindings'; -import { Action } from '@ui/tabs/observe/action'; -import { Session } from '@service/session'; - -import * as Stream from '@platform/types/observe/origin/stream/index'; - -@Component({ - selector: 'app-process-setup-base', - template: '', - standalone: false, -}) -@Ilc() -export class SetupBase - extends ChangesDetector - implements AfterContentInit, AfterViewInit, OnDestroy -{ - @Input() public configuration!: Stream.Process.Configuration; - @Input() public action!: Action; - @Input() public session: Session | undefined; - - public state!: State; - - @ViewChild('cwd') public cwdInputRef!: FolderInput; - @ViewChild('cmd') public cmdInputRef!: AutocompleteInput; - - private _inputs!: { - cmd: AutocompleteOptions; - cwd: FoldersOptions; - }; - - protected setup(): void { - this.cmdInputRef !== undefined && - this.cmdInputRef.set(this.state.configuration.configuration.command); - this.cwdInputRef !== undefined && - this.cwdInputRef.set(this.state.configuration.configuration.cwd); - this.action.setDisabled(this.configuration.validate() instanceof Error); - if (this.state.configuration.configuration.cwd.trim() !== '') { - return; - } - this.ilc() - .services.system.bridge.env() - .get() - .then((envs) => { - this.state.envs = Stream.Process.Configuration.sterilizeEnvVars(envs); - }) - .catch((err: Error) => { - this.log().error(`Fail to get envvars path: ${err.message}`); - }) - .finally(() => { - this.detectChanges(); - }); - this.ilc() - .services.system.bridge.cwd() - .get(undefined) - .then((cwd) => { - this.cwdInputRef.set(cwd); - this.configuration.configuration.cwd = cwd; - }) - .catch((err: Error) => { - this.log().error(`Fail to get cwd path: ${err.message}`); - }) - .finally(() => { - this.detectChanges(); - }); - } - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public setInputs(inputs: { cmd: AutocompleteOptions; cwd: FoldersOptions }): void { - this._inputs = inputs; - } - - public ngOnDestroy(): void { - this.state.destroy(); - } - - public ngAfterContentInit(): void { - this.state = new State(this.action, this.configuration); - this._inputs.cmd.defaults = this.state.configuration.configuration.command; - this._inputs.cwd.defaults = this.state.configuration.configuration.cwd; - this.ilc() - .services.system.bridge.env() - .get() - .then((envs) => { - this.state.envs = Stream.Process.Configuration.sterilizeEnvVars(envs); - }) - .catch((err: Error) => { - this.log().error(`Fail to get envvars path: ${err.message}`); - }) - .finally(() => { - this.detectChanges(); - }); - this.ilc() - .services.system.bridge.os() - .shells() - .then((profiles) => { - this.state - .setProfiles(profiles) - .catch((err: Error) => { - this.log().error(`Fail to set profiles: ${err.message}`); - }) - .finally(() => { - this.detectChanges(); - }); - }) - .catch((err: Error) => { - this.log().warn(`Fail to get a list of shell's profiles: ${err.message}`); - this.state - .setProfiles([]) - .catch((err: Error) => { - this.log().error(`Fail to set profiles: ${err.message}`); - }) - .finally(() => { - this.detectChanges(); - }); - }) - .finally(() => { - this.detectChanges(); - }); - this.env().subscriber.register( - this.configuration.subscribe(() => { - this.action.setDisabled(this.configuration.validate() instanceof Error); - this.detectChanges(); - }), - this.action.subjects.get().applied.subscribe(() => { - this._inputs.cmd.recent.emit(this.state.configuration.configuration.command); - this.state.configuration.configuration.cwd.trim() !== '' && - this.ilc() - .services.system.bridge.cwd() - .set(undefined, this.state.configuration.configuration.cwd) - .catch((err: Error) => { - this.log().error(`Fail to set cwd path: ${err.message}`); - }); - }), - ); - this.action.setDisabled(this.configuration.validate() instanceof Error); - } - - public ngAfterViewInit(): void { - this.setup(); - } - - public edit(target: 'cmd' | 'cwd', value: string): void { - if (target === 'cmd') { - this.state.configuration.configuration.command = value; - } else { - this.state.configuration.configuration.cwd = value; - } - } - - public enter(target: 'cmd' | 'cwd'): void { - if (this.cwdInputRef.error.is() || this.cmdInputRef.error.is()) { - return; - } - if (target === 'cmd' && this.configuration.validate() === undefined) { - this.action.apply(); - this.cmdInputRef.control.drop(); - } - this.markChangesForCheck(); - } - - public panel(): void { - this.markChangesForCheck(); - } - - public showEnvVars() { - this.ilc().services.ui.popup.open({ - component: { - factory: components.get('app-elements-pairs'), - inputs: { - map: this.state.getSelectedEnvs(), - }, - }, - closeOnKey: 'Escape', - uuid: 'app-elements-pairs', - }); - } - - public setCurrentProfile(profile: ShellProfile | undefined) { - this.state.setCurrentProfile(profile); - this.detectChanges(); - } - - public getShellName(shell: ShellType): string { - switch (shell) { - case 'Bash': - return 'Bash'; - case 'Zsh': - return 'Zsh'; - case 'Fish': - return 'Fish'; - case 'NuShell': - return 'Nushell'; - case 'Elvish': - return 'Elvish'; - case 'Pwsh': - return 'PowerShell'; - default: { - // This static check ensures all cases are handled. - // If you add to ShellType, TypeScript will error here. - const _exhaustiveCheck: never = shell; - return _exhaustiveCheck; - } - } - } -} -export interface SetupBase extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/process/error.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/process/error.ts deleted file mode 100644 index b3c490f9c3..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/process/error.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { ErrorState } from '@elements/autocomplete/error'; -import { Subject } from '@platform/env/subscription'; - -export class CmdErrorState extends ErrorState { - protected updated: Subject = new Subject(); - protected error: string | undefined; - - public validate(): void { - const matches = this.value.match(/"/gi); - if (matches === null || matches.length === 0) { - this.error = undefined; - } else if (matches.length % 2 !== 0) { - this.error = `Not closed string: no closing "`; - } else { - this.error = undefined; - } - } - - public is(): boolean { - return this.error !== undefined; - } - - public msg(): string { - return this.error === undefined ? '' : this.error; - } - - public observer(): Subject { - return this.updated; - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/serial/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/serial/component.ts deleted file mode 100644 index 237401751d..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/serial/component.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - OnDestroy, - AfterContentInit, - ViewChild, -} from '@angular/core'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from '../../states/serial'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Action } from '@ui/tabs/observe/action'; -import { Session } from '@service/session'; -import { - AutocompleteInput, - Options as AutocompleteOptions, -} from '@elements/autocomplete/component'; -import { Subject } from '@platform/env/subscription'; -import { PathErrorState } from './error'; - -import * as Stream from '@platform/types/observe/origin/stream/index'; - -@Component({ - selector: 'app-serial-setup-base', - template: '', - standalone: false, -}) -@Ilc() -export class SetupBase extends ChangesDetector implements AfterContentInit, OnDestroy { - @Input() public configuration!: Stream.Serial.Configuration; - @Input() public action!: Action; - @Input() public session: Session | undefined; - @ViewChild('path') public pathInputRef!: AutocompleteInput; - - public state!: State; - public pathInputOptions: AutocompleteOptions = { - name: 'SerialPortPathRecentList', - storage: 'serialport_paths_recent', - defaults: '', - placeholder: 'Enter path to serial port', - label: 'Serial port path', - recent: new Subject(), - error: new PathErrorState(), - }; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.state = new State(this.action, this.configuration); - this.env().subscriber.register( - this.state.changed.subscribe(() => { - this.detectChanges(); - }), - ); - this.env().subscriber.register( - this.configuration.subscribe(() => { - this.action.setDisabled(this.configuration.validate() instanceof Error); - this.detectChanges(); - }), - this.action.subjects.get().applied.subscribe(() => { - this.action.setDisabled(this.configuration.validate() instanceof Error); - this.detectChanges(); - }), - ); - this.action.setDisabled(this.configuration.validate() instanceof Error); - this.state.scan().start(); - } - - public ngOnDestroy() { - this.state.scan().stop(); - this.state.destroy(); - } - - public selectDetectedPort(port: string): void { - this.state.configuration.configuration.path = port; - this.pathInputRef.set(port).focus(); - } - - public onPathChange(value: string): void { - this.state.configuration.configuration.path = value; - } - - public onPathEnter(): void { - if (this.pathInputRef.error.is() || this.state.configuration.validate() !== undefined) { - return; - } - this.action.apply(); - this.markChangesForCheck(); - } - - public panel(): void { - this.markChangesForCheck(); - } -} -export interface SetupBase extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/serial/error.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/serial/error.ts deleted file mode 100644 index 1921cae447..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/serial/error.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Subject } from '@platform/env/subscription'; -import { ErrorState } from '@elements/autocomplete/error'; - -export class PathErrorState extends ErrorState { - protected updated: Subject = new Subject(); - protected error: string | undefined; - - public validate(): void { - if (this.value.trim().length === 0) { - this.error = 'No path' - } else { - this.error = undefined; - } - } - - public is(): boolean { - return this.error !== undefined; - } - - public msg(): string { - return this.error === undefined ? '' : this.error; - } - - public observer(): Subject { - return this.updated; - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/serial/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/serial/module.ts deleted file mode 100644 index 3a2c02aa66..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/serial/module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatInputModule } from '@angular/material/input'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatProgressBarModule, - MatIconModule, - MatFormFieldModule, - MatSelectModule, - MatInputModule, - MatAutocompleteModule, - MatRadioModule, - ], - declarations: [], - exports: [], -}) -export class BaseModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/tcp/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/tcp/component.ts deleted file mode 100644 index bb70e7bf03..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/tcp/component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, ChangeDetectorRef, Input, OnDestroy, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from '../../states/tcp'; -import { Action } from '@ui/tabs/observe/action'; -import { Session } from '@service/session'; - -import * as Stream from '@platform/types/observe/origin/stream/index'; - -@Component({ - selector: 'app-tcp-setup-base', - template: '', - standalone: false, -}) -@Ilc() -export class SetupBase extends ChangesDetector implements OnDestroy, AfterContentInit { - @Input() public configuration!: Stream.TCP.Configuration; - @Input() public action!: Action; - @Input() public session: Session | undefined; - - public state!: State; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnDestroy(): void { - this.state.destroy(); - } - - public ngAfterContentInit(): void { - this.state = new State(this.action, this.configuration); - this.env().subscriber.register( - this.configuration.subscribe(() => { - this.action.setDisabled(this.configuration.validate() instanceof Error); - this.detectChanges(); - }), - this.action.subjects.get().applied.subscribe(() => { - this.action.setDisabled(this.configuration.validate() instanceof Error); - this.detectChanges(); - }), - ); - this.action.setDisabled(this.configuration.validate() instanceof Error); - } -} -export interface SetupBase extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/tcp/error.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/tcp/error.ts deleted file mode 100644 index cdea46d467..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/tcp/error.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { ErrorStateMatcher } from '@angular/material/core'; -import { UntypedFormControl, FormGroupDirective, NgForm } from '@angular/forms'; - -import * as ip from '@platform/env/ipaddr'; - -export enum Field { - address = 'address', - multicastInterface = 'multicastInterface', -} - -export enum Codes { - NO_ERRORS = 'NO_ERRORS', - REQUIRED = 'REQUIRED', - INVALID = 'INVALID', -} - -export type UpdateHandler = () => void; - -export class ErrorState implements ErrorStateMatcher { - readonly _alias: Field; - readonly _updated: UpdateHandler; - private _code: Codes = Codes.NO_ERRORS; - - constructor(alias: Field, updated: UpdateHandler) { - this._alias = alias; - this._updated = updated; - } - - public isErrorState( - control: UntypedFormControl | null, - _form: FormGroupDirective | NgForm | null, - ): boolean { - if (control === null) { - return false; - } - if (this.isFieldRequired(control.value)) { - this._code = Codes.REQUIRED; - } else if (!this.isFieldValid(control.value)) { - this._code = Codes.INVALID; - } else { - this._code = Codes.NO_ERRORS; - } - this._updated(); - return this._code !== Codes.NO_ERRORS; - } - - public isFieldValid(value: string): boolean { - if (typeof value !== 'string') { - return false; - } - switch (this._alias) { - case Field.address: - return ( - ip.isValidIPv4(value) || - ip.isValidIPv6(value) || - ip.isValidIPv4WithPort(value) || - ip.isValidIPv6WithPort(value) - ); - case Field.multicastInterface: - return ( - ip.isValidIPv4(value) || - ip.isValidIPv6(value) || - ip.isValidIPv4WithPort(value) || - ip.isValidIPv6WithPort(value) - ); - default: - throw new Error(`Unexpected Field value: ${this._alias}`); - } - } - - public isFieldRequired(value: string): boolean { - if (typeof value !== 'string') { - return true; - } - switch (this._alias) { - case Field.address: - case Field.multicastInterface: - return value.trim() === ''; - } - } - - public getErrorCode(): Codes { - return this._code; - } - - public isValid(): boolean { - return this._code === Codes.NO_ERRORS; - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/component.ts deleted file mode 100644 index 409586df14..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/component.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Component, ChangeDetectorRef, Input, OnDestroy, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from '../../states/udp'; -import { Action } from '@ui/tabs/observe/action'; -import { Session } from '@service/session'; - -import * as Stream from '@platform/types/observe/origin/stream/index'; - -@Component({ - selector: 'app-udp-setup-base', - template: '', - standalone: false, -}) -@Ilc() -export class SetupBase extends ChangesDetector implements OnDestroy, AfterContentInit { - @Input() public configuration!: Stream.UDP.Configuration; - @Input() public action!: Action; - @Input() public session: Session | undefined; - - public state!: State; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnDestroy(): void { - this.state.destroy(); - } - - public ngAfterContentInit(): void { - this.state = new State(this.action, this.configuration); - this.env().subscriber.register( - this.configuration.subscribe(() => { - this.action.setDisabled(this.configuration.validate() instanceof Error); - this.detectChanges(); - }), - this.action.subjects.get().applied.subscribe(() => { - this.action.setDisabled(this.configuration.validate() instanceof Error); - this.detectChanges(); - }), - ); - this.action.setDisabled(this.configuration.validate() instanceof Error); - } - - public addMulticast() { - this.state.addMulticast(); - } - - public removeMulticast(index: number) { - this.state.removeMulticast(index); - } -} -export interface SetupBase extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/error.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/error.ts deleted file mode 100644 index fa36b206a6..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/error.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { ErrorStateMatcher } from '@angular/material/core'; -import { UntypedFormControl, FormGroupDirective, NgForm } from '@angular/forms'; - -import * as ip from '@platform/env/ipaddr'; - -export enum Field { - bindingAddress = 'bindingAddress', - multicastAddress = 'multicastAddress', - multicastInterface = 'multicastInterface', -} - -export enum Codes { - NO_ERRORS = 'NO_ERRORS', - REQUIRED = 'REQUIRED', - INVALID = 'INVALID', -} - -export type UpdateHandler = () => void; - -export class ErrorState implements ErrorStateMatcher { - readonly _alias: Field; - readonly _updated: UpdateHandler; - private _code: Codes = Codes.NO_ERRORS; - - constructor(alias: Field, updated: UpdateHandler) { - this._alias = alias; - this._updated = updated; - } - - public isErrorState( - control: UntypedFormControl | null, - _form: FormGroupDirective | NgForm | null, - ): boolean { - if (control === null) { - return false; - } - const prev = this._code; - if (this.isFieldRequired(control.value)) { - this._code = Codes.REQUIRED; - } else if (!this.isFieldValid(control.value)) { - this._code = Codes.INVALID; - } else { - this._code = Codes.NO_ERRORS; - } - prev !== this._code && this._updated(); - return this._code !== Codes.NO_ERRORS; - } - - public isFieldValid(value: string): boolean { - if (typeof value !== 'string') { - return false; - } - switch (this._alias) { - case Field.bindingAddress: - case Field.multicastAddress: - return ( - ip.isValidIPv4(value) || - ip.isValidIPv6(value) || - ip.isValidIPv4WithPort(value) || - ip.isValidIPv6WithPort(value) - ); - case Field.multicastInterface: - return ip.isValidIPv4(value) || ip.isValidIPv6(value); - default: - throw new Error(`Unexpected Field value: ${this._alias}`); - } - } - - public isFieldRequired(value: string): boolean { - if (typeof value !== 'string') { - return true; - } - switch (this._alias) { - case Field.bindingAddress: - case Field.multicastAddress: - case Field.multicastInterface: - return value.trim() === ''; - } - } - - public getErrorCode(): Codes { - return this._code; - } - - public isValid(): boolean { - return this._code === Codes.NO_ERRORS; - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/module.ts deleted file mode 100644 index d5d9f86eac..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; - -import { Multicast } from './multicast/component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatIconModule, - MatFormFieldModule, - MatInputModule, - ], - declarations: [Multicast], - exports: [Multicast] -}) -export class BaseModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/multicast/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/multicast/component.ts deleted file mode 100644 index 1cbf4793d1..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/multicast/component.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import * as Errors from '../error'; - -import * as Stream from '@platform/types/observe/origin/stream/index'; - -@Component({ - selector: 'app-transport-udp-multicast', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Multicast { - @Input() public multicast!: Stream.UDP.Multicast; - - public errors: { - multiaddr: Errors.ErrorState; - interface: Errors.ErrorState; - } = { - multiaddr: new Errors.ErrorState(Errors.Field.multicastAddress, () => { - // this.update(); - }), - interface: new Errors.ErrorState(Errors.Field.multicastAddress, () => { - // this.update(); - }), - }; - @Output() public clean: EventEmitter = new EventEmitter(); - - public onChanges() { - if ( - this.multicast.multiaddr.trim() !== '' || - (this.multicast.interface !== undefined && this.multicast.interface.trim() !== '') - ) { - return; - } - this.clean.next(); - } - - public onRemove() { - this.clean.next(); - } -} -export interface Multicast extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/multicast/styles.less b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/multicast/styles.less deleted file mode 100644 index 9b5a4a41cf..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/multicast/styles.less +++ /dev/null @@ -1,26 +0,0 @@ -@import '../../../../../../../../../styles/variables.less'; - - -:host { - align-items: baseline; - position: relative; - display: flex; - margin: 0; - cursor: default; - padding-right: 6px; - & mat-form-field.inline { - margin-right: 12px; - } - & .mat-icon { - width: 16px; - height: 16px; - font-size: 16px; - color: var(--scheme-color-1); - &:hover { - color: var(--scheme-color-3); - } - } - & span.filler { - flex: auto; - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/multicast/template.html b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/multicast/template.html deleted file mode 100644 index e1167c5145..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/bases/udp/multicast/template.html +++ /dev/null @@ -1,22 +0,0 @@ - - Address - - - Please enter a valid IPv4/IPv6 address - - - required - - - - Interface Address - - - Please define valid interface - - - required - - - -close diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/component.ts deleted file mode 100644 index 471470e73c..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - AfterContentInit, - AfterViewInit, - OnDestroy, - ViewEncapsulation, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Options as AutocompleteOptions } from '@elements/autocomplete/component'; -import { Options as FoldersOptions } from '@elements/folderinput/component'; -import { Subject } from '@platform/env/subscription'; -import { CmdErrorState } from '../../bases/process/error'; -import { SetupBase } from '../../bases/process/component'; - -@Component({ - selector: 'app-transport-process', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class Setup extends SetupBase implements AfterContentInit, AfterViewInit, OnDestroy { - @Input() public update?: Subject; - - public readonly inputs: { - cmd: AutocompleteOptions; - cwd: FoldersOptions; - } = { - cmd: { - name: 'CommandsRecentList', - storage: 'processes_cmd_recent', - defaults: '', - placeholder: 'Enter terminal command', - label: 'Terminal command', - recent: new Subject(), - error: new CmdErrorState(), - }, - cwd: { - placeholder: 'Enter working folder', - label: 'Working folder', - defaults: '', - passive: true, - }, - }; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - this.setInputs(this.inputs); - } - - public override ngAfterContentInit(): void { - this.update !== undefined && - this.env().subscriber.register( - this.update.subscribe(() => { - this.cmdInputRef.set(this.state.configuration.configuration.command); - this.cwdInputRef.set(this.state.configuration.configuration.cwd); - }), - ); - super.ngAfterContentInit(); - } -} -export interface Setup extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/module.ts deleted file mode 100644 index 351a776791..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { AutocompleteModule } from '@elements/autocomplete/module'; -import { FolderInputModule } from '@elements/folderinput/module'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatDividerModule } from '@angular/material/divider'; -import { Setup } from './component'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; - -@NgModule({ - imports: [ - CommonModule, - AutocompleteModule, - FolderInputModule, - MatMenuModule, - MatDividerModule, - MatProgressBarModule, - MatProgressSpinnerModule, - ], - declarations: [Setup], - exports: [Setup] -}) -export class SetupModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/styles.less b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/styles.less deleted file mode 100644 index 992a05aa79..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/styles.less +++ /dev/null @@ -1,61 +0,0 @@ -@import '../../../../../../../../styles/variables.less'; - - -app-transport-process { - position: relative; - display: block; - width: 100%; - & div.command { - position: relative; - display: flex; - width: 100%; - align-items: center; - margin-bottom: 12px; - & button { - margin-left: 6px; - } - } -} -.app-transport-process-menu { - & button[mat-menu-item] { - & div.shell-profile { - position: relative; - margin-top: -7px; - & > span { - height: 16px; - line-height: 16px; - } - & > span.envvars-count { - color: var(--scheme-color-3); - } - & > span.shell-path { - position: relative; - display: block; - color: var(--scheme-color-3); - font-size: 10px; - max-width: 250px; - overflow: hidden; - text-overflow: ellipsis; - margin-top: -8px; - white-space: nowrap; - direction: rtl; - max-width: 200px; - } - } - &[data-selected="true"] { - & div.shell-profile { - &::before { - display: block; - position: absolute; - width: 2px; - height: 24px; - background: var(--scheme-color-accent); - left: -9px; - top: 7px; - content: ''; - } - } - } - } - -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/template.html b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/template.html deleted file mode 100644 index 06ffe59aa5..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/process/template.html +++ /dev/null @@ -1,50 +0,0 @@ -
    - - -
    - - - - - -

    Available shells:

    - -
    - -

    Loading profiles...

    - -
    - - -
    diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/component.ts deleted file mode 100644 index de3561dee3..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component, ChangeDetectorRef, Input, OnDestroy, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Subject } from '@platform/env/subscription'; -import { SetupBase } from '../../bases/serial/component'; - -@Component({ - selector: 'app-transport-serial', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Setup extends SetupBase implements AfterContentInit, OnDestroy { - @Input() public update?: Subject; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public override ngAfterContentInit() { - this.update !== undefined && - this.env().subscriber.register( - this.update.subscribe(() => { - this.detectChanges(); - }), - ); - super.ngAfterContentInit(); - } -} -export interface TransportSerial extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/module.ts deleted file mode 100644 index 3856d61cf8..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/module.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatInputModule } from '@angular/material/input'; -import { BaseModule } from '../../bases/serial/module'; -import { Setup } from './component'; -import { AutocompleteModule } from '@elements/autocomplete/module'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatProgressBarModule, - MatIconModule, - MatFormFieldModule, - MatSelectModule, - MatInputModule, - AutocompleteModule, - MatRadioModule, - BaseModule, - MatProgressSpinnerModule, - MatMenuModule, - ], - declarations: [Setup], - exports: [Setup], -}) -export class SetupModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/styles.less b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/styles.less deleted file mode 100644 index bb4e6031d9..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/styles.less +++ /dev/null @@ -1,24 +0,0 @@ -@import '../../../../../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - p.settings { - margin: 8px 0; - } - & div.path { - position: relative; - display: flex; - width: 100%; - align-items: center; - margin-bottom: 12px; - & button { - margin-left: 6px; - } - } - div.controlls{ - text-align: right; - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/template.html b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/template.html deleted file mode 100644 index f97479eb58..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/serial/template.html +++ /dev/null @@ -1,96 +0,0 @@ -
    - - -
    - -

    Settings

    - - Baud Rate - - - {{value}} - - - - - Custom Baud Rate - - - - Data Bits - - - {{value}} - - - - - Flow Control - - - {{keyvalue.name}} - - - - - Parity - - - {{keyvalue.name}} - - - - - Stop Bits - - - {{value}} - - - - - Exclusive opening - - - {{keyvalue.name}} - - - - - Delay on writing - - - {{keyvalue.name}} - - - -
    - -
    - - - -

    No ports found

    -
    - - - -
    - -

    Scanning for available ports...

    - -
    -
    \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/component.ts deleted file mode 100644 index ca5a8abf43..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component, ChangeDetectorRef, Input, OnDestroy, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Subject } from '@platform/env/subscription'; -import { SetupBase } from '../../bases/tcp/component'; - -@Component({ - selector: 'app-transport-tcp', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Setup extends SetupBase implements OnDestroy, AfterContentInit { - @Input() public update?: Subject; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public override ngAfterContentInit(): void { - this.update !== undefined && - this.env().subscriber.register( - this.update.subscribe(() => { - this.detectChanges(); - }), - ); - super.ngAfterContentInit(); - } -} -export interface Setup extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/module.ts deleted file mode 100644 index 408a3f3895..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatInputModule } from '@angular/material/input'; -import { Setup } from './component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatProgressBarModule, - MatIconModule, - MatFormFieldModule, - MatSelectModule, - MatInputModule, - ], - declarations: [Setup], - exports: [Setup] -}) -export class SetupModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/styles.less b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/styles.less deleted file mode 100644 index 1890004256..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/styles.less +++ /dev/null @@ -1,14 +0,0 @@ -@import '../../../../../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - & mat-form-field.full-width { - display: block; - } - & mat-form-field.inline { - margin-right: 12px; - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/template.html b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/template.html deleted file mode 100644 index 8d0df136b3..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/tcp/template.html +++ /dev/null @@ -1,20 +0,0 @@ - - IP Address - - - Please enter a valid IPv4/IPv6 address - - - required - - - diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/component.ts deleted file mode 100644 index 772ff593db..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component, ChangeDetectorRef, Input, OnDestroy, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Subject } from '@platform/env/subscription'; -import { SetupBase } from '../../bases/udp/component'; - -@Component({ - selector: 'app-transport-udp', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Setup extends SetupBase implements OnDestroy, AfterContentInit { - @Input() public update?: Subject; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public override ngAfterContentInit(): void { - this.update !== undefined && - this.env().subscriber.register( - this.update.subscribe(() => { - this.detectChanges(); - }), - ); - super.ngAfterContentInit(); - } -} -export interface Setup extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/module.ts deleted file mode 100644 index d3cee77cb9..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatInputModule } from '@angular/material/input'; - -import { Setup } from './component'; -import { BaseModule } from '../../bases/udp/module'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatProgressBarModule, - MatIconModule, - MatFormFieldModule, - MatSelectModule, - MatInputModule, - BaseModule, - ], - declarations: [Setup], - exports: [Setup] -}) -export class SetupModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/styles.less b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/styles.less deleted file mode 100644 index 201ebcbb99..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/styles.less +++ /dev/null @@ -1,28 +0,0 @@ -@import '../../../../../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - & mat-form-field.full-width { - display: block; - } - & mat-form-field.inline { - margin-right: 12px; - } - div.mutlicasts{ - margin: 12px 0; - & p { - padding-top: 6px; - } - } - div.controlls{ - text-align: right; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/template.html b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/template.html deleted file mode 100644 index 79aee38d2a..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/complete/udp/template.html +++ /dev/null @@ -1,20 +0,0 @@ - - IP Address - - - Please enter a valid IPv4/IPv6 address - - - required - - -
    - -

    Multicasts

    -
    - -
    - -
    diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/component.ts deleted file mode 100644 index 5f24f76559..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/component.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from './state'; - -import * as Stream from '@platform/types/observe/origin/stream'; - -@Component({ - selector: 'app-transport', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Transport extends ChangesDetector implements AfterContentInit { - public Source = Stream.Stream.Source; - - @Input() public state!: State; - - public instance: { - [Stream.Stream.Source.Process]: Stream.Stream.Process.Configuration | undefined; - [Stream.Stream.Source.Serial]: Stream.Stream.Serial.Configuration | undefined; - [Stream.Stream.Source.UDP]: Stream.Stream.UDP.Configuration | undefined; - [Stream.Stream.Source.TCP]: Stream.Stream.TCP.Configuration | undefined; - } = { - [Stream.Stream.Source.Process]: undefined, - [Stream.Stream.Source.Serial]: undefined, - [Stream.Stream.Source.UDP]: undefined, - [Stream.Stream.Source.TCP]: undefined, - }; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.env().subscriber.register( - this.state.updated.subscribe(() => { - this.update().detectChanges(); - }), - ); - this.update(); - } - - protected update(): Transport { - (this.instance as any) = { - [this.state.configuration.instance.alias()]: this.state.configuration.instance, - }; - return this; - } -} -export interface Transport extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/module.ts deleted file mode 100644 index 88c5de6b96..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { SetupModule as UdpSetupModule } from './complete/udp/module'; -import { SetupModule as TcpSetupModule } from './complete/tcp/module'; -import { SetupModule as SerialSetupModule } from './complete/serial/module'; -import { SetupModule as ProcessSetupModule } from './complete/process/module'; - -import { Transport } from './component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatDividerModule, - MatFormFieldModule, - MatSelectModule, - UdpSetupModule, - TcpSetupModule, - SerialSetupModule, - ProcessSetupModule, - ], - declarations: [Transport], - exports: [Transport, UdpSetupModule, TcpSetupModule, SerialSetupModule, ProcessSetupModule], -}) -export class StreamsModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/component.ts deleted file mode 100644 index 9fcdac6e3d..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/component.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterContentInit, - OnDestroy, - ViewEncapsulation, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Options as AutocompleteOptions } from '@elements/autocomplete/component'; -import { Options as FoldersOptions } from '@elements/folderinput/component'; -import { Subject } from '@platform/env/subscription'; -import { CmdErrorState } from '../../bases/process/error'; -import { SetupBase } from '../../bases/process/component'; - -@Component({ - selector: 'app-process-quicksetup', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class QuickSetup extends SetupBase implements AfterContentInit, OnDestroy { - public readonly inputs: { - cmd: AutocompleteOptions; - cwd: FoldersOptions; - } = { - cmd: { - name: 'CommandsRecentList', - storage: 'processes_cmd_recent', - defaults: '', - placeholder: 'Enter terminal command', - label: 'Terminal command', - recent: new Subject(), - error: new CmdErrorState(), - }, - cwd: { - placeholder: 'Enter working folder', - label: undefined, - defaults: '', - passive: true, - }, - }; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - this.setInputs(this.inputs); - } - - public destroy(): Promise { - return Promise.resolve(); - } -} -export interface QuickSetup extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/module.ts deleted file mode 100644 index 684c7c7713..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { AutocompleteModule } from '@elements/autocomplete/module'; -import { FolderInputModule } from '@elements/folderinput/module'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatDividerModule } from '@angular/material/divider'; -import { QuickSetup } from './component'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; - -@NgModule({ - imports: [ - CommonModule, - AutocompleteModule, - FolderInputModule, - MatMenuModule, - MatDividerModule, - MatProgressBarModule, - MatProgressSpinnerModule, - ], - declarations: [QuickSetup], - exports: [QuickSetup] -}) -export class QuickSetupModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/styles.less b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/styles.less deleted file mode 100644 index eb5b473183..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/styles.less +++ /dev/null @@ -1,67 +0,0 @@ -@import '../../../../../../../../styles/variables.less'; - - -app-process-quicksetup { - position: relative; - display: block; - width: 100%; - & div.command { - position: relative; - display: flex; - width: 100%; - align-items: center; - margin-bottom: 6px; - & button { - margin-left: 6px; - } - } - & mat-form-field.full-width { - display: block; - } - & mat-form-field.outline { - margin: 0!important; - } - -} -.app-transport-process-menu { - & .mat-menu-item { - & > div.shell-profile { - position: relative; - margin-top: -7px; - & > span { - height: 16px; - line-height: 16px; - } - & > span.envvars-count { - color: var(--scheme-color-3); - } - & > span.shell-path { - position: relative; - display: block; - color: var(--scheme-color-3); - font-size: 10px; - max-width: 250px; - overflow: hidden; - text-overflow: ellipsis; - margin-top: -8px; - white-space: nowrap; - direction: rtl; - max-width: 200px; - } - } - } - & .mat-menu-item[data-selected="true"] { - & > div.shell-profile { - &::before { - display: block; - position: absolute; - width: 2px; - height: 24px; - background: var(--scheme-color-accent); - left: -9px; - top: 11px; - content: ''; - } - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/template.html b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/template.html deleted file mode 100644 index b9e3bb02da..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/process/template.html +++ /dev/null @@ -1,50 +0,0 @@ -
    - - -
    - - - - - -

    Available shells:

    - -
    - -

    Loading profiles...

    - -
    - - -
    diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/component.ts deleted file mode 100644 index 3f0bda0436..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, ChangeDetectorRef, OnDestroy, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { SetupBase } from '../../bases/serial/component'; - -@Component({ - selector: 'app-serial-quicksetup', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class QuickSetup extends SetupBase implements AfterContentInit, OnDestroy { - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public connect() { - this.action.apply(); - } -} -export interface QuickSetup extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/module.ts deleted file mode 100644 index 95da2b450a..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatInputModule } from '@angular/material/input'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { BaseModule } from '../../bases/serial/module'; -import { QuickSetup } from './component'; -import { SetupModule } from '../../complete/serial/module'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatProgressBarModule, - MatIconModule, - MatFormFieldModule, - MatSelectModule, - MatInputModule, - MatAutocompleteModule, - MatRadioModule, - BaseModule, - SetupModule, - ], - declarations: [QuickSetup], - exports: [QuickSetup], -}) -export class QuickSetupModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/styles.less b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/styles.less deleted file mode 100644 index 32de7112f4..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/styles.less +++ /dev/null @@ -1,12 +0,0 @@ -@import '../../../../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - width: auto; - padding: 0 24px; - div.controlls{ - text-align: right; - padding: 8px 0 0 0; - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/template.html b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/template.html deleted file mode 100644 index 5ed1034fc1..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/serial/template.html +++ /dev/null @@ -1,4 +0,0 @@ - -
    - -
    \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/component.ts deleted file mode 100644 index 76101e9545..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, ChangeDetectorRef, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { SetupBase } from '../../bases/tcp/component'; - -@Component({ - selector: 'app-tcp-quicksetup', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class QuickSetup extends SetupBase implements AfterContentInit { - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public connect() { - this.action.apply(); - } -} -export interface QuickSetup extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/module.ts deleted file mode 100644 index d25b0c9b98..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatInputModule } from '@angular/material/input'; - -import { QuickSetup } from './component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatProgressBarModule, - MatIconModule, - MatFormFieldModule, - MatSelectModule, - MatInputModule, - ], - declarations: [QuickSetup], - exports: [QuickSetup] -}) -export class QuickSetupModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/styles.less b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/styles.less deleted file mode 100644 index 537eda256d..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/styles.less +++ /dev/null @@ -1,25 +0,0 @@ -@import '../../../../../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - & mat-form-field { - width: 100%; - } - & mat-form-field.full-width { - display: block; - } - & mat-form-field.inline { - margin-right: 12px; - } - div.controlls{ - text-align: right; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/template.html b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/template.html deleted file mode 100644 index 1ec1653777..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/tcp/template.html +++ /dev/null @@ -1,13 +0,0 @@ - - IP Address - - - Please enter a valid IPv4/IPv6 address - - - required - - -
    - -
    \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/component.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/component.ts deleted file mode 100644 index 8856acba55..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, ChangeDetectorRef, OnDestroy, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { SetupBase } from '../../bases/udp/component'; - -@Component({ - selector: 'app-udp-quicksetup', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class QuickSetup extends SetupBase implements OnDestroy, AfterContentInit { - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public connect() { - this.action.apply(); - } -} -export interface QuickSetup extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/module.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/module.ts deleted file mode 100644 index 5bf02f945f..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatInputModule } from '@angular/material/input'; - -import { QuickSetup } from './component'; -import { BaseModule } from '../../bases/udp/module'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatProgressBarModule, - MatIconModule, - MatFormFieldModule, - MatSelectModule, - MatInputModule, - BaseModule, - ], - declarations: [QuickSetup], - exports: [QuickSetup] -}) -export class QuickSetupModule {} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/styles.less b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/styles.less deleted file mode 100644 index c7c410479d..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/styles.less +++ /dev/null @@ -1,31 +0,0 @@ -@import '../../../../../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - & mat-form-field { - width: 100%; - } - & mat-form-field.full-width { - display: block; - } - & mat-form-field.inline { - margin-right: 12px; - } - div.mutlicasts{ - margin: 12px 0; - & p { - padding-top: 6px; - } - } - div.controlls{ - text-align: right; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/template.html b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/template.html deleted file mode 100644 index 8fdbe94855..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/quick/udp/template.html +++ /dev/null @@ -1,21 +0,0 @@ - - IP Address - - - Please enter a valid IPv4/IPv6 address - - - required - - -
    - -

    Multicasts

    -
    - -
    - - -
    diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/state.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/state.ts deleted file mode 100644 index dfd8dd4c9a..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/state.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Subject } from '@platform/env/subscription'; -import { Action } from '@ui/tabs/observe/action'; - -import * as Stream from '@platform/types/observe/origin/stream/index'; - -export class State { - protected readonly history: Map = new Map(); - - public source: Stream.Source; - public updated: Subject = new Subject(); - - constructor( - public readonly action: Action, - public readonly configuration: Stream.Configuration, - ) { - this.source = Stream.getAliasByConfiguration(configuration.configuration); - this.action = action; - } - - public destroy() { - this.updated.destroy(); - } - - public from(configuration: Stream.IConfiguration) { - this.history.set( - this.configuration.instance.alias(), - this.configuration.instance.configuration, - ); - this.configuration.change().byConfiguration(configuration); - this.source = Stream.getAliasByConfiguration(configuration); - this.updated.emit(); - } - - public switch(source: Stream.Source) { - this.history.set( - this.configuration.instance.alias(), - this.configuration.instance.configuration, - ); - this.configuration - .change() - .byDeclaration(Stream.getByAlias(source, this.history.get(source))); - this.source = source; - this.updated.emit(); - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/process.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/process.ts deleted file mode 100644 index c11b84b2e6..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/process.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { ShellProfile } from '@platform/types/bindings'; -import { bridge } from '@service/bridge'; -import { Destroy } from '@platform/types/env/types'; -import { Action } from '../../../../../action'; - -import * as obj from '@platform/env/obj'; -import * as Stream from '@platform/types/observe/origin/stream/index'; - -const ROOTS_STORAGE_KEY = 'user_selected_profile'; -const ENTRY_KEY = 'selected_profile_path'; - -export class State implements Destroy { - public profiles: { - all: ShellProfile[] | undefined; - valid: ShellProfile[] | undefined; - } = { - all: undefined, - valid: undefined, - }; - public current: ShellProfile | undefined; - /// Environment variables for in Chipmunk. - public envs: { [key: string]: string } = {}; - - constructor( - public readonly action: Action, - public readonly configuration: Stream.Process.Configuration, - ) {} - - public destroy(): void { - // Having method "destroy()" is requirement of session's storage - } - - public setProfiles(profiles: ShellProfile[]): Promise { - const valid: ShellProfile[] = []; - profiles.forEach((profile) => { - if (valid.find((p) => p.path === profile.path) === undefined) { - valid.push(profile); - } - }); - this.profiles.all = profiles; - this.profiles.valid = valid; - return this.storage() - .get() - .then((path: string | undefined) => { - this.current = this.profiles.all?.find((p) => p.path === path); - this.configuration.configuration.shell = this.current; - }); - } - - public isProfilesLoaded(): boolean { - return this.profiles.all !== undefined; - } - - public setCurrentProfile(profile: ShellProfile | undefined): Promise { - if (profile === undefined) { - this.current = undefined; - this.configuration.configuration.shell = undefined; - return this.storage().set(undefined); - } else { - this.current = profile; - this.configuration.configuration.shell = this.current; - return this.storage().set(profile.path); - } - } - - public getSelectedEnvs(): Map { - return obj.objToStringMap(this.envs); - } - - public isShellSelected(profile: ShellProfile): boolean { - return this.current ? profile.path === this.current.path : false; - } - - protected storage(): { - get(): Promise; - set(path: string | undefined): Promise; - } { - return { - get: (): Promise => { - return new Promise((resolve, reject) => { - bridge - .entries({ key: ROOTS_STORAGE_KEY }) - .get() - .then((entries) => { - resolve(entries.length === 0 ? undefined : entries[0].content); - }) - .catch(reject); - }); - }, - set: (path: string | undefined): Promise => { - if (path === undefined) { - return bridge.entries({ key: ROOTS_STORAGE_KEY }).delete([ENTRY_KEY]); - } else { - return bridge.entries({ key: ROOTS_STORAGE_KEY }).overwrite([ - { - uuid: ENTRY_KEY, - content: path, - }, - ]); - } - }, - }; - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/serial.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/serial.ts deleted file mode 100644 index d902a5254b..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/serial.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { bridge } from '@service/bridge'; -import { scope } from '@platform/env/scope'; -import { Subject } from '@platform/env/subscription'; -import { error } from '@platform/log/utils'; -import { Destroy } from '@platform/types/env/types'; -import { Action } from '../../../../../action'; - -import * as Stream from '@platform/types/observe/origin/stream/index'; - -const SERIAL_PORT_SETTINGS_STORAGE = 'serial_port_settings'; -const REGULAR_RESCAN_PORTS_DURATION_MS = 3000; -const NOPORTS_RESCAN_PORTS_DURATION_MS = 1000; - -const CUSTOM_BAUD_RATE_REF = 'Custom'; -const BAUD_RATE = [ - CUSTOM_BAUD_RATE_REF, - 50, - 75, - 110, - 134, - 150, - 200, - 300, - 600, - 1200, - 1800, - 2400, - 4800, - 9600, - 19200, - 38400, - 57600, - 115200, - 230400, - 460800, - 500000, - 576000, - 921600, - 1000000, - 1152000, - 1500000, - 2000000, - 2500000, - 3000000, - 3500000, - 4000000, -]; -const DATA_BITS: number[] = [8, 7, 6, 5]; -const FLOW_CONTROL = [ - { value: 0, name: 'None' }, - { value: 1, name: 'Hardware' }, - { value: 2, name: 'Software' }, -]; -const PARITY = [ - { value: 0, name: 'None' }, - { value: 1, name: 'Odd' }, - { value: 2, name: 'Even' }, -]; -const STOP_BITS = [1, 2]; -const EXCLUSIVE = [ - { value: true, name: 'Yes (default)' }, - { value: false, name: 'No' }, -]; -const DELAY = [ - { value: 0, name: 'No delay (default)' }, - { value: 10, name: '10 ms' }, - { value: 20, name: '20 ms' }, - { value: 30, name: '30 ms' }, - { value: 40, name: '40 ms' }, - { value: 50, name: '50 ms' }, -]; - -export class State implements Destroy { - public ports: string[] = []; - public changed: Subject = new Subject(); - public baudRateProxy: number | string = 115200; - public loaded: boolean = false; - - public BAUD_RATE = BAUD_RATE; - public DATA_BITS = DATA_BITS; - public FLOW_CONTROL = FLOW_CONTROL; - public PARITY = PARITY; - public STOP_BITS = STOP_BITS; - public EXCLUSIVE = EXCLUSIVE; - public DELAY = DELAY; - - protected timer: number = -1; - protected states: Map = new Map(); - protected prev: string = ''; - - constructor( - public readonly action: Action, - public readonly configuration: Stream.Serial.Configuration, - ) { - this.history().load(); - } - - public destroy(): void { - // Having method "destroy()" is requirement of session's storage - } - - public scan(): { - start(): void; - stop(): void; - } { - const logger = scope.getLogger('SerialPorts Scanner'); - return { - start: (): void => { - function isSame(prev: string[], current: string[]): boolean { - return prev.join(';') === current.join(';'); - } - this.scan().stop(); - bridge - .ports() - .list() - .then((ports: string[]) => { - this.loaded = true; - if (!isSame(this.ports.slice(1), ports)) { - this.ports = ports; - } - this.changed.emit(); - // if (this.ports.includes(this.configuration.configuration.path)) { - // return; - // } - // this.configuration.configuration.path = - // this.ports[0] === undefined ? '' : this.ports[0]; - // this.configuration.configuration.path !== '' && - // this.history().restore(this.configuration.configuration.path); - // this.prev = this.configuration.configuration.path; - // this.changed.emit(); - }) - .catch((err: Error) => { - logger.error(`Fail to update ports list due error: ${err.message}`); - }) - .finally(() => { - this.timer = setTimeout( - () => { - this.scan().start(); - }, - this.ports.length === 0 - ? NOPORTS_RESCAN_PORTS_DURATION_MS - : REGULAR_RESCAN_PORTS_DURATION_MS, - ) as unknown as number; - }); - }, - stop: (): void => { - clearTimeout(this.timer); - }, - }; - } - - public isEmpty(): boolean { - return this.ports.length === 0; - } - - public history(): { - update(path: string): void; - restore(path: string): void; - load(): void; - save(): void; - } { - const logger = scope.getLogger('SerialPorts Settings History'); - return { - update: (path: string): void => { - if (this.prev !== '') { - this.states.set(this.prev, this.configuration.configuration); - } - this.history().restore(path); - this.prev = path; - this.history().save(); - this.changed.emit(); - }, - restore: (path: string): void => { - const state = this.states.get(path); - this.configuration.overwrite( - state === undefined ? Stream.Serial.Configuration.initial() : state, - ); - this.baudRateProxtUpdate(); - this.configuration.configuration.path = path; - }, - load: (): void => { - bridge - .storage(SERIAL_PORT_SETTINGS_STORAGE) - .read() - .then((content: string) => { - if (content === '') { - return; - } - try { - const map = JSON.parse(content); - if (!(map instanceof Array)) { - logger.warn(`Invalid format of history`); - return; - } - this.states.clear(); - map.forEach((pair) => { - if (pair instanceof Array && pair.length === 2) { - this.states.set(pair[0], pair[1]); - } - }); - this.configuration.configuration.path !== '' && - this.history().restore(this.configuration.configuration.path); - } catch (e) { - logger.warn(`Fail to parse history: ${error(e)}`); - } - }) - .catch((err: Error) => { - logger.warn(`Fail to get history: ${err.message}`); - }); - }, - save: (): void => { - const map: [string, Stream.Serial.IConfiguration][] = []; - this.states.forEach((value, key) => { - map.push([key, value]); - }); - bridge - .storage(SERIAL_PORT_SETTINGS_STORAGE) - .write(JSON.stringify(map)) - .catch((err: Error) => { - logger.warn(`Fail to save history: ${err.message}`); - }); - }, - }; - } - - public isBoudRateCustom(): boolean { - return this.baudRateProxy === CUSTOM_BAUD_RATE_REF; - } - - public baudRateChange(): void { - this.configuration.configuration.baud_rate = - typeof this.baudRateProxy === 'string' - ? this.configuration.configuration.baud_rate - : this.baudRateProxy; - this.configuration.configuration.baud_rate = - typeof this.configuration.configuration.baud_rate === 'string' - ? parseInt(this.configuration.configuration.baud_rate, 10) - : this.configuration.configuration.baud_rate; - if ( - isNaN(this.configuration.configuration.baud_rate) || - !isFinite(this.configuration.configuration.baud_rate) - ) { - this.configuration.configuration.baud_rate = - Stream.Serial.Configuration.initial().baud_rate; - } - this.changed.emit(); - } - - public defaluts(): void { - const path = this.configuration.configuration.path; - this.configuration.overwrite(Stream.Serial.Configuration.initial()); - this.configuration.configuration.path = path; - this.states.set(this.configuration.configuration.path, this.configuration.configuration); - this.baudRateProxtUpdate(); - this.history().save(); - this.changed.emit(); - } - - protected baudRateProxtUpdate(): void { - if ( - this.BAUD_RATE.find((r) => r == this.configuration.configuration.baud_rate) === - undefined - ) { - this.baudRateProxy = CUSTOM_BAUD_RATE_REF; - } else { - this.baudRateProxy = this.configuration.configuration.baud_rate; - } - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/tcp.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/tcp.ts deleted file mode 100644 index 133c2bdd33..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/tcp.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Destroy } from '@platform/types/env/types'; -import { Action } from '@ui/tabs/observe/action'; - -import * as Errors from '../bases/tcp/error'; -import * as Stream from '@platform/types/observe/origin/stream/index'; - -export class State implements Destroy { - public errors: { - address: Errors.ErrorState; - }; - - constructor( - public readonly action: Action, - public readonly configuration: Stream.TCP.Configuration, - ) { - this.errors = { - address: new Errors.ErrorState(Errors.Field.address, () => { - // this.update(); - }), - }; - } - - public destroy(): void { - // Having method "destroy()" is requirement of session's storage - } - - public isValid(): boolean { - if (!this.errors.address.isValid()) { - return false; - } - return true; - } - - public drop() { - this.configuration.configuration.bind_addr = Stream.TCP.Configuration.initial().bind_addr; - } - -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/udp.ts b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/udp.ts deleted file mode 100644 index 6aa9fd202f..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/states/udp.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Destroy } from '@platform/types/env/types'; -import { Action } from '../../../../../action'; - -import * as Errors from '../bases/udp/error'; -import * as Stream from '@platform/types/observe/origin/stream/index'; - -const MULTICAST_ADDR = '255.255.255.255'; -const MULTUCAST_INTERFACE = '0.0.0.0'; - -export class State implements Destroy { - public errors: { - address: Errors.ErrorState; - }; - - constructor( - public readonly action: Action, - public readonly configuration: Stream.UDP.Configuration, - ) { - this.errors = { - address: new Errors.ErrorState(Errors.Field.bindingAddress, () => { - // this.update(); - }), - }; - } - - public destroy(): void { - // Having method "destroy()" is requirement of session's storage - } - - public drop() { - this.configuration.configuration.bind_addr = Stream.UDP.Configuration.initial().bind_addr; - this.configuration.configuration.multicast = Stream.UDP.Configuration.initial().multicast; - } - - public addMulticast() { - this.configuration.configuration.multicast.push({ - multiaddr: MULTICAST_ADDR, - interface: MULTUCAST_INTERFACE, - }); - } - - public removeMulticast(index: number) { - index > -1 && this.configuration.configuration.multicast.splice(index, 1); - } -} diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/styles.less b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/styles.less deleted file mode 100644 index 51a34a89c7..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/styles.less +++ /dev/null @@ -1,19 +0,0 @@ -@import '../../../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - & mat-form-field.full-width { - display: block; - } - & mat-form-field.inline { - margin-right: 12px; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/template.html b/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/template.html deleted file mode 100644 index effbaf0d68..0000000000 --- a/application/client/src/app/ui/tabs/observe/origin/stream/transport/setup/template.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/component.ts b/application/client/src/app/ui/tabs/observe/parsers/extra/component.ts deleted file mode 100644 index a70358b249..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from '../state'; - -@Component({ - selector: 'app-el-parser-extra', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class ParserExtraConfiguration extends ChangesDetector implements AfterContentInit { - @Input() state!: State; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.state.bind(this); - } -} -export interface ParserExtraConfiguration extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/component.ts b/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/component.ts deleted file mode 100644 index eb817b3b75..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/component.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - AfterContentInit, - AfterViewInit, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { bytesToStr, timestampToUTC } from '@env/str'; -import { State } from './state'; -import { Observe } from '@platform/types/observe'; - -@Component({ - selector: 'app-el-dlt-extra', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class DltExtraConfiguration - extends ChangesDetector - implements AfterContentInit, AfterViewInit -{ - @Input() observe!: Observe; - - protected state!: State; - - public bytesToStr = bytesToStr; - public timestampToUTC = timestampToUTC; - public error: string | undefined; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.state = new State(this.observe); - this.state.bind(this); - } - - public ngAfterViewInit(): void { - this.state - .struct() - .load() - .catch((err: Error) => { - this.log().error(`Fail load DLT statistics: ${err.message}`); - this.error = err.message; - this.detectChanges(); - }); - } - - public ngOnEntitySelect() { - this.state.buildSummary().selected(); - this.detectChanges(); - } - - public ngContextMenu(event: MouseEvent) { - const after = () => { - this.state.buildSummary().selected(); - this.detectChanges(); - }; - this.ilc().emitter.ui.contextmenu.open({ - items: [ - { - caption: 'Select all', - handler: () => { - this.state.structure.forEach((section) => { - section.entities.forEach((e) => e.select()); - }); - after(); - }, - }, - { - caption: 'Unselect all', - handler: () => { - this.state.structure.forEach((section) => { - section.entities.forEach((e) => e.unselect()); - }); - after(); - }, - }, - { - caption: 'Reverse selection', - handler: () => { - this.state.structure.forEach((section) => { - section.entities.forEach((e) => e.toggle()); - }); - after(); - }, - }, - {}, - { - caption: 'Select with fotal', - handler: () => { - this.state.structure.forEach((section) => { - section.entities.forEach((e) => { - e.log_fatal > 0 && e.select(); - }); - }); - after(); - }, - }, - { - caption: 'Select with errors', - handler: () => { - this.state.structure.forEach((section) => { - section.entities.forEach((e) => { - e.log_error > 0 && e.select(); - }); - }); - after(); - }, - }, - { - caption: 'Select with warnings', - handler: () => { - this.state.structure.forEach((section) => { - section.entities.forEach((e) => { - e.log_warning > 0 && e.select(); - }); - }); - after(); - }, - }, - {}, - { - caption: 'Unselect without fotal', - handler: () => { - this.state.structure.forEach((section) => { - section.entities.forEach((e) => { - e.log_fatal === 0 && e.unselect(); - }); - }); - after(); - }, - }, - { - caption: 'Unselect without errors', - handler: () => { - this.state.structure.forEach((section) => { - section.entities.forEach((e) => { - e.log_error === 0 && e.unselect(); - }); - }); - after(); - }, - }, - { - caption: 'Unselect without warnings', - handler: () => { - this.state.structure.forEach((section) => { - section.entities.forEach((e) => { - e.log_warning === 0 && e.unselect(); - }); - }); - after(); - }, - }, - ], - x: event.x, - y: event.y, - }); - } -} -export interface DltExtraConfiguration extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/module.ts b/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/module.ts deleted file mode 100644 index 760ef5b981..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/module.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatListModule } from '@angular/material/list'; -import { MatTableModule } from '@angular/material/table'; -import { MatSortModule } from '@angular/material/sort'; - -import { DltExtraConfiguration } from './component'; -import { DltExtraConfigurationStructure } from './structure/component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatProgressBarModule, - MatChipsModule, - MatIconModule, - MatFormFieldModule, - MatSelectModule, - MatListModule, - MatTableModule, - MatSortModule, - ], - declarations: [DltExtraConfiguration, DltExtraConfigurationStructure], - exports: [DltExtraConfiguration], - bootstrap: [DltExtraConfiguration, DltExtraConfigurationStructure], -}) -export class DltExtraConfigurationModule {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/state.ts b/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/state.ts deleted file mode 100644 index 9067f14986..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/state.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { State as Base } from '../../state'; -import { Section } from './structure/section'; -import { Summary } from './summary'; -import { StatEntity } from './structure/statentity'; -import { getTypedProp } from '@platform/env/obj'; -import { DltStatisticInfo, DltLevelDistribution } from '@platform/types/bindings'; - -import * as Dlt from '@platform/types/observe/parser/dlt'; - -export const ENTITIES = { - app_ids: 'app_ids', - context_ids: 'context_ids', - ecu_ids: 'ecu_ids', -}; - -export const NAMES: { [key: string]: string } = { - [ENTITIES.app_ids]: 'Applications', - [ENTITIES.context_ids]: 'Contexts', - [ENTITIES.ecu_ids]: 'ECUs', -}; -export class State extends Base { - public structure: Section[] = []; - public stat: DltStatisticInfo | undefined; - public summary: { - total: Summary; - selected: Summary; - } = { - total: new Summary(), - selected: new Summary(), - }; - - protected files(): string[] { - const files = this.observe.origin.files(); - if (files === undefined) { - throw new Error( - `Extra settings of DLT parser are available only for File and Concat origins`, - ); - } - return typeof files === 'string' ? [files] : files; - } - - protected filters(): Dlt.IFilters | undefined { - const parser = this.observe.parser.as(Dlt.Configuration); - if (parser === undefined) { - throw new Error(`Observe object uses not ${Dlt.Configuration.alias()} parser.`); - } - return parser.configuration.filter_config; - } - - public isStatLoaded(): boolean { - return this.stat !== undefined; - } - - public getSelectedEntities(): StatEntity[] { - let selected: StatEntity[] = []; - this.structure.forEach((section) => { - selected = selected.concat(section.getSelected()); - }); - return selected; - } - - public struct(): { - load(): Promise; - build(preselection?: Dlt.IFilters): void; - filter(value: string): void; - supported(): boolean; - } { - return { - supported: (): boolean => { - const parser = this.observe.parser.as(Dlt.Configuration); - return parser === undefined ? false : parser.configuration.with_storage_header; - }, - load: (): Promise => { - if (!this.struct().supported()) { - return Promise.resolve(); - } - return this.ref - .ilc() - .services.system.bridge.dlt() - .stat(this.files()) - .then((stat) => { - // this.tab.setTitle( - // this.files.length === 1 - // ? this.files[0].name - // : `${this.files.length} DLT files`, - // ); - this.stat = stat; - this.struct().build(this.filters()); - this.ref.detectChanges(); - }); - }, - build: (preselection?: Dlt.IFilters): void => { - if (!this.struct().supported()) { - return; - } - if (this.stat === undefined) { - return; - } - const stat = this.stat; - const structure: Section[] = []; - ['app_ids', 'context_ids', 'ecu_ids'].forEach((key: string) => { - const content: Array<[string, DltLevelDistribution]> = getTypedProp< - DltStatisticInfo, - Array<[string, DltLevelDistribution]> - >(stat, key); - const entities: StatEntity[] = content.map((record) => { - const entity = new StatEntity(record[0], key, record[1], this.matcher); - if ( - preselection !== undefined && - (preselection as any)[key] !== undefined - ) { - if ( - ((preselection as any)[key] as string[]).indexOf(record[0]) !== -1 - ) { - entity.select(); - } - } - return entity; - }); - structure.push(new Section(key, NAMES[key]).fill(entities)); - }); - this.structure = structure; - this.buildSummary().all(); - }, - filter: (value: string): void => { - if (!this.struct().supported()) { - return; - } - this.matcher.search(value); - this.structure.forEach((structure) => { - structure.entities.sort( - (a: StatEntity, b: StatEntity) => b.getScore() - a.getScore(), - ); - structure.update.emit(); - }); - }, - }; - } - - public buildSummary(): { - total(): void; - selected(): void; - all(): void; - } { - return { - total: (): void => { - this.summary.total.reset(); - this.structure.forEach((structure) => { - structure.entities.forEach((entity) => { - this.summary.total.inc(entity); - }); - }); - }, - selected: (): void => { - this.summary.selected.reset(); - this.structure.forEach((structure) => { - structure.entities.forEach((entity) => { - entity.selected && this.summary.selected.inc(entity); - }); - }); - const conf = this.observe.parser.as(Dlt.Configuration); - if (conf === undefined) { - return; - } - conf.setDefaultsFilterConfig(); - let app_id_count = 0; - let context_id_count = 0; - this.structure.forEach((structure) => { - if (structure.key === ENTITIES.app_ids) { - app_id_count = structure.entities.length; - } else if (structure.key === ENTITIES.context_ids) { - context_id_count = structure.entities.length; - } - const selected = structure.getSelected().map((f) => f.id); - if (selected.length === 0) { - (conf.configuration.filter_config as any)[structure.key] = undefined; - } else { - (conf.configuration.filter_config as any)[structure.key] = selected; - } - }); - if (conf.configuration.filter_config) { - conf.configuration.filter_config.app_id_count = app_id_count; - conf.configuration.filter_config.context_id_count = context_id_count; - } - }, - all: (): void => { - this.buildSummary().total(); - this.buildSummary().selected(); - }, - }; - } -} diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/component.ts b/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/component.ts deleted file mode 100644 index a958c96ce1..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/component.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { - Component, - ViewChild, - ChangeDetectorRef, - AfterViewInit, - AfterContentInit, - Input, - Output, - EventEmitter, - ViewEncapsulation, -} from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { MatSort } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; -import { StatEntity } from './statentity'; -import { Section } from './section'; -import { MatTable } from '@angular/material/table'; - -export const COLUMNS = { - id: 'id', - non_log: 'non_log', - log_fatal: 'log_fatal', - log_error: 'log_error', - log_warning: 'log_warning', - log_info: 'log_info', - log_debug: 'log_debug', - log_verbose: 'log_verbose', - log_invalid: 'log_invalid', -}; - -@Component({ - selector: 'app-el-dlt-extra-structure', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class DltExtraConfigurationStructure - extends ChangesDetector - implements AfterContentInit, AfterViewInit -{ - columns: string[] = [ - COLUMNS.id, - COLUMNS.log_fatal, - COLUMNS.log_error, - COLUMNS.log_warning, - COLUMNS.log_debug, - COLUMNS.log_info, - COLUMNS.log_verbose, - COLUMNS.non_log, - ]; - - @Input() section!: Section; - @Output() select: EventEmitter = new EventEmitter(); - - @ViewChild(MatSort) sort!: MatSort; - @ViewChild(MatTable) table!: MatTable; - - public data!: MatTableDataSource; - - constructor(cdRef: ChangeDetectorRef, private _sanitizer: DomSanitizer) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.data = new MatTableDataSource(this.section.entities); - this.env().subscriber.register( - this.section.update.subscribe(() => { - this.data.data = this.section.entities.filter((e: StatEntity) => !e.hidden()); - this.table.renderRows(); - this.detectChanges(); - }), - ); - } - - public ngAfterViewInit(): void { - this.data.sort = this.sort; - } - - public ngOnSortChange() { - this.detectChanges(); - this.table.renderRows(); - } - - public ngOnRowSelect(entity: StatEntity) { - entity.toggle(); - this.select.emit(entity); - this.detectChanges(); - } - - public safeHtml(html: string): SafeHtml { - return this._sanitizer.bypassSecurityTrustHtml(html); - } -} -export interface DltExtraConfigurationStructure extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/section.ts b/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/section.ts deleted file mode 100644 index 46180a6ae2..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/section.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Subject } from '@platform/env/subscription'; -import { StatEntity } from './statentity'; - -export class Section { - public key: string; - public name: string; - public update: Subject = new Subject(); - public entities: StatEntity[] = []; - - constructor(key: string, name: string) { - this.key = key; - this.name = name; - } - - public getSelected(): StatEntity[] { - return this.entities.filter((f) => f.selected); - } - - public fill(entities: StatEntity[]): Section { - this.entities = entities; - return this; - } -} diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/statentity.ts b/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/statentity.ts deleted file mode 100644 index fb2961ffc2..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/statentity.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { DltLevelDistribution } from '@platform/types/bindings'; -import { Matchee } from '@module/matcher'; - -import * as wasm from '@loader/wasm'; - -export class StatEntity extends Matchee { - public selected: boolean = false; - public id: string; - public parent: string; - public non_log: number; - public log_fatal: number; - public log_error: number; - public log_warning: number; - public log_info: number; - public log_debug: number; - public log_verbose: number; - public log_invalid: number; - - constructor(id: string, parent: string, from: DltLevelDistribution, matcher: wasm.Matcher) { - super(matcher, { id: id }); - this.id = id; - this.parent = parent; - this.non_log = from.non_log; - this.log_fatal = from.log_fatal; - this.log_error = from.log_error; - this.log_warning = from.log_warning; - this.log_info = from.log_info; - this.log_debug = from.log_debug; - this.log_verbose = from.log_verbose; - this.log_invalid = from.log_invalid; - } - - public html(): string { - const html: string | undefined = this.getHtmlOf('html_id'); - return html === undefined ? this.id : html; - } - - public hash(): string { - return `${this.parent}-${this.id}`; - } - - public equal(entity: StatEntity): boolean { - return entity.hash() === this.hash(); - } - - public toggle() { - this.selected = !this.selected; - } - - public select() { - this.selected = true; - } - - public unselect() { - this.selected = false; - } - - public hidden(): boolean { - return this.getScore() === 0; - } -} diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/styles.less b/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/styles.less deleted file mode 100644 index 9c0dd96e72..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/styles.less +++ /dev/null @@ -1,40 +0,0 @@ -@import '../../../../../../styles/variables.less'; - - -app-el-dlt-extra-structure { - position: relative; - display: block; - width: 100%; - & p.title { - margin: 8px 0 0px 16px; - color: var(--scheme-color-2); - font-size: 14px; - font-weight: 500; - } - & tr{ - position: relative; - &:hover { - background-color: var(--scheme-color-4)!important; - } - } - & tr[dataselected="true"] { - background: var(--scheme-color-active); - &::after { - position: absolute; - display: block; - content: ''; - width: 4px; - height: 100%; - background: var(--scheme-color-accent); - left: 0; - } - &:hover { - background-color: var(--scheme-color-active-75)!important; - } - } - & span.id{ - & > span { - background-color: var(--scheme-color-3); - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/template.html b/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/template.html deleted file mode 100644 index 605dd3223c..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/structure/template.html +++ /dev/null @@ -1,62 +0,0 @@ -

    {{section.name}}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - ID - - FATAL - {{element.log_fatal}} - ERROR - {{element.log_error}} - WARN - {{element.log_warning}} - DEBUG - {{element.log_debug}} - INFO - {{element.log_info}} - VERB - {{element.log_verbose}} - NON - {{element.non_log}}
    \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/styles.less b/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/styles.less deleted file mode 100644 index e813d7e1d2..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/styles.less +++ /dev/null @@ -1,116 +0,0 @@ -@import '../../../../../styles/variables.less'; - - -:host { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - & p.error { - color: var(--scheme-color-error-light); - text-align: center; - padding: 64px 0; - } - & app-transport { - margin-top: 12px; - } - & div.controlls { - text-align: right; - } - & h1 { - font-size: 14px; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } - & div.left { - position: absolute; - display: flex; - flex-direction: column; - top: 0; - bottom: 0; - left: 0; - right: 330px; - overflow: hidden; - justify-content: stretch; - justify-items: stretch; - & div.filter { - position: absolute; - z-index: 1000; - padding: 6px 12px; - background: var(--scheme-color-warning-light); - top: 6px; - right: 6px; - box-shadow: 3px 3px 3px rgb(0 0 0 / 40%); - border-radius: 3px; - } - & .fill { - overflow: auto; - } - & .section { - padding-top: 12px; - & mat-divider { - margin-top: -12px; - } - & .mat-standard-chip{ - min-height: 24px; - } - } - } - & div.right { - position: absolute; - width: 320px; - right: 6px; - bottom: 0; - top: 0; - overflow-y: auto; - overflow-x: hidden; - display: flex; - flex-direction: column; - & mat-divider.fibex-divider { - margin-top: 12px; - } - & div.fibex-controlls{ - position: relative; - width: 100%; - margin-top: 19px; - text-align: right; - } - & div.spacer { - flex: auto; - } - & app-tabs-source-actions { - position: sticky; - bottom: 0; - z-index: 1; - box-shadow: 0px 0px 16px rgba(0,0,0,0.4); - } - } - & .table-fill { - width: 100%; - } - & .info { - & .caption { - text-align: left; - padding-right: 12px; - } - & .value { - text-align: left; - } - } - - & div.progress { - margin-top: 24px; - & p { - text-align: center; - } - } - & .mat-progress-bar-fill::after { - background-color: var(--scheme-color-accent); - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/summary.ts b/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/summary.ts deleted file mode 100644 index 194eabc187..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/summary.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { StatEntity } from './structure/statentity'; - -export class Summary { - public fatal: number = 0; - public error: number = 0; - public warning: number = 0; - public info: number = 0; - public debug: number = 0; - public verbose: number = 0; - public invalid: number = 0; - public total: number = 0; - public count: number = 0; - - private _loaded: boolean = false; - - public isLoaded(): boolean { - return this._loaded; - } - - public inc(entity: StatEntity) { - this.fatal += entity.log_fatal; - this.error += entity.log_error; - this.warning += entity.log_warning; - this.info += entity.log_info; - this.debug += entity.log_debug; - this.verbose += entity.log_verbose; - this.invalid += entity.log_invalid; - this.total += - entity.log_fatal + - entity.log_error + - entity.log_warning + - entity.log_info + - entity.log_debug + - entity.log_verbose + - entity.log_invalid; - this.count += 1; - } - - public reset() { - this._loaded = true; - this.fatal = 0; - this.error = 0; - this.warning = 0; - this.info = 0; - this.debug = 0; - this.verbose = 0; - this.invalid = 0; - this.total = 0; - this.count = 0; - } -} diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/template.html b/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/template.html deleted file mode 100644 index 122c91d51d..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/dlt/template.html +++ /dev/null @@ -1,67 +0,0 @@ - - -

    - Cannot load statistics information because of an error: {{error}} -

    - -
    - -

    Scanning DLT structure...

    -
    -
    -

    - DLT structure scanning isn't supported for this type of source -

    -
    -
    - -

    - Summary ({{state.summary.total.count}} / {{state.summary.selected.count}}) -

    - - - - - - - - - - - - - - - - - - - - - - - -
    Fatal - {{state.summary.total.fatal}}
    {{state.summary.selected.fatal}} -
    Error - {{state.summary.total.error}}
    {{state.summary.selected.error}} -
    Debug - {{state.summary.total.debug}}
    {{state.summary.selected.debug}} -
    Info - {{state.summary.total.info}}
    {{state.summary.selected.info}} -
    Verbose - {{state.summary.total.verbose}}
    {{state.summary.selected.verbose}} -
    Invalid - {{state.summary.total.invalid}}
    {{state.summary.selected.invalid}} -
    Total - {{state.summary.total.total}} / {{state.summary.selected.total}} -
    -
    - -
    -
    diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/module.ts b/application/client/src/app/ui/tabs/observe/parsers/extra/module.ts deleted file mode 100644 index 311c764732..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { DltExtraConfigurationModule } from './dlt/module'; -import { SomeIpExtraConfigurationModule } from './someip/module'; -import { ParserExtraConfiguration } from './component'; -@NgModule({ - imports: [CommonModule, DltExtraConfigurationModule, SomeIpExtraConfigurationModule], - declarations: [ParserExtraConfiguration], - exports: [ - ParserExtraConfiguration, - DltExtraConfigurationModule, - SomeIpExtraConfigurationModule, - ], - bootstrap: [ParserExtraConfiguration], -}) -export class ParserExtraConfigurationModule {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/someip/component.ts b/application/client/src/app/ui/tabs/observe/parsers/extra/someip/component.ts deleted file mode 100644 index b3419cc4e7..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/someip/component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from './state'; -import { Observe } from '@platform/types/observe'; - -@Component({ - selector: 'app-el-someip-extra', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class SomeIpExtraConfiguration extends ChangesDetector implements AfterContentInit { - @Input() observe!: Observe; - - protected state!: State; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.state = new State(this.observe); - this.state.bind(this); - } -} -export interface SomeIpExtraConfiguration extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/someip/module.ts b/application/client/src/app/ui/tabs/observe/parsers/extra/someip/module.ts deleted file mode 100644 index c02e703ca4..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/someip/module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatListModule } from '@angular/material/list'; - -import { SomeIpExtraConfiguration } from './component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatProgressBarModule, - MatChipsModule, - MatIconModule, - MatFormFieldModule, - MatSelectModule, - MatListModule, - ], - declarations: [SomeIpExtraConfiguration], - exports: [SomeIpExtraConfiguration], - bootstrap: [SomeIpExtraConfiguration], -}) -export class SomeIpExtraConfigurationModule {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/someip/state.ts b/application/client/src/app/ui/tabs/observe/parsers/extra/someip/state.ts deleted file mode 100644 index 4579f844c7..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/someip/state.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { State as Base } from '../../state'; - -export class State extends Base {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/someip/styles.less b/application/client/src/app/ui/tabs/observe/parsers/extra/someip/styles.less deleted file mode 100644 index 4bd77884a2..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/someip/styles.less +++ /dev/null @@ -1,111 +0,0 @@ -@import '../../../../../styles/variables.less'; - - -:host { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - & app-transport { - margin-top: 12px; - } - & div.controlls { - text-align: right; - } - & h1 { - font-size: 14px; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } - & div.left { - position: absolute; - display: flex; - flex-direction: column; - top: 0; - bottom: 0; - left: 0; - right: 330px; - overflow: hidden; - justify-content: stretch; - justify-items: stretch; - & div.filter { - position: absolute; - z-index: 1000; - padding: 6px 12px; - background: var(--scheme-color-warning-light); - top: 6px; - right: 6px; - box-shadow: 3px 3px 3px rgb(0 0 0 / 40%); - border-radius: 3px; - } - & .fill { - overflow: auto; - } - & .section { - padding-top: 12px; - & mat-divider { - margin-top: -12px; - } - & .mat-standard-chip{ - min-height: 24px; - } - } - } - & div.right { - position: absolute; - width: 320px; - right: 6px; - bottom: 0; - top: 0; - overflow-y: auto; - overflow-x: hidden; - display: flex; - flex-direction: column; - & mat-divider.fibex-divider { - margin-top: 12px; - } - & div.fibex-controlls{ - position: relative; - width: 100%; - margin-top: 19px; - text-align: right; - } - & div.spacer { - flex: auto; - } - & app-tabs-source-actions { - position: sticky; - bottom: 0; - z-index: 1; - box-shadow: 0px 0px 16px rgba(0,0,0,0.4); - } - } - & .table-fill { - width: 100%; - } - & .info { - & .caption { - text-align: left; - padding-right: 12px; - } - & .value { - text-align: left; - } - } - - & div.progress { - margin-top: 24px; - & p { - text-align: center; - } - } - & .mat-progress-bar-fill::after { - background-color: var(--scheme-color-accent); - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/someip/template.html b/application/client/src/app/ui/tabs/observe/parsers/extra/someip/template.html deleted file mode 100644 index 139597f9cb..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/someip/template.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/styles.less b/application/client/src/app/ui/tabs/observe/parsers/extra/styles.less deleted file mode 100644 index be92722fb8..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/styles.less +++ /dev/null @@ -1,111 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - & app-transport { - margin-top: 12px; - } - & div.controlls { - text-align: right; - } - & h1 { - font-size: 14px; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } - & div.left { - position: absolute; - display: flex; - flex-direction: column; - top: 0; - bottom: 0; - left: 0; - right: 330px; - overflow: hidden; - justify-content: stretch; - justify-items: stretch; - & div.filter { - position: absolute; - z-index: 1000; - padding: 6px 12px; - background: var(--scheme-color-warning-light); - top: 6px; - right: 6px; - box-shadow: 3px 3px 3px rgb(0 0 0 / 40%); - border-radius: 3px; - } - & .fill { - overflow: auto; - } - & .section { - padding-top: 12px; - & mat-divider { - margin-top: -12px; - } - & .mat-standard-chip{ - min-height: 24px; - } - } - } - & div.right { - position: absolute; - width: 320px; - right: 6px; - bottom: 0; - top: 0; - overflow-y: auto; - overflow-x: hidden; - display: flex; - flex-direction: column; - & mat-divider.fibex-divider { - margin-top: 12px; - } - & div.fibex-controlls{ - position: relative; - width: 100%; - margin-top: 19px; - text-align: right; - } - & div.spacer { - flex: auto; - } - & app-tabs-source-actions { - position: sticky; - bottom: 0; - z-index: 1; - box-shadow: 0px 0px 16px rgba(0,0,0,0.4); - } - } - & .table-fill { - width: 100%; - } - & .info { - & .caption { - text-align: left; - padding-right: 12px; - } - & .value { - text-align: left; - } - } - - & div.progress { - margin-top: 24px; - & p { - text-align: center; - } - } - & .mat-progress-bar-fill::after { - background-color: var(--scheme-color-accent); - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/parsers/extra/template.html b/application/client/src/app/ui/tabs/observe/parsers/extra/template.html deleted file mode 100644 index ea14b75d8d..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/extra/template.html +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/component.ts b/application/client/src/app/ui/tabs/observe/parsers/general/component.ts deleted file mode 100644 index 71e961f332..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from '../state'; -import { State as GlobalState } from '../../state'; - -@Component({ - selector: 'app-el-parser-general', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class ParserGeneralConfiguration extends ChangesDetector implements AfterContentInit { - @Input() state!: State; - @Input() global!: GlobalState; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.state.bind(this); - } -} -export interface ParserGeneralConfiguration extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/dlt/component.ts b/application/client/src/app/ui/tabs/observe/parsers/general/dlt/component.ts deleted file mode 100644 index 2c97a1320c..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/dlt/component.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - AfterContentInit, - AfterViewInit, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { bytesToStr, timestampToUTC } from '@env/str'; -import { State } from './state'; -import { Observe } from '@platform/types/observe'; - -@Component({ - selector: 'app-el-dlt-general', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class DltGeneralConfiguration - extends ChangesDetector - implements AfterContentInit, AfterViewInit -{ - @Input() observe!: Observe; - - protected state!: State; - - public bytesToStr = bytesToStr; - public timestampToUTC = timestampToUTC; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.state = new State(this.observe); - this.state.bind(this); - } - - public ngAfterViewInit(): void { - this.state - .load() - .then(() => { - this.detectChanges(); - }) - .catch((err: Error) => { - this.log().error(`Fail to restore configuration with: ${err.message}`); - }); - } -} -export interface DltGeneralConfiguration extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/dlt/module.ts b/application/client/src/app/ui/tabs/observe/parsers/general/dlt/module.ts deleted file mode 100644 index c308db8a67..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/dlt/module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatListModule } from '@angular/material/list'; - -import { DltGeneralConfiguration } from './component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatProgressBarModule, - MatChipsModule, - MatIconModule, - MatFormFieldModule, - MatSelectModule, - MatListModule, - ], - declarations: [DltGeneralConfiguration], - exports: [DltGeneralConfiguration], - bootstrap: [DltGeneralConfiguration], -}) -export class DltGeneralConfigurationModule {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/dlt/state.ts b/application/client/src/app/ui/tabs/observe/parsers/general/dlt/state.ts deleted file mode 100644 index 56e340b9aa..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/dlt/state.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { File } from '@platform/types/files'; -import { Timezone } from '@elements/timezones/timezone'; -import { bridge } from '@service/bridge'; -import { components } from '@env/decorators/initial'; -import { State as Base } from '../../state'; -import { Observe } from '@platform/types/observe'; - -import * as Dlt from '@platform/types/observe/parser/dlt'; - -export class State extends Base { - public readonly LOG_LEVELS: { value: Dlt.LogLevel; caption: string }[] = [ - { value: Dlt.LogLevel.Fatal, caption: 'Fatal' }, - { value: Dlt.LogLevel.Error, caption: 'Error' }, - { value: Dlt.LogLevel.Warn, caption: 'Warn' }, - { value: Dlt.LogLevel.Info, caption: 'Info' }, - { value: Dlt.LogLevel.Debug, caption: 'Debug' }, - { value: Dlt.LogLevel.Verbose, caption: 'Verbose' }, - ]; - public fibex: File[] = []; - public timezone: Timezone | undefined; - public logLevel: Dlt.LogLevel = Dlt.LogLevel.Verbose; - - constructor(observe: Observe) { - super(observe); - } - - public async load(): Promise { - const conf = this.observe.parser.as(Dlt.Configuration); - if (conf === undefined) { - return; - } - const stored: string[] | string | undefined = conf.configuration.fibex_file_paths; - const paths: string[] = - stored === undefined - ? [] - : typeof stored === 'string' - ? [stored] - : stored.map((p) => p); - this.fibex = await bridge.files().getByPath(paths); - conf.configuration.filter_config !== undefined && - conf.configuration.filter_config.min_log_level !== undefined && - (this.logLevel = conf.configuration.filter_config.min_log_level); - const timezone = - conf.configuration.tz !== undefined ? Timezone.from(conf.configuration.tz) : undefined; - this.timezone = timezone instanceof Error ? undefined : timezone; - } - - public update(): State { - const conf = this.observe.parser.as(Dlt.Configuration); - if (conf === undefined) { - return this; - } - if (this.fibex.length !== 0) { - conf.configuration.fibex_file_paths = this.fibex.map((f) => f.filename); - } else { - conf.configuration.fibex_file_paths = undefined; - } - if (this.logLevel !== Dlt.LogLevel.Verbose) { - conf.setDefaultsFilterConfig(); - conf.configuration.filter_config!.min_log_level = this.logLevel; - } - conf.configuration.tz = this.timezone === undefined ? undefined : this.timezone.name; - return this; - } - - public addFibexFile() { - bridge - .files() - .select.custom('xml') - .then((files: File[]) => { - files = files.filter((added) => { - return ( - this.fibex.find((exist) => exist.filename === added.filename) === undefined - ); - }); - this.fibex = this.fibex.concat(files); - }) - .catch((err: Error) => { - this.ref.log().error(`Fail to open xml (fibex) file(s): ${err.message}`); - }) - .finally(() => { - this.update().ref.detectChanges(); - }); - } - - public removeFibex(file: File) { - this.fibex = this.fibex.filter((f) => f.filename !== file.filename); - this.update().ref.detectChanges(); - } - - public timezoneSelect() { - const subscription = this.ref - .ilc() - .services.ui.popup.open({ - component: { - factory: components.get('app-elements-timezone-selector'), - inputs: { - selected: (timezone: Timezone): void => { - if (timezone.name.toLowerCase().startsWith('utc')) { - this.timezone = undefined; - } else { - this.timezone = timezone; - } - this.update(); - this.ref.detectChanges(); - }, - }, - }, - closeOnKey: 'Escape', - width: 350, - uuid: 'app-elements-timezone-selector', - }) - .subjects.get() - .closed.subscribe(() => { - subscription.unsubscribe(); - }); - } -} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/dlt/styles.less b/application/client/src/app/ui/tabs/observe/parsers/general/dlt/styles.less deleted file mode 100644 index d28051537c..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/dlt/styles.less +++ /dev/null @@ -1,17 +0,0 @@ -@import '../../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - overflow: hidden; - & div.controlls { - text-align: right; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/dlt/template.html b/application/client/src/app/ui/tabs/observe/parsers/general/dlt/template.html deleted file mode 100644 index 89e1ea8ab8..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/dlt/template.html +++ /dev/null @@ -1,48 +0,0 @@ - - Log level - - - Select required level of logs - - - {{level.caption}} - - - - - - - Fibex - Attach fibex file (optional) - -
    - - - {{file.name}} - - - -
    - -
    - -
    -
    -
    - - Timezone - Select required timezone (optional). UTC is default - - - {{state.timezone.name}} ({{state.timezone.utc}}) - -
    - -
    -
    -
    diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/module.ts b/application/client/src/app/ui/tabs/observe/parsers/general/module.ts deleted file mode 100644 index 740831ef04..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { ErrorStateModule } from '../../error/module'; -import { DltGeneralConfigurationModule } from './dlt/module'; -import { SomeIpGeneralConfigurationModule } from './someip/module'; -import { TextGeneralConfigurationModule } from './text/module'; -import { ParserPluginGeneralConfigurationModule } from './plugin/module'; -import { ParserGeneralConfiguration } from './component'; - -@NgModule({ - imports: [ - CommonModule, - DltGeneralConfigurationModule, - SomeIpGeneralConfigurationModule, - TextGeneralConfigurationModule, - ParserPluginGeneralConfigurationModule, - ErrorStateModule, - ], - declarations: [ParserGeneralConfiguration], - exports: [ - ParserGeneralConfiguration, - DltGeneralConfigurationModule, - SomeIpGeneralConfigurationModule, - TextGeneralConfigurationModule, - ParserPluginGeneralConfigurationModule, - ErrorStateModule, - ], - bootstrap: [ParserGeneralConfiguration], -}) -export class ParserGeneralConfigurationModule {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/plugin/component.ts b/application/client/src/app/ui/tabs/observe/parsers/general/plugin/component.ts deleted file mode 100644 index e7192c6a2b..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/plugin/component.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - Component, - Input, - ChangeDetectorRef, - AfterContentInit, - AfterViewInit, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Observe } from '@platform/types/observe'; -import { State } from './state'; - -@Component({ - selector: 'app-el-parser-plugin-general', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class ParserPluginGeneralConfiguration - extends ChangesDetector - implements AfterContentInit, AfterViewInit -{ - @Input() observe!: Observe; - @Input() path!: string | undefined; - - protected state!: State; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngAfterContentInit(): void { - this.state = new State(this.observe, this.path); - this.state.bind(this); - this.env().subscriber.register( - this.observe.parser.subscribe(() => { - if (!this.path) { - return; - } - this.state.setPath(this.path); - }), - ); - } - - public update(): void { - this.state.update(); - } - - ngAfterViewInit(): void { - this.state.init(); - this.detectChanges(); - } -} - -export interface ParserPluginGeneralConfiguration extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/plugin/module.ts b/application/client/src/app/ui/tabs/observe/parsers/general/plugin/module.ts deleted file mode 100644 index 12bf08c02f..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/plugin/module.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; - -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatListModule } from '@angular/material/list'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatInputModule } from '@angular/material/input'; -import { ConfigSchmasModule } from '@ui/tabs/observe/config-schema/module'; -import { ParserPluginGeneralConfiguration } from './component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatChipsModule, - MatFormFieldModule, - MatSelectModule, - MatListModule, - ConfigSchmasModule, - MatCheckboxModule, - MatInputModule, - ], - declarations: [ParserPluginGeneralConfiguration], - exports: [ParserPluginGeneralConfiguration], - bootstrap: [ParserPluginGeneralConfiguration], -}) -export class ParserPluginGeneralConfigurationModule {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/plugin/state.ts b/application/client/src/app/ui/tabs/observe/parsers/general/plugin/state.ts deleted file mode 100644 index 7e7cf45f7b..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/plugin/state.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { State as Base } from '../../state'; -import { Observe } from '@platform/types/observe'; -import { plugins } from '@service/plugins'; -import { getSafeFileName } from '@platform/types/files'; -import { Subject } from '@platform/env/subscription'; - -import * as Plugin from '@platform/types/observe/parser/plugin'; -import { - PluginEntity, - PluginConfigSchemaItem, - PluginConfigValue, -} from '@platform/types/bindings/plugins'; - -export class State extends Base { - public parsers: PluginEntity[] = []; - public path: string | undefined; - public selectedParser?: PluginEntity; - public selected: Subject = new Subject(); - - constructor(observe: Observe, path: string | undefined) { - super(observe); - this.path = path; - } - - public init() { - const conf = this.observe.parser.as(Plugin.Configuration); - if (conf === undefined) { - this.ref.log().error(`Currnet parser configuration must match plugin parser`); - return; - } - this.parsers = plugins - .list() - .preload() - .filter((p) => p.plugin_type === 'Parser'); - - if (this.parsers.length > 0) { - this.selectedParser = this.path - ? this.parsers.find((p) => p.dir_path == this.path) - : this.parsers[0]; - this.update(); - } - } - - public setPath(path: string) { - this.path = path; - if (this.parsers.length > 0) { - this.selectedParser = this.path - ? this.parsers.find((p) => p.dir_path == this.path) - : this.parsers[0]; - this.update(); - } - } - - /** - * Saves the given value to the tab configurations - * @param id - ID of the configuration entry - * @param value - Value of the configuration - */ - public saveConfig(id: string, value: PluginConfigValue) { - const conf = this.observe.parser.as(Plugin.Configuration); - if (conf === undefined) { - this.ref.log().error(`Currnet parser configuration must match plugin parser`); - return; - } - - const item = conf.configuration.plugin_configs.find((item) => item.id === id); - if (item !== undefined) { - item.value = value; - } else { - conf.configuration.plugin_configs.push({ id, value }); - } - } - - /** - * Updates the configuration data for the parser in the current tab - */ - public update() { - const conf = this.observe.parser.as(Plugin.Configuration); - if (conf === undefined) { - return; - } - - const pluginPath = this.selectedParser?.info.wasm_file_path ?? ''; - - if (conf.configuration.plugin_path !== pluginPath) { - conf.configuration.plugin_path = pluginPath; - // Clear configurations on plugin change. - conf.configuration.plugin_configs = []; - } - this.selectedParser && this.selected.emit(this.selectedParser); - } - - public getPluginTitle(parser: PluginEntity): string { - return parser.metadata?.title ?? getSafeFileName(parser.dir_path); - } - - public getPluginConfigs(parser?: PluginEntity): PluginConfigSchemaItem[] { - return parser?.info.config_schemas ?? []; - } -} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/plugin/styles.less b/application/client/src/app/ui/tabs/observe/parsers/general/plugin/styles.less deleted file mode 100644 index 04f4051d5b..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/plugin/styles.less +++ /dev/null @@ -1,8 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - width: 100%; - overflow: hidden; -} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/plugin/template.html b/application/client/src/app/ui/tabs/observe/parsers/general/plugin/template.html deleted file mode 100644 index e689845ed8..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/plugin/template.html +++ /dev/null @@ -1,6 +0,0 @@ - - Configurations - - - - diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/someip/component.ts b/application/client/src/app/ui/tabs/observe/parsers/general/someip/component.ts deleted file mode 100644 index c446a49095..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/someip/component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { bytesToStr } from '@env/str'; -import { State } from './state'; -import { Observe } from '@platform/types/observe'; - -@Component({ - selector: 'app-el-someip-general', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class SomeIpGeneralConfiguration extends ChangesDetector implements AfterContentInit { - @Input() observe!: Observe; - - protected state!: State; - - public bytesToStr = bytesToStr; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.state = new State(this.observe); - this.state.bind(this); - } -} -export interface SomeIpGeneralConfiguration extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/someip/module.ts b/application/client/src/app/ui/tabs/observe/parsers/general/someip/module.ts deleted file mode 100644 index c7400a6791..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/someip/module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatSelectModule } from '@angular/material/select'; -import { MatListModule } from '@angular/material/list'; - -import { SomeIpGeneralConfiguration } from './component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatButtonModule, - MatCardModule, - MatDividerModule, - MatProgressBarModule, - MatChipsModule, - MatIconModule, - MatFormFieldModule, - MatSelectModule, - MatListModule, - ], - declarations: [SomeIpGeneralConfiguration], - exports: [SomeIpGeneralConfiguration], - bootstrap: [SomeIpGeneralConfiguration], -}) -export class SomeIpGeneralConfigurationModule {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/someip/state.ts b/application/client/src/app/ui/tabs/observe/parsers/general/someip/state.ts deleted file mode 100644 index 28a593ef44..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/someip/state.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { File } from '@platform/types/files'; -import { bridge } from '@service/bridge'; -import { State as Base } from '../../state'; - -import * as SomeIp from '@platform/types/observe/parser/someip'; - -export class State extends Base { - public fibex: File[] = []; - - public update(): State { - const conf = this.observe.parser.as(SomeIp.Configuration); - if (conf === undefined) { - return this; - } - if (this.fibex.length !== 0) { - conf.configuration.fibex_file_paths = this.fibex.map((f) => f.filename); - } else { - conf.configuration.fibex_file_paths = undefined; - } - return this; - } - - public addFibexFile() { - bridge - .files() - .select.custom('xml') - .then((files: File[]) => { - files = files.filter((added) => { - return ( - this.fibex.find((exist) => exist.filename === added.filename) === undefined - ); - }); - this.fibex = this.fibex.concat(files); - }) - .catch((err: Error) => { - this.ref.log().error(`Fail to open xml (fibex) file(s): ${err.message}`); - }) - .finally(() => { - this.update().ref.detectChanges(); - }); - } - - public removeFibex(file: File) { - this.fibex = this.fibex.filter((f) => f.filename !== file.filename); - this.update().ref.detectChanges(); - } -} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/someip/styles.less b/application/client/src/app/ui/tabs/observe/parsers/general/someip/styles.less deleted file mode 100644 index 684961bca9..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/someip/styles.less +++ /dev/null @@ -1,18 +0,0 @@ -@import '../../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - overflow: hidden; - & div.controlls { - text-align: right; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } - -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/someip/template.html b/application/client/src/app/ui/tabs/observe/parsers/general/someip/template.html deleted file mode 100644 index b25ae24971..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/someip/template.html +++ /dev/null @@ -1,24 +0,0 @@ - - Fibex - Attach fibex file (optional) - -
    - - - {{file.name}} - - - -
    - -
    - -
    -
    -
    - diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/styles.less b/application/client/src/app/ui/tabs/observe/parsers/general/styles.less deleted file mode 100644 index be92722fb8..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/styles.less +++ /dev/null @@ -1,111 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - & app-transport { - margin-top: 12px; - } - & div.controlls { - text-align: right; - } - & h1 { - font-size: 14px; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } - & div.left { - position: absolute; - display: flex; - flex-direction: column; - top: 0; - bottom: 0; - left: 0; - right: 330px; - overflow: hidden; - justify-content: stretch; - justify-items: stretch; - & div.filter { - position: absolute; - z-index: 1000; - padding: 6px 12px; - background: var(--scheme-color-warning-light); - top: 6px; - right: 6px; - box-shadow: 3px 3px 3px rgb(0 0 0 / 40%); - border-radius: 3px; - } - & .fill { - overflow: auto; - } - & .section { - padding-top: 12px; - & mat-divider { - margin-top: -12px; - } - & .mat-standard-chip{ - min-height: 24px; - } - } - } - & div.right { - position: absolute; - width: 320px; - right: 6px; - bottom: 0; - top: 0; - overflow-y: auto; - overflow-x: hidden; - display: flex; - flex-direction: column; - & mat-divider.fibex-divider { - margin-top: 12px; - } - & div.fibex-controlls{ - position: relative; - width: 100%; - margin-top: 19px; - text-align: right; - } - & div.spacer { - flex: auto; - } - & app-tabs-source-actions { - position: sticky; - bottom: 0; - z-index: 1; - box-shadow: 0px 0px 16px rgba(0,0,0,0.4); - } - } - & .table-fill { - width: 100%; - } - & .info { - & .caption { - text-align: left; - padding-right: 12px; - } - & .value { - text-align: left; - } - } - - & div.progress { - margin-top: 24px; - & p { - text-align: center; - } - } - & .mat-progress-bar-fill::after { - background-color: var(--scheme-color-accent); - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/template.html b/application/client/src/app/ui/tabs/observe/parsers/general/template.html deleted file mode 100644 index 41493effc4..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/template.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/text/component.ts b/application/client/src/app/ui/tabs/observe/parsers/general/text/component.ts deleted file mode 100644 index 5b989063ad..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/text/component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { Observe } from '@platform/types/observe'; - -@Component({ - selector: 'app-el-text-general', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class TextGeneralConfiguration { - @Input() observe!: Observe; -} -export interface TextGeneralConfiguration extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/text/module.ts b/application/client/src/app/ui/tabs/observe/parsers/general/text/module.ts deleted file mode 100644 index ed5b0df2df..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/text/module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; - -import { TextGeneralConfiguration } from './component'; - -@NgModule({ - imports: [CommonModule, MatCardModule, MatDividerModule], - declarations: [TextGeneralConfiguration], - exports: [TextGeneralConfiguration], - bootstrap: [TextGeneralConfiguration], -}) -export class TextGeneralConfigurationModule {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/text/styles.less b/application/client/src/app/ui/tabs/observe/parsers/general/text/styles.less deleted file mode 100644 index 2276da0bdd..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/text/styles.less +++ /dev/null @@ -1,9 +0,0 @@ -@import '../../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - width: 100%; - overflow: hidden; -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/parsers/general/text/template.html b/application/client/src/app/ui/tabs/observe/parsers/general/text/template.html deleted file mode 100644 index de35a517dc..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/general/text/template.html +++ /dev/null @@ -1,7 +0,0 @@ - - Plain text parser - -

    This parser doesn't require any kind of configuration

    -
    -
    - diff --git a/application/client/src/app/ui/tabs/observe/parsers/module.ts b/application/client/src/app/ui/tabs/observe/parsers/module.ts deleted file mode 100644 index 79fc31786b..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ParserGeneralConfigurationModule } from './general/module'; -import { ParserExtraConfigurationModule } from './extra/module'; - -@NgModule({ - imports: [CommonModule, ParserGeneralConfigurationModule, ParserExtraConfigurationModule], - declarations: [], - exports: [], - bootstrap: [], -}) -export class ParsersModule {} diff --git a/application/client/src/app/ui/tabs/observe/parsers/state.ts b/application/client/src/app/ui/tabs/observe/parsers/state.ts deleted file mode 100644 index afd24b19cc..0000000000 --- a/application/client/src/app/ui/tabs/observe/parsers/state.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Observe } from '@platform/types/observe'; -import { Holder } from '@module/matcher'; - -export class State extends Holder { - protected ref!: IlcInterface & ChangesDetector; - - constructor(public readonly observe: Observe) { - super(); - } - - public bind(ref: IlcInterface & ChangesDetector) { - this.ref = ref; - } -} diff --git a/application/client/src/app/ui/tabs/observe/state.ts b/application/client/src/app/ui/tabs/observe/state.ts deleted file mode 100644 index a79f5e0841..0000000000 --- a/application/client/src/app/ui/tabs/observe/state.ts +++ /dev/null @@ -1,347 +0,0 @@ -import { IList, Observe, Parser } from '@platform/types/observe'; -import { IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Subjects, Subject, Subscriber } from '@platform/env/subscription'; -import { File } from '@platform/types/files'; -import { bytesToStr } from '@env/str'; -import { Action } from './action'; -import { TabControls } from '@service/session'; -import { Notification } from '@ui/service/notifications'; -import { Locker, Level } from '@ui/service/lockers'; -import { PluginEntity } from '@platform/types/bindings'; - -import * as StreamOrigin from '@platform/types/observe/origin/stream/index'; -import * as Origin from '@platform/types/observe/origin/index'; -import * as FileOrigin from '@platform/types/observe/origin/file'; -import * as ConcatOrigin from '@platform/types/observe/origin/concat'; -import * as Parsers from '@platform/types/observe/parser'; -import * as Streams from '@platform/types/observe/origin/stream/index'; -import { plugins } from '@service/plugins'; - -export interface IApi { - finish(observe: Observe): Promise; - cancel(): void; - tab(): TabControls; -} - -export interface IInputs { - observe: Observe; - api: IApi; -} - -export class WrappedParserRef { - constructor(protected readonly inner: Parser.Reference | PluginEntity) {} - - private as_embedded(): Parser.Reference | undefined { - if (typeof (this.inner as any)['alias'] === 'function') { - return this.inner as Parser.Reference; - } - return undefined; - } - - private as_plugin(): PluginEntity | undefined { - if (typeof (this.inner as any)['dir_path'] === 'string') { - return this.inner as PluginEntity; - } - return undefined; - } - - public desc(): IList { - const embedded = this.as_embedded(); - if (embedded !== undefined) { - return embedded.desc(); - } - const plugin = this.as_plugin(); - if (plugin !== undefined) { - return { - major: plugin.metadata.title, - minor: plugin.metadata.description - ? plugin.metadata.description - : plugin.metadata.title, - icon: undefined, - }; - } - throw new Error(`Fail to process ${JSON.stringify(this.inner)}`); - } - public alias(): Parser.Protocol | string { - const embedded = this.as_embedded(); - if (embedded !== undefined) { - return embedded.alias(); - } - const plugin = this.as_plugin(); - if (plugin !== undefined) { - return plugin.dir_path; - } - throw new Error(`Fail to process ${JSON.stringify(this.inner)}`); - } -} - -export class State extends Subscriber { - public parser: Parser.Protocol | string | undefined; - public parsers: { ref: WrappedParserRef; disabled: boolean }[] = []; - public streams: { ref: StreamOrigin.Reference; disabled: boolean }[] = []; - public file: File | undefined; - public concat: File[] | undefined; - public stream: StreamOrigin.Source | undefined; - public size: string | undefined; - public action: Action = new Action(); - public updates: Subjects<{ - parser: Subject; - stream: Subject; - }> = new Subjects({ - parser: new Subject(), - stream: new Subject(), - }); - - constructor( - protected readonly ref: IlcInterface & ChangesDetector & { api: IApi }, - public readonly observe: Observe, - ) { - super(); - this.update().stream(); - this.update().files(); - this.update().parser(); - this.update().validate(); - this.update().action(); - this.register( - this.action.subjects.get().updated.subscribe(() => { - this.ref.markChangesForCheck(); - }), - this.action.subjects.get().apply.subscribe(() => { - this.finish(); - }), - this.observe.subscribe(() => { - this.update().validate(); - this.update().action(); - }), - ); - } - - public destroy() { - this.updates.destroy(); - this.unsubscribe(); - } - - public finish() { - if (this.action.disabled) { - return; - } - this.action.applied(); - this.ref.api.finish(this.observe).catch((err: Error) => { - this.ref - .ilc() - .services.ui.lockers.lock( - new Locker(true, err.message).set().type(Level.error).spinner(false).end(), - { - closable: true, - closeOnKey: 'Escape', - closeOnBGClick: true, - }, - ); - this.ref.ilc().services.ui.notifications.store( - new Notification({ - message: err.message, - actions: [], - }), - ); - }); - } - - public cancel() { - this.ref.api.cancel(); - } - - public getParser(): { - embedded(): Parser.Protocol | undefined; - pluginPath(): string | undefined; - } { - return { - embedded: (): Parser.Protocol | undefined => { - if (!this.parser) { - return undefined; - } - const embedded = Parser.tryAsEmbedded(this.parser); - return embedded ? embedded : undefined; - }, - pluginPath: (): string | undefined => { - if (!this.parser) { - return undefined; - } - return Parser.tryAsEmbedded(this.parser) ? undefined : (this.parser as string); - }, - }; - } - - public update(): { - stream(): void; - files(): void; - parser(): void; - validate(): void; - action(): void; - } { - return { - stream: (): void => { - const prev = this.stream; - const nature = this.observe.origin.nature(); - if ( - nature instanceof Origin.File.Configuration || - nature instanceof Origin.Concat.Configuration || - nature instanceof Origin.Plugin.Configuration - ) { - this.streams = []; - this.stream = undefined; - } else { - this.streams = this.observe.parser.getSupportedStream().map((ref) => { - return { ref, disabled: false }; - }); - if (this.stream === undefined) { - this.stream = nature.alias(); - } else { - const current = this.stream; - this.stream = - current !== undefined && - this.streams.find((p) => p.ref.alias() === current) !== undefined - ? current - : this.streams[0].ref.alias(); - } - this.streams.push( - ...Streams.getAllRefs() - .filter( - (ref) => - this.streams.find((p) => p.ref.alias() === ref.alias()) === - undefined, - ) - .map((ref) => { - return { ref, disabled: true }; - }), - ); - } - this.ref.markChangesForCheck(); - prev !== this.stream && this.updates.get().stream.emit(); - }, - files: (): void => { - const instance = this.observe.origin.instance; - const files: string[] | undefined = - instance instanceof FileOrigin.Configuration - ? [instance.filename()] - : instance instanceof ConcatOrigin.Configuration - ? instance.files() - : undefined; - if (files === undefined) { - return; - } - this.ref - .ilc() - .services.system.bridge.files() - .getByPath(files) - .then((files: File[]) => { - this.size = bytesToStr( - files - .map((f) => f.stat.size) - .reduce((partialSum, a) => partialSum + a, 0), - ); - if (instance instanceof FileOrigin.Configuration) { - if (files.length !== 1) { - this.ref - .log() - .error( - `Expecting only 1 file stats. Has been gotten: ${files.length}`, - ); - return; - } - this.file = files[0]; - } else if (instance instanceof ConcatOrigin.Configuration) { - this.concat = files; - } - }) - .catch((err: Error) => { - this.ref - .log() - .error( - `Fail to get stats for files: ${files.join(', ')}: ${err.message}`, - ); - }) - .finally(() => { - this.ref.markChangesForCheck(); - }); - }, - parser: (): void => { - const current = this.parser; - this.parsers = [ - ...this.observe.origin - .getSupportedParsers() - .filter((ref) => ref.alias() !== Parser.Protocol.Plugin) - .map((ref) => { - return { ref: new WrappedParserRef(ref), disabled: false }; - }), - ...plugins - .list() - .preload() - .filter((ref) => ref.plugin_type === 'Parser') - .map((ref) => { - return { ref: new WrappedParserRef(ref), disabled: false }; - }), - ]; - this.parser = - current !== undefined && - this.parsers.find((p) => p.ref.alias() === current) !== undefined - ? current - : this.parsers[0].ref.alias(); - this.parsers.push( - ...Parsers.getAllRefs() - .filter( - (ref) => - this.parsers.find((p) => p.ref.alias() === ref.alias()) === - undefined && ref.inited(), - ) - .map((ref) => { - return { ref: new WrappedParserRef(ref), disabled: true }; - }), - ); - this.ref.markChangesForCheck(); - current !== this.parser && this.updates.get().parser.emit(); - }, - validate: (): void => { - const error = this.observe.validate(); - this.action.setDisabled(error instanceof Error); - }, - action: (): void => { - this.action.setCaption(this.observe.origin.desc().action); - }, - }; - } - - public change(): { - stream(): void; - parser(): void; - } { - return { - stream: (): void => { - if (this.stream === undefined) { - this.ref.log().error(`Stream cannot be changed, because it's undefined`); - return; - } - const instance = this.observe.origin.instance; - if (!(instance instanceof Origin.Stream.Configuration)) { - this.ref.log().error(`Stream cannot be changed, because origin isn't Stream`); - return; - } - instance.change(StreamOrigin.getByAlias(this.stream)); - this.updates.get().stream.emit(); - this.update().parser(); - }, - parser: (): void => { - if (this.parser === undefined) { - this.ref.log().error(`Parser cannot be changed, because it's undefined`); - return; - } - const alias = Parser.tryAsEmbedded(this.parser); - this.observe.parser.change( - Parser.getByAlias(alias ? alias : Parser.Protocol.Plugin), - ); - this.updates.get().parser.emit(); - this.update().stream(); - }, - }; - } -} diff --git a/application/client/src/app/ui/tabs/observe/styles.less b/application/client/src/app/ui/tabs/observe/styles.less deleted file mode 100644 index 7b24c33a16..0000000000 --- a/application/client/src/app/ui/tabs/observe/styles.less +++ /dev/null @@ -1,74 +0,0 @@ -@import '../../styles/variables.less'; - - -:host { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - & div.preset-container { - top: 48px; - bottom: 0px; - height: auto; - } - & div.title { - position: absolute; - display: flex; - flex-direction: row; - align-items: center; - left:0; - right: 0; - padding: 0 8px; - background: var(--scheme-color-5); - box-shadow: 0 3px 3px rgba(0,0,0,0.4); - height: 48px; - overflow: hidden; - & *.entity { - display: flex; - flex-direction: row; - align-items: center; - left:0; - right: 0; - padding: 0 8px; - background: var(--scheme-color-5); - height: 48px; - &.filler { - flex: auto; - width: 100%; - margin: 0; - justify-content: end; - } - &.info { - color: var(--scheme-color-2); - white-space: nowrap; - align-items: center; - flex: auto; - width: 100%; - overflow: hidden; - text-overflow: ellipsis; - & span { - margin-left: 8px; - } - } - & button { - position: relative; - display: inline-block; - margin: 0 16px 0 0; - margin-bottom: 0!important; - &:last-child { - margin-right: 0; - } - } - & p.info { - color: var(--scheme-color-2); - white-space: nowrap; - } - } - & > * { - margin: 0 8px; - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/observe/template.html b/application/client/src/app/ui/tabs/observe/template.html deleted file mode 100644 index 7400d0a98a..0000000000 --- a/application/client/src/app/ui/tabs/observe/template.html +++ /dev/null @@ -1,35 +0,0 @@ -
    -

    {{state.file.name}}({{state.size}})

    -

    Concating:{{state.concat.length}}files({{state.size}})

    -
    -

    Stream From:

    - - - - {{stream.ref.desc().major}} - - - -
    -
    -

    Used Parser:

    - - - - {{parser.ref.desc().major}} - - - -
    -
    - - -
    -
    -
    -
    - - - -
    -
    diff --git a/application/client/src/app/ui/tabs/plugins/component.ts b/application/client/src/app/ui/tabs/plugins/component.ts deleted file mode 100644 index 3a6d81e2f6..0000000000 --- a/application/client/src/app/ui/tabs/plugins/component.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Component, ChangeDetectorRef, AfterContentInit, OnDestroy } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Provider } from './provider'; -import { Target } from './list/component'; -import { bridge } from '@service/bridge'; -import { Notification, notifications } from '@ui/service/notifications'; -import { error } from '@platform/log/utils'; - -@Component({ - selector: 'app-tabs-plugins-manager', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class PluginsManager extends ChangesDetector implements AfterContentInit, OnDestroy { - public provider: Provider = new Provider(); - public get Target(): typeof Target { - return Target; - } - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnDestroy(): void { - this.provider.destroy(); - } - - public ngAfterContentInit(): void { - this.env().subscriber.register( - this.provider.subjects.get().state.subscribe(() => { - this.detectChanges(); - }), - this.provider.subjects.get().selected.subscribe(() => { - this.detectChanges(); - }), - this.provider.subjects.get().add.subscribe(() => { - this.detectChanges(); - }), - this.provider.subjects.get().remove.subscribe(() => { - this.detectChanges(); - }), - ); - this.provider.load(); - } - - public async reload() { - if (this.provider.isBusy()) { - return; - } - await this.provider.load(true); - } - - public async addPlugin() { - if (this.provider.isBusy()) { - return; - } - try { - const folder = await bridge.folders().select(); - if (folder.length === 0) { - return; - } - await this.provider.addPlugin(folder[0]); - this.reload(); - notifications.notify( - new Notification({ - message: `New plugin has been added`, - actions: [], - }), - ); - } catch (err) { - notifications.notify( - new Notification({ - message: this.log().error(`Fail to add plugin: ${error(err)}`), - actions: [], - pinned: true, - }), - ); - } - } -} - -export interface PluginsManager extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/plugins/desc.ts b/application/client/src/app/ui/tabs/plugins/desc.ts deleted file mode 100644 index 75c49618e7..0000000000 --- a/application/client/src/app/ui/tabs/plugins/desc.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { PluginEntity, InvalidPluginEntity } from '@platform/types/bindings/plugins'; -import { bridge } from '@service/bridge'; -import { ParsedPath } from '@platform/types/files'; - -export abstract class PluginDescription { - public name: string = ''; - public desc: string = ''; - public icon: string = ''; - public path: ParsedPath | undefined; - public readmePath: string | undefined; - - protected abstract getName(): string; - protected abstract getDesc(): string; - protected abstract getIcon(): string; - protected abstract getReadmePath(): string | undefined; - - protected update() { - this.icon = this.getIcon(); - this.name = this.getName(); - this.desc = this.getDesc(); - this.readmePath = this.getReadmePath(); - } - - public abstract getPath(): string; - public abstract isValid(): boolean; - - public load(): Promise { - return bridge - .files() - .name(this.getPath()) - .then((path: ParsedPath) => { - this.path = path; - this.update(); - }); - } -} - -export class InstalledPluginDesc extends PluginDescription { - constructor(public readonly entity: PluginEntity) { - super(); - } - protected override getIcon(): string { - switch (this.entity.plugin_type) { - case 'Parser': - return 'swap_vert'; - case 'ByteSource': - return 'input'; - } - } - protected override getName(): string { - if (!this.entity.metadata && !this.path) { - return this.entity.dir_path; - } else if (!this.entity.metadata && this.path) { - return this.path.name; - } else if (this.entity.metadata) { - return this.entity.metadata.title; - } else { - return this.entity.dir_path; - } - } - protected override getDesc(): string { - if (!this.entity.metadata && !this.path) { - return this.entity.dir_path; - } else if (!this.entity.metadata && this.path) { - return this.path.name; - } else if (this.entity.metadata && this.entity.metadata.description) { - return this.entity.metadata.description; - } else { - return this.entity.dir_path; - } - } - public override getPath(): string { - return this.entity.dir_path; - } - public override getReadmePath(): string | undefined { - return this.entity.readme_path ?? undefined; - } - public override isValid(): boolean { - return true; - } -} - -export class InvalidPluginDesc extends PluginDescription { - constructor(public readonly entity: InvalidPluginEntity) { - super(); - } - protected override getIcon(): string { - switch (this.entity.plugin_type) { - case 'Parser': - return 'swap_vert'; - case 'ByteSource': - return 'input'; - } - } - protected override getName(): string { - if (!this.path) { - return this.entity.dir_path; - } else { - return this.path.name; - } - } - protected override getDesc(): string { - if (!this.path) { - return this.entity.dir_path; - } else { - return this.path.name; - } - } - public override getPath(): string { - return this.entity.dir_path; - } - public override getReadmePath(): string | undefined { - return undefined; - } - public override isValid(): boolean { - return false; - } -} diff --git a/application/client/src/app/ui/tabs/plugins/details/component.ts b/application/client/src/app/ui/tabs/plugins/details/component.ts deleted file mode 100644 index 29876330b7..0000000000 --- a/application/client/src/app/ui/tabs/plugins/details/component.ts +++ /dev/null @@ -1,302 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - ViewChild, - ElementRef, - AfterViewInit, - AfterContentInit, - OnDestroy, -} from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { micromark } from 'micromark'; -import { PluginDescription } from '../desc'; -import { Provider } from '../provider'; -import { PluginRunData, PluginLogLevel } from '@platform/types/bindings/plugins'; -import { lockers, Locker } from '@ui/service/lockers'; -import { Notification, notifications } from '@ui/service/notifications'; - -import * as dom from '@ui/env/dom'; - -enum Tab { - ReadMe, - Inspecting, -} - -interface ParsedLogMessage { - msg: string; - dt: string; - level: PluginLogLevel; -} - -@Component({ - selector: 'app-plugins-manager-details', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class Details extends ChangesDetector implements AfterViewInit, AfterContentInit, OnDestroy { - @Input() public provider!: Provider; - @Input() public plugin!: PluginDescription; - - @ViewChild('content') contentRef!: ElementRef; - - public get Tab(): typeof Tab { - return Tab; - } - public readme: SafeHtml = ''; - public logs: ParsedLogMessage[] = []; - public loading: { - readme: boolean; - logs: boolean; - } = { - readme: false, - logs: false, - }; - public tab: Tab = Tab.ReadMe; - public stats: { - errors: number; - warns: number; - } = { - errors: 0, - warns: 0, - }; - - protected async fetchReadMe(): Promise { - const drop = () => { - this.loading.readme = false; - this.readme = ''; - this.detectChanges(); - }; - if (this.loading.readme) { - return; - } - this.loading.readme = true; - this.links().unbind(); - this.detectChanges(); - if (!this.plugin.path) { - return drop(); - } - if (this.plugin.readmePath !== undefined) { - this.provider - .readme(this.plugin.readmePath) - .then((content: string | undefined) => { - if (content !== undefined) { - this.readme = this.sanitizer.bypassSecurityTrustHtml(micromark(content)); - this.detectChanges(); - this.links().bind(); - } else { - drop(); - } - }) - .catch((err: Error) => { - this.log().error(`Fail to read "${this.plugin.getPath()}": ${err.message}`); - this.readme = ''; - }) - .finally(() => { - this.loading.readme = false; - this.detectChanges(); - }); - } else { - drop(); - } - } - - protected fetchRunData() { - if (this.loading.logs) { - return; - } - this.loading.logs = true; - this.logs = []; - this.detectChanges(); - this.provider - .getRunData(this.plugin.getPath()) - .then((rd: PluginRunData | undefined) => { - if (rd !== undefined) { - this.stats.errors = 0; - this.stats.warns = 0; - this.logs = rd.logs.map((log) => { - this.stats.errors += log.level === 'Err' ? 1 : 0; - this.stats.warns += log.level === 'Warn' ? 1 : 0; - return { - msg: log.msg, - level: log.level, - dt: new Date(Number(log.timestamp)).toLocaleTimeString(), - }; - }); - } - }) - .catch((err: Error) => { - this.log().error(`Fail fetch run data: ${err.message}`); - }) - .finally(() => { - this.loading.logs = false; - this.detectChanges(); - }); - } - - protected links(): { - bind(): void; - unbind(): void; - } { - return { - bind: (): void => { - if (!this.contentRef) { - return; - } - const links = this.contentRef.nativeElement.querySelectorAll('a'); - if (links === null) { - return; - } - links.forEach((link: HTMLAnchorElement) => { - link.addEventListener('click', this.redirect); - }); - }, - unbind: (): void => { - if (!this.contentRef) { - return; - } - const links = this.contentRef.nativeElement.querySelectorAll('a'); - if (links === null) { - return; - } - links.forEach((link: HTMLAnchorElement) => { - link.removeEventListener('click', this.redirect); - }); - }, - }; - } - - protected safeLoad(): void { - this.fetchReadMe() - .catch((err: Error) => { - this.log().error(`Fail to load plugin's details: ${err.message}`); - }) - .finally(() => { - if (!this.plugin.isValid()) { - this.goto().inspect(); - } else { - this.goto().readme(); - } - }); - this.fetchRunData(); - } - - protected redirect(event: MouseEvent): void { - dom.stop(event); - // TODO: safe openening URL - } - - constructor( - cdRef: ChangeDetectorRef, - protected readonly sanitizer: DomSanitizer, - ) { - super(cdRef); - } - - public ngAfterViewInit(): void { - this.safeLoad(); - } - - public ngAfterContentInit(): void { - this.env().subscriber.register( - this.provider.subjects.get().selected.subscribe(() => { - this.safeLoad(); - }), - ); - } - - public ngOnDestroy(): void { - this.links().unbind(); - } - - public isLoading(): boolean { - return this.loading.logs || this.loading.readme; - } - - public goto(): { readme(): void; inspect(): void } { - return { - readme: (): void => { - this.tab = Tab.ReadMe; - this.detectChanges(); - this.links().bind(); - }, - inspect: (): void => { - this.links().unbind(); - this.tab = Tab.Inspecting; - this.fetchRunData(); - }, - }; - } - - public removePlugin() { - if (this.plugin.path === undefined) { - return; - } - const confirm = lockers.lock( - new Locker( - false, - `Are you sure you want to permanently remove '${this.plugin.name}' plugin?`, - ) - .set() - .buttons([ - { - caption: 'Remove', - handler: () => { - confirm.popup.close(); - this.doRemovePlugin(); - }, - }, - { - caption: 'Cancel', - handler: () => { - confirm.popup.close(); - }, - }, - ]) - .end(), - { - closable: false, - }, - ); - } - - doRemovePlugin() { - if (this.plugin.path === undefined) { - return; - } - - const lock = lockers.lock(new Locker(true, `Removing plugin...`), { - closable: false, - }); - this.provider - .removePlugin(this.plugin.path.filename) - .then(() => { - notifications.notify( - new Notification({ - message: `Plugin has been removed`, - actions: [], - }), - ); - }) - .catch((err: Error) => { - notifications.notify( - new Notification({ - message: `Fail to remove plugin: ${err.message}`, - actions: [], - pinned: true, - }), - ); - }) - .finally(() => { - lock.popup.close(); - }); - } -} - -export interface Details extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/plugins/details/styles.less b/application/client/src/app/ui/tabs/plugins/details/styles.less deleted file mode 100644 index c51817b0ea..0000000000 --- a/application/client/src/app/ui/tabs/plugins/details/styles.less +++ /dev/null @@ -1,98 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: absolute; - display: flex; - flex-direction: column; - top: 12px; - left: 12px; - bottom: 12px; - right: 12px; - overflow: hidden; - & div.info { - position: relative; - margin: 0 6px 12px 0; - & p { - text-align: left; - } - } - & div.actions { - position: relative; - display: flex; - margin: 0 0 12px 0; - flex-direction: row; - justify-content: end; - & button.selected { - &::after { - position: absolute; - display: block; - content: ''; - height: 2px; - bottom: 0; - width: 100%; - left: 0px; - background-color: var(--scheme-color-accent); - } - } - & button { - & span.stats { - position: relative; - display: inline-block; - font-size: 12px; - line-height: 0px; - margin: -8px 0 0 6px; - &.err { - color: var(--scheme-color-error); - } - &.warns { - color: var(--scheme-color-warning); - } - } - } - & button[disabled] { - &:hover { - background: none; - } - color: var(--scheme-color-3); - } - } - & div.readme { - position: relative; - overflow-y: auto; - overflow-x: hidden; - flex: auto; - } - & ul.logs { - position: relative; - list-style: none; - padding: 0; - margin: 0; - & li { - position: relative; - font-family: 'console', monospace; - font-size: 13.5px; - font-variant-numeric: tabular-nums; - display: flex; - flex-direction: row; - & span { - margin-right: 12px; - } - & span.dt { - min-width: 70px; - } - & span.level { - min-width: 40px; - } - &.Info, - &.Debug { - color: var(--scheme-color-1); - } - &.Err { - color: var(--scheme-color-error-light); - } - &.Warn { - color: var(--scheme-color-warning-light); - } - } - } -} diff --git a/application/client/src/app/ui/tabs/plugins/details/template.html b/application/client/src/app/ui/tabs/plugins/details/template.html deleted file mode 100644 index b13c192fc9..0000000000 --- a/application/client/src/app/ui/tabs/plugins/details/template.html +++ /dev/null @@ -1,50 +0,0 @@ -
    -

    {{plugin.name}}

    -

    {{plugin.desc}}

    -
    -
    - - - - -
    -
    - - - - -
    -

    - Seems this plugins doesn't have yet any kind of description. -

    -
    - -
      -
    • - {{log.dt}}{{log.level}}{{log.msg}} -
    • -
    -
    -
    diff --git a/application/client/src/app/ui/tabs/plugins/list/component.ts b/application/client/src/app/ui/tabs/plugins/list/component.ts deleted file mode 100644 index e3a8c90995..0000000000 --- a/application/client/src/app/ui/tabs/plugins/list/component.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Component, ChangeDetectorRef, AfterContentInit, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Provider } from '../provider'; -import { PluginDescription } from '../desc'; - -export enum Target { - Installed, - Invalid, - Available, -} - -@Component({ - selector: 'app-plugins-manager-list', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class List extends ChangesDetector implements AfterContentInit { - @Input() public provider!: Provider; - @Input() public target!: Target; - - public plugins: PluginDescription[] = []; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.env().subscriber.register( - this.provider.subjects.get().load.subscribe(() => { - this.update(); - }), - this.provider.subjects.get().state.subscribe(() => { - this.update(); - }), - ); - } - - public getTitle(): string { - switch (this.target) { - case Target.Installed: - return 'Installed Plugins'; - case Target.Invalid: - return 'Invalid Plugins'; - case Target.Available: - return 'Available Plugins'; - } - } - - protected update() { - switch (this.target) { - case Target.Installed: - this.plugins = this.provider.get().installed(); - break; - case Target.Invalid: - this.plugins = this.provider.get().invalid(); - break; - case Target.Available: - this.plugins = this.provider.get().available(); - break; - } - this.detectChanges(); - } -} - -export interface List extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/plugins/list/styles.less b/application/client/src/app/ui/tabs/plugins/list/styles.less deleted file mode 100644 index 4a9052cb3b..0000000000 --- a/application/client/src/app/ui/tabs/plugins/list/styles.less +++ /dev/null @@ -1,8 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - display: block; - width: 100%; - overflow: hidden; -} diff --git a/application/client/src/app/ui/tabs/plugins/list/template.html b/application/client/src/app/ui/tabs/plugins/list/template.html deleted file mode 100644 index c657168792..0000000000 --- a/application/client/src/app/ui/tabs/plugins/list/template.html +++ /dev/null @@ -1,18 +0,0 @@ - - {{getTitle()}} - - - - - - - - -

    No plugins

    -
    -
    -
    diff --git a/application/client/src/app/ui/tabs/plugins/module.ts b/application/client/src/app/ui/tabs/plugins/module.ts deleted file mode 100644 index b1b85c0bad..0000000000 --- a/application/client/src/app/ui/tabs/plugins/module.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatCardModule } from '@angular/material/card'; -import { MatButtonModule } from '@angular/material/button'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatIconModule } from '@angular/material/icon'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; - -import { PluginsManager } from './component'; -import { List } from './list/component'; -import { Plugin } from './plugin/component'; -import { Details } from './details/component'; - -@NgModule({ - imports: [ - CommonModule, - MatCardModule, - MatButtonModule, - MatProgressBarModule, - MatIconModule, - MatProgressSpinnerModule, - ], - declarations: [PluginsManager, Plugin, List, Details], - exports: [PluginsManager], - bootstrap: [PluginsManager], -}) -export class PluginsManagerModule {} diff --git a/application/client/src/app/ui/tabs/plugins/plugin/component.ts b/application/client/src/app/ui/tabs/plugins/plugin/component.ts deleted file mode 100644 index 55fdfc2e63..0000000000 --- a/application/client/src/app/ui/tabs/plugins/plugin/component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Component, ChangeDetectorRef, Input, HostListener, HostBinding } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { PluginDescription } from '../desc'; -import { Provider } from '../provider'; - -@Component({ - selector: 'app-plugins-manager-plugin', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class Plugin extends ChangesDetector { - @Input() public provider!: Provider; - @Input() public plugin!: PluginDescription; - - @HostListener('click', ['$event']) onClick(_event: MouseEvent) { - this.provider.select(this.plugin.getPath()); - } - @HostBinding('class') get getClass() { - return !this.provider.selected - ? '' - : this.provider.selected.getPath() === this.plugin.getPath() - ? 'selected' - : ''; - } - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } -} - -export interface Plugin extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/plugins/plugin/styles.less b/application/client/src/app/ui/tabs/plugins/plugin/styles.less deleted file mode 100644 index e2e6f2b631..0000000000 --- a/application/client/src/app/ui/tabs/plugins/plugin/styles.less +++ /dev/null @@ -1,36 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - align-items: center; - flex-direction: row; - cursor: default; - &.selected { - &::after { - position: absolute; - content: ''; - height: 100%; - left: -2px; - width: 2px; - background: var(--scheme-color-accent); - } - } - & div.icon { - & mat-icon { - font-size: 18px; - height: 16px; - } - } - & div.info { - flex: 1; - margin: 0 6px; - overflow: hidden; - & p { - text-align: left; - } - } - &:hover { - background: var(--scheme-color-3-75); - } -} diff --git a/application/client/src/app/ui/tabs/plugins/plugin/template.html b/application/client/src/app/ui/tabs/plugins/plugin/template.html deleted file mode 100644 index f6193c6de0..0000000000 --- a/application/client/src/app/ui/tabs/plugins/plugin/template.html +++ /dev/null @@ -1,10 +0,0 @@ -
    - {{plugin.icon}} -
    -
    -

    {{plugin.name}}

    -

    {{plugin.desc}}

    -
    -
    - menu -
    diff --git a/application/client/src/app/ui/tabs/plugins/provider.ts b/application/client/src/app/ui/tabs/plugins/provider.ts deleted file mode 100644 index 03bb715c3c..0000000000 --- a/application/client/src/app/ui/tabs/plugins/provider.ts +++ /dev/null @@ -1,193 +0,0 @@ -import { plugins } from '@service/plugins'; -import { InvalidPluginEntity, PluginEntity, PluginRunData } from '@platform/types/bindings/plugins'; -import { Subjects, Subject } from '@platform/env/subscription'; -import { scope } from '@platform/env/scope'; -import { Logger } from '@platform/log'; -import { InstalledPluginDesc, InvalidPluginDesc, PluginDescription } from './desc'; -import { bridge } from '@service/bridge'; -import { error } from '@platform/log/utils'; - -export class Provider { - protected log: Logger; - protected readonly plugins: { - invalid: InvalidPluginDesc[]; - installed: InstalledPluginDesc[]; - available: InstalledPluginDesc[]; - } = { - invalid: [], - installed: [], - available: [], - }; - - public subjects: Subjects<{ - load: Subject; - state: Subject; - selected: Subject; - // true - add starting; false - finished - add: Subject; - // true - add starting; false - finished - remove: Subject; - }> = new Subjects({ - load: new Subject(), - state: new Subject(), - selected: new Subject(), - add: new Subject(), - remove: new Subject(), - }); - public selected: PluginDescription | undefined; - public state: { - loading: boolean; - adding: boolean; - removing: boolean; - error: string | undefined; - } = { - loading: false, - adding: false, - removing: false, - error: undefined, - }; - - constructor() { - this.log = scope.getLogger(`Plugins Provider`); - } - - public async load(reload: boolean = false): Promise { - if (this.state.loading) { - return Promise.resolve(); - } - this.select(undefined); - this.state.loading = true; - if (reload) { - await plugins - .reloadPlugins() - .catch((err: Error) => this.log.error(`Fail to reload plugins: ${err.message}`)); - } - this.subjects.get().state.emit(); - return Promise.all([plugins.list().installed(), plugins.list().invalid()]) - .then((loaded: [PluginEntity[], InvalidPluginEntity[]]) => { - this.plugins.installed = loaded[0].map((en) => new InstalledPluginDesc(en)); - this.plugins.invalid = loaded[1].map((en) => new InvalidPluginDesc(en)); - this.state.error = undefined; - }) - .catch((err: Error) => { - this.log.error(`Fail to load plugins, due error: ${err.message}`); - this.state.error = err.message; - }) - .finally(() => { - Promise.all([ - ...this.plugins.installed.map((pl) => pl.load()), - ...this.plugins.invalid.map((pl) => pl.load()), - ]) - .catch((err: Error) => { - this.log.error(`Fail load some plugins data: ${err.message}`); - }) - .then(() => { - this.state.loading = false; - this.subjects.get().state.emit(); - this.subjects.get().load.emit(); - if (reload) { - // Apply changes on selected plugins by invoking select on it again. - const selectedPath = this.selected?.getPath(); - if (selectedPath !== undefined) { - this.select(selectedPath); - } - } - }); - }); - } - - public destroy() { - this.subjects.destroy(); - } - - public get(): { - /// List of installed plugins - installed(): InstalledPluginDesc[]; - /// List of available plugins (on remove source) - available(): InstalledPluginDesc[]; - /// List of invalid plugins (installed, but not inited) - invalid(): InvalidPluginDesc[]; - } { - return { - installed: (): InstalledPluginDesc[] => { - return this.plugins.installed; - }, - available: (): InstalledPluginDesc[] => { - return this.plugins.available; - }, - invalid: (): InvalidPluginDesc[] => { - return this.plugins.invalid; - }, - }; - } - public async readme(readmePath: string): Promise { - if (!(await bridge.files().exists(readmePath))) { - return Promise.resolve(undefined); - } - return bridge.files().read(readmePath); - } - public getRunData(path: string): Promise { - return plugins.getPluginRunData(path); - } - public select(path: string | undefined) { - this.selected = !path - ? undefined - : [...this.plugins.installed, ...this.plugins.available, ...this.plugins.invalid].find( - (pl) => pl.entity.dir_path === path, - ); - this.subjects.get().selected.emit(path); - } - public addPlugin(pluginPath: string): Promise { - if (this.isBusy()) { - return Promise.reject( - new Error( - `Cannot add plugin, because previous plugin operation is still in progress.`, - ), - ); - } - this.state.adding = true; - this.subjects.get().add.emit(this.state.adding); - return plugins.addPlugin(pluginPath).finally(() => { - this.state.adding = false; - this.subjects.get().add.emit(this.state.adding); - }); - } - public async removePlugin(pluginPath: string): Promise { - if (this.isBusy()) { - return Promise.reject( - new Error( - `Cannot add plugin, because previous plugin operation is still in progress.`, - ), - ); - } - this.state.removing = true; - this.subjects.get().remove.emit(this.state.removing); - try { - await plugins.removePlugin(pluginPath); - await this.load(true); - const selected = this.selected; - if (selected !== undefined) { - if ( - [ - ...this.plugins.installed, - ...this.plugins.available, - ...this.plugins.invalid, - ].find((pl) => pl.entity.dir_path === selected.getPath()) !== undefined - ) { - this.selected = undefined; - } - } - this.state.removing = false; - this.subjects.get().remove.emit(this.state.removing); - this.subjects.get().state.emit(); - return Promise.resolve(); - } catch (err) { - this.state.removing = false; - this.subjects.get().remove.emit(this.state.removing); - return Promise.reject(new Error(error(err))); - } - } - public isBusy(): boolean { - return this.state.adding || this.state.loading || this.state.removing; - } -} diff --git a/application/client/src/app/ui/tabs/plugins/styles.less b/application/client/src/app/ui/tabs/plugins/styles.less deleted file mode 100644 index ac7a4f0a97..0000000000 --- a/application/client/src/app/ui/tabs/plugins/styles.less +++ /dev/null @@ -1,88 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - & mat-card { - margin: 12px 6px 12px 12px; - & mat-card-title { - color: var(--scheme-color-1); - font-size: 16px; - } - & mat-card-subtitle { - color: var(--scheme-color-3); - font-size: 12px; - } - &.no-left-margin { - margin-left: 6px; - } - } - & div.left { - position: absolute; - display: flex; - flex-direction: column; - top: 0; - bottom: 0; - left: 0; - right: 330px; - overflow: hidden; - justify-content: stretch; - justify-items: stretch; - & div.filter { - position: absolute; - z-index: 1000; - padding: 6px 12px; - background: var(--scheme-color-warning-light); - top: 6px; - right: 6px; - box-shadow: 3px 3px 3px rgb(0 0 0 / 40%); - border-radius: 3px; - } - & .fill { - overflow: auto; - } - } - & div.right { - position: absolute; - width: 320px; - right: 6px; - bottom: 0; - top: 0; - overflow-y: auto; - overflow-x: hidden; - display: flex; - flex-direction: column; - & div.spacer { - flex: auto 100; - } - } - & pre { - padding-left: 5px; - } - & h1 { - color: white; - font-size: 20px; - font-weight: 700; - padding-left: 5px; - } - & button { - min-width: 150px; - } - & div.controlls { - position: relative; - width: 100%; - overflow: hidden; - text-align: right; - white-space: nowrap; - height: auto; - & button { - margin-left: 8px; - min-width: auto; - } - } -} diff --git a/application/client/src/app/ui/tabs/plugins/template.html b/application/client/src/app/ui/tabs/plugins/template.html deleted file mode 100644 index 98200a5be4..0000000000 --- a/application/client/src/app/ui/tabs/plugins/template.html +++ /dev/null @@ -1,47 +0,0 @@ -
    -
    -
    - - - -
    -
    - - - - -
    - - -
    -
    -
    -
    -
    -
    diff --git a/application/client/src/app/ui/tabs/settings/component.ts b/application/client/src/app/ui/tabs/settings/component.ts deleted file mode 100644 index 4d56aa9cc5..0000000000 --- a/application/client/src/app/ui/tabs/settings/component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Component, ChangeDetectorRef, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from './state'; - -@Component({ - selector: 'app-tabs-settings', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class Settings extends ChangesDetector implements AfterContentInit { - public readonly state: State = new State(); - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.ilc() - .services.system.settings.get() - .then((entries) => { - this.state.build(entries); - this.detectChanges(); - }) - .catch((err: Error) => { - this.log().error(`Fail to get settings list: ${err}`); - }); - } -} -export interface Settings extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/settings/entry/component.ts b/application/client/src/app/ui/tabs/settings/entry/component.ts deleted file mode 100644 index 48f7c07a9c..0000000000 --- a/application/client/src/app/ui/tabs/settings/entry/component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Component, ChangeDetectorRef, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { ISettingsEntry } from '@platform/types/settings/entry'; -import { Render } from '@platform/types/settings/entry.description'; - -@Component({ - selector: 'app-tabs-settings-entry', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class SettingsEntry extends ChangesDetector { - public readonly Render = Render; - - @Input() public entry!: ISettingsEntry; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public save(entry: ISettingsEntry) { - this.ilc() - .services.system.settings.set(entry.desc.path, entry.desc.key, entry.value) - .catch((err: Error) => { - this.log().error( - `Fail to save ${entry.desc.path}::${entry.desc.key}; error: ${err.message}`, - ); - }); - } -} -export interface SettingsEntry extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/settings/entry/styles.less b/application/client/src/app/ui/tabs/settings/entry/styles.less deleted file mode 100644 index f90559a55d..0000000000 --- a/application/client/src/app/ui/tabs/settings/entry/styles.less +++ /dev/null @@ -1,7 +0,0 @@ -@import '../../../styles/variables.less'; - - -:host { - position: relative; - display: block; -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/settings/entry/template.html b/application/client/src/app/ui/tabs/settings/entry/template.html deleted file mode 100644 index 603f13e2e4..0000000000 --- a/application/client/src/app/ui/tabs/settings/entry/template.html +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/application/client/src/app/ui/tabs/settings/module.ts b/application/client/src/app/ui/tabs/settings/module.ts deleted file mode 100644 index eb3c43ee14..0000000000 --- a/application/client/src/app/ui/tabs/settings/module.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatButtonModule } from '@angular/material/button'; - -import { Settings } from './component'; -import { SettingsNode } from './node/component'; -import { SettingsEntry } from './entry/component'; -import { SettingsEntryString } from './renders/string/component'; -import { SettingsEntryBool } from './renders/bool/component'; -import { SettingsEntryColor } from './renders/color/component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatCheckboxModule, - MatCardModule, - MatDividerModule, - MatFormFieldModule, - MatInputModule, - MatButtonModule, - ], - declarations: [ - Settings, - SettingsNode, - SettingsEntry, - SettingsEntryString, - SettingsEntryBool, - SettingsEntryColor, - ], - exports: [Settings], - bootstrap: [ - Settings, - SettingsNode, - SettingsEntry, - SettingsEntryString, - SettingsEntryBool, - SettingsEntryColor, - ], -}) -export class SettingsModule {} diff --git a/application/client/src/app/ui/tabs/settings/node.ts b/application/client/src/app/ui/tabs/settings/node.ts deleted file mode 100644 index e343a34a8a..0000000000 --- a/application/client/src/app/ui/tabs/settings/node.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { ISettingsEntry } from '@platform/types/settings/entry'; - -export class Node { - public readonly entries: ISettingsEntry[] = []; - public readonly childs: Node[] = []; - public readonly path: string; - - constructor(path: string) { - this.path = path; - } - - public attach(entry: ISettingsEntry): boolean { - if (this.path === entry.desc.path) { - this.entries.push(entry); - return true; - } - for (const child of this.childs) { - if (child.attach(entry)) { - return true; - } - } - return false; - } - - public adopt(path: string): boolean { - if (this.path === path) { - return true; - } - const parts = path.split('.'); - if (parts.length === 0) { - return false; - } - const childPath = `${this.path}${this.path === '' ? '' : '.'}${parts[0]}`; - let child = this.child(childPath); - if (child === undefined) { - child = new Node(childPath); - this.childs.push(child); - } - parts.splice(0, 1); - if (parts.length === 0) { - return true; - } - return child.adopt(parts.join('.')); - } - - public child(path: string): Node | undefined { - return this.childs.find((c) => c.path === path); - } - - public isRoot(): boolean { - return this.path === ''; - } -} diff --git a/application/client/src/app/ui/tabs/settings/node/component.ts b/application/client/src/app/ui/tabs/settings/node/component.ts deleted file mode 100644 index 974010a3c1..0000000000 --- a/application/client/src/app/ui/tabs/settings/node/component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Component, ChangeDetectorRef, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Node } from '../node'; - -@Component({ - selector: 'app-tabs-settings-node', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class SettingsNode extends ChangesDetector { - @Input() public node!: Node; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } -} -export interface SettingsNode extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/settings/node/styles.less b/application/client/src/app/ui/tabs/settings/node/styles.less deleted file mode 100644 index 7fca853cf3..0000000000 --- a/application/client/src/app/ui/tabs/settings/node/styles.less +++ /dev/null @@ -1,36 +0,0 @@ -@import '../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - & app-tabs-settings-entry { - margin: 6px 0; - } - & app-tabs-settings-node { - margin: 6px 0; - } - & p.node { - text-align: right; - position: relative; - &::before { - position: absolute; - content: ''; - display: block; - height: 1px; - width: 100%; - border-top: dashed thin var(--scheme-color-active); - left: 0; - top: 11px; - z-index: 0; - } - & span { - position: relative; - display: inline-block; - background: var(--scheme-color-active); - border-radius: 3px; - padding: 1px 12px 3px 12px; - z-index: 1; - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/settings/node/template.html b/application/client/src/app/ui/tabs/settings/node/template.html deleted file mode 100644 index ab0e2accb3..0000000000 --- a/application/client/src/app/ui/tabs/settings/node/template.html +++ /dev/null @@ -1,3 +0,0 @@ -

    ::{{node.path}}

    - - \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/settings/renders/bool/component.ts b/application/client/src/app/ui/tabs/settings/renders/bool/component.ts deleted file mode 100644 index 16f36ad4bc..0000000000 --- a/application/client/src/app/ui/tabs/settings/renders/bool/component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit, OnDestroy } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { ISettingsEntry } from '@platform/types/settings/entry'; - -@Component({ - selector: 'app-tabs-settings-entry-bool', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class SettingsEntryBool extends ChangesDetector implements AfterContentInit, OnDestroy { - @Input() public entry!: ISettingsEntry; - @Input() public save!: (entry: ISettingsEntry) => void; - - public value: boolean | undefined; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnDestroy(): void { - if (this.value === this.entry.value) { - return; - } - this.entry.value = this.value; - this.save(this.entry); - } - - public ngAfterContentInit(): void { - this.value = this.entry.value === undefined ? false : (this.entry.value as boolean); - } -} -export interface SettingsEntryBool extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/settings/renders/bool/styles.less b/application/client/src/app/ui/tabs/settings/renders/bool/styles.less deleted file mode 100644 index 92cb1b7023..0000000000 --- a/application/client/src/app/ui/tabs/settings/renders/bool/styles.less +++ /dev/null @@ -1,6 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/settings/renders/bool/template.html b/application/client/src/app/ui/tabs/settings/renders/bool/template.html deleted file mode 100644 index 80ec2c262a..0000000000 --- a/application/client/src/app/ui/tabs/settings/renders/bool/template.html +++ /dev/null @@ -1,2 +0,0 @@ -{{entry.desc.name}} -

    {{entry.desc.desc}}

    diff --git a/application/client/src/app/ui/tabs/settings/renders/color/component.ts b/application/client/src/app/ui/tabs/settings/renders/color/component.ts deleted file mode 100644 index c679416c34..0000000000 --- a/application/client/src/app/ui/tabs/settings/renders/color/component.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { ISettingsEntry } from '@platform/types/settings/entry'; -import { popup, Vertical, Horizontal } from '@ui/service/popup'; -import { components } from '@env/decorators/initial'; -import { getContrastColor } from '@styles/colors'; - -@Component({ - selector: 'app-tabs-settings-entry-color', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class SettingsEntryColor extends ChangesDetector implements AfterContentInit { - @Input() public entry!: ISettingsEntry; - @Input() public save!: (entry: ISettingsEntry) => void; - - public color: string | undefined; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.color = - this.entry.value !== undefined - ? (this.entry.value as string) - : (this.ilc().services.system.settings.getDefaultByDesc(this.entry.desc) as - | string - | undefined); - } - - public styles(): { [key: string]: string | undefined } { - return { - background: this.color as string, - color: this.color !== undefined ? getContrastColor(this.color, true) : undefined, - }; - } - - public change(): void { - const dialog = popup.open({ - component: { - factory: components.get('app-dialogs-color-selector'), - inputs: { - done: (color: string | undefined) => { - this.color = color; - this.entry.value = color; - this.save(this.entry); - dialog.close(); - this.detectChanges(); - }, - color: this.entry.value, - }, - }, - position: { - vertical: Vertical.center, - horizontal: Horizontal.center, - }, - closeOnKey: '*', - uuid: 'Color Selection', - }); - } - - public drop() { - this.entry.value = undefined; - this.save(this.entry); - this.ngAfterContentInit(); - this.detectChanges(); - } -} -export interface SettingsEntryColor extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/settings/renders/color/styles.less b/application/client/src/app/ui/tabs/settings/renders/color/styles.less deleted file mode 100644 index 60f411c0fa..0000000000 --- a/application/client/src/app/ui/tabs/settings/renders/color/styles.less +++ /dev/null @@ -1,16 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - & p.example { - margin: 8px 0; - } - & div.buttons { - width: 100%; - text-align: right; - white-space: nowrap; - & button { - margin-left: 16px; - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/settings/renders/color/template.html b/application/client/src/app/ui/tabs/settings/renders/color/template.html deleted file mode 100644 index 2a43b81dfe..0000000000 --- a/application/client/src/app/ui/tabs/settings/renders/color/template.html +++ /dev/null @@ -1,9 +0,0 @@ -

    {{entry.desc.name}}

    -

    {{entry.desc.desc}}

    -

    - This is example of color view -

    -
    - - -
    diff --git a/application/client/src/app/ui/tabs/settings/renders/string/component.ts b/application/client/src/app/ui/tabs/settings/renders/string/component.ts deleted file mode 100644 index 1052ce5b41..0000000000 --- a/application/client/src/app/ui/tabs/settings/renders/string/component.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit, OnDestroy } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { ISettingsEntry } from '@platform/types/settings/entry'; -import { ErrorState } from './error'; -import { Validator } from '../validator'; - -@Component({ - selector: 'app-tabs-settings-entry-string', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class SettingsEntryString extends ChangesDetector implements AfterContentInit, OnDestroy { - @Input() public entry!: ISettingsEntry; - @Input() public save!: (entry: ISettingsEntry) => void; - - public value: string | undefined; - public error!: ErrorState; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnDestroy(): void { - if (this.value === this.entry.value) { - return; - } - this.entry.value = this.value; - this.save(this.entry); - } - - public ngAfterContentInit(): void { - this.value = this.entry.value as string; - this.error = new ErrorState(this.entry, new Validator(), () => { - this.detectChanges(); - }); - } -} -export interface SettingsEntryString extends IlcInterface {} diff --git a/application/client/src/app/ui/tabs/settings/renders/string/error.ts b/application/client/src/app/ui/tabs/settings/renders/string/error.ts deleted file mode 100644 index 19f8f5554a..0000000000 --- a/application/client/src/app/ui/tabs/settings/renders/string/error.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { ErrorStateMatcher } from '@angular/material/core'; -import { UntypedFormControl } from '@angular/forms'; -import { ISettingsEntry } from '@platform/types/settings/entry'; -import { Validator } from '../validator'; - -export enum Codes { - NO_ERRORS = 'NO_ERRORS', - REQUIRED = 'REQUIRED', - INVALID = 'INVALID', -} - -export class ErrorState implements ErrorStateMatcher { - protected readonly entry: ISettingsEntry; - protected readonly validator: Validator; - protected readonly update: () => void; - protected checked: string | undefined; - - public error: string | undefined; - - constructor(entry: ISettingsEntry, validator: Validator, update: () => void) { - this.entry = entry; - this.validator = validator; - this.update = update; - } - - public isErrorState( - control: UntypedFormControl | null, - //form: FormGroupDirective | NgForm | null, - ): boolean { - if (control === null) { - return false; - } - if (this.checked === control.value) { - return this.error !== undefined; - } - this.checked = control.value; - if (this.isFieldRequired(control.value)) { - this.error = `Required`; - } else { - this.validator - .validate(this.entry.desc.path, this.entry.desc.key, control.value) - .then((error: string | undefined) => { - this.error = error; - }) - .catch((err: Error) => { - this.error = err.message; - }) - .finally(() => { - this.update(); - }); - } - return this.error !== undefined; - } - - public isFieldRequired(value: string): boolean { - if (typeof value !== 'string') { - return !this.entry.desc.allowEmpty; - } - if (this.entry.desc.allowEmpty) { - return false; - } - return value.trim() === ''; - } -} diff --git a/application/client/src/app/ui/tabs/settings/renders/string/styles.less b/application/client/src/app/ui/tabs/settings/renders/string/styles.less deleted file mode 100644 index 493c4db123..0000000000 --- a/application/client/src/app/ui/tabs/settings/renders/string/styles.less +++ /dev/null @@ -1,8 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - & mat-form-field { - display: block; - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/settings/renders/string/template.html b/application/client/src/app/ui/tabs/settings/renders/string/template.html deleted file mode 100644 index 346c2f156e..0000000000 --- a/application/client/src/app/ui/tabs/settings/renders/string/template.html +++ /dev/null @@ -1,8 +0,0 @@ - - {{entry.desc.name}} - - {{entry.desc.desc}} - {{error.error}} - \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/settings/renders/validator.ts b/application/client/src/app/ui/tabs/settings/renders/validator.ts deleted file mode 100644 index 3bc35681ba..0000000000 --- a/application/client/src/app/ui/tabs/settings/renders/validator.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { settings } from '@service/settings'; - -export class Validator { - public validate(path: string, key: string, value: T): Promise { - return settings.validate(path, key, value); - } -} diff --git a/application/client/src/app/ui/tabs/settings/state.ts b/application/client/src/app/ui/tabs/settings/state.ts deleted file mode 100644 index 760897e974..0000000000 --- a/application/client/src/app/ui/tabs/settings/state.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Node } from './node'; -import { ISettingsEntry } from '@platform/types/settings/entry'; - -export class State { - public readonly root: Node = new Node(''); - - public build(entries: ISettingsEntry[]): void { - entries.forEach((entry) => { - if (!this.root.adopt(entry.desc.path)) { - console.error(`Fail to create node`); - return; - } - if (!this.root.attach(entry)) { - console.log(`Fail to add entry`); - } - }); - } - -} diff --git a/application/client/src/app/ui/tabs/settings/styles.less b/application/client/src/app/ui/tabs/settings/styles.less deleted file mode 100644 index cb586b223d..0000000000 --- a/application/client/src/app/ui/tabs/settings/styles.less +++ /dev/null @@ -1,70 +0,0 @@ -@import '../../styles/variables.less'; - - -:host { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - overflow: hidden; - & mat-card { - margin: 12px 6px 12px 12px; - & mat-card-title { - color: var(--scheme-color-1); - font-size: 16px; - } - & mat-card-subtitle { - color: var(--scheme-color-3); - font-size: 12px; - } - &.no-left-margin { - margin-left: 6px; - } - } - & h1 { - font-size: 14px; - } - & div.left { - position: absolute; - display: flex; - flex-direction: column; - top: 0; - bottom: 0; - left: 0; - right: 330px; - overflow: hidden; - justify-content: stretch; - justify-items: stretch; - & div.filter { - position: absolute; - z-index: 1000; - padding: 6px 12px; - background: var(--scheme-color-warning-light); - top: 6px; - right: 6px; - box-shadow: 3px 3px 3px rgb(0 0 0 / 40%); - border-radius: 3px; - } - & .fill { - overflow: auto; - } - } - & div.right { - position: absolute; - width: 320px; - right: 6px; - bottom: 0; - top: 0; - overflow-y: auto; - overflow-x: hidden; - display: flex; - flex-direction: column; - & div.spacer{ - flex: auto 100; - } - } - - -} \ No newline at end of file diff --git a/application/client/src/app/ui/tabs/settings/template.html b/application/client/src/app/ui/tabs/settings/template.html deleted file mode 100644 index 81a0f024bb..0000000000 --- a/application/client/src/app/ui/tabs/settings/template.html +++ /dev/null @@ -1,20 +0,0 @@ -
    -
    -
    - - Settings - - - - -
    -
    - - Settings - -

    List of chipmunk settings

    -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/application/client/src/app/ui/views/dialogs/about/component.ts b/application/client/src/app/ui/views/dialogs/about/component.ts deleted file mode 100644 index 31930aa3b9..0000000000 --- a/application/client/src/app/ui/views/dialogs/about/component.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Component, ChangeDetectorRef, AfterViewInit, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Initial } from '@env/decorators/initial'; - -@Component({ - selector: 'app-dialogs-about', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class About extends ChangesDetector implements AfterViewInit { - @Input() public version: string = ''; - @Input() public alphaRelease: { version: string; url: string } | undefined; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngAfterViewInit(): void { - Promise.all([ - this.ilc().services.system.bridge.app().version(), - this.ilc().services.system.bridge.app().alphaRelease(), - ]) - .then(([version, alphaRelease]) => { - this.version = version; - this.alphaRelease = alphaRelease; - this.detectChanges(); - }) - .catch((err: Error) => { - this.log().error(`Fail to get about dialog data: ${err.message}`); - }); - } - - public open(url: string): void { - this.ilc() - .services.system.bridge.browser() - .url(url) - .catch((err: Error) => { - this.log().error(`Fail to open URL "${url}": ${err.message}`); - }); - } -} -export interface About extends IlcInterface {} diff --git a/application/client/src/app/ui/views/dialogs/about/module.ts b/application/client/src/app/ui/views/dialogs/about/module.ts deleted file mode 100644 index 0776f718af..0000000000 --- a/application/client/src/app/ui/views/dialogs/about/module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatButtonModule } from '@angular/material/button'; -import { About } from './component'; - -@NgModule({ - imports: [CommonModule, MatButtonModule], - declarations: [About], - exports: [About], - bootstrap: [About] -}) -export class AboutModule {} diff --git a/application/client/src/app/ui/views/dialogs/about/styles.less b/application/client/src/app/ui/views/dialogs/about/styles.less deleted file mode 100644 index 3ce309a50b..0000000000 --- a/application/client/src/app/ui/views/dialogs/about/styles.less +++ /dev/null @@ -1,68 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - width: 350px; - height: 200px; - & img { - position: absolute; - display: block; - width: 100%; - height: 100%; - top: 0; - left: 0; - z-index: 0; - animation: appearing 3s linear forwards; - } - @keyframes appearing { - 0% { - opacity: 0; - } - 100% { - opacity: 0.5; - } - } - & div.content { - position: absolute; - display: block; - width: 100%; - height: 100%; - top: 0; - left: 0; - margin: 0; - z-index: 1; - & p { - text-align: center; - } - & p.name { - margin-top: 56px; - } - & p.alpha { - margin-top: 8px; - } - & button.alpha-link { - padding: 0; - border: none; - background: transparent; - text-decoration: underline; - cursor: pointer; - } - & div.controlls { - margin-top: 20px; - text-align: center; - & button { - color: var(--scheme-color-1); - margin-right: 12px; - &:last-child { - margin-right: 0px; - } - } - &:last-child { - margin-right: 0px; - } - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/views/dialogs/about/template.html b/application/client/src/app/ui/views/dialogs/about/template.html deleted file mode 100644 index 35aad7f7da..0000000000 --- a/application/client/src/app/ui/views/dialogs/about/template.html +++ /dev/null @@ -1,14 +0,0 @@ - -
    -

    CHIPMUNK

    -

    version: {{version}}

    -

    - Chipmunk 4 alpha: - -

    -
    - - - -
    -
    diff --git a/application/client/src/app/ui/views/dialogs/colors/component.ts b/application/client/src/app/ui/views/dialogs/colors/component.ts deleted file mode 100644 index bacccaa56f..0000000000 --- a/application/client/src/app/ui/views/dialogs/colors/component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, ChangeDetectorRef, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Initial } from '@env/decorators/initial'; -import { CColors } from '@styles/colors'; - -@Component({ - selector: 'app-dialogs-color-selector', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class ColorSelector extends ChangesDetector { - @Input() public done!: (color: string | undefined) => void; - @Input() public color!: string | undefined; - - public colors: string[] = CColors.slice(); - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } -} -export interface ColorSelector extends IlcInterface {} diff --git a/application/client/src/app/ui/views/dialogs/colors/module.ts b/application/client/src/app/ui/views/dialogs/colors/module.ts deleted file mode 100644 index 1d1110a704..0000000000 --- a/application/client/src/app/ui/views/dialogs/colors/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ColorSelector } from './component'; -import { MatButtonModule } from '@angular/material/button'; -import { ColorSelectorModule as Selector } from '@elements/color.selector/module'; - -@NgModule({ - imports: [CommonModule, MatButtonModule, Selector], - declarations: [ColorSelector], - exports: [ColorSelector], - bootstrap: [ColorSelector], -}) -export class ColorSelectorModule {} diff --git a/application/client/src/app/ui/views/dialogs/colors/styles.less b/application/client/src/app/ui/views/dialogs/colors/styles.less deleted file mode 100644 index 0d64d30364..0000000000 --- a/application/client/src/app/ui/views/dialogs/colors/styles.less +++ /dev/null @@ -1,9 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 16px; - margin: 0; - width: 200px; -} \ No newline at end of file diff --git a/application/client/src/app/ui/views/dialogs/colors/template.html b/application/client/src/app/ui/views/dialogs/colors/template.html deleted file mode 100644 index bb76848898..0000000000 --- a/application/client/src/app/ui/views/dialogs/colors/template.html +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/application/client/src/app/ui/views/dialogs/columnsselector/component.ts b/application/client/src/app/ui/views/dialogs/columnsselector/component.ts deleted file mode 100644 index 38c1a32c25..0000000000 --- a/application/client/src/app/ui/views/dialogs/columnsselector/component.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Initial } from '@env/decorators/initial'; -import { Session } from '@service/session/session'; -import { Columns, Header } from '@schema/render/columns'; -import { getContrastColor } from '@ui/styles/colors'; - -@Component({ - selector: 'app-dialogs-columns-selector', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class ColumnsSelector extends ChangesDetector implements AfterContentInit { - @Input() public session!: Session; - @Input() public accept!: (columns: number[], delimiter: string | undefined) => void; - @Input() public close!: () => void; - - public headers: Header[] = []; - public selected: { [key: number]: boolean } = {}; - public delimiter: string = ';'; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - const bound = this.session.render.getBoundEntity(); - if (!(bound instanceof Columns)) { - this.headers = []; - return; - } - const controller = bound as unknown as Columns; - this.headers = controller.get().all(); - this.headers.forEach((h) => { - this.selected[h.index] = h.visible; - }); - } - - public export() { - const indexes: number[] = []; - Object.keys(this.selected).forEach((key: string) => { - if (this.selected[key as unknown as number] === true) { - indexes.push(parseInt(key, 10)); - } - }); - this.accept(indexes, this.delimiter); - this.close(); - } - - public getBgColor(header: Header) { - return { - background: header.color, - }; - } - public getFgColor(header: Header) { - return { - color: header.color === undefined ? undefined : getContrastColor(header.color, true), - }; - } - - public disabled(): boolean { - return ( - Object.keys(this.selected).find( - (k: string) => this.selected[k as unknown as number], - ) === undefined || this.delimiter === '' - ); - } -} -export interface ColumnsSelector extends IlcInterface {} diff --git a/application/client/src/app/ui/views/dialogs/columnsselector/module.ts b/application/client/src/app/ui/views/dialogs/columnsselector/module.ts deleted file mode 100644 index 77a3e169ce..0000000000 --- a/application/client/src/app/ui/views/dialogs/columnsselector/module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ColumnsSelector } from './component'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatInputModule } from '@angular/material/input'; - -@NgModule({ - imports: [ - CommonModule, - MatButtonModule, - MatCheckboxModule, - FormsModule, - ReactiveFormsModule, - MatInputModule, - ], - declarations: [ColumnsSelector], - exports: [ColumnsSelector], - bootstrap: [ColumnsSelector], -}) -export class ColumnsSelectorModule {} diff --git a/application/client/src/app/ui/views/dialogs/columnsselector/styles.less b/application/client/src/app/ui/views/dialogs/columnsselector/styles.less deleted file mode 100644 index 56df1cf5e0..0000000000 --- a/application/client/src/app/ui/views/dialogs/columnsselector/styles.less +++ /dev/null @@ -1,53 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 16px; - margin: 0; - width: 450px; - & div.options { - display: flex; - flex-direction: row; - & div.left { - flex: 1; - & div.header { - display: flex; - flex-direction: row; - align-items: center; - margin: 4px 0; - border: thin solid var(--scheme-color-4); - border-radius: 2px; - & .title { - display: flex; - flex-direction: column; - padding: 2px 6px; - & .label { - color: var(--scheme-color-0); - } - & .sublabel { - color: var(--scheme-color-2); - } - } - - } - - } - & div.right { - flex: 1; - padding: 4px 0px 0px 16px; - & p { - padding-bottom: 12px; - } - } - } - & .controlls { - display: flex; - flex-direction: row; - justify-content: end; - margin-top: 12px; - & button { - margin-left: 8px; - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/views/dialogs/columnsselector/template.html b/application/client/src/app/ui/views/dialogs/columnsselector/template.html deleted file mode 100644 index 8e3a194579..0000000000 --- a/application/client/src/app/ui/views/dialogs/columnsselector/template.html +++ /dev/null @@ -1,31 +0,0 @@ -
    -
    -
    - -
    - {{header.caption}} - {{header.desc}} -
    -
    -
    -
    -

    - Please select columns to be exported and define the delimiter, which will be used to - split columns. -

    - - Delimiter - - -
    -
    -
    - - -
    diff --git a/application/client/src/app/ui/views/dialogs/comment/component.ts b/application/client/src/app/ui/views/dialogs/comment/component.ts deleted file mode 100644 index 6b1db7666f..0000000000 --- a/application/client/src/app/ui/views/dialogs/comment/component.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - AfterViewInit, - AfterContentInit, - ViewChild, -} from '@angular/core'; -import { MatInput } from '@angular/material/input'; -import { CommentDefinition } from '@platform/types/comment'; -import { FormControl } from '@angular/forms'; -import { ErrorStateMatcher } from '@angular/material/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Initial } from '@env/decorators/initial'; - -export class InputErrorStateMatcher implements ErrorStateMatcher { - private _valid: boolean = true; - private _error: string = ''; - - constructor() {} - - public isErrorState(control: FormControl | null): boolean { - this._valid = true; - this._error = ''; - if (control !== null && (control.value === null || control.value.trim() === '')) { - this._valid = false; - this._error = `Value of comment cannot be empty`; - } - if (control !== null && control.value !== null && control.value.length > 1024) { - this._valid = false; - this._error = `Maximum length of comment is 1024 chars`; - } - return !this._valid; - } - - public isValid(): boolean { - return this._valid; - } - - public getError(): string | undefined { - return this._error; - } -} - -@Component({ - selector: 'app-dialogs-comment', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class Comment extends ChangesDetector implements AfterViewInit, AfterContentInit { - public ng_comment: string = ''; - public ng_input_error: InputErrorStateMatcher = new InputErrorStateMatcher(); - - @ViewChild(MatInput, { static: true }) ng_inputComRef!: MatInput; - - @Input() comment!: CommentDefinition; - - public ng_mode: 'edit' | 'create' = 'edit'; - - @Input() accept: (comment: string) => void = (_comment: string) => {}; - @Input() remove: () => void = () => {}; - @Input() cancel: () => void = () => {}; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngAfterContentInit() { - this.ng_comment = this.comment.comment; - this.ng_mode = this.comment.comment === '' ? 'create' : 'edit'; - } - - ngAfterViewInit() { - setTimeout(() => { - this.ng_inputComRef.focus(); - }, 150); - } - - public ng_onKeyDown(event: KeyboardEvent) { - if (event.code === 'Enter') { - this.ng_onAccept(); - } - } - - public ng_onAccept() { - if (!this.ng_input_error.isValid()) { - return; - } - this.accept(this.ng_comment); - } - - public ng_onRemove() { - this.remove(); - } - - public ng_onCancel() { - this.cancel(); - } -} -export interface Comment extends IlcInterface {} diff --git a/application/client/src/app/ui/views/dialogs/comment/module.ts b/application/client/src/app/ui/views/dialogs/comment/module.ts deleted file mode 100644 index c248e81bf2..0000000000 --- a/application/client/src/app/ui/views/dialogs/comment/module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatButtonModule } from '@angular/material/button'; -import { MatInputModule } from '@angular/material/input'; -import { MatFormFieldModule } from '@angular/material/form-field'; - -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -import { Comment } from './component'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - MatFormFieldModule, - MatButtonModule, - MatInputModule, - ], - declarations: [Comment], - exports: [Comment], - bootstrap: [Comment], -}) -export class CommentModule {} diff --git a/application/client/src/app/ui/views/dialogs/comment/styles.less b/application/client/src/app/ui/views/dialogs/comment/styles.less deleted file mode 100644 index 840d24250a..0000000000 --- a/application/client/src/app/ui/views/dialogs/comment/styles.less +++ /dev/null @@ -1,27 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0.5rem; - margin: 0; - & div.controlls { - text-align: right; - padding-top: 8px; - & button { - margin-left: 16px; - } - } - & div.inputs { - width: 100%; - & mat-form-field { - width: 100%; - } - } - & mat-error { - color: var(--scheme-color-warning); - } - & mat-hint { - color: var(--scheme-color-2); - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/views/dialogs/comment/template.html b/application/client/src/app/ui/views/dialogs/comment/template.html deleted file mode 100644 index 8e76921433..0000000000 --- a/application/client/src/app/ui/views/dialogs/comment/template.html +++ /dev/null @@ -1,29 +0,0 @@ -
    - - Leave a comment - - {{ng_input_error.getError()}} - - Don't disclose personal info - - {{message.value.length}} / 1024 - -
    -
    - - - -
    diff --git a/application/client/src/app/ui/views/dialogs/hotkeys/component.ts b/application/client/src/app/ui/views/dialogs/hotkeys/component.ts deleted file mode 100644 index ffbe0c7836..0000000000 --- a/application/client/src/app/ui/views/dialogs/hotkeys/component.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Component, ChangeDetectorRef, AfterViewChecked, AfterViewInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { KeysMap, KeyDescription } from '@platform/types/hotkeys/map'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Initial } from '@env/decorators/initial'; - -interface IKey { - shortkeys: string[]; - description: string; -} - -interface IGroup { - name: string; - keys: IKey[]; -} - -@Component({ - selector: 'app-dialogs-hotkeys', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class Hotkeys extends ChangesDetector implements AfterViewChecked, AfterViewInit { - public groups: IGroup[] = []; - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - const groups: any = {}; - KeysMap.forEach((desc: KeyDescription) => { - if (desc.hidden !== undefined && desc.hidden) { - return; - } - if (groups[desc.category] === undefined) { - groups[desc.category] = { - name: desc.category, - keys: [], - }; - } - groups[desc.category].keys.push({ - shortkeys: - desc.display.darwin === undefined - ? desc.display.others - : this.ilc().services.system.env.platform().darwin() - ? desc.display.darwin - : desc.display.others, - description: desc.description, - }); - }); - Object.keys(groups).forEach((key: string) => { - this.groups.push(groups[key]); - }); - } - - ngAfterViewChecked(): void { - this.detectChanges(); - } - - ngAfterViewInit(): void { - this.detectChanges(); - } -} -export interface Hotkeys extends IlcInterface {} diff --git a/application/client/src/app/ui/views/dialogs/hotkeys/module.ts b/application/client/src/app/ui/views/dialogs/hotkeys/module.ts deleted file mode 100644 index c5408d04d7..0000000000 --- a/application/client/src/app/ui/views/dialogs/hotkeys/module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { Hotkeys } from './component'; - -@NgModule({ - imports: [CommonModule], - declarations: [Hotkeys], - exports: [Hotkeys], - bootstrap: [Hotkeys] -}) -export class HotkeysModule {} diff --git a/application/client/src/app/ui/views/dialogs/hotkeys/styles.less b/application/client/src/app/ui/views/dialogs/hotkeys/styles.less deleted file mode 100644 index 6aae24e6e1..0000000000 --- a/application/client/src/app/ui/views/dialogs/hotkeys/styles.less +++ /dev/null @@ -1,47 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - overflow-x: hidden; - overflow-y: auto; - position: relative; - display: block; - padding: 24px; - margin: 0; - & * { - color: var(--scheme-color-1); - } - div.group{ - vertical-align: top; - position: relative; - margin: 0.5rem 0; - border-bottom: 1px dashed var(--scheme-color-4); - & table { - & th { - padding: 3px 0; - } - & tr { - & td { - white-space: nowrap; - padding: 3px 0; - &:first-child{ - width: 100%; - } - &:last-child{ - text-align: right; - width: auto; - } - } - } - } - & span.shortkey { - padding: 1px 6px; - margin-right: 6px; - border-radius: 6px; - color: var(--scheme-color-0); - font-weight: 600; - border: 1px dotted var(--scheme-color-3); - background: var(--scheme-color-5); - box-shadow: 1px 1px 6px rgba(0, 0, 0, 0.4); - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/views/dialogs/hotkeys/template.html b/application/client/src/app/ui/views/dialogs/hotkeys/template.html deleted file mode 100644 index 7c61ef6463..0000000000 --- a/application/client/src/app/ui/views/dialogs/hotkeys/template.html +++ /dev/null @@ -1,16 +0,0 @@ -
    - - - - - - - - -

    {{group.name}}

    {{key.description}}

    - - {{shortkey}} - or - -
    -
    \ No newline at end of file diff --git a/application/client/src/app/ui/views/dialogs/jumpto/component.ts b/application/client/src/app/ui/views/dialogs/jumpto/component.ts deleted file mode 100644 index a09b47c6d4..0000000000 --- a/application/client/src/app/ui/views/dialogs/jumpto/component.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { - Component, - ChangeDetectorRef, - ViewChild, - ElementRef, - AfterContentInit, - AfterViewInit, - Input, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Initial } from '@env/decorators/initial'; -import { Owner } from '@schema/content/row'; - -export type CloseHandler = () => void; - -@Component({ - selector: 'app-dialogs-jumpto', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class JumpTo extends ChangesDetector implements AfterViewInit, AfterContentInit { - @ViewChild('rowinput') ref!: ElementRef; - @Input() close!: CloseHandler; - public value: string = ''; - public key: string = 'ctrl'; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.key = this.ilc().services.system.env.platform().darwin() ? 'Cmd' : 'Ctrl'; - } - - public ngAfterViewInit(): void { - this.ref.nativeElement.focus(); - } - - public focus() { - this.ref.nativeElement.focus(); - } - - public change(value: string) { - const line = parseInt(value, 10); - if (!isFinite(line) || isNaN(line)) { - return; - } - const session = this.ilc().services.system.session.active().session(); - if (session === undefined) { - return; - } - if (session.stream.len() <= line) { - return; - } - session.cursor.select(line, Owner.Bookmark, undefined, undefined); - this.ref.nativeElement.focus(); - } - - public keydown(event: KeyboardEvent) { - const session = this.ilc().services.system.session.active().session(); - if (session === undefined) { - return; - } - if (event.key === 'Enter') { - if ( - event.ctrlKey || - (this.ilc().services.system.env.platform().darwin() && event.metaKey) - ) { - session.switch().toolbar.details(); - } - this.close(); - } - } -} -export interface JumpTo extends IlcInterface {} diff --git a/application/client/src/app/ui/views/dialogs/jumpto/module.ts b/application/client/src/app/ui/views/dialogs/jumpto/module.ts deleted file mode 100644 index 0ad56afc6e..0000000000 --- a/application/client/src/app/ui/views/dialogs/jumpto/module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { JumpTo } from './component'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -@NgModule({ - imports: [CommonModule, MatFormFieldModule, MatInputModule, FormsModule, ReactiveFormsModule], - declarations: [JumpTo], - exports: [JumpTo], - bootstrap: [JumpTo], -}) -export class JumpToModule {} diff --git a/application/client/src/app/ui/views/dialogs/jumpto/styles.less b/application/client/src/app/ui/views/dialogs/jumpto/styles.less deleted file mode 100644 index 9cfb3021c2..0000000000 --- a/application/client/src/app/ui/views/dialogs/jumpto/styles.less +++ /dev/null @@ -1,42 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - width: 350px; - & div.input { - position: relative; - display: block; - width: 100%; - z-index: 1; - & input::-webkit-outer-spin-button, - & input::-webkit-inner-spin-button { - -webkit-appearance: none; - margin: 0; - } - & input[type=number] { - -moz-appearance: textfield; - } - } - & div.info { - position: relative; - display: block; - width: 100%; - padding: 6px 0; - & p { - color: var(--scheme-color-1); - } - & span.shortkey { - padding: 1px 6px; - margin-right: 6px; - border-radius: 6px; - color: var(--scheme-color-0); - font-weight: 600; - border: 1px dotted var(--scheme-color-3); - background: var(--scheme-color-5); - box-shadow: 1px 1px 6px rgba(0, 0, 0, 0.4); - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/views/dialogs/jumpto/template.html b/application/client/src/app/ui/views/dialogs/jumpto/template.html deleted file mode 100644 index 5533a838ec..0000000000 --- a/application/client/src/app/ui/views/dialogs/jumpto/template.html +++ /dev/null @@ -1,22 +0,0 @@ -
    - - - -
    -
    -

    - Enter to close; - {{key}} + Enter to open Details; -

    -
    diff --git a/application/client/src/app/ui/views/dialogs/locker/component.ts b/application/client/src/app/ui/views/dialogs/locker/component.ts deleted file mode 100644 index a7c6f74314..0000000000 --- a/application/client/src/app/ui/views/dialogs/locker/component.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterViewInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Initial } from '@env/decorators/initial'; -import { Locker, Level } from '@ui/service/lockers'; -import { Popup } from '@ui/service/popup'; - -@Component({ - selector: 'app-dialogs-locker-message', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class LockerMessage extends ChangesDetector implements AfterViewInit { - @Input() public locker!: Locker; - @Input() public popup!: Popup; - @Input() public close!: () => void; - - protected keyboardUnlocker!: () => void; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public get Level(): typeof Level { - return Level; - } - - public ngAfterViewInit(): void { - this.env().subscriber.register( - this.locker.updated.subscribe(() => { - this.detectChanges(); - }), - ); - } - - ngClose() { - this.close(); - } -} -export interface LockerMessage extends IlcInterface {} diff --git a/application/client/src/app/ui/views/dialogs/locker/module.ts b/application/client/src/app/ui/views/dialogs/locker/module.ts deleted file mode 100644 index 1f2426382a..0000000000 --- a/application/client/src/app/ui/views/dialogs/locker/module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { LockerMessage } from './component'; -import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule } from '@angular/material/button'; - -@NgModule({ - imports: [ - CommonModule, - MatProgressSpinnerModule, - MatIconModule, - MatButtonModule, - MatProgressBarModule, - ], - declarations: [LockerMessage], - exports: [LockerMessage], - bootstrap: [LockerMessage] -}) -export class LockerMessageModule {} diff --git a/application/client/src/app/ui/views/dialogs/locker/styles.less b/application/client/src/app/ui/views/dialogs/locker/styles.less deleted file mode 100644 index 43ab9003ee..0000000000 --- a/application/client/src/app/ui/views/dialogs/locker/styles.less +++ /dev/null @@ -1,75 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - overflow: hidden; - position: relative; - padding: 0; - margin: 0; - text-align: center; - & div.modal { - display: flex; - flex-direction: column; - align-items: center; - padding: 24px; - margin: 0; - } - & div.progress { - display: flex; - position: relative; - flex-direction: column; - align-items: center; - justify-content: center; - padding: 6px 12px; - margin: 0; - & > * { - z-index: 1; - } - & img { - position: absolute; - display: block; - width: 100%; - height: 100%; - top: 0; - left: 0; - z-index: 0; - animation: appearing 3s linear forwards; - } - @keyframes appearing { - 0% { - opacity: 0; - } - 100% { - opacity: 0.5; - } - } - } - & * { - color: var(--scheme-color-1); - } - & mat-spinner { - display: block; - } - & mat-icon { - display: block; - height: 32px; - width: 32px; - font-size: 32px; - color: var(--scheme-color-warning-light) - } - & p { - text-align: left; - padding: 12px 0; - overflow-wrap: anywhere; - } - & div.controls{ - position: relative; - text-align: right; - padding: 12px 0 6px 0; - width: 100%; - white-space: nowrap; - & button { - display: inline-block; - margin-left: 12px; - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/views/dialogs/locker/template.html b/application/client/src/app/ui/views/dialogs/locker/template.html deleted file mode 100644 index 10290430f6..0000000000 --- a/application/client/src/app/ui/views/dialogs/locker/template.html +++ /dev/null @@ -1,14 +0,0 @@ -
    -

    {{locker.message}}

    - -
    - diff --git a/application/client/src/app/ui/views/dialogs/module.ts b/application/client/src/app/ui/views/dialogs/module.ts deleted file mode 100644 index 353556cab1..0000000000 --- a/application/client/src/app/ui/views/dialogs/module.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { HotkeysModule } from './hotkeys/module'; -import { LockerMessageModule } from './locker/module'; -import { AboutModule } from './about/module'; -import { ColorSelectorModule } from './colors/module'; -import { CommentModule } from './comment/module'; -import { JumpToModule } from './jumpto/module'; -import { ColumnsSelectorModule } from './columnsselector/module'; - -@NgModule({ - imports: [ - CommonModule, - HotkeysModule, - AboutModule, - LockerMessageModule, - ColorSelectorModule, - CommentModule, - JumpToModule, - ColumnsSelectorModule, - ], - declarations: [], - exports: [HotkeysModule, AboutModule, LockerMessageModule, CommentModule, JumpToModule], - bootstrap: [], -}) -export class DialogsModule {} diff --git a/application/client/src/app/ui/views/module.ts b/application/client/src/app/ui/views/module.ts deleted file mode 100644 index 8b342d1c9b..0000000000 --- a/application/client/src/app/ui/views/module.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Declares the `views` module, which organizes UI components (views) by their rendering context. - * - * @remarks - * This module serves as a central entry point for registering and managing views - * that are rendered in various predefined UI zones of the application. Views are - * grouped according to their logical container to ensure consistency, clarity, - * and maintainability. - * - * The main rendering contexts include: - * - `/toolbar` - all views rendered in the toolbar area. - * - `/sidebar` - all views rendered in the sidebar panel. - * - `/workspace` - all views rendered in the main output or content window. - * - `/statusbar` - all views rendered in the bottom status bar. - * - `/dialogs` - all views rendered in modal dialog windows. - * - * @important - * When creating new views, developers must assign them to the appropriate context directory - * based on the parent view or rendering zone. This promotes a clean separation of concerns - * and simplifies view lifecycle and rendering logic across the application. - * - * @module - * @public - */ - -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { WorkspaceModule } from './workspace/module'; -import { ToolbarModule } from './toolbar/module'; -import { SidebarModule } from './sidebar/module'; -import { DialogsModule } from './dialogs/module'; - -@NgModule({ - imports: [CommonModule, WorkspaceModule, ToolbarModule, SidebarModule, DialogsModule], - declarations: [], - exports: [WorkspaceModule, ToolbarModule, SidebarModule, DialogsModule], - bootstrap: [], -}) -export class ViewsModule {} diff --git a/application/client/src/app/ui/views/sidebar/attachments/attachment/component.ts b/application/client/src/app/ui/views/sidebar/attachments/attachment/component.ts deleted file mode 100644 index d6eb5a938c..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/attachment/component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, Input, AfterContentInit, ChangeDetectionStrategy } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Attachment } from '@platform/types/content'; -import { bytesToStr } from '@env/str'; - -@Component({ - selector: 'app-views-attachments-item', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class Item implements AfterContentInit { - @Input() attachment!: Attachment; - - public ext!: string; - public size!: string; - - public ngAfterContentInit(): void { - this.ext = this.attachment.extAsString(); - this.size = bytesToStr(this.attachment.size); - } -} -export interface Item extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/attachments/attachment/module.ts b/application/client/src/app/ui/views/sidebar/attachments/attachment/module.ts deleted file mode 100644 index 2be9d186cf..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/attachment/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { Item } from './component'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { AppDirectiviesModule } from '@directives/module'; - -@NgModule({ - imports: [CommonModule, MatButtonModule, MatIconModule, AppDirectiviesModule], - declarations: [Item], - exports: [Item], -}) -export class ItemModule {} diff --git a/application/client/src/app/ui/views/sidebar/attachments/attachment/styles.less b/application/client/src/app/ui/views/sidebar/attachments/attachment/styles.less deleted file mode 100644 index 8a85c477d8..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/attachment/styles.less +++ /dev/null @@ -1,51 +0,0 @@ -@import '../../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - padding: 0; - margin: 0; - flex-direction: row; - align-items: center; - width: 100%; - margin-left: -24px; - height: 32px; - overflow: hidden; - padding: 3px 24px; - cursor: default; - & span.extention { - position: relative; - display: flex; - width: 32px; - height: 32px; - text-transform: uppercase; - align-items: center; - align-content: center; - color: var(--scheme-color-1); - font-size: 12px; - } - & div.desc { - position: relative; - display: flex; - height: 32px; - overflow: hidden; - flex-direction: column; - padding-left: 8px; - & p.name, - & p.size { - font-size: 14px; - font-weight: 400; - line-height: 14px; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - } - & p.name { - color: var(--scheme-color-1); - } - & p.size { - color: var(--scheme-color-3); - - } - } -} diff --git a/application/client/src/app/ui/views/sidebar/attachments/attachment/template.html b/application/client/src/app/ui/views/sidebar/attachments/attachment/template.html deleted file mode 100644 index 242e343026..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/attachment/template.html +++ /dev/null @@ -1,5 +0,0 @@ -{{ext}} -
    -

    {{attachment.name}}

    -

    {{size}}

    -
    diff --git a/application/client/src/app/ui/views/sidebar/attachments/attachment/wrapper.ts b/application/client/src/app/ui/views/sidebar/attachments/attachment/wrapper.ts deleted file mode 100644 index 79b9a75f8e..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/attachment/wrapper.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Attachment } from '@platform/types/content'; - -export class Wrapped { - public selected: boolean = false; - constructor(public readonly attachment: Attachment) {} - public select(): void { - this.selected = true; - } - public unselect(): void { - this.selected = false; - } - public toggle(): void { - this.selected = !this.selected; - } - public equal(attachment: Attachment): boolean { - return this.attachment.uuid === attachment.uuid; - } - public ext(ext: string): boolean { - return this.attachment.extAsString().toLowerCase() === ext.toLowerCase(); - } -} diff --git a/application/client/src/app/ui/views/sidebar/attachments/component.ts b/application/client/src/app/ui/views/sidebar/attachments/component.ts deleted file mode 100644 index ae1c14d080..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/component.ts +++ /dev/null @@ -1,436 +0,0 @@ -import { - Component, - Input, - ChangeDetectorRef, - AfterContentInit, - ViewChild, - ChangeDetectionStrategy, - HostListener, -} from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Attachment } from '@platform/types/content'; -import { Wrapped } from './attachment/wrapper'; -import { Locker } from '@ui/service/lockers'; -import { Notification } from '@ui/service/notifications'; -import { Owner } from '@schema/content/row'; -import { Preview } from './preview/component'; -import { NormalizedBackgroundTask } from '@platform/env/normalized'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { - getFileExtention, - appendFileExtention, - getFileName, - getSafeFileName, -} from '@platform/types/files'; - -import * as dom from '@ui/env/dom'; - -const UNTYPED = 'untyped'; - -@Component({ - selector: 'app-views-attachments-list', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Initial() -@Ilc() -export class Attachments extends ChangesDetector implements AfterContentInit { - @Input() session!: Session; - @ViewChild('previewref') previewElRef!: Preview; - - public preview: Attachment | undefined; - public extensions: Map = new Map(); - public readonly filtered: { - ext: string | undefined; - attachments: Wrapped[]; - } = { - ext: undefined, - attachments: [], - }; - - protected readonly runner: NormalizedBackgroundTask = new NormalizedBackgroundTask(20); - protected readonly attachments: Wrapped[] = []; - protected readonly selection: { - last: string | undefined; - } = { - last: undefined, - }; - protected readonly holded: { - ctrl: boolean; - shift: boolean; - } = { - ctrl: false, - shift: false, - }; - - @HostListener('contextmenu', ['$event']) onContextMenu(event: MouseEvent) { - this.ilc().emitter.ui.contextmenu.open({ - items: this.getCommonContextMenu(), - x: event.x, - y: event.y, - }); - } - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.env().subscriber.register( - this.session.attachments.subjects.get().updated.subscribe(this.update.bind(this)), - ); - this.env().subscriber.register( - this.ilc().services.ui.listener.listen('focus', window, (_event: Event) => { - this.holded.ctrl = false; - this.holded.shift = false; - return true; - }), - this.ilc().services.ui.listener.listen('blur', window, (_event: Event) => { - this.holded.ctrl = false; - this.holded.shift = false; - return true; - }), - this.ilc().services.ui.listener.listen( - 'keyup', - window, - (event: KeyboardEvent) => { - if (event.key === 'Control' || event.key === 'Meta') { - this.holded.ctrl = false; - } else if (event.key === 'Shift') { - this.holded.shift = false; - } - return true; - }, - ), - ); - this.env().subscriber.register( - this.ilc().services.ui.listener.listen( - 'keydown', - window, - (event: KeyboardEvent) => { - if (event.key === 'Control' || event.key === 'Meta') { - this.holded.ctrl = true; - } else if (event.key === 'Shift') { - this.holded.shift = true; - } - return true; - }, - ), - ); - this.update(); - } - - public onItemContextMenu(event: MouseEvent, attachment: Attachment) { - const items = [ - { - caption: 'Select All', - handler: () => { - this.attachments.map((a) => a.select()); - this.detectChanges(); - }, - }, - { - caption: 'Revert selection', - handler: () => { - this.attachments.map((a) => a.toggle()); - this.detectChanges(); - }, - }, - {}, - { - caption: 'Save Selected', - handler: () => { - this.save().selected(); - }, - }, - { - caption: 'Save All', - handler: () => { - this.save().all(); - }, - }, - {}, - { - caption: 'Save As', - handler: () => { - this.save().as(attachment); - }, - }, - {}, - { - caption: 'GoTo Related Row', - handler: () => { - if (attachment.messages.length === 0) { - this.log().warn( - `Attachment ${attachment.name} isn't bound with any row(s)`, - ); - return; - } - this.session.cursor.select( - attachment.messages[0], - Owner.Attachment, - undefined, - undefined, - ); - }, - }, - { - caption: 'Select Related Row(s)', - handler: () => { - if (attachment.messages.length === 0) { - this.log().warn( - `Attachment ${attachment.name} isn't bound with any row(s)`, - ); - return; - } - const cursor = this.session.cursor; - cursor - .drop() - .select(attachment.messages[0], Owner.Attachment, undefined, undefined); - attachment.messages.forEach((pos) => cursor.mark(pos).selected()); - }, - }, - {}, - ...this.getCommonContextMenu(), - ]; - this.ilc().emitter.ui.contextmenu.open({ - items, - x: event.x, - y: event.y, - }); - dom.stop(event); - } - - public select(): { - attachment(attachment: Attachment): void; - drop(): void; - } { - return { - attachment: (attachment: Attachment): void => { - const target = this.attachments.find((a) => a.equal(attachment)); - if (target === undefined) { - return; - } - if (!this.holded.ctrl && !this.holded.shift) { - const selected = target.selected; - this.attachments.map((a) => a.unselect()); - !selected && target.select(); - } else if (this.holded.ctrl) { - target.toggle(); - } else if (this.holded.shift) { - if (this.selection.last === undefined) { - return; - } - const index = this.filtered.attachments.findIndex((a) => a.equal(attachment)); - const lastIndex = this.filtered.attachments.findIndex( - (a) => a.attachment.uuid === this.selection.last, - ); - if (index === -1 || lastIndex === -1) { - return; - } - if (index === lastIndex) { - target.toggle(); - } else if (index > lastIndex) { - for (let i = lastIndex + 1; i <= index; i += 1) { - this.filtered.attachments[i].toggle(); - } - } else if (index < lastIndex) { - for (let i = lastIndex - 1; i >= index; i -= 1) { - this.filtered.attachments[i].toggle(); - } - } - } - const selected = this.getSelected(); - if (selected.length === 1) { - this.preview = selected[0]; - if (this.previewElRef !== undefined) { - this.previewElRef.assign(this.preview); - } - } else { - this.preview = undefined; - } - if (selected.length > 0) { - this.selection.last = attachment.uuid; - } else { - this.selection.last = undefined; - } - this.detectChanges(); - }, - drop: (): void => { - this.attachments.map((a) => a.unselect()); - this.selection.last = undefined; - this.preview = undefined; - }, - }; - } - - public getSelected(): Attachment[] { - return this.attachments.filter((a) => a.selected).map((a) => a.attachment); - } - - public filter(): { - ext(ext: string): void; - update(): void; - all(): void; - } { - return { - ext: (ext: string): void => { - this.filtered.ext = ext === UNTYPED ? '' : ext; - this.select().drop(); - this.filter().update(); - }, - update: (): void => { - const ext = this.filtered.ext; - if (ext === undefined) { - this.filtered.attachments = this.attachments; - } else { - this.filtered.attachments = this.attachments.filter((a) => a.ext(ext)); - } - this.detectChanges(); - }, - all: (): void => { - this.filtered.ext = undefined; - this.select().drop(); - this.filter().update(); - }, - }; - } - - public save(): { - all(): Promise; - selected(): Promise; - typed(ext: string): Promise; - as(attachment?: Attachment): Promise; - } { - const bridge = this.ilc().services.system.bridge; - const copy = async (files: string[]) => { - if (files.length === 0) { - return; - } - const folders = await bridge.folders().select(); - if (folders.length !== 1) { - return; - } - const message = this.ilc().services.ui.lockers.lock(new Locker(true, `Saving...`), { - closable: false, - }); - bridge - .files() - .copy(files, folders[0]) - .catch((err: Error) => { - this.ilc().services.ui.notifications.notify( - new Notification({ - message: err.message, - actions: [], - }), - ); - }) - .finally(() => { - message.popup.close(); - }); - }; - return { - all: async (): Promise => { - copy(this.attachments.map((a) => a.attachment.filepath)); - }, - selected: async (): Promise => { - copy(this.attachments.filter((a) => a.selected).map((a) => a.attachment.filepath)); - }, - typed: async (ext: string): Promise => { - copy(this.attachments.filter((a) => a.ext(ext)).map((a) => a.attachment.filepath)); - }, - as: async (attachment?: Attachment): Promise => { - if (attachment === undefined) { - const selected = this.getSelected(); - if (selected.length !== 1) { - return; - } - attachment = selected[0]; - } - let dest = await bridge - .files() - .select.save(undefined, getSafeFileName(getFileName(attachment.filepath))); - if (dest === undefined) { - return; - } - const ext = { - dest: getFileExtention(dest), - src: getFileExtention(attachment.filepath), - }; - if (ext.dest.toLowerCase() !== ext.src.toLowerCase()) { - dest = appendFileExtention(dest, ext.src); - } - const message = this.ilc().services.ui.lockers.lock(new Locker(true, `Saving...`), { - closable: false, - }); - bridge - .files() - .cp(attachment.filepath, dest) - .catch((err: Error) => { - this.ilc().services.ui.notifications.notify( - new Notification({ - message: err.message, - actions: [], - }), - ); - }) - .finally(() => { - message.popup.close(); - }); - }, - }; - } - - protected getCommonContextMenu(): IMenuItem[] { - return [ - { - caption: `Show All (${this.attachments.length})`, - handler: () => { - this.filter().all(); - }, - }, - {}, - ...Array.from(this.extensions.entries()).map((entry) => { - const ext = entry[0]; - const count = entry[1]; - return ext === UNTYPED - ? { - caption: `Show All Untyped (${count})`, - handler: () => { - this.filter().ext(''); - }, - } - : { - caption: `Show: *.${ext} (${count})`, - handler: () => { - this.filter().ext(ext); - }, - }; - }), - ]; - } - - protected update(): void { - const attachments = Array.from(this.session.attachments.attachments.values()).filter( - (a) => this.attachments.find((w) => w.equal(a)) === undefined, - ); - this.attachments.push(...attachments.map((a) => new Wrapped(a))); - attachments.forEach((attachment) => { - const ext = typeof attachment.ext !== 'string' ? UNTYPED : attachment.ext; - const count = this.extensions.get(ext); - if (count === undefined) { - this.extensions.set(ext, 1); - } else { - this.extensions.set(ext, count + 1); - } - }); - this.filter().update(); - this.detectChanges(); - } -} -export interface Attachments extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/attachments/module.ts b/application/client/src/app/ui/views/sidebar/attachments/module.ts deleted file mode 100644 index 98175b428a..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ContainersModule } from '@elements/containers/module'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { Attachments } from './component'; -import { ItemModule } from './attachment/module'; -import { PreviewModule } from './preview/module'; -import { MatCardModule } from '@angular/material/card'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatDividerModule } from '@angular/material/divider'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - MatButtonModule, - MatCardModule, - MatExpansionModule, - MatMenuModule, - MatIconModule, - MatDividerModule, - ItemModule, - PreviewModule, - ], - declarations: [Attachments], - exports: [Attachments], - bootstrap: [Attachments], -}) -export class AttachmentsModule {} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/audio/component.ts b/application/client/src/app/ui/views/sidebar/attachments/preview/audio/component.ts deleted file mode 100644 index e5e2df0468..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/audio/component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Attachment } from '@platform/types/content'; -import { Subject } from '@platform/env/subscription'; - -@Component({ - selector: 'app-views-attachments-item-audio-preview', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class Preview { - @Input() attachment!: Attachment; - @Input() embedded!: boolean; - @Input() updated!: Subject; -} -export interface Preview extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/audio/styles.less b/application/client/src/app/ui/views/sidebar/attachments/preview/audio/styles.less deleted file mode 100644 index 77c3a08a3d..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/audio/styles.less +++ /dev/null @@ -1,10 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - width: 100%; - overflow: hidden; -} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/audio/template.html b/application/client/src/app/ui/views/sidebar/attachments/preview/audio/template.html deleted file mode 100644 index d42f77ef55..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/audio/template.html +++ /dev/null @@ -1 +0,0 @@ -

    Not supported yet

    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/component.ts b/application/client/src/app/ui/views/sidebar/attachments/preview/component.ts deleted file mode 100644 index dfd3b15d71..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/component.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { - Component, - Input, - AfterContentInit, - ChangeDetectorRef, - ChangeDetectionStrategy, - HostBinding, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Attachment } from '@platform/types/content'; -import { bytesToStr } from '@env/str'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Locker } from '@ui/service/lockers'; -import { Notification } from '@ui/service/notifications'; -import { Subject } from '@platform/env/subscription'; -import { - getFileExtention, - appendFileExtention, - getFileName, - getSafeFileName, -} from '@platform/types/files'; - -@Component({ - selector: 'app-views-attachments-preview', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Initial() -@Ilc() -export class Preview extends ChangesDetector implements AfterContentInit { - @Input() attachment!: Attachment; - @Input() embedded!: boolean; - @Input() close!: () => void; - - @HostBinding('class.popup') get popup() { - return !this.embedded; - } - - set popup(value: boolean) { - // - } - - public ext!: string; - public size!: string; - public type!: 'audio' | 'video' | 'text' | 'image' | 'unknown'; - public updated: Subject = new Subject(); - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.update(); - } - - public assign(attachment: Attachment): void { - this.attachment = attachment; - this.update().detectChanges(); - this.updated.emit(); - } - - public async saveAs(): Promise { - const bridge = this.ilc().services.system.bridge; - let dest = await bridge - .files() - .select.save(undefined, getSafeFileName(getFileName(this.attachment.filepath))); - if (dest === undefined) { - return; - } - const ext = { - dest: getFileExtention(dest), - src: getFileExtention(this.attachment.filepath), - }; - if (ext.dest.toLowerCase() !== ext.src.toLowerCase()) { - dest = appendFileExtention(dest, ext.src); - } - const message = this.ilc().services.ui.lockers.lock(new Locker(true, `Saving...`), { - closable: false, - }); - bridge - .files() - .cp(this.attachment.filepath, dest) - .catch((err: Error) => { - this.ilc().services.ui.notifications.notify( - new Notification({ - message: err.message, - actions: [], - }), - ); - }) - .finally(() => { - message.popup.close(); - }); - } - - protected update(): Preview { - this.ext = this.attachment.extAsString(); - this.size = bytesToStr(this.attachment.size); - if (this.attachment.is().image()) { - this.type = 'image'; - } else if (this.attachment.is().video()) { - this.type = 'video'; - } else if (this.attachment.is().audio()) { - this.type = 'audio'; - } else if (this.attachment.is().text()) { - this.type = 'text'; - } else { - this.type = 'unknown'; - } - return this; - } -} -export interface Preview extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/image/component.ts b/application/client/src/app/ui/views/sidebar/attachments/preview/image/component.ts deleted file mode 100644 index e0962d4bb7..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/image/component.ts +++ /dev/null @@ -1,239 +0,0 @@ -import { - Component, - Input, - ViewChild, - AfterViewInit, - ElementRef, - ChangeDetectorRef, - ChangeDetectionStrategy, - AfterContentInit, -} from '@angular/core'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Attachment } from '@platform/types/content'; -import { popup, Vertical, Horizontal } from '@ui/service/popup'; -import { ChangeEvent } from '@directives/dragging'; -import { stop } from '@ui/env/dom'; -import { Subject } from '@platform/env/subscription'; -import { components } from '@env/decorators/initial'; -import { Locker } from '@ui/service/lockers'; -import { URLFileReader } from '@env/urlfilereader'; - -@Component({ - selector: 'app-views-attachments-item-image-preview', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class Preview extends ChangesDetector implements AfterViewInit, AfterContentInit { - @Input() attachment!: Attachment; - @Input() embedded!: boolean; - @Input() updated!: Subject; - - @ViewChild('image') public imageElRef!: ElementRef; - - public url!: string; - - protected rotation: number = 0; - protected zoom: number = 1; - protected size!: DOMRect; - protected origin!: DOMRect; - - protected readonly position: { - top: number; - left: number; - } = { - top: 0, - left: 0, - }; - - protected readonly min: { - top: number; - left: number; - } = { - top: 0, - left: 0, - }; - - protected readonly max: { - top: number; - left: number; - } = { - top: 0, - left: 0, - }; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - protected updateImageDomRect() { - this.size = this.imageElRef.nativeElement.getBoundingClientRect(); - const diff = { - top: (this.size.height - this.origin.height) / 2 / this.zoom, - left: (this.size.width - this.origin.width) / 2 / this.zoom, - }; - if (diff.top > 0) { - this.max.top = diff.top; - this.min.top = -diff.top; - } else { - this.max.top = 0; - this.min.top = 0; - } - if (diff.left > 0) { - this.max.left = diff.left; - this.min.left = -diff.left; - } else { - this.max.left = 0; - this.min.left = 0; - } - if (this.position.top > this.max.top) { - this.position.top = this.max.top; - } else if (this.position.top < this.min.top) { - this.position.top = this.min.top; - } - if (this.position.left > this.max.left) { - this.position.left = this.max.left; - } else if (this.position.left < this.min.left) { - this.position.left = this.min.left; - } - } - - public contextmenu(event: MouseEvent) { - this.ilc().emitter.ui.contextmenu.open({ - items: [ - { - caption: 'Copy Into Clipboard', - handler: () => { - this.copy(); - }, - }, - ], - x: event.x, - y: event.y, - }); - } - - public originImageDomRect() { - this.origin = this.imageElRef.nativeElement.getBoundingClientRect(); - this.updateImageDomRect(); - } - - public ngAfterContentInit(): void { - this.update(); - this.env().subscriber.register( - this.updated.subscribe(() => { - this.update(); - this.detectChanges(); - }), - ); - } - - public ngAfterViewInit(): void { - this.originImageDomRect(); - this.size = this.origin; - } - - public getStyles(): { [key: string]: string } { - return { - transform: `rotate(${this.rotation}deg) scale(${this.zoom}) translate(${this.position.left}px,${this.position.top}px)`, - }; - } - - public rotate(): { - left(): void; - right(): void; - } { - return { - left: (): void => { - this.rotation -= 90; - this.rotation = this.rotation < 0 ? 270 : this.rotation; - }, - right: (): void => { - this.rotation += 90; - this.rotation = this.rotation > 360 ? 90 : this.rotation; - }, - }; - } - - public scrolling(event: WheelEvent) { - stop(event); - this.zoom += 0.05 * (event.deltaY > 0 ? -1 : 1); - this.zoom = this.zoom < 1 ? 1 : this.zoom; - this.detectChanges(); - this.updateImageDomRect(); - } - - public maximize() { - const instance = popup.open({ - component: { - factory: components.get('app-views-attachments-preview'), - inputs: { - attachment: this.attachment, - embedded: false, - close: () => { - instance.close(); - }, - }, - }, - position: { - vertical: Vertical.center, - horizontal: Horizontal.center, - }, - closeOnKey: 'Escape', - uuid: this.attachment.uuid, - }); - } - - public move(event: ChangeEvent) { - this.position.top = event.top; - this.position.left = event.left; - } - - public copy(): void { - const message = this.ilc().services.ui.lockers.lock( - new Locker(true, `Copying into clipboard...`), - { - closable: false, - }, - ); - new URLFileReader(`attachment://${encodeURIComponent(this.attachment.filepath)}`) - .read('blob') - .then((response) => { - if (!(response instanceof Blob)) { - this.log().warn(`Fail to fetch image as Blob`); - return; - } - const contentType = response.type.trim(); - response - .arrayBuffer() - .then((buffer) => { - // We are using native clipboard API, but not browser one (navigator.clipboard) - // to avoid possible issues with size of blob. - window.electron.clipboard - .write(contentType.length > 0 ? contentType : undefined, buffer) - .catch((err: Error) => { - this.log().warn( - `Fail to copy image into clipboard: ${err.message}`, - ); - }); - }) - .catch((err: Error) => { - this.log().warn(`Fail to load image as bytes: ${err.message}`); - }); - }) - .catch((err: Error) => { - this.log().error(`Fail to get a blob for ${this.attachment.name}: ${err.message}.`); - }) - .finally(() => { - message.popup.close(); - }); - } - - protected update() { - this.url = `attachment://${encodeURIComponent(this.attachment.filepath)}`; - } -} -export interface Preview extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/image/styles.less b/application/client/src/app/ui/views/sidebar/attachments/preview/image/styles.less deleted file mode 100644 index 49ffc30d46..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/image/styles.less +++ /dev/null @@ -1,43 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - & div.image { - position: relative; - width: 100%; - overflow: hidden; - margin-bottom: 16px; - & img { - position: relative; - display: block; - width: 100%; - } - } - & div.shortcuts { - position: absolute; - top: 8px; - right: 10px; - padding: 3px; - } - & div.controlls { - position: absolute; - width: 100%; - justify-content: center; - flex-direction: row; - top: 0px; - width: 100%; - background: var(--scheme-color-3-15); - display: none; - & * { - color:var(--scheme-color-1); - } - } - &:hover { - & div.controlls { - display: flex; - } - } -} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/image/template.html b/application/client/src/app/ui/views/sidebar/attachments/preview/image/template.html deleted file mode 100644 index 471bb3e038..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/image/template.html +++ /dev/null @@ -1,24 +0,0 @@ -
    - -
    -
    - - - -
    -
    - -
    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/module.ts b/application/client/src/app/ui/views/sidebar/attachments/preview/module.ts deleted file mode 100644 index fa8f36613f..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { Preview } from './component'; -import { Preview as ImagePreview } from './image/component'; -import { Preview as TextPreview } from './text/component'; -import { Preview as UnknownPreview } from './unknown/component'; -import { Preview as VideoPreview } from './video/component'; -import { Preview as AudioPreview } from './audio/component'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { AppDirectiviesModule } from '@directives/module'; - -@NgModule({ - imports: [CommonModule, MatButtonModule, MatIconModule, AppDirectiviesModule], - declarations: [Preview, ImagePreview, VideoPreview, AudioPreview, TextPreview, UnknownPreview], - exports: [Preview], -}) -export class PreviewModule {} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/styles.less b/application/client/src/app/ui/views/sidebar/attachments/preview/styles.less deleted file mode 100644 index b542abb6ab..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/styles.less +++ /dev/null @@ -1,67 +0,0 @@ -@import '../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - &.popup { - margin: 16px; - } - & div.title { - position: relative; - display: flex; - padding: 0; - margin: 0; - flex-direction: row; - align-items: center; - margin-left: -24px; - height: 32px; - overflow: hidden; - padding: 3px 24px; - cursor: default; - margin-bottom: 16px; - & span.extention { - position: relative; - display: flex; - width: 32px; - height: 32px; - text-transform: uppercase; - align-items: center; - align-content: center; - color: var(--scheme-color-1); - font-size: 12px; - font-weight: 700; - } - & div.desc { - position: relative; - display: flex; - height: 32px; - overflow: hidden; - flex-direction: column; - padding-left: 8px; - & p.name, - & p.size { - font-size: 14px; - font-weight: 400; - line-height: 14px; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - } - & p.name { - color: var(--scheme-color-1); - } - & p.size { - color: var(--scheme-color-3); - - } - } - } - & div.controlls { - text-align: right; - & button { - margin-left: 8px; - } - } -} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/template.html b/application/client/src/app/ui/views/sidebar/attachments/preview/template.html deleted file mode 100644 index 36b852fbe9..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/template.html +++ /dev/null @@ -1,18 +0,0 @@ -
    - {{ext}} -
    -

    {{attachment.name}}

    -

    {{size}}

    -
    -
    -
    - - - - - -
    -
    - - -
    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/text/component.ts b/application/client/src/app/ui/views/sidebar/attachments/preview/text/component.ts deleted file mode 100644 index 46f6002ae9..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/text/component.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { - Component, - Input, - AfterContentInit, - ChangeDetectorRef, - ChangeDetectionStrategy, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Attachment } from '@platform/types/content'; -import { URLFileReader } from '@env/urlfilereader'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { unique } from '@platform/env/sequence'; -import { Subject } from '@platform/env/subscription'; - -const MAX_LINES_COUNT = 1000; - -@Component({ - selector: 'app-views-attachments-item-text-preview', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class Preview extends ChangesDetector implements AfterContentInit { - @Input() attachment!: Attachment; - @Input() embedded!: boolean; - @Input() updated!: Subject; - - public lines: string[] = []; - public uuid: string = unique(); - public reading: boolean = true; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.update(); - this.env().subscriber.register( - this.ilc().services.system.hotkeys.listen('Ctrl + C', () => { - this.copy(false); - }), - this.updated.subscribe(() => { - this.update(); - }), - ); - } - - public contextmenu(event: MouseEvent) { - this.ilc().emitter.ui.contextmenu.open({ - items: [ - { - caption: 'Copy Into Clipboard', - handler: () => { - this.copy(); - }, - }, - ], - x: event.x, - y: event.y, - }); - } - - public copy(all = true): void { - if (all) { - navigator.clipboard.writeText(this.lines.join('\n')); - } else { - const active = document.activeElement; - if (active === null) { - return; - } - if (active.getAttribute('uuid') !== this.uuid) { - return; - } - const selection = document.getSelection(); - if (selection === null) { - return; - } - navigator.clipboard.writeText( - selection - .toString() - .replace(/[\n\r]/gi, '\n') - .replace(/\n{2,}/gi, '\n'), - ); - } - } - - protected update() { - this.reading = true; - this.detectChanges(); - new URLFileReader(`attachment://${encodeURIComponent(this.attachment.filepath)}`) - .read() - .then((response) => { - if (typeof response !== 'string') { - this.log().error(`Expecting to get a text for ${this.attachment.name}.`); - return; - } - this.lines = response.split(/[\n\r]/gi); - if (this.lines.length > MAX_LINES_COUNT) { - const cutted = this.lines.length - MAX_LINES_COUNT; - this.lines.splice(MAX_LINES_COUNT, cutted); - this.lines.push(`... (more ${cutted} lines) ...`); - } - }) - .catch((err: Error) => { - this.log().error(`Fail to get a text for ${this.attachment.name}: ${err.message}.`); - }) - .finally(() => { - this.reading = false; - this.detectChanges(); - }); - } -} -export interface Preview extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/text/styles.less b/application/client/src/app/ui/views/sidebar/attachments/preview/text/styles.less deleted file mode 100644 index a20ce2c1c8..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/text/styles.less +++ /dev/null @@ -1,47 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - width: 100%; - overflow: hidden; - & p.info { - font-size: 13px; - color: var(--scheme-color-1); - margin-bottom: 16px; - } - & div.container { - & div.shortcuts { - position: absolute; - top: 1px; - right: 10px; - padding: 3px; - background: var(--scheme-color-5-85); - } - & div.content { - position: relative; - display: block; - width: 100%; - max-height: 300px; - overflow: auto; - padding: 8px 0; - margin: 0 0 16px 0; - border: thin solid var(--scheme-color-3); - box-sizing: border-box; - & p.line { - color: var(--scheme-color-1); - font-size: 11px; - white-space: nowrap; - padding: 0 8px; - margin: 0; - line-height: 15px; - user-select: text; - cursor: text; - font-variant-numeric: tabular-nums; - font-family: console, monospace; - } - } - } -} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/text/template.html b/application/client/src/app/ui/views/sidebar/attachments/preview/text/template.html deleted file mode 100644 index c5f9a7f437..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/text/template.html +++ /dev/null @@ -1,9 +0,0 @@ -

    Reading...

    -
    -
    -

    {{line}}

    -
    -
    - -
    -
    diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/unknown/component.ts b/application/client/src/app/ui/views/sidebar/attachments/preview/unknown/component.ts deleted file mode 100644 index 9a2bdb25a6..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/unknown/component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Attachment } from '@platform/types/content'; -import { Subject } from '@platform/env/subscription'; - -@Component({ - selector: 'app-views-attachments-item-unknown-preview', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class Preview { - @Input() attachment!: Attachment; - @Input() embedded!: boolean; - @Input() updated!: Subject; -} -export interface Preview extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/unknown/styles.less b/application/client/src/app/ui/views/sidebar/attachments/preview/unknown/styles.less deleted file mode 100644 index 050a0b946a..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/unknown/styles.less +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - margin-bottom: 16px; - width: 100%; - overflow: hidden; - & p { - color: var(--scheme-color-1); - font-size: 14px; - } -} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/unknown/template.html b/application/client/src/app/ui/views/sidebar/attachments/preview/unknown/template.html deleted file mode 100644 index 70891f3b96..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/unknown/template.html +++ /dev/null @@ -1 +0,0 @@ -

    This format of file isn't supported by chipmunk

    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/video/component.ts b/application/client/src/app/ui/views/sidebar/attachments/preview/video/component.ts deleted file mode 100644 index 6dc80ed49c..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/video/component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Attachment } from '@platform/types/content'; -import { Subject } from '@platform/env/subscription'; - -@Component({ - selector: 'app-views-attachments-item-video-preview', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class Preview { - @Input() attachment!: Attachment; - @Input() embedded!: boolean; - @Input() updated!: Subject; -} -export interface Preview extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/video/styles.less b/application/client/src/app/ui/views/sidebar/attachments/preview/video/styles.less deleted file mode 100644 index 77c3a08a3d..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/video/styles.less +++ /dev/null @@ -1,10 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - width: 100%; - overflow: hidden; -} diff --git a/application/client/src/app/ui/views/sidebar/attachments/preview/video/template.html b/application/client/src/app/ui/views/sidebar/attachments/preview/video/template.html deleted file mode 100644 index d42f77ef55..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/preview/video/template.html +++ /dev/null @@ -1 +0,0 @@ -

    Not supported yet

    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/attachments/styles.less b/application/client/src/app/ui/views/sidebar/attachments/styles.less deleted file mode 100644 index 157b52bb9c..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/styles.less +++ /dev/null @@ -1,85 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: absolute; - display: flex; - flex-direction: column; - padding: 0; - margin: 0; - bottom: 0.5rem; - right: 0.5rem; - left: 0.5rem; - top: 0.5rem; - overflow-y: auto; - overflow-x: hidden; - outline: none; - & > div.caption { - position: sticky !important; - top: 0; - left: 0; - z-index: 1; - background: var(--scheme-color-5); - display: flex; - padding: 0 24px; - margin: 0; - text-align: left; - align-items: center; - white-space: nowrap; - font-size: 0.9rem; - font-weight: 400; - span.title{ - color: var(--scheme-color-2); - } - span.subtitle{ - padding-left: 6px; - color: var(--scheme-color-3); - } - & span.filler { - flex: auto; - } - - } - & p.info { - font-size: 13px; - color: var(--scheme-color-2); - margin: 16px 24px; - } - & mat-expansion-panel { - margin: 6px 0!important; - } - & div.mat-expansion-panel-body { - padding-left: 0; - padding-right: 0; - } - & mat-expansion-panel.list { - flex:auto; - overflow-y: auto; - overflow-x: hidden; - & mat-expansion-panel-header { - position: sticky; - background-color: var(--scheme-bk-color-0); - z-index: 1; - top: 0; - } - & app-views-attachments-item.selected { - background: var(--scheme-color-4); - &::after { - position: absolute; - content: ''; - display: block; - top: 0; - height: 100%; - width: 4px; - left:0; - background: var(--scheme-color-active); - } - } - & app-views-attachments-item:hover { - background: var(--scheme-color-5); - } - } - & mat-expansion-panel.preview { - flex: none; - } - -} diff --git a/application/client/src/app/ui/views/sidebar/attachments/template.html b/application/client/src/app/ui/views/sidebar/attachments/template.html deleted file mode 100644 index a5f99691e3..0000000000 --- a/application/client/src/app/ui/views/sidebar/attachments/template.html +++ /dev/null @@ -1,40 +0,0 @@ -
    - Attachments - ({{attachments.length}}) - - -
    -

    No attachments has been received

    - - - Received Attachments - -
    - -
    -
    - - - Preview - - - - - - - - - - diff --git a/application/client/src/app/ui/views/sidebar/comments/comment/component.ts b/application/client/src/app/ui/views/sidebar/comments/comment/component.ts deleted file mode 100644 index ac080c914a..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/comment/component.ts +++ /dev/null @@ -1,198 +0,0 @@ -// tslint:disable: member-ordering - -import { - Component, - ChangeDetectorRef, - Input, - AfterContentInit, - OnChanges, - SimpleChanges, - ViewEncapsulation, - ChangeDetectionStrategy, -} from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { CommentDefinition, Response } from '@platform/types/comment'; -import { CShortColors, shadeColor } from '@ui/styles/colors'; -import { Subject } from '@platform/env/subscription'; -import { unique } from '@platform/env/sequence'; -import { Owner } from '@schema/content/row'; - -import * as moment from 'moment'; -import * as obj from '@platform/env/obj'; - -@Component({ - selector: 'app-views-comments-item', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Initial() -@Ilc() -export class Comment extends ChangesDetector implements AfterContentInit, OnChanges { - @Input() comment!: CommentDefinition; - @Input() session!: Session; - @Input() broadcastEditorUsage!: Subject; - - public colors: string[] = CShortColors.slice(); - public response: Response | undefined; - - protected uuid: string = unique(); - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - this.ngOnResponseSave = this.ngOnResponseSave.bind(this); - this.ngOnResponseCancel = this.ngOnResponseCancel.bind(this); - this.ngOnResponseRemove = this.ngOnResponseRemove.bind(this); - } - - public created(): string { - return moment.unix(this.comment.created / 1000).format('MM/DD/YYYY hh:mm:ss'); - } - - public isEditable(): boolean { - return this.session.comments.isEditable(this.comment); - } - - public isResponseEditable(response: Response): boolean { - return ( - this.session.teamwork.user().get() !== undefined && - response.username === this.session.teamwork.user().get() - ); - } - - public ngAfterContentInit() { - this.env().subscriber.register( - this.broadcastEditorUsage.subscribe((uuid: string) => { - if (uuid === this.uuid) { - return; - } - this.response = undefined; - this.detectChanges(); - }), - ); - } - - public ngOnEdit() { - if (!this.isEditable()) { - return; - } - this.session.comments.edit(this.comment); - } - - public ngOnShow() { - this.session.cursor.select( - this.comment.selection.start.position, - Owner.Comment, - undefined, - undefined, - ); - } - - public ngOnRemove() { - if (!this.isEditable()) { - return; - } - this.session.comments.remove(this.comment.uuid); - } - - public ngOnChanges(changes: SimpleChanges) { - const change = changes as unknown as { comment: { currentValue: CommentDefinition } }; - if (change.comment === undefined) { - return; - } - this.comment = obj.clone(change.comment.currentValue); - this.detectChanges(); - } - - public ngOnSetColor(color: string | undefined) { - if (!this.isEditable()) { - return; - } - this.comment.color = color; - this.session.comments.update(this.comment); - this.detectChanges(); - } - - public ngOnReplay() { - const username = this.session.teamwork.user().get(); - if (username === undefined) { - return; - } - this.response = { - uuid: '', - username, - created: Date.now(), - modified: Date.now(), - comment: '', - }; - this.broadcastEditorUsage.emit(this.uuid); - this.detectChanges(); - } - - public ngOnResponseSave(comment: string) { - if (this.response === undefined) { - return; - } - if (comment !== '') { - if (this.response.uuid === '') { - this.response.uuid = unique(); - this.response.comment = comment; - this.comment.responses.push(this.response); - } else { - this.comment.responses = this.comment.responses.map((response: Response) => { - if (response.uuid === this.response?.uuid) { - response.modified = Date.now(); - response.comment = comment; - } - return response; - }); - } - this.session.comments.update(this.comment); - } - this.ngOnResponseCancel(); - } - - public ngOnResponseCancel() { - this.response = undefined; - this.detectChanges(); - } - - public ngOnResponseRemove() { - if (this.response === undefined) { - return; - } - if (!this.isResponseEditable(this.response)) { - return; - } - this.comment.responses = this.comment.responses.filter( - (r) => r.uuid !== this.response?.uuid, - ); - this.session.comments.update(this.comment); - this.ngOnResponseCancel(); - } - - public ngGetResponseEditCallback(response: Response) { - return () => { - this.response = Object.assign({}, response); - this.broadcastEditorUsage.emit(this.uuid); - this.detectChanges(); - }; - } - - public ngGetResponseRemoveCallback(uuid: string) { - return () => { - this.comment.responses = this.comment.responses.filter((r) => r.uuid !== uuid); - this.session.comments.update(this.comment); - }; - } - - public ngGetResponseColor(): string | undefined { - return this.comment.color === undefined ? undefined : shadeColor(this.comment.color, -10); - } -} -export interface Comment extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/comments/comment/styles.less b/application/client/src/app/ui/views/sidebar/comments/comment/styles.less deleted file mode 100644 index 243b65a3b0..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/comment/styles.less +++ /dev/null @@ -1,64 +0,0 @@ -@import '../../../../styles/variables.less'; - -app-views-comments-item { - display: block; - & div.wrapper { - &.black { - & * { - color: var(--scheme-color-7)!important; - } - .mat-expansion-indicator::after{ - color: var(--scheme-color-7)!important; - } - } - & div.signature { - display: flex; - flex-direction: row; - & p.date { - flex:100%; - text-align: right; - } - } - & mat-card { - margin-top: 8px; - & mat-card-actions { - display: flex; - flex-direction: row; - opacity: 0.001; - justify-content: end; - transition: 250ms ease-in-out all; - & span.small-icon-button { - color: var(--scheme-color-5); - } - } - & mat-expansion-panel { - border-top-left-radius: 0!important; - border-top-right-radius: 0!important; - // margin-bottom: -16px!important; - & .mat-expansion-panel-header { - padding: 0 16px; - } - & .mat-expansion-panel-body { - padding: 0 8px 16px 16px; - } - } - & mat-card-subtitle { - color: var(--scheme-color-5); - & span.position-label:hover { - cursor: pointer; - text-decoration: underline; - } - } - & mat-card-content:hover { - cursor: pointer; - } - } - &:hover { - & mat-card { - & mat-card-actions { - opacity: 1; - } - } - } - } -} diff --git a/application/client/src/app/ui/views/sidebar/comments/comment/template.html b/application/client/src/app/ui/views/sidebar/comments/comment/template.html deleted file mode 100644 index a15883f250..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/comment/template.html +++ /dev/null @@ -1,98 +0,0 @@ -
    - - - {{comment.selection.start.position}} - {{comment.selection.end.position}} -
    -

    {{comment.username}}

    -

    {{created()}}

    -
    -
    - {{comment.comment}} - - - - - - - - - - - {{comment.responses.length}} response{{comment.responses.length > 1 ? 's' : ''}} - - - - -
    - - - - - - - - - -
    - - -
    -
    -
    - -
    - -
    diff --git a/application/client/src/app/ui/views/sidebar/comments/component.ts b/application/client/src/app/ui/views/sidebar/comments/component.ts deleted file mode 100644 index b05b56c5cb..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/component.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { - Component, - OnDestroy, - Input, - ChangeDetectorRef, - AfterContentInit, - AfterViewInit, - ViewEncapsulation, -} from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { CommentDefinition } from '@platform/types/comment'; -import { CShortColors } from '@ui/styles/colors'; -import { Subscriber, Subject } from '@platform/env/subscription'; - -export enum ECommentsOrdering { - position = 'position', - colors = 'colors', -} - -@Component({ - selector: 'app-views-comments', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Initial() -@Ilc() -export class Comments - extends ChangesDetector - implements OnDestroy, AfterContentInit, AfterViewInit -{ - @Input() session: Session | undefined; - - protected update() { - this.comments = this.origin - .filter((c) => this.filter === undefined || this.filter === c.color) - .map((c) => Object.assign({}, c)); - this.hidden = []; - this.origin - .filter((c) => this.filter !== undefined && this.filter !== c.color) - .map((comment: CommentDefinition) => { - const index: number = this.hidden.findIndex((d) => d.color === comment.color); - if (index === -1) { - this.hidden.push({ count: 1, color: comment.color }); - } else { - this.hidden[index].count += 1; - } - }); - this.detectChanges(); - } - - protected onSessionChange(_uuid: string | undefined) { - this.session = this.ilc().services.system.session.active().session(); - if (this.session !== undefined) { - this.subscriber.unsubscribe(); - this.subscriber.register( - this.session.comments.subjects.get().added.subscribe(this.reload.bind(this)), - this.session.comments.subjects.get().updated.subscribe(this.reload.bind(this)), - this.session.comments.subjects.get().removed.subscribe(this.reload.bind(this)), - this.session.comments.subjects.get().reload.subscribe(this.reload.bind(this)), - ); - } - this.reload(); - } - - protected reload() { - if (this.session === undefined) { - this.origin = []; - this.update(); - return; - } - let comments: CommentDefinition[] = []; - const all: CommentDefinition[] = this.session.comments.getAsArray(); - switch (this.ordring) { - case ECommentsOrdering.colors: - (CShortColors.slice() as Array) - .concat([undefined] as Array) - .forEach((color: string | undefined) => { - const group: CommentDefinition[] = all.filter((c) => c.color === color); - group.sort((a: CommentDefinition, b: CommentDefinition) => { - return a.selection.start.position > b.selection.start.position ? 1 : -1; - }); - comments = comments.concat(group); - }); - break; - case ECommentsOrdering.position: - all.sort((a: CommentDefinition, b: CommentDefinition) => { - return a.selection.start.position > b.selection.start.position ? 1 : -1; - }); - comments = all; - break; - } - this.origin = comments; - this.update(); - } - - protected readonly subscriber: Subscriber = new Subscriber(); - protected filter: string | undefined; - protected origin: CommentDefinition[] = []; - - public comments: CommentDefinition[] = []; - public hidden: { count: number; color: string | undefined }[] = []; - public broadcastEditorUsage: Subject = new Subject(); - public colors: string[] = CShortColors.slice(); - public ordring: ECommentsOrdering = ECommentsOrdering.position; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnDestroy() { - this.subscriber.unsubscribe(); - } - - public ngAfterContentInit() { - this.ilc().channel.session.change(this.onSessionChange.bind(this)); - this.onSessionChange(undefined); - this.session !== undefined && - this.subscriber.register( - this.session.teamwork.subjects.get().active.subscribe(() => { - this.detectChanges(); - }), - ); - } - - public ngAfterViewInit() { - this.reload(); - } - - public ngOnSetFilter(color: string | undefined) { - this.filter = color; - this.update(); - } - - public ngOnRemoveAll() { - this.session !== undefined && this.session.comments.clear(); - } - - public ngOnCheckUpdates() { - this.session !== undefined && this.session.teamwork.update(); - } - - public ngOnOrderingSwitch() { - this.ordring = - this.ordring === ECommentsOrdering.colors - ? ECommentsOrdering.position - : ECommentsOrdering.colors; - this.reload(); - } - - public isAvailable(): boolean { - if (this.session === undefined) { - return false; - } - return ( - this.session.teamwork.repo().getActive() !== undefined && - this.session.teamwork.user().get() !== undefined - ); - } -} -export interface Comments extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/comments/editor/component.ts b/application/client/src/app/ui/views/sidebar/comments/editor/component.ts deleted file mode 100644 index f678162f15..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/editor/component.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { Component, ChangeDetectorRef, Input, AfterContentInit } from '@angular/core'; -import { ErrorStateMatcher } from '@angular/material/core'; -import { FormControl } from '@angular/forms'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Response } from '@platform/types/comment'; - -export class InputErrorStateMatcher implements ErrorStateMatcher { - protected valid: boolean = true; - protected error: string = ''; - - constructor() {} - - public isErrorState(control: FormControl | null): boolean { - if (control === null) { - return false; - } - this.valid = true; - this.error = ''; - if (control.value === null || control.value.trim() === '') { - this.valid = false; - this.error = `Value of comment cannot be empty`; - } - if (control.value !== null && control.value.length > 1024) { - this.valid = false; - this.error = `Maximum length of comment is 1024 chars`; - } - return !this.valid; - } - - public getError(): string | undefined { - return this.error; - } -} - -@Component({ - selector: 'app-views-comments-editor', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class Editor extends ChangesDetector implements AfterContentInit { - @Input() response!: Response; - @Input() save!: (comment: string) => void; - @Input() remove!: () => void; - @Input() cancel!: () => void; - - public ng_input_error: InputErrorStateMatcher = new InputErrorStateMatcher(); - public ng_response: string = ''; - public ng_mode: 'create' | 'edit' = 'create'; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit() { - if (this.response.uuid !== '') { - this.ng_response = this.response.comment; - this.ng_mode = 'edit'; - } - } - - public onKeyDown(event: KeyboardEvent) { - if (event.code === 'Enter') { - this.onAccept(); - } - } - - public onAccept() { - this.save(this.ng_response); - } - - public onRemove() { - this.remove(); - } - - public onCancel() { - this.cancel(); - } -} -export interface Editor extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/comments/editor/styles.less b/application/client/src/app/ui/views/sidebar/comments/editor/styles.less deleted file mode 100644 index 0d627226c0..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/editor/styles.less +++ /dev/null @@ -1,34 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - padding: 0.5rem; - margin: 0; - & div.inputs { - width: 100%; - & mat-form-field { - width: 100%; - } - } - div.controlls { - text-align: right; - padding-top: 8px; - overflow: hidden; - white-space: nowrap; - & button { - margin-left: 16px; - } - } - & mat-hint { - color: var(--scheme-color-2); - white-space: nowrap; - } - & mat-error { - color: var(--scheme-color-warning); - } - & textarea { - color: var(--scheme-color-1); - } -} diff --git a/application/client/src/app/ui/views/sidebar/comments/editor/template.html b/application/client/src/app/ui/views/sidebar/comments/editor/template.html deleted file mode 100644 index 4b24cf44d3..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/editor/template.html +++ /dev/null @@ -1,29 +0,0 @@ -
    - - Leave a comment - - {{ng_input_error.getError()}} - - Don't disclose personal info - - {{message.value.length}} / 1024 - -
    -
    - - - -
    diff --git a/application/client/src/app/ui/views/sidebar/comments/module.ts b/application/client/src/app/ui/views/sidebar/comments/module.ts deleted file mode 100644 index 2e8b76fcca..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/module.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ScrollingModule } from '@angular/cdk/scrolling'; -import { TeamworkAppletModule } from '@elements/teamwork/module'; - -import { Comments } from './component'; -import { Comment } from './comment/component'; -import { Editor } from './editor/component'; -import { Reply } from './reply/component'; - -import { MatButtonModule } from '@angular/material/button'; -import { MatInputModule } from '@angular/material/input'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatCardModule } from '@angular/material/card'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatDividerModule } from '@angular/material/divider'; - -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -@NgModule({ - imports: [ - CommonModule, - ScrollingModule, - FormsModule, - ReactiveFormsModule, - MatFormFieldModule, - MatButtonModule, - MatIconModule, - MatInputModule, - MatExpansionModule, - MatCardModule, - MatMenuModule, - MatDividerModule, - TeamworkAppletModule, - ], - declarations: [Comments, Comment, Editor, Reply], - exports: [Comments], - bootstrap: [Comments], -}) -export class CommentsModule { - constructor() {} -} diff --git a/application/client/src/app/ui/views/sidebar/comments/reply/component.ts b/application/client/src/app/ui/views/sidebar/comments/reply/component.ts deleted file mode 100644 index 99514434ec..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/reply/component.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - Component, - ChangeDetectorRef, - Input, - OnChanges, - SimpleChanges, - ChangeDetectionStrategy, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Response } from '@platform/types/comment'; - -import * as moment from 'moment'; - -@Component({ - selector: 'app-views-comments-reply', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Initial() -@Ilc() -export class Reply extends ChangesDetector implements OnChanges { - @Input() response!: Response; - @Input() color!: string | undefined; - @Input() edit!: () => void; - @Input() remove!: () => void; - @Input() icon!: boolean; - @Input() editable!: boolean; - - constructor(private cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnRemove() { - this.remove(); - } - - public ngOnEdit() { - this.edit(); - } - - public ngOnChanges(changes: SimpleChanges) { - const change = changes as unknown as { response: { currentValue: Response } }; - if (change.response === undefined) { - return; - } - this.response = change.response.currentValue; - this.detectChanges(); - } - - public created(): string { - return moment.unix(this.response.created / 1000).format('MM/DD hh:mm:ss'); - } -} -export interface Reply extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/comments/reply/styles.less b/application/client/src/app/ui/views/sidebar/comments/reply/styles.less deleted file mode 100644 index 7259fa3616..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/reply/styles.less +++ /dev/null @@ -1,57 +0,0 @@ -@import '../../../../styles/variables.less'; - - -:host { - display: block; - & div.wrapper { - display: block; - width: 100%; - &.black { - & * { - color: #000000; - } - & .datetime { - color: #444444!important; - } - & .mat-divider { - border-top-color: rgba(0,0,0,0.2); - } - } - & div.title { - display: flex; - flex-direction: row; - & .datetime { - text-align: right; - color: var(--scheme-color-2); - flex: 100%; - } - } - & div.controls { - display: flex; - flex-direction: row; - & span.small-icon-button { - opacity: 0.05; - } - & .filler { - flex: 100%; - } - } - & div.content { - margin-bottom: 12px; - } - - &:hover { - & div.controls { - & span.small-icon-button { - opacity: 1; - } - } - } - } - &:last-child{ - & mat-divider { - display: none; - } - } -} - diff --git a/application/client/src/app/ui/views/sidebar/comments/reply/template.html b/application/client/src/app/ui/views/sidebar/comments/reply/template.html deleted file mode 100644 index 8c55aa833b..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/reply/template.html +++ /dev/null @@ -1,30 +0,0 @@ -
    -
    - {{response.username}} - {{created()}} -
    -
    {{response.comment}}
    -
    - - -
    - -
    - - - - - - diff --git a/application/client/src/app/ui/views/sidebar/comments/styles.less b/application/client/src/app/ui/views/sidebar/comments/styles.less deleted file mode 100644 index 370da793fd..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/styles.less +++ /dev/null @@ -1,90 +0,0 @@ -@import '../../../styles/variables.less'; - - -app-views-comments { - position: absolute; - display: block; - padding: 0; - margin: 0; - bottom: 0.5rem; - right: 0.5rem; - left: 0.5rem; - top: 0.5rem; - overflow: hidden; - & > div.caption { - position: sticky !important; - top: 0; - left: 0; - z-index: 1; - background: var(--scheme-color-5); - display: flex; - padding: 0 22px; - margin: 0; - text-align: left; - align-items: center; - white-space: nowrap; - font-size: 0.9rem; - font-weight: 400; - span.title{ - color: var(--scheme-color-2); - } - span.subtitle{ - padding-left: 6px; - color: var(--scheme-color-3); - } - & span.filler { - flex: auto; - } - - } - & .comments { - position: absolute; - display: block; - top: 32px; - bottom: 0; - width: 100%; - left:0; - overflow-y: auto; - overflow-x: hidden; - } - & .hidden { - margin-top: 8px; - & .hidden-comment-wrapper{ - padding: 8px 18px; - &:first-child{ - margin-top: 8px; - } - &:last-child{ - margin-bottom: 8px; - } - & .hidden-comment{ - display: flex; - align-items: center; - & p { - margin-left: 16px; - margin-top: -2px; - } - & .mdc-fab--mini{ - width: 16px; - height: 16px; - } - } - } - } - p.info { - margin: 16px 24px; - } -} - -.app-views-comments-colors-wrapper { - display: flex; - overflow: hidden; - flex-direction: row; - padding: 4px 8px; - & .mdc-fab--mini { - height: 24px; - width: 24px; - padding: 0; - margin: 4px; - } -} diff --git a/application/client/src/app/ui/views/sidebar/comments/template.html b/application/client/src/app/ui/views/sidebar/comments/template.html deleted file mode 100644 index 8e7410c6e5..0000000000 --- a/application/client/src/app/ui/views/sidebar/comments/template.html +++ /dev/null @@ -1,97 +0,0 @@ -
    - Comments - ({{comments.length}}) - - - - - -
    -
    - - - - - - -
    - - - - - - - - - - -
    - - -
    -
    diff --git a/application/client/src/app/ui/views/sidebar/module.ts b/application/client/src/app/ui/views/sidebar/module.ts deleted file mode 100644 index 33702583a2..0000000000 --- a/application/client/src/app/ui/views/sidebar/module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FiltersModule } from './search/module'; -import { ObservedModule } from './observe/module'; -import { AttachmentsModule } from './attachments/module'; -import { CommentsModule } from './comments/module'; -import { TeamWorkModule } from './teamwork/module'; - -@NgModule({ - imports: [ - CommonModule, - FiltersModule, - ObservedModule, - AttachmentsModule, - CommentsModule, - TeamWorkModule, - ], - declarations: [], - exports: [FiltersModule, ObservedModule, AttachmentsModule, CommentsModule, TeamWorkModule], - bootstrap: [], -}) -export class SidebarModule {} diff --git a/application/client/src/app/ui/views/sidebar/observe/common/module.ts b/application/client/src/app/ui/views/sidebar/observe/common/module.ts deleted file mode 100644 index a2f9f3f453..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/common/module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { Title } from './title/component'; - -@NgModule({ - imports: [CommonModule], - declarations: [Title], - exports: [Title], -}) -export class CommonObserveModule {} diff --git a/application/client/src/app/ui/views/sidebar/observe/common/title/component.ts b/application/client/src/app/ui/views/sidebar/observe/common/title/component.ts deleted file mode 100644 index ec30184e2e..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/common/title/component.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; - -export interface IButton { - icon: string; - handler: () => void; -} - -@Component({ - selector: 'app-views-observed-list-title', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Title { - @Input() title!: string; - @Input() subtitle: string | undefined; - @Input() buttons: IButton[] = []; - @Input() opened!: boolean; - @Input() hideToggle: boolean | undefined; - @Output() toggled: EventEmitter = new EventEmitter(); - - public click(button: IButton) { - button.handler(); - } - - public toggle() { - this.opened = !this.opened; - this.toggled.emit(this.opened); - } -} -export interface Title extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/common/title/styles.less b/application/client/src/app/ui/views/sidebar/observe/common/title/styles.less deleted file mode 100644 index fa1135c628..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/common/title/styles.less +++ /dev/null @@ -1,23 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - padding: 0 24px; - margin: 0; - text-align: left; - align-items: center; - white-space: nowrap; - font-size: 0.9rem; - font-weight: 400; - span.title{ - color: var(--scheme-color-2); - } - span.subtitle{ - padding-left: 6px; - color: var(--scheme-color-3); - } - & span.filler { - flex: auto; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/common/title/template.html b/application/client/src/app/ui/views/sidebar/observe/common/title/template.html deleted file mode 100644 index 62d2371e3c..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/common/title/template.html +++ /dev/null @@ -1,5 +0,0 @@ -{{title}} -({{subtitle}}) - - - diff --git a/application/client/src/app/ui/views/sidebar/observe/component.ts b/application/client/src/app/ui/views/sidebar/observe/component.ts deleted file mode 100644 index b4b874d874..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component, Input, ChangeDetectorRef, ViewEncapsulation } from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-views-observe-list', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Initial() -@Ilc() -export class Observed extends ChangesDetector { - @Input() session!: Session; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } -} -export interface Observed extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/component.ts b/application/client/src/app/ui/views/sidebar/observe/element/component.ts deleted file mode 100644 index 16207193d0..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/component.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Component, Input, HostListener } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Element } from './element'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-views-observed-list-item', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Item { - public readonly Context = $.Origin.Context; - public readonly Source = $.Origin.Stream.Stream.Source; - - @Input() element!: Element; - - @HostListener('click') onClick() { - this.element.select(); - } - - @HostListener('contextmenu', ['$event']) async onContextMenu(event: MouseEvent) { - const items = this.element.provider.contextMenu(this.element.source); - if (items.length > 0) { - items.push({}); - } - items.push({ - caption: 'Reopen in New Tab', - handler: () => { - this.element.provider.openAsNew(this.element.source).catch((err: Error) => { - this.log().error(`Fail to open Source: ${err.message}`); - }); - }, - }); - this.ilc().emitter.ui.contextmenu.open({ - items, - x: event.x, - y: event.y, - }); - } -} -export interface Item extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/element.ts b/application/client/src/app/ui/views/sidebar/observe/element/element.ts deleted file mode 100644 index bb840c3e24..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/element.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ObserveSource } from '@service/session/dependencies/observing/source'; -import { File } from '@platform/types/files'; -import { Mutable } from '@platform/types/unity/mutable'; -import { Provider } from '@service/session/dependencies/observing/provider'; - -import * as $ from '@platform/types/observe'; - -export class Element { - public readonly source: ObserveSource; - public readonly provider: Provider; - public readonly id: number | undefined; - public readonly file: File | undefined; - public selected: boolean = false; - - constructor(source: ObserveSource, provider: Provider) { - this.source = source; - this.provider = provider; - const session = this.provider.session; - const sourceId = this.source.observe.origin.source(); - this.id = - sourceId !== undefined ? session.stream.observe().descriptions.id(sourceId) : undefined; - this.selected = session.stream.sde.selecting().is(this.source.observe.uuid); - } - - public select(): void { - const sde = this.provider.session.stream.sde; - this.selected = sde.selecting().select(this.source.observe.uuid); - } - - public set(): { file(file: File): Element } { - return { - file: (file: File): Element => { - (this as Mutable).file = file; - return this; - }, - }; - } - - public nature(): $.Origin.Context | $.Origin.Stream.Stream.Source { - return this.source.observe.origin.getNatureAlias(); - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/file/component.ts b/application/client/src/app/ui/views/sidebar/observe/element/file/component.ts deleted file mode 100644 index 9866b90ae6..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/file/component.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Component, Input, ChangeDetectorRef, ElementRef, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { File } from '@platform/types/files'; -import { Element } from '../element'; -import { Mutable } from '@platform/types/unity/mutable'; -import { stop } from '@ui/env/dom'; - -@Component({ - selector: 'app-views-observed-file', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Item extends ChangesDetector implements AfterContentInit { - @Input() element!: Element; - - public readonly file: File | undefined; - - constructor(cdRef: ChangeDetectorRef, private _self: ElementRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - if (this.element.file === undefined) { - this.log().error(`Field "file" in Element is undefined`); - return; - } - (this as Mutable).file = this.element.file; - } - - public isActive(): boolean { - return this.element.source.observer !== undefined; - } - - public openAsNew(event: MouseEvent): void { - stop(event); - this.element.provider.openAsNew(this.element.source).catch((err: Error) => { - this.log().error(`Fail to restart file: ${err.message}`); - }); - } - - public stop(event: MouseEvent): void { - stop(event); - const observer = this.element.source.observer; - if (observer === undefined) { - return; - } - observer.abort().catch((err: Error) => { - this.log().error(`Fail to abort file tailing: ${err.message}`); - }); - } -} -export interface Item extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/file/styles.less b/application/client/src/app/ui/views/sidebar/observe/element/file/styles.less deleted file mode 100644 index fa223d7b34..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/file/styles.less +++ /dev/null @@ -1,51 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - padding: 0; - margin: 0; - flex-direction: row; - align-items: center; - width: 100%; - height: 32px; - overflow: hidden; - & span.ext { - display: block; - position: relative; - font-size: 14px; - height: 18px; - line-height: 14px; - font-weight: 700; - margin-right: 12px; - margin-left: 6px; - color: var(--scheme-color-3); - &.active { - color: var(--scheme-color-accent); - } - } - & div.info { - overflow: hidden; - flex: auto; - text-align: left; - & span { - display: block; - position: relative; - overflow: hidden; - text-overflow: ellipsis; - direction: rtl; - line-height: 0.9rem; - white-space: nowrap; - } - & span.name { - color: var(--scheme-color-1); - margin-bottom: 3px; - } - & span.path { - color: var(--scheme-color-3); - } - } - & div.controlls { - margin: 0 24px 0 12px; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/file/template.html b/application/client/src/app/ui/views/sidebar/observe/element/file/template.html deleted file mode 100644 index c45d03c0c1..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/file/template.html +++ /dev/null @@ -1,14 +0,0 @@ - - No data about file - - - {{file.ext}} -
    - {{file.name}} - {{file.path}} -
    -
    - - -
    -
    diff --git a/application/client/src/app/ui/views/sidebar/observe/element/module.ts b/application/client/src/app/ui/views/sidebar/observe/element/module.ts deleted file mode 100644 index 9741b26fcd..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { Item } from './component'; -import { Item as FileItem } from './file/component'; -import { Item as ProcessItem } from './process/component'; -import { Item as SerialItem } from './serial/component'; -import { Item as TCPItem } from './tcp/component'; -import { Item as UDPItem } from './udp/component'; -import { Signature } from './signature/component'; - -@NgModule({ - imports: [CommonModule], - declarations: [Item, FileItem, ProcessItem, SerialItem, TCPItem, UDPItem, Signature], - exports: [Item], -}) -export class ElementModule {} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/process/component.ts b/application/client/src/app/ui/views/sidebar/observe/element/process/component.ts deleted file mode 100644 index 1402a070f2..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/process/component.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, Input, ChangeDetectorRef, ElementRef, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Element } from '../element'; -import { Mutable } from '@platform/types/unity/mutable'; -import { stop } from '@ui/env/dom'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-views-observed-process', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Item extends ChangesDetector implements AfterContentInit { - @Input() element!: Element; - - public readonly connection: $.Origin.Stream.Stream.Process.IConfiguration | undefined; - public readonly selected!: boolean; - - constructor(cdRef: ChangeDetectorRef, private _self: ElementRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - const conf = - this.element.source.observe.origin.as<$.Origin.Stream.Stream.Process.Configuration>( - $.Origin.Stream.Stream.Process.Configuration, - ); - if (conf === undefined) { - this.log().error(`Expected origin Source would be Process`); - return; - } - (this as Mutable).connection = conf.configuration; - } - - public isActive(): boolean { - return this.element.source.observer !== undefined; - } - - public restart(event: MouseEvent): void { - stop(event); - this.element.provider.clone(this.element.source.observe).catch((err: Error) => { - this.log().error(`Fail to restart process: ${err.message}`); - }); - } - - public stop(event: MouseEvent): void { - stop(event); - const observer = this.element.source.observer; - if (observer === undefined) { - return; - } - observer.abort().catch((err: Error) => { - this.log().error(`Fail to abort process: ${err.message}`); - }); - } -} -export interface Item extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/process/styles.less b/application/client/src/app/ui/views/sidebar/observe/element/process/styles.less deleted file mode 100644 index 404ed07c50..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/process/styles.less +++ /dev/null @@ -1,51 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - padding: 0; - margin: 0; - flex-direction: row; - align-items: center; - width: 100%; - height: 32px; - overflow: hidden; - & span.ext { - display: block; - position: relative; - margin-right: 12px; - margin-left: 6px; - line-height: 10px; - & span.codicon { - color: var(--scheme-color-3); - font-weight: 700; - &.active { - color: var(--scheme-color-accent); - } - } - } - & div.info { - overflow: hidden; - flex: auto; - text-align: left; - & span { - display: block; - position: relative; - overflow: hidden; - text-overflow: ellipsis; - direction: rtl; - line-height: 0.9rem; - white-space: nowrap; - } - & span.name { - color: var(--scheme-color-1); - margin-bottom: 3px; - } - & span.path { - color: var(--scheme-color-3); - } - } - & div.controlls { - margin: 0 24px 0 12px; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/process/template.html b/application/client/src/app/ui/views/sidebar/observe/element/process/template.html deleted file mode 100644 index 5b9f49cce3..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/process/template.html +++ /dev/null @@ -1,16 +0,0 @@ - - No data about process - - - - - -
    - {{connection.command}} - {{connection.cwd}} -
    -
    - - -
    -
    diff --git a/application/client/src/app/ui/views/sidebar/observe/element/serial/component.ts b/application/client/src/app/ui/views/sidebar/observe/element/serial/component.ts deleted file mode 100644 index 36caabd1d7..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/serial/component.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Component, Input, ChangeDetectorRef, ElementRef, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Element } from '../element'; -import { Mutable } from '@platform/types/unity/mutable'; -import { stop } from '@ui/env/dom'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-views-observed-serial', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Item extends ChangesDetector implements AfterContentInit { - @Input() element!: Element; - - public readonly connection: $.Origin.Stream.Stream.Serial.IConfiguration | undefined; - - constructor(cdRef: ChangeDetectorRef, private _self: ElementRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - const conf = - this.element.source.observe.origin.as<$.Origin.Stream.Stream.Serial.Configuration>( - $.Origin.Stream.Stream.Serial.Configuration, - ); - if (conf === undefined) { - this.log().error(`Expected origin Source would be TCP`); - return; - } - (this as Mutable).connection = conf.configuration; - } - - public isActive(): boolean { - return this.element.source.observer !== undefined; - } - - public restart(event: MouseEvent): void { - stop(event); - this.element.provider.clone(this.element.source.observe).catch((err: Error) => { - this.log().error(`Fail to restart Serial connection: ${err.message}`); - }); - } - - public stop(event: MouseEvent): void { - stop(event); - const observer = this.element.source.observer; - if (observer === undefined) { - return; - } - observer.abort().catch((err: Error) => { - this.log().error(`Fail to abort Serial connection: ${err.message}`); - }); - } -} -export interface Item extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/serial/styles.less b/application/client/src/app/ui/views/sidebar/observe/element/serial/styles.less deleted file mode 100644 index 404ed07c50..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/serial/styles.less +++ /dev/null @@ -1,51 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - padding: 0; - margin: 0; - flex-direction: row; - align-items: center; - width: 100%; - height: 32px; - overflow: hidden; - & span.ext { - display: block; - position: relative; - margin-right: 12px; - margin-left: 6px; - line-height: 10px; - & span.codicon { - color: var(--scheme-color-3); - font-weight: 700; - &.active { - color: var(--scheme-color-accent); - } - } - } - & div.info { - overflow: hidden; - flex: auto; - text-align: left; - & span { - display: block; - position: relative; - overflow: hidden; - text-overflow: ellipsis; - direction: rtl; - line-height: 0.9rem; - white-space: nowrap; - } - & span.name { - color: var(--scheme-color-1); - margin-bottom: 3px; - } - & span.path { - color: var(--scheme-color-3); - } - } - & div.controlls { - margin: 0 24px 0 12px; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/serial/template.html b/application/client/src/app/ui/views/sidebar/observe/element/serial/template.html deleted file mode 100644 index 276c1b3d0d..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/serial/template.html +++ /dev/null @@ -1,16 +0,0 @@ - - No data about serial connection - - - - - -
    - {{connection.path}} - boud rate: {{connection.baud_rate.toString()}} -
    -
    - - -
    -
    diff --git a/application/client/src/app/ui/views/sidebar/observe/element/signature/component.ts b/application/client/src/app/ui/views/sidebar/observe/element/signature/component.ts deleted file mode 100644 index 5ba82829e5..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/signature/component.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Component, Input, ChangeDetectorRef, ElementRef, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { getSourceColor } from '@ui/styles/colors'; -import { Element } from '../element'; - -@Component({ - selector: 'app-views-observed-list-item-signature', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Signature extends ChangesDetector implements AfterContentInit { - @Input() element!: Element; - @Input() id!: number | undefined; - - public selected!: boolean; - - constructor(cdRef: ChangeDetectorRef, private _self: ElementRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.selected = this.element.selected; - } - - public getSourceMarkerStyles(): { [key: string]: string } { - return this.id === undefined - ? {} - : { - background: getSourceColor(this.id), - }; - } -} -export interface List extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/signature/styles.less b/application/client/src/app/ui/views/sidebar/observe/element/signature/styles.less deleted file mode 100644 index d377d303dc..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/signature/styles.less +++ /dev/null @@ -1,26 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0 6px 0 0 ; - height: 32px; - & span.color { - position: relative; - display: inline-block; - width: 4px; - height: 100%; - } - & span.selected { - position: absolute; - display: block; - width: 8px; - height: 8px; - border-radius: 4px; - top: 50%; - margin-top: -4px; - left: -17px; - background-color: var(--scheme-color-accent); - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/signature/template.html b/application/client/src/app/ui/views/sidebar/observe/element/signature/template.html deleted file mode 100644 index 99e32df210..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/signature/template.html +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/observe/element/styles.less b/application/client/src/app/ui/views/sidebar/observe/element/styles.less deleted file mode 100644 index 77d20f99e9..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/styles.less +++ /dev/null @@ -1,18 +0,0 @@ -@import '../../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - padding: 0; - margin: 0; - flex-direction: row; - align-items: center; - width: ~"calc(100% - 24px)"; - height: 32px; - overflow: hidden; - padding: 3px 24px; - cursor: default; - &:hover { - background: var(--scheme-color-5); - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/tcp/component.ts b/application/client/src/app/ui/views/sidebar/observe/element/tcp/component.ts deleted file mode 100644 index 5c9d951056..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/tcp/component.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Component, Input, ChangeDetectorRef, ElementRef, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Element } from '../element'; -import { Mutable } from '@platform/types/unity/mutable'; -import { stop } from '@ui/env/dom'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-views-observed-tcp', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Item extends ChangesDetector implements AfterContentInit { - @Input() element!: Element; - - public readonly connection: $.Origin.Stream.Stream.TCP.IConfiguration | undefined; - - constructor(cdRef: ChangeDetectorRef, private _self: ElementRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - const conf = - this.element.source.observe.origin.as<$.Origin.Stream.Stream.TCP.Configuration>( - $.Origin.Stream.Stream.TCP.Configuration, - ); - if (conf === undefined) { - this.log().error(`Expected origin Source would be TCP`); - return; - } - (this as Mutable).connection = conf.configuration; - } - - public isActive(): boolean { - return this.element.source.observer !== undefined; - } - - public restart(event: MouseEvent): void { - stop(event); - this.element.provider.clone(this.element.source.observe).catch((err: Error) => { - this.log().error(`Fail to restart TCP connection: ${err.message}`); - }); - } - - public stop(event: MouseEvent): void { - stop(event); - const observer = this.element.source.observer; - if (observer === undefined) { - return; - } - observer.abort().catch((err: Error) => { - this.log().error(`Fail to abort TCP connection: ${err.message}`); - }); - } -} -export interface Item extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/tcp/styles.less b/application/client/src/app/ui/views/sidebar/observe/element/tcp/styles.less deleted file mode 100644 index fa223d7b34..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/tcp/styles.less +++ /dev/null @@ -1,51 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - padding: 0; - margin: 0; - flex-direction: row; - align-items: center; - width: 100%; - height: 32px; - overflow: hidden; - & span.ext { - display: block; - position: relative; - font-size: 14px; - height: 18px; - line-height: 14px; - font-weight: 700; - margin-right: 12px; - margin-left: 6px; - color: var(--scheme-color-3); - &.active { - color: var(--scheme-color-accent); - } - } - & div.info { - overflow: hidden; - flex: auto; - text-align: left; - & span { - display: block; - position: relative; - overflow: hidden; - text-overflow: ellipsis; - direction: rtl; - line-height: 0.9rem; - white-space: nowrap; - } - & span.name { - color: var(--scheme-color-1); - margin-bottom: 3px; - } - & span.path { - color: var(--scheme-color-3); - } - } - & div.controlls { - margin: 0 24px 0 12px; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/tcp/template.html b/application/client/src/app/ui/views/sidebar/observe/element/tcp/template.html deleted file mode 100644 index 64f1441f91..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/tcp/template.html +++ /dev/null @@ -1,13 +0,0 @@ - - No data about TCP connection - - - TCP -
    - {{connection.bind_addr}} -
    -
    - - -
    -
    diff --git a/application/client/src/app/ui/views/sidebar/observe/element/template.html b/application/client/src/app/ui/views/sidebar/observe/element/template.html deleted file mode 100644 index d12c7bdce8..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/template.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/observe/element/udp/component.ts b/application/client/src/app/ui/views/sidebar/observe/element/udp/component.ts deleted file mode 100644 index 15a56bc047..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/udp/component.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Component, Input, ChangeDetectorRef, ElementRef, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Element } from '../element'; -import { Mutable } from '@platform/types/unity/mutable'; -import { stop } from '@ui/env/dom'; - -import * as $ from '@platform/types/observe'; - -@Component({ - selector: 'app-views-observed-udp', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Item extends ChangesDetector implements AfterContentInit { - @Input() element!: Element; - - public readonly connection: $.Origin.Stream.Stream.UDP.IConfiguration | undefined; - - constructor(cdRef: ChangeDetectorRef, private _self: ElementRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - const conf = - this.element.source.observe.origin.as<$.Origin.Stream.Stream.UDP.Configuration>( - $.Origin.Stream.Stream.UDP.Configuration, - ); - if (conf === undefined) { - this.log().error(`Expected origin Source would be UDP`); - return; - } - (this as Mutable).connection = conf.configuration; - } - - public isActive(): boolean { - return this.element.source.observer !== undefined; - } - - public restart(event: MouseEvent): void { - stop(event); - this.element.provider.clone(this.element.source.observe).catch((err: Error) => { - this.log().error(`Fail to restart UDP connection: ${err.message}`); - }); - } - - public stop(event: MouseEvent): void { - stop(event); - const observer = this.element.source.observer; - if (observer === undefined) { - return; - } - observer.abort().catch((err: Error) => { - this.log().error(`Fail to abort UDP connection: ${err.message}`); - }); - } -} -export interface Item extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/udp/styles.less b/application/client/src/app/ui/views/sidebar/observe/element/udp/styles.less deleted file mode 100644 index ab053647ac..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/udp/styles.less +++ /dev/null @@ -1,51 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - padding: 0; - margin: 0; - flex-direction: row; - align-items: center; - width: 100%; - height: 32px; - overflow: hidden; - & span.ext { - display: block; - position: relative; - margin-left: 6px; - font-size: 14px; - height: 18px; - line-height: 14px; - font-weight: 700; - margin-right: 12px; - color: var(--scheme-color-3); - &.active { - color: var(--scheme-color-accent); - } - } - & div.info { - overflow: hidden; - flex: auto; - text-align: left; - & span { - display: block; - position: relative; - overflow: hidden; - text-overflow: ellipsis; - direction: rtl; - line-height: 0.9rem; - white-space: nowrap; - } - & span.name { - color: var(--scheme-color-1); - margin-bottom: 3px; - } - & span.path { - color: var(--scheme-color-3); - } - } - & div.controlls { - margin: 0 24px 0 12px; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/element/udp/template.html b/application/client/src/app/ui/views/sidebar/observe/element/udp/template.html deleted file mode 100644 index ace0ad5458..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/element/udp/template.html +++ /dev/null @@ -1,14 +0,0 @@ - - No data about UDP connection - - - UDP -
    - {{connection.bind_addr}} - {{connection.multicast[0].multiaddr}} -
    -
    - - -
    -
    diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/component.ts b/application/client/src/app/ui/views/sidebar/observe/lists/component.ts deleted file mode 100644 index c85f754be9..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/component.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { - Component, - Input, - OnDestroy, - Inject, - AfterContentInit, - ChangeDetectorRef, -} from '@angular/core'; -import { Provider as ProviderBase } from '@service/session/dependencies/observing/provider'; -import { Mutable } from '@platform/types/unity/mutable'; -import { Base } from '../states/state'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-observe-list-base', - template: '', - standalone: false, -}) -export class ListBase - extends ChangesDetector - implements OnDestroy, AfterContentInit -{ - public readonly state!: State; - - @Input() public provider!: Provider; - - constructor(@Inject('defaults') protected readonly defaults: State, cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - const state = this.provider.session.storage.get(this.defaults.key()); - (this as Mutable>).state = - state === undefined ? this.defaults : state; - } - - public ngOnDestroy(): void { - this.provider.session.storage.set(this.defaults.key(), this.state); - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/file/component.ts b/application/client/src/app/ui/views/sidebar/observe/lists/file/component.ts deleted file mode 100644 index a5ee4b3979..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/file/component.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { Component, ChangeDetectorRef, AfterContentInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Element } from '../../element/element'; -import { File } from '@platform/types/files'; -import { State } from '../../states/files'; -import { IButton } from '../../common/title/component'; -import { ListBase } from '../component'; -import { Provider } from '@service/session/dependencies/observing/implementations/files'; -import { ObserveSource } from '@service/session/dependencies/observing/source'; - -import * as $ from '@platform/types/observe'; -import * as Factory from '@platform/types/observe/factory'; - -@Component({ - selector: 'app-views-observed-list-file', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class List extends ListBase implements AfterContentInit { - public tailing: Element[] = []; - public offline: Element[] = []; - public buttons: IButton[] = [ - { - icon: 'codicon-tasklist', - handler: () => { - this.provider.recent(); - }, - }, - ]; - public warning: string | undefined = undefined; - - protected inited: boolean = false; - - constructor(cdRef: ChangeDetectorRef) { - super(new State(), cdRef); - } - - public override ngAfterContentInit(): void { - super.ngAfterContentInit(); - this.update(); - this.env().subscriber.register( - this.provider.subjects.get().updated.subscribe(() => { - this.update().detectChanges(); - }), - ); - } - - protected update(): List { - const filterFileNature = (s: ObserveSource): boolean => { - return s.observe.origin.nature().alias() === $.Origin.Context.File; - }; - const filterAsFile = (s: ObserveSource): $.Origin.File.Configuration => { - return s.observe.origin.as<$.Origin.File.Configuration>( - $.Origin.File.Configuration, - ) as $.Origin.File.Configuration; - }; - const asFileInstance = (s: ObserveSource): $.Origin.File.Configuration => { - return s.observe.origin.as<$.Origin.File.Configuration>( - $.Origin.File.Configuration, - ) as $.Origin.File.Configuration; - }; - const tailing = this.provider - .sources() - .filter((s) => s.observer !== undefined) - .filter(filterFileNature); - const offline = this.provider - .sources() - .filter((s) => s.observer === undefined) - .filter(filterFileNature); - const attachNewSourceErr = this.provider.getNewSourceError(); - this.warning = attachNewSourceErr instanceof Error ? attachNewSourceErr.message : undefined; - this.ilc() - .services.system.bridge.files() - .getByPathWithCache([ - ...tailing.map(filterAsFile).map((i) => i.filename()), - ...offline.map(filterAsFile).map((i) => i.filename()), - ]) - .then((files: File[]) => { - this.tailing = tailing - .map((s) => { - const filename = asFileInstance(s).filename(); - const file = files.find((f) => f.filename === filename); - if (file === undefined) { - this.log().error( - `Fail to find a file ${filename} in cache; or get file metadata`, - ); - } - return file === undefined - ? null - : new Element(s, this.provider).set().file(file); - }) - .filter((i) => i !== null) as Element[]; - this.offline = offline - .map((s) => { - const filename = asFileInstance(s).filename(); - const file = files.find((f) => f.filename === filename); - if (file === undefined) { - this.log().error( - `Fail to find a file ${filename} in cache; or get file metadata`, - ); - } - return file === undefined - ? null - : new Element(s, this.provider).set().file(file); - }) - .filter((i) => i !== null) as Element[]; - }) - .catch((err: Error) => { - this.log().error(`Fail load stat of files: ${err.message}`); - }) - .finally(() => { - this.detectChanges(); - }); - return this; - } - - public toggled(opened: boolean) { - this.state.toggleQuickSetup(opened); - } - - public attach() { - const last = this.provider.last(); - if (last === undefined) { - return; - } - const lastFile = last.origin.as<$.Origin.File.Configuration>($.Origin.File.Configuration); - if (lastFile === undefined) { - return; - } - this.ilc() - .services.system.bridge.files() - .select.any() - .then((files: File[]) => { - if (files.length === 0) { - return; - } - this.provider.session.stream - .observe() - .start( - files.length === 1 - ? new Factory.File() - .type(lastFile.configuration[1]) - .file(files[0].filename) - .protocol(last.parser.instance.alias()) - .get() - : new Factory.Concat() - .type(lastFile.configuration[1]) - .files(files.map((f) => f.filename)) - .protocol(last.parser.instance.alias()) - .get(), - ) - .catch((err: Error) => { - this.log().error(`Fail to observe: ${err.message}`); - }); - }) - .catch((err: Error) => { - this.log().error(`Fail to select file(s): ${err.message}`); - }); - } -} -export interface List extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/file/module.ts b/application/client/src/app/ui/views/sidebar/observe/lists/file/module.ts deleted file mode 100644 index 0965ac7086..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/file/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { List } from './component'; -import { ElementModule } from '../../element/module'; -import { CommonObserveModule } from '../../common/module'; -import { MatButtonModule } from '@angular/material/button'; - -@NgModule({ - imports: [CommonModule, ElementModule, CommonObserveModule, MatButtonModule], - declarations: [List], - exports: [List], -}) -export class ListModule {} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/file/styles.less b/application/client/src/app/ui/views/sidebar/observe/lists/file/styles.less deleted file mode 100644 index b4d727cfca..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/file/styles.less +++ /dev/null @@ -1,23 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - p.subtitle{ - color: var(--scheme-color-3); - text-align: right; - } - div.quicksetup { - padding: 0 24px 24px 24px; - } - div.controlls{ - text-align: right; - } - & button { - position: relative; - display: inline-block; - margin: 6px 0 6px 6px; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/file/template.html b/application/client/src/app/ui/views/sidebar/observe/lists/file/template.html deleted file mode 100644 index 898c3a222c..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/file/template.html +++ /dev/null @@ -1,15 +0,0 @@ - -
    -

    {{warning}}

    -
    - -
    -
    -
    - - -
    -
    - - -
    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/process/component.ts b/application/client/src/app/ui/views/sidebar/observe/lists/process/component.ts deleted file mode 100644 index 5a7d337108..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/process/component.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Component, ChangeDetectorRef, AfterContentInit, ViewChild } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Element } from '../../element/element'; -import { Action } from '@ui/tabs/observe/action'; -import { QuickSetup } from '@tabs/observe/origin/stream/transport/setup/quick/process/component'; -import { IButton } from '../../common/title/component'; -import { State } from '../../states/process'; -import { ListBase } from '../component'; -import { Provider } from '@service/session/dependencies/observing/implementations/processes'; -import { Configuration } from '@platform/types/observe/origin/stream/process'; -import { notifications, Notification } from '@ui/service/notifications'; - -import * as Factroy from '@platform/types/observe/factory'; - -@Component({ - selector: 'app-views-observed-list-process', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class List extends ListBase implements AfterContentInit { - @ViewChild('quicksetupref') public quickSetupRef!: QuickSetup; - - public tailing: Element[] = []; - public offline: Element[] = []; - public action: Action = new Action(); - public initial: Configuration = new Configuration(Configuration.initial(), undefined); - public buttons: IButton[] = [ - { - icon: 'codicon-tasklist', - handler: () => { - this.provider.recent(); - }, - }, - { - icon: 'codicon-empty-window', - handler: () => { - this.provider.openNewSessionOptions(); - }, - }, - ]; - - constructor(cdRef: ChangeDetectorRef) { - super(new State(), cdRef); - } - - public override ngAfterContentInit(): void { - super.ngAfterContentInit(); - this.update(); - this.env().subscriber.register( - this.provider.subjects.get().updated.subscribe(() => { - this.update().detectChanges(); - }), - ); - this.env().subscriber.register( - this.action.subjects.get().apply.subscribe(() => { - this.provider - .openAsNewOrigin( - new Factroy.Stream().asText().process(this.initial.configuration).get(), - ) - .then(() => { - const cloned = this.initial.sterilized(); - this.action.applied(); - this.initial.overwrite({ - command: '', - cwd: cloned.cwd, - shell: cloned.shell, - }); - }) - .catch((err: Error) => { - notifications.notify( - new Notification({ - message: err.message, - actions: [], - }), - ); - this.log().error(`Fail to apply connection to Process: ${err.message}`); - }); - }), - ); - } - - public toggled(opened: boolean) { - this.state.toggleQuickSetup(opened); - } - - protected update(): List { - this.tailing = this.provider - .sources() - .filter((s) => s.observer !== undefined) - .map((s) => new Element(s, this.provider)); - this.offline = this.provider - .sources() - .filter((s) => s.observer === undefined) - .map((s) => new Element(s, this.provider)); - return this; - } -} -export interface List extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/process/module.ts b/application/client/src/app/ui/views/sidebar/observe/lists/process/module.ts deleted file mode 100644 index f4020c2c40..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/process/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { List } from './component'; -import { ElementModule } from '../../element/module'; -import { CommonObserveModule } from '../../common/module'; -import { QuickSetupModule } from '@ui/tabs/observe/origin/stream/transport/setup/quick/process/module'; - -@NgModule({ - imports: [CommonModule, ElementModule, CommonObserveModule, QuickSetupModule], - declarations: [List], - exports: [List], -}) -export class ListModule {} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/process/styles.less b/application/client/src/app/ui/views/sidebar/observe/lists/process/styles.less deleted file mode 100644 index c1c9e9f852..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/process/styles.less +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - p.subtitle{ - color: var(--scheme-color-3); - text-align: right; - } - div.quicksetup { - padding: 0 24px 24px 24px; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/process/template.html b/application/client/src/app/ui/views/sidebar/observe/lists/process/template.html deleted file mode 100644 index d5ba862cce..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/process/template.html +++ /dev/null @@ -1,12 +0,0 @@ - -
    - -
    -
    - - -
    -
    - - -
    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/serial/component.ts b/application/client/src/app/ui/views/sidebar/observe/lists/serial/component.ts deleted file mode 100644 index 13b8af7d3b..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/serial/component.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { Component, ChangeDetectorRef, AfterContentInit, ViewChild } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Provider } from '@service/session/dependencies/observing/implementations/serial'; -import { Element } from '../../element/element'; -import { Action } from '@ui/tabs/observe/action'; -import { QuickSetup } from '@tabs/observe/origin/stream/transport/setup/quick/serial/component'; -import { IButton } from '../../common/title/component'; -import { State } from '../../states/serial'; -import { ListBase } from '../component'; -import { Configuration } from '@platform/types/observe/origin/stream/serial'; -import { notifications, Notification } from '@ui/service/notifications'; - -import * as Factroy from '@platform/types/observe/factory'; - -@Component({ - selector: 'app-views-observed-list-serial', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class List extends ListBase implements AfterContentInit { - @ViewChild('quicksetupref') public quickSetupRef!: QuickSetup; - - public tailing: Element[] = []; - public offline: Element[] = []; - public action: Action = new Action(); - public initial: Configuration = new Configuration(Configuration.initial(), undefined); - public buttons: IButton[] = [ - { - icon: 'codicon-tasklist', - handler: () => { - this.provider.recent(); - }, - }, - { - icon: 'codicon-empty-window', - handler: () => { - // this.provider.openNewSessionOptions(); - }, - }, - ]; - - constructor(cdRef: ChangeDetectorRef) { - super(new State(), cdRef); - } - - public override ngAfterContentInit(): void { - super.ngAfterContentInit(); - this.update(); - this.env().subscriber.register( - this.provider.subjects.get().updated.subscribe(() => { - this.update().detectChanges(); - }), - ); - this.env().subscriber.register( - this.action.subjects.get().apply.subscribe(() => { - this.provider - .openAsNewOrigin( - new Factroy.Stream().asText().serial(this.initial.configuration).get(), - ) - .then(() => { - this.action.applied(); - this.initial.overwrite(Configuration.initial()); - }) - .catch((err: Error) => { - notifications.notify( - new Notification({ - message: err.message, - actions: [], - }), - ); - this.log().error(`Fail to apply connection to Serial: ${err.message}`); - }); - }), - ); - } - - public toggled(opened: boolean) { - this.state.toggleQuickSetup(opened); - } - - protected update(): List { - this.tailing = this.provider - .sources() - .filter((s) => s.observer !== undefined) - .map((s) => new Element(s, this.provider)); - this.offline = this.provider - .sources() - .filter((s) => s.observer === undefined) - .map((s) => new Element(s, this.provider)); - return this; - } -} -export interface List extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/serial/module.ts b/application/client/src/app/ui/views/sidebar/observe/lists/serial/module.ts deleted file mode 100644 index 8ff83a3eca..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/serial/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { List } from './component'; -import { ElementModule } from '../../element/module'; -import { CommonObserveModule } from '../../common/module'; -import { QuickSetupModule } from '@ui/tabs/observe/origin/stream/transport/setup/quick/serial/module'; - -@NgModule({ - imports: [CommonModule, ElementModule, CommonObserveModule, QuickSetupModule], - declarations: [List], - exports: [List], -}) -export class ListModule {} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/serial/styles.less b/application/client/src/app/ui/views/sidebar/observe/lists/serial/styles.less deleted file mode 100644 index 2a8ccf7f22..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/serial/styles.less +++ /dev/null @@ -1,12 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - p.subtitle{ - color: var(--scheme-color-3); - text-align: right; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/serial/template.html b/application/client/src/app/ui/views/sidebar/observe/lists/serial/template.html deleted file mode 100644 index 1958a0ea6e..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/serial/template.html +++ /dev/null @@ -1,12 +0,0 @@ - -
    - -
    -
    - - -
    -
    - - -
    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/tcp/component.ts b/application/client/src/app/ui/views/sidebar/observe/lists/tcp/component.ts deleted file mode 100644 index ae222ec039..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/tcp/component.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { Component, ChangeDetectorRef, AfterContentInit, ViewChild } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Provider } from '@service/session/dependencies/observing/implementations/tcp'; -import { Element } from '../../element/element'; -import { QuickSetup } from '@tabs/observe/origin/stream/transport/setup/quick/tcp/component'; -import { Action } from '@ui/tabs/observe/action'; -import { IButton } from '../../common/title/component'; -import { State } from '../../states/tcp'; -import { ListBase } from '../component'; -import { Configuration } from '@platform/types/observe/origin/stream/tcp'; -import { notifications, Notification } from '@ui/service/notifications'; - -import * as Factroy from '@platform/types/observe/factory'; - -@Component({ - selector: 'app-views-observed-list-tcp', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class List extends ListBase implements AfterContentInit { - @ViewChild('quicksetupref') public quickSetupRef!: QuickSetup; - - public tailing: Element[] = []; - public offline: Element[] = []; - public action: Action = new Action(); - public initial: Configuration = new Configuration(Configuration.initial(), undefined); - public buttons: IButton[] = [ - { - icon: 'codicon-tasklist', - handler: () => { - this.provider.recent(); - }, - }, - { - icon: 'codicon-empty-window', - handler: () => { - this.provider.openNewSessionOptions(); - }, - }, - ]; - - constructor(cdRef: ChangeDetectorRef) { - super(new State(), cdRef); - } - - public override ngAfterContentInit(): void { - super.ngAfterContentInit(); - this.update(); - this.env().subscriber.register( - this.provider.subjects.get().updated.subscribe(() => { - this.update().detectChanges(); - }), - ); - this.env().subscriber.register( - this.action.subjects.get().apply.subscribe(() => { - this.provider - .openAsNewOrigin( - new Factroy.Stream().asDlt().tcp(this.initial.configuration).get(), - ) - .then(() => { - this.action.applied(); - this.initial.overwrite(Configuration.initial()); - }) - .catch((err: Error) => { - notifications.notify( - new Notification({ - message: err.message, - actions: [], - }), - ); - this.log().warn(`Fail to apply connection to TCP: ${err.message}`); - }); - }), - ); - } - - public toggled(opened: boolean) { - this.state.toggleQuickSetup(opened); - } - - protected update(): List { - this.tailing = this.provider - .sources() - .filter((s) => s.observer !== undefined) - .map((s) => new Element(s, this.provider)); - this.offline = this.provider - .sources() - .filter((s) => s.observer === undefined) - .map((s) => new Element(s, this.provider)); - return this; - } -} -export interface List extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/tcp/module.ts b/application/client/src/app/ui/views/sidebar/observe/lists/tcp/module.ts deleted file mode 100644 index 0ed497def2..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/tcp/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { List } from './component'; -import { ElementModule } from '../../element/module'; -import { CommonObserveModule } from '../../common/module'; -import { QuickSetupModule } from '@ui/tabs/observe/origin/stream/transport/setup/quick/tcp/module'; - -@NgModule({ - imports: [CommonModule, ElementModule, CommonObserveModule, QuickSetupModule], - declarations: [List], - exports: [List], -}) -export class ListModule {} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/tcp/styles.less b/application/client/src/app/ui/views/sidebar/observe/lists/tcp/styles.less deleted file mode 100644 index c1c9e9f852..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/tcp/styles.less +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - p.subtitle{ - color: var(--scheme-color-3); - text-align: right; - } - div.quicksetup { - padding: 0 24px 24px 24px; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/tcp/template.html b/application/client/src/app/ui/views/sidebar/observe/lists/tcp/template.html deleted file mode 100644 index 59fa652d62..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/tcp/template.html +++ /dev/null @@ -1,12 +0,0 @@ - -
    - -
    -
    - - -
    -
    - - -
    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/udp/component.ts b/application/client/src/app/ui/views/sidebar/observe/lists/udp/component.ts deleted file mode 100644 index 6c3b3687db..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/udp/component.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { Component, ChangeDetectorRef, AfterContentInit, ViewChild } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Provider } from '@service/session/dependencies/observing/implementations/udp'; -import { Element } from '../../element/element'; -import { QuickSetup } from '@tabs/observe/origin/stream/transport/setup/quick/udp/component'; -import { Action } from '@ui/tabs/observe/action'; -import { IButton } from '../../common/title/component'; -import { State } from '../../states/udp'; -import { ListBase } from '../component'; -import { Configuration } from '@platform/types/observe/origin/stream/udp'; -import { notifications, Notification } from '@ui/service/notifications'; - -import * as Factroy from '@platform/types/observe/factory'; - -@Component({ - selector: 'app-views-observed-list-udp', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class List extends ListBase implements AfterContentInit { - @ViewChild('quicksetupref') public quickSetupRef!: QuickSetup; - - public tailing: Element[] = []; - public offline: Element[] = []; - public action: Action = new Action(); - public initial: Configuration = new Configuration(Configuration.initial(), undefined); - public buttons: IButton[] = [ - { - icon: 'codicon-tasklist', - handler: () => { - this.provider.recent(); - }, - }, - { - icon: 'codicon-empty-window', - handler: () => { - this.provider.openNewSessionOptions(); - }, - }, - ]; - - constructor(cdRef: ChangeDetectorRef) { - super(new State(), cdRef); - } - - public override ngAfterContentInit(): void { - super.ngAfterContentInit(); - this.update(); - this.env().subscriber.register( - this.provider.subjects.get().updated.subscribe(() => { - this.update().detectChanges(); - }), - ); - this.env().subscriber.register( - this.action.subjects.get().apply.subscribe(() => { - this.provider - .openAsNewOrigin( - new Factroy.Stream().asDlt().udp(this.initial.configuration).get(), - ) - .then(() => { - this.action.applied(); - this.initial.overwrite(Configuration.initial()); - }) - .catch((err: Error) => { - notifications.notify( - new Notification({ - message: err.message, - actions: [], - }), - ); - this.log().error(`Fail to apply connection to UDP: ${err.message}`); - }); - }), - ); - } - - public toggled(opened: boolean) { - this.state.toggleQuickSetup(opened); - } - - protected update(): List { - this.tailing = this.provider - .sources() - .filter((s) => s.observer !== undefined) - .map((s) => new Element(s, this.provider)); - this.offline = this.provider - .sources() - .filter((s) => s.observer === undefined) - .map((s) => new Element(s, this.provider)); - return this; - } -} -export interface List extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/udp/module.ts b/application/client/src/app/ui/views/sidebar/observe/lists/udp/module.ts deleted file mode 100644 index f1b92a3d71..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/udp/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { List } from './component'; -import { ElementModule } from '../../element/module'; -import { CommonObserveModule } from '../../common/module'; -import { QuickSetupModule } from '@ui/tabs/observe/origin/stream/transport/setup/quick/udp/module'; - -@NgModule({ - imports: [CommonModule, ElementModule, CommonObserveModule, QuickSetupModule], - declarations: [List], - exports: [List], -}) -export class ListModule {} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/udp/styles.less b/application/client/src/app/ui/views/sidebar/observe/lists/udp/styles.less deleted file mode 100644 index c1c9e9f852..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/udp/styles.less +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - position: relative; - display: block; - padding: 0; - margin: 0; - p.subtitle{ - color: var(--scheme-color-3); - text-align: right; - } - div.quicksetup { - padding: 0 24px 24px 24px; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/lists/udp/template.html b/application/client/src/app/ui/views/sidebar/observe/lists/udp/template.html deleted file mode 100644 index 818a546edf..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/lists/udp/template.html +++ /dev/null @@ -1,12 +0,0 @@ - -
    - -
    -
    - - -
    -
    - - -
    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/observe/module.ts b/application/client/src/app/ui/views/sidebar/observe/module.ts deleted file mode 100644 index 7631400b7e..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ContainersModule } from '@elements/containers/module'; -import { MatButtonModule } from '@angular/material/button'; -import { Observed } from './component'; -import { MatCardModule } from '@angular/material/card'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatIconModule } from '@angular/material/icon'; -import { MatDividerModule } from '@angular/material/divider'; -import { AttachSourceMenuModule } from '@elements/menu.attachsource/module'; -import { ListModule as FileListModule } from './lists/file/module'; -import { ListModule as ProcessListModule } from './lists/process/module'; -import { ListModule as SerialListModule } from './lists/serial/module'; -import { ListModule as TcpListModule } from './lists/tcp/module'; -import { ListModule as UdpListModule } from './lists/udp/module'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - MatButtonModule, - MatCardModule, - MatExpansionModule, - FileListModule, - ProcessListModule, - SerialListModule, - TcpListModule, - UdpListModule, - MatMenuModule, - MatIconModule, - MatDividerModule, - AttachSourceMenuModule, - ], - declarations: [Observed], - exports: [Observed], - bootstrap: [Observed], -}) -export class ObservedModule {} diff --git a/application/client/src/app/ui/views/sidebar/observe/states/files.ts b/application/client/src/app/ui/views/sidebar/observe/states/files.ts deleted file mode 100644 index 217f0e4c60..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/states/files.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Base } from './state'; -import { unique } from '@platform/env/sequence'; - -export const KEY: string = unique(); - -export class State extends Base { - - public key(): string { - return KEY; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/states/process.ts b/application/client/src/app/ui/views/sidebar/observe/states/process.ts deleted file mode 100644 index 4210b3fdc7..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/states/process.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Base } from './state'; -import { unique } from '@platform/env/sequence'; - -export const KEY: string = unique(); - -export class State extends Base { - public override quicksetup: boolean = true; - - public key(): string { - return KEY; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/states/serial.ts b/application/client/src/app/ui/views/sidebar/observe/states/serial.ts deleted file mode 100644 index 485e5bf7ec..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/states/serial.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Base } from './state'; -import { unique } from '@platform/env/sequence'; - -export const KEY: string = unique(); - -export class State extends Base { - public key(): string { - return KEY; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/states/state.ts b/application/client/src/app/ui/views/sidebar/observe/states/state.ts deleted file mode 100644 index 482b33b764..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/states/state.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Destroy } from '@platform/types/env/types'; - -export abstract class Base implements Destroy { - public quicksetup: boolean = false; - - public toggleQuickSetup(quicksetup?: boolean) { - if (quicksetup !== undefined) { - this.quicksetup = quicksetup; - } else { - this.quicksetup = !this.quicksetup; - } - } - - public destroy(): void { - // - } - - public abstract key(): string; -} diff --git a/application/client/src/app/ui/views/sidebar/observe/states/tcp.ts b/application/client/src/app/ui/views/sidebar/observe/states/tcp.ts deleted file mode 100644 index 485e5bf7ec..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/states/tcp.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Base } from './state'; -import { unique } from '@platform/env/sequence'; - -export const KEY: string = unique(); - -export class State extends Base { - public key(): string { - return KEY; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/states/udp.ts b/application/client/src/app/ui/views/sidebar/observe/states/udp.ts deleted file mode 100644 index 485e5bf7ec..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/states/udp.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Base } from './state'; -import { unique } from '@platform/env/sequence'; - -export const KEY: string = unique(); - -export class State extends Base { - public key(): string { - return KEY; - } -} diff --git a/application/client/src/app/ui/views/sidebar/observe/styles.less b/application/client/src/app/ui/views/sidebar/observe/styles.less deleted file mode 100644 index 450a60350a..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/styles.less +++ /dev/null @@ -1,61 +0,0 @@ -@import '../../../styles/variables.less'; - -app-views-observe-list { - position: absolute; - display: block; - padding: 0; - margin: 0; - bottom: 0.5rem; - right: 0.5rem; - left: 0.5rem; - top: 0.5rem; - overflow-y: auto; - overflow-x: hidden; - outline: none; - & > div.caption { - position: sticky !important; - top: 0; - left: 0; - z-index: 1; - background: var(--scheme-color-5); - display: flex; - padding: 0 24px; - margin: 0; - text-align: left; - align-items: center; - white-space: nowrap; - font-size: 0.9rem; - font-weight: 400; - span.title{ - color: var(--scheme-color-2); - } - span.subtitle{ - padding-left: 6px; - color: var(--scheme-color-3); - } - & span.filler { - flex: auto; - } - - } - & mat-expansion-panel { - margin: 6px 0!important; - } - & div.mat-expansion-panel-body { - padding-left: 0; - padding-right: 0; - } - -} -p.attach-menu-warning { - padding: 12px 24px; - color: var(--scheme-color-1); -} -div.attach-new-source-menu { - & .mat-icon { - width: 16px; - height: 16px; - font-size: 16px; - color: var(--scheme-color-1); - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/observe/template.html b/application/client/src/app/ui/views/sidebar/observe/template.html deleted file mode 100644 index 7710be9170..0000000000 --- a/application/client/src/app/ui/views/sidebar/observe/template.html +++ /dev/null @@ -1,29 +0,0 @@ -
    - Observing Sources - ({{session.observed.count()}}) - - -
    - - - - {{provider.value.panels.list.name}} - {{provider.value.panels.list.desc}} - -
    - -
    - -
    -
    - diff --git a/application/client/src/app/ui/views/sidebar/search/base/entity.ts b/application/client/src/app/ui/views/sidebar/search/base/entity.ts deleted file mode 100644 index 1be56b831c..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/base/entity.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - Component, - ChangeDetectorRef, - OnInit, - Input, - HostBinding, - HostListener, - ChangeDetectionStrategy, -} from '@angular/core'; -import { Provider, ISelectEvent } from '../providers/definitions/provider'; -import { Entity } from '../providers/definitions/entity'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { CdkDrag } from '@angular/cdk/drag-drop'; - -@Component({ - selector: 'app-sidebar-entity-item-base', - template: '', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -@Initial() -@Ilc() -export abstract class EntityItem extends ChangesDetector implements OnInit { - static HOST_DIRECTIVES = [ - { - directive: CdkDrag, - }, - ]; - - @Input() provider!: P & Provider; - @Input() entity!: Entity; - - public edit: boolean = false; - public selected: boolean = false; - public dragging: boolean = false; - - private _ignore: boolean = false; - - @HostBinding('class.selected') get cssClassSelected() { - return this.selected; - } - @HostBinding('class.edited') get cssClassEdited() { - return this.edit; - } - @HostListener('click') onClick() { - if (this._ignore) { - this._ignore = false; - return; - } - if (this.edit) { - return; - } - this.provider !== undefined && this.provider.select().set({ guid: this.entity.uuid() }); - this.detectChanges(); - } - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnInit() { - this.env().subscriber.register( - this.provider.subjects.get().edit.subscribe((guid: string | undefined) => { - this.edit = this.entity.uuid() === guid; - this.markChangesForCheck(); - }), - this.provider.subjects.get().selection.subscribe((event: ISelectEvent) => { - this.selected = event.guids.indexOf(this.entity.uuid()) !== -1; - if (!this.selected) { - this.edit = false; - } - this.markChangesForCheck(); - }), - ); - this.selected = this.provider.select().get().indexOf(this.entity.uuid()) !== -1; - } - - public ignoreMouseClick() { - this._ignore = true; - } -} -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export interface EntityItem extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/base/list.ts b/application/client/src/app/ui/views/sidebar/search/base/list.ts deleted file mode 100644 index ccdb3d132d..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/base/list.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterContentInit, - Input, - HostBinding, - ChangeDetectionStrategy, - OnDestroy, -} from '@angular/core'; -import { Provider } from '../providers/definitions/provider'; -import { Entity } from '../providers/definitions/entity'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { CdkDropList, CdkDragDrop } from '@angular/cdk/drag-drop'; -import { Subscription } from 'rxjs'; - -export enum ListId { - Filters = 'searchmanager-filters-list', - Charts = 'searchmanager-charts-list', - Disabled = 'searchmanager-disabled-list', - Bin = 'searchmanager-bin-list', -} - -@Component({ - selector: 'app-sidebar-entities-list-base', - template: '', - changeDetection: ChangeDetectionStrategy.OnPush, -}) -@Initial() -@Ilc() -export abstract class EntitiesList - extends ChangesDetector - implements AfterContentInit, OnDestroy -{ - static HOST_DIRECTIVE = { - directive: CdkDropList, - }; - - @Input() provider!: P & Provider; - - @HostBinding('id') get id(): string { - return this.getListId(); - } - - protected readonly subscriptions: Subscription[] = []; - protected entries: Entity[] = []; - - constructor( - protected readonly cdRef: ChangeDetectorRef, - protected readonly cdkDropListDir: CdkDropList, - ) { - super(cdRef); - this.cdkDropListDir.connectedTo = [ - ListId.Filters, - ListId.Charts, - ListId.Disabled, - ListId.Bin, - ]; - this.cdkDropListDir.id = this.getListId(); - this.cdkDropListDir.lockAxis = 'y'; - this.subscriptions.push( - ...[ - this.cdkDropListDir.dropped.subscribe((event: CdkDragDrop) => { - const provider: P & Provider = event.previousContainer.data; - if (provider.uuid === this.provider.uuid) { - this.provider.reorder({ - prev: event.previousIndex, - curt: event.currentIndex, - }); - return; - } - const dragged = provider.getEntityByIndex(event.previousIndex); - if (dragged === undefined) { - return; - } - this.provider.tryToInsertEntity(dragged, event.currentIndex); - }), - this.cdkDropListDir._dropListRef.beforeStarted.subscribe(() => { - this.cdkDropListDir.data = this.provider; - this.provider.events.get().dragging.emit(); - }), - ], - ); - } - - public ngOnDestroy(): void { - this.subscriptions.forEach((s) => s.unsubscribe()); - } - - public ngAfterContentInit() { - this.entries = this.provider.entities(); - this.env().subscriber.register( - this.provider.subjects.get().change.subscribe(() => { - this.entries = this.provider.entities(); - this.markChangesForCheck(); - }), - this.provider.subjects.get().selection.subscribe(() => { - this.markChangesForCheck(); - }), - ); - } - - public onContexMenu(event: MouseEvent, entity: Entity) { - this.provider.select().context(event, entity); - } - - protected abstract getListId(): ListId; -} -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export interface EntitiesList extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/bin/component.ts b/application/client/src/app/ui/views/sidebar/search/bin/component.ts deleted file mode 100644 index 19ce4f35dd..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/bin/component.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { - Component, - ChangeDetectorRef, - HostBinding, - HostListener, - OnDestroy, - Input, - AfterContentInit, -} from '@angular/core'; -import { CdkDropList, CdkDragDrop } from '@angular/cdk/drag-drop'; -import { ListId } from '../base/list'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Subscription } from 'rxjs'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Provider } from '../providers/definitions/provider'; -import { Providers } from '../providers/providers'; - -@Component({ - selector: 'app-sidebar-entities-bin', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - hostDirectives: [ - { - directive: CdkDropList, - }, - ], - standalone: false, -}) -@Ilc() -export class Bin extends ChangesDetector implements AfterContentInit, OnDestroy { - @Input() providers!: Providers; - - @HostListener('window:mouseup') onWindowMouseUp() { - this._dragging = false; - this.detectChanges(); - } - - @HostBinding('id') get id(): string { - return ListId.Bin; - } - - @HostBinding('attr.data-dragging') get dragging(): boolean { - return this._dragging; - } - - protected readonly subscriptions: Subscription[] = []; - - private _dragging: boolean = false; - - constructor( - protected readonly cdRef: ChangeDetectorRef, - protected readonly cdkDropListDir: CdkDropList, - ) { - super(cdRef); - this.cdkDropListDir.id = ListId.Bin; - this.cdkDropListDir.lockAxis = 'y'; - this.subscriptions.push( - ...[ - this.cdkDropListDir.dropped.subscribe((event: CdkDragDrop) => { - const provider: Provider | undefined = event.previousContainer.data; - if (!(provider instanceof Provider)) { - return; - } - const dragged = provider.getEntityByIndex(event.previousIndex); - if (dragged === undefined) { - return; - } - provider.removeEntity(dragged); - }), - ], - ); - } - - public ngOnDestroy(): void { - this.subscriptions.forEach((s) => s.unsubscribe()); - } - - public ngAfterContentInit(): void { - this.env().subscriber.register( - this.providers.subjects.get().dragging.subscribe(() => { - this._dragging = true; - this.detectChanges(); - }), - ); - } -} -export interface Bin extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/bin/styles.less b/application/client/src/app/ui/views/sidebar/search/bin/styles.less deleted file mode 100644 index 62ce3901d7..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/bin/styles.less +++ /dev/null @@ -1,29 +0,0 @@ -@import '../../../../styles/variables.less'; -:host { - position: absolute; - display: block; - bottom: 0; - border-radius: 3px; - margin: 8px 0px; - padding: 16px 0; - text-align: center; - width: 100%; - pointer-events: none; - overflow: hidden; - opacity: 0.001; - height: 0px; - &[data-dragging="true"] { - background: var(--scheme-bk-color-0); - pointer-events: all; - opacity: 1; - height: auto; - } - & p { - color: var(--scheme-color-2); - } - & mat-icon { - position: relative; - display: inline-block; - color: var(--scheme-color-accent); - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/bin/template.html b/application/client/src/app/ui/views/sidebar/search/bin/template.html deleted file mode 100644 index d4c9b1d1fc..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/bin/template.html +++ /dev/null @@ -1,2 +0,0 @@ -delete_outline -

    Drop entity here to remove

    diff --git a/application/client/src/app/ui/views/sidebar/search/charts/chart/component.ts b/application/client/src/app/ui/views/sidebar/search/charts/chart/component.ts deleted file mode 100644 index 230c66e532..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/chart/component.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { Component, AfterContentInit, HostBinding, ViewChild } from '@angular/core'; -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; -import { MatCheckboxChange } from '@angular/material/checkbox'; -import { MatInput } from '@angular/material/input'; -import { MatCheckbox } from '@angular/material/checkbox'; -import { ProviderCharts } from '../provider'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from './state'; -import { EFlag } from '@platform/types/filter'; -import { EntityItem } from '../../base/entity'; - -@Component({ - selector: 'app-sidebar-charts-filter', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - hostDirectives: EntityItem.HOST_DIRECTIVES, - standalone: false, -}) -@Ilc() -export class Chart extends EntityItem implements AfterContentInit { - @HostBinding('class.notvalid') get cssClassNotValid() { - return !ChartRequest.isValid(this.state.filter); - } - - @ViewChild(MatInput) _inputRefCom!: MatInput; - @ViewChild(MatCheckbox) _stateRefCom!: MatCheckbox; - - public state!: State; - public EFlag = EFlag; - - public ngAfterContentInit() { - this.env().subscriber.register( - this.provider.subjects.get().edit.subscribe((guid: string | undefined) => { - if (this.entity.uuid() === guid) { - this.update(); - if (this._inputRefCom !== undefined) { - this._inputRefCom.focus(); - } - } - }), - ); - this.env().subscriber.register( - this.entity.extract().updated.subscribe((event) => { - if (event.inner().filter) { - this.state.update().filter(); - } else if (event.inner().color) { - this.state.update().color(); - } else if (event.inner().line) { - this.state.update().line(); - } else if (event.inner().point) { - this.state.update().point(); - } else if (event.inner().state) { - this.state.update().state(); - } - this.update(); - }), - ); - this.state = new State(this.entity, this.provider); - } - - public _ng_onStateChange(event: MatCheckboxChange) { - this.state.setState(event.checked); - this.update(); - } - - public _ng_onRequestInputKeyUp(event: KeyboardEvent) { - if (this.provider === undefined) { - return; - } - if (['Escape', 'Enter'].indexOf(event.code) === -1) { - return; - } - switch (event.code) { - case 'Escape': - this.state.edit().drop(); - break; - case 'Enter': - this.state.edit().accept(); - break; - } - this.update(); - } - - public _ng_onRequestInputBlur() { - if (this.provider === undefined) { - return; - } - this.state.edit().drop(); - this.update(); - } - - public _ng_onDoubleClick(event: MouseEvent) { - this.provider !== undefined && this.provider.select().doubleclick(event, this.entity); - } - - public update() { - this.detectChanges(); - ChangesDetector.detectChanges(this._stateRefCom); - } -} -export interface Chart extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/charts/chart/state.ts b/application/client/src/app/ui/views/sidebar/search/charts/chart/state.ts deleted file mode 100644 index 622191b0d2..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/chart/state.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { Entity } from '../../providers/definitions/entity'; -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; -import { ProviderCharts } from '../provider'; - -import * as obj from '@platform/env/obj'; - -export class State { - public filter: string; - public color: string; - public line: number; - public point: number; - public active: boolean = false; - public provider: ProviderCharts; - public entity: Entity; - public found: number = 0; - - private _isValidRegex: boolean = true; - private _error: string | undefined; - - constructor(entity: Entity, prodider: ProviderCharts) { - this.filter = obj.clone(entity.extract().definition.filter); - this.color = obj.clone(entity.extract().definition.color); - this.line = obj.clone(entity.extract().definition.widths.line); - this.point = obj.clone(entity.extract().definition.widths.point); - this.active = entity.extract().definition.active; - this.provider = prodider; - this.entity = entity; - this._update(); - } - - public get isValidRegex(): boolean { - return this._isValidRegex; - } - - public setState(checked: boolean) { - this.active = checked; - this.entity.extract().set().state(checked); - } - - public update(): { - filter(): void; - color(): void; - line(): void; - point(): void; - state(): void; - } { - return { - filter: (): void => { - this.filter = obj.clone(this.entity.extract().definition.filter); - }, - color: (): void => { - this.color = obj.clone(this.entity.extract().definition.color); - }, - line: (): void => { - this.line = obj.clone(this.entity.extract().definition.widths.line); - }, - point: (): void => { - this.point = obj.clone(this.entity.extract().definition.widths.point); - }, - state: (): void => { - this.active = this.entity.extract().definition.active; - }, - }; - } - - public edit(): { - drop(): void; - accept(): void; - } { - return { - drop: (): void => { - this.filter = this.entity.extract().definition.filter; - this.provider.edit().out(); - }, - accept: (): void => { - this._update(); - if (this.filter.trim() !== '' && this._error === undefined) { - this.entity.extract().set().filter(this.filter); - } else { - this.filter = this.entity.extract().definition.filter; - } - this.provider.edit().out(); - }, - }; - } - - public get error(): string | undefined { - return this._error; - } - - private _update() { - this._checkSpecifiedRegex(); - this._checkGeneralRegex(); - } - - private _checkSpecifiedRegex() { - this._error = ChartRequest.getValidationError(this.filter); - } - - private _checkGeneralRegex() { - this._isValidRegex = ChartRequest.isValid(this.filter); - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/charts/chart/styles.less b/application/client/src/app/ui/views/sidebar/search/charts/chart/styles.less deleted file mode 100644 index a8f9f9ad66..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/chart/styles.less +++ /dev/null @@ -1,136 +0,0 @@ -@import '../../../../../styles/variables.less'; - - -:host { - display: flex; - position: relative; - flex-flow: row; - padding: 3px 12px 5px 24px; - overflow: hidden; - height: 20px; - cursor: default; - align-items: center; - width: calc(100% - 36px); - &.notvalid { - background: var(--scheme-color-warning-fadeout-50); - &::after { - display: block; - content: '⚠'; - font-size: 8px; - color: #fd1515; - top: 3px; - left: 8px; - position: absolute; - } - input.request { - color: var(--scheme-color-error); - border-bottom: dashed 1px var(--scheme-color-error); - } - } - &:hover{ - background: var(--scheme-color-5); - } - &.selected{ - background: var(--scheme-color-accent-fadeout-50); - } - div.doubleclick { - display: contents; - flex: auto; - } - span.color { - flex: 0; - width: 8px; - max-width: 8px; - min-width: 8px; - min-height: 16px; - display: block; - position: relative; - margin: 2px 0 2px 0; - } - span.request{ - flex: auto; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - padding-left: 6px; - color: var(--scheme-color-0); - cursor: default; - } - span.found { - flex: 0; - white-space: nowrap; - color: var(--scheme-color-0); - padding: 0 6px; - font-size: 12px; - margin: 0; - border: thin solid var(--scheme-color-active); - background: var(--scheme-color-active); - border-radius: 6px; - } - input.request { - margin: 0 8px; - padding: 0; - border: none; - border-bottom: dashed 1px var(--scheme-color-1); - flex: auto; - white-space: nowrap; - color: var(--scheme-color-0); - background: none; - outline: none; - } - span.flags { - display: flex; - flex-direction: row; - align-items: center; - flex: 0; - padding-right: 8px; - & span { - font-size: 14px; - line-height: 14px; - vertical-align: bottom; - cursor: default; - &.active{ - color: var(--scheme-color-0); - } - &.inactive{ - color: var(--scheme-color-3); - } - &.invalid { - color: var(--scheme-color-error); - } - } - } - &.edited { - &::after{ - display: none; - } - padding-left: 0; - background: var(--scheme-color-6); - mat-checkbox { - display: none; - } - span.color { - display: none; - } - span.background { - display: none; - } - span.flags { - display: none; - } - } - &.cdk-drag-preview { - box-sizing: border-box; - box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), - 0 8px 10px 1px rgba(0, 0, 0, 0.14), - 0 3px 14px 2px rgba(0, 0, 0, 0.12); - font-size: 14px; - line-height: 20px; - } - &.cdk-drag-placeholder { - opacity: 0; - } - &.cdk-drag-animating { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/charts/chart/template.html b/application/client/src/app/ui/views/sidebar/search/charts/chart/template.html deleted file mode 100644 index a7add77724..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/chart/template.html +++ /dev/null @@ -1,13 +0,0 @@ - -
    - - {{state.filter}} - -
    -{{state.found}} \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/search/charts/details/component.ts b/application/client/src/app/ui/views/sidebar/search/charts/details/component.ts deleted file mode 100644 index 6978d5cd75..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/details/component.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterContentInit, - Input, - ChangeDetectionStrategy, -} from '@angular/core'; -import { ChartRequest, ChartType } from '@service/session/dependencies/search/charts/request'; -import { ProviderCharts } from '../provider'; -import { Entity } from '../../providers/definitions/entity'; -import { CColors } from '@styles/colors'; -import { styles } from '@ui/service/styles'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-sidebar-charts-details', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Initial() -@Ilc() -export class ChartrDetails extends ChangesDetector implements AfterContentInit { - @Input() provider!: ProviderCharts; - - public request: string | undefined; - public color: string = styles.colors().scheme_color_accent; - public line: number = ChartRequest.DEFAULT_LINE_WIDTH; - public point: number = ChartRequest.DEFAULT_POINT_RADIUS; - public colors: string[] = []; - public type: ChartType = ChartType.Linear; - public types: ChartType[] = [ChartType.Linear, ChartType.Stepper, ChartType.Temperature]; - - private _entity: Entity | undefined; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit() { - this.env().subscriber.register( - this.provider.subjects.get().selection.subscribe(this._init.bind(this)), - ); - this.env().subscriber.register( - this.provider.subjects.get().change.subscribe(this._onChange.bind(this)), - ); - this._init(); - } - - public onColorChanges(color: string) { - if (this._entity === undefined) { - return; - } - this.color = color; - this._entity.extract().set().color(this.color); - this.detectChanges(); - } - - public onChartTypeChange() { - if (this._entity === undefined) { - return; - } - this._entity.extract().set().type(this.type); - this.detectChanges(); - } - - public onLineChanges() { - if (this._entity === undefined) { - return; - } - this._entity.extract().set().line(this.line); - this.detectChanges(); - } - - public onPointChanges() { - if (this._entity === undefined) { - return; - } - this._entity.extract().set().point(this.point); - this.detectChanges(); - } - - private _setColors() { - this.colors = CColors.slice(); - if (this.colors.find((c) => c === this.color) !== undefined) { - return; - } - this.colors.push(this.color); - this.detectChanges(); - } - - private _init() { - this._entity = this.provider.select().single(); - if (this._entity === undefined) { - this.request = undefined; - this.color = styles.colors().scheme_color_accent; - this.type = ChartType.Linear; - } else { - const def = this._entity.extract().definition; - this.request = def.filter; - this.color = def.color; - this.type = def.type; - this._setColors(); - } - this._onChange(); - } - - private _onChange() { - if (this._entity === undefined) { - return; - } - this.request = this._entity.extract().definition.filter; - this.detectChanges(); - } -} -export interface ChartrDetails extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/charts/details/styles.less b/application/client/src/app/ui/views/sidebar/search/charts/details/styles.less deleted file mode 100644 index 1834c25704..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/details/styles.less +++ /dev/null @@ -1,31 +0,0 @@ -@import '../../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - padding: 0 12px 0 24px; - & span.splitter{ - position: relative; - display: block; - height: 8px; - } - & p.sample{ - position: relative; - display: block; - margin: 0 4px; - padding: 2px 4px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - & .label-container { - display: flex; - justify-content: space-between; - margin: 20px 10px 0; - max-width: 284px; - } - & mat-slider { - width: ~"calc(100% - 12px)"; - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/charts/details/template.html b/application/client/src/app/ui/views/sidebar/search/charts/details/template.html deleted file mode 100644 index 41c4d4154a..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/details/template.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - Chart Type - - - {{type}} - - - - - - -

    {{request}}

    - - - -
    - - -
    - - - - -
    - - -
    - - - \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/search/charts/list/component.ts b/application/client/src/app/ui/views/sidebar/search/charts/list/component.ts deleted file mode 100644 index 131a8dbf80..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/list/component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Component } from '@angular/core'; -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; -import { ProviderCharts } from '../provider'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { EntitiesList, ListId } from '../../base/list'; - -@Component({ - selector: 'app-sidebar-charts-list', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - hostDirectives: [EntitiesList.HOST_DIRECTIVE], - standalone: false, -}) -@Initial() -@Ilc() -export class ChartsList extends EntitiesList { - protected getListId(): ListId { - return ListId.Charts; - } -} -export interface ChartsList extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/charts/list/styles.less b/application/client/src/app/ui/views/sidebar/search/charts/list/styles.less deleted file mode 100644 index 23193efe51..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/list/styles.less +++ /dev/null @@ -1,7 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - &.cdk-drop-list-dragging *:not(.cdk-drag-placeholder) { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/charts/list/template.html b/application/client/src/app/ui/views/sidebar/search/charts/list/template.html deleted file mode 100644 index 47d430cdea..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/list/template.html +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/search/charts/placeholder/component.ts b/application/client/src/app/ui/views/sidebar/search/charts/placeholder/component.ts deleted file mode 100644 index fe4bf57e73..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/placeholder/component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Component } from '@angular/core'; -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; -import { ProviderCharts } from '../provider'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { EntitiesList, ListId } from '../../base/list'; - -@Component({ - selector: 'app-sidebar-charts-placeholder', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - hostDirectives: [EntitiesList.HOST_DIRECTIVE], - standalone: false, -}) -@Initial() -@Ilc() -export class ChartsPlaceholder extends EntitiesList { - protected getListId(): ListId { - return ListId.Charts; - } -} -export interface ChartsPlaceholder extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/charts/placeholder/styles.less b/application/client/src/app/ui/views/sidebar/search/charts/placeholder/styles.less deleted file mode 100644 index e25d6a97e6..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/placeholder/styles.less +++ /dev/null @@ -1,4 +0,0 @@ -:host { - display: block; - padding: 0 24px; -} \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/search/charts/placeholder/template.html b/application/client/src/app/ui/views/sidebar/search/charts/placeholder/template.html deleted file mode 100644 index 9c89d1ef31..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/placeholder/template.html +++ /dev/null @@ -1 +0,0 @@ -

    No charts

    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/search/charts/provider.ts b/application/client/src/app/ui/views/sidebar/search/charts/provider.ts deleted file mode 100644 index 2ffc37f3fa..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/charts/provider.ts +++ /dev/null @@ -1,296 +0,0 @@ -import { Entity } from '../providers/definitions/entity'; -import { Provider } from '../providers/definitions/provider'; -import { ChartRequest } from '@service/session/dependencies/search/charts/store'; -import { DisabledRequest } from '@service/session/dependencies/search/disabled/request'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { ChartsList } from './list/component'; -import { ChartsPlaceholder } from './placeholder/component'; -import { ChartrDetails } from './details/component'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; - -export class ProviderCharts extends Provider { - private _entities: Map> = new Map(); - - public init(): void { - this.updatePanels(); - this.register( - this.session.search - .store() - .charts() - .subjects.get() - .value.subscribe(() => { - super.change(); - }), - ); - } - - public entities(): Array> { - const guids: string[] = []; - const entities = this.session.search - .store() - .charts() - .get() - .map((filter: ChartRequest) => { - let entity = this._entities.get(filter.definition.uuid); - if (entity === undefined) { - entity = new Entity(filter); - } else { - entity.set(filter); - } - this._entities.set(filter.definition.uuid, entity); - guids.push(filter.definition.uuid); - return entity; - }); - this._entities.forEach((_, guid: string) => { - if (guids.indexOf(guid) === -1) { - this._entities.delete(guid); - } - }); - return entities; - } - - public reorder(params: { prev: number; curt: number }) { - this.session.search.store().charts().reorder(params); - super.change(); - } - - public getPanels(): { - list(): { - name(): string; - desc(): string; - comp(): IComponentDesc; - }; - details(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - nocontent(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - } { - return { - list: (): { - name(): string; - desc(): string; - comp(): IComponentDesc; - } => { - return { - name: (): string => { - return `Charts`; - }, - desc: (): string => { - const count = this.entities().length; - return `${count} charts${count > 1 ? 's' : ''}`; - }, - comp: (): IComponentDesc => { - return { - factory: ChartsList, - inputs: { - provider: this, - session: this.session, - }, - }; - }, - }; - }, - details: (): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - } => { - return { - name: (): string | undefined => { - return `Charts Details`; - }, - desc: (): string | undefined => { - if (this.select().get().length !== 1) { - return ''; - } - const selection = this._entities.get(this.select().get()[0]); - if (selection === undefined) { - return ''; - } - return selection.extract().definition.filter; - }, - comp: (): IComponentDesc | undefined => { - return { - factory: ChartrDetails, - inputs: { - provider: this, - }, - }; - }, - }; - }, - nocontent: (): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - } => { - return { - name: (): string | undefined => { - return `Filters`; - }, - desc: (): string | undefined => { - return undefined; - }, - comp: (): IComponentDesc | undefined => { - return { - factory: ChartsPlaceholder, - inputs: { - provider: this, - }, - }; - }, - }; - }, - }; - } - - public getContextMenuItems(_target: Entity, selected: Array>): IMenuItem[] { - if (selected.length !== 1) { - return []; - } - const entity = selected[0].extract(); - const items: IMenuItem[] = []; - if (entity instanceof ChartRequest) { - items.push( - ...[ - { - caption: `Show Matches`, - handler: () => { - this.search(selected[0]); - }, - }, - {}, - { - caption: `Into Filter`, - handler: () => { - if ( - !this.session.search - .store() - .filters() - .addFromFilter({ - filter: entity.as().filter(), - flags: { reg: true, word: false, cases: false }, - }) - ) { - return; - } - this.session.search.store().charts().delete([entity.uuid()]); - }, - }, - ], - ); - } - return items; - } - - public actions( - target: Entity, - selected: Array>, - ): { - activate?: () => void; - deactivate?: () => void; - remove?: () => void; - edit?: () => void; - } { - const actions: { - activate?: () => void; - deactivate?: () => void; - remove?: () => void; - edit?: () => void; - } = {}; - const self = this; - const entities = selected.filter((entity: Entity) => { - return entity.extract() instanceof ChartRequest; - }); - actions.activate = - entities.filter((entity: Entity) => { - return entity.extract().definition.active === false; - }).length !== 0 - ? () => { - entities.forEach((entity: Entity) => { - entity.extract().set().state(true); - }); - } - : undefined; - actions.deactivate = - entities.filter((entity: Entity) => { - return entity.extract().definition.active === true; - }).length !== 0 - ? () => { - entities.forEach((entity: Entity) => { - entity.extract().set().state(false); - }); - } - : undefined; - actions.edit = - selected.length === 1 && entities.length === 1 - ? () => { - // View should be focused to switch to edit-mode, but while context - // menu is open, there are no focus. Well, that's why settimer here. - setTimeout(() => { - self.edit().in(); - }); - } - : undefined; - actions.remove = - entities.length !== 0 - ? () => { - if (entities.length === self.entities().length) { - this.session.search.store().charts().clear(); - self.change(); - } else { - entities.forEach((entity: Entity) => { - this.session.search.store().charts().delete([entity.uuid()]); - }); - } - } - : undefined; - return actions; - } - - public search(entity: Entity) { - this.session.switch().toolbar.search(); - this.session.search - .state() - .setActive({ - filter: entity.extract().definition.filter, - flags: { reg: true, word: false, cases: false }, - }) - .catch((error: Error) => { - this.logger.error(`Fail to make search: ${error.message}`); - }); - } - - public tryToInsertEntity(entity: unknown, _index: number): boolean { - if (entity instanceof FilterRequest) { - if (this.session.search.store().charts().tryFromFilter(entity)) { - this.session.search.store().filters().delete([entity.uuid()]); - return true; - } - return false; - } else if (entity instanceof DisabledRequest) { - if (this.session.search.store().charts().tryRestore(entity.entity())) { - this.session.search.store().disabled().delete([entity.uuid()]); - return true; - } else { - return false; - } - } - return false; - } - - public removeEntity(entity: unknown): boolean { - if (!(entity instanceof ChartRequest)) { - return false; - } - this.session.search.store().charts().delete([entity.uuid()]); - return true; - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/component.ts b/application/client/src/app/ui/views/sidebar/search/component.ts deleted file mode 100644 index 91a884a8ed..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/component.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { - Component, - OnDestroy, - ViewEncapsulation, - Input, - AfterContentInit, - ChangeDetectorRef, - HostBinding, - HostListener, - ElementRef, - ChangeDetectionStrategy, -} from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { Providers } from './providers/providers'; -import { Provider, ProviderData, ISelectEvent } from './providers/definitions/provider'; -import { IMenuItem, contextmenu } from '@ui/service/contextmenu'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { ProviderFilters } from './filters/provider'; -import { ProviderCharts } from './charts/provider'; -import { ProviderDisabled } from './disabled/provider'; -import { stop } from '@ui/env/dom'; - -import * as dom from '@ui/env/dom'; -import * as ids from '@schema/ids'; - -@Component({ - selector: 'app-views-filters', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Initial() -@Ilc() -export class Filters extends ChangesDetector implements OnDestroy, AfterContentInit { - @Input() session!: Session; - - public list: Provider[] = []; - public selected: Provider | undefined; - public providers!: Providers; - - private _focused: boolean = false; - - @HostBinding('attr.tabindex') get tabindex() { - return 0; - } - @HostListener('focus', ['$event.target']) onFocus() { - this._focused = true; - } - @HostListener('blur', ['$event.target']) onBlur() { - this._focused = false; - } - @HostListener('contextmenu', ['$event']) onContextMenu(event: MouseEvent) { - const items: IMenuItem[] = [ - { - caption: `Clear recent history`, - handler: () => { - this.log().debug(`Not implemented yet`); - }, - }, - ]; - this.providers.injectGeneralMenuItems(items); - contextmenu.show({ - items, - x: event.pageX, - y: event.pageY, - }); - dom.stop(event); - } - - constructor(cdRef: ChangeDetectorRef, private _self: ElementRef) { - super(cdRef); - this._onGlobalKeyUp = this._onGlobalKeyUp.bind(this); - } - - public ngOnDestroy() { - this.providers.destroy(); - window.removeEventListener('keyup', this._onGlobalKeyUp); - } - - public ngAfterContentInit(): void { - this.providers = new Providers(this.session, this.log()); - this.providers.add(ProviderData.filters, ProviderFilters); - this.providers.add(ProviderData.charts, ProviderCharts); - this.providers.add(ProviderData.disabled, ProviderDisabled); - this.list = this.providers.list(); - this.env().subscriber.register( - this.providers.subjects.get().select.subscribe((event: ISelectEvent | undefined) => { - if (event === undefined && this.selected !== undefined) { - this.selected = undefined; - } else if (event !== undefined) { - this.selected = event.provider; - } - this.detectChanges(); - }), - ); - this.env().subscriber.register( - this.providers.subjects.get().context.subscribe((event) => { - contextmenu.show({ - items: event.items, - x: event.event.pageX, - y: event.event.pageY, - }); - stop(event.event); - }), - ); - this.env().subscriber.register( - this.providers.subjects.get().change.subscribe(() => { - if ( - this.selected !== undefined && - this.selected.select().getEntities().length === 0 - ) { - this.selected = undefined; - } - this.detectChanges(); - }), - ); - this.env().subscriber.register( - this.providers.subjects.get().edit.subscribe((guid: string | undefined) => { - setTimeout(() => { - guid === undefined && (this._self.nativeElement as HTMLElement).focus(); - }); - }), - ); - window.addEventListener('keyup', this._onGlobalKeyUp); - } - - public onShowPresets(event: MouseEvent) { - const items: IMenuItem[] = [ - { - caption: `Open preset manager`, - handler: () => { - this.session.toolbar()?.setActive(ids.TOOLBAR_TAB_PRESET); - }, - }, - ]; - const session = this.ilc().services.system.history.get(this.session.uuid()); - const named = this.ilc().services.system.history.collections.find().named(); - if (named.length > 0 && session !== undefined) { - const history = session; - items.push({}); - named.forEach((col) => { - items.push({ - caption: col.name, - handler: () => { - history.apply(col); - }, - }); - }); - } - contextmenu.show({ - items: items, - x: event.pageX, - y: event.pageY, - }); - dom.stop(event); - } - - private _onGlobalKeyUp(event: KeyboardEvent) { - if (!this._focused) { - return; - } - switch (event.code) { - case 'ArrowUp': - this.providers.select().prev(); - break; - case 'ArrowDown': - this.providers.select().next(); - break; - case 'Enter': - this.providers.edit().in(); - break; - } - stop(event); - return false; - } -} -export interface Filters extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/disabled/entity/component.ts b/application/client/src/app/ui/views/sidebar/search/disabled/entity/component.ts deleted file mode 100644 index b00fd2c73c..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/disabled/entity/component.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Component, AfterContentInit, ViewChild } from '@angular/core'; -import { MatInput } from '@angular/material/input'; -import { DisabledRequest } from '@service/session/dependencies/search/disabled/request'; -import { ProviderDisabled } from '../provider'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { EntityItem } from '../../base/entity'; - -@Component({ - selector: 'app-sidebar-disabled', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - hostDirectives: EntityItem.HOST_DIRECTIVES, - standalone: false, -}) -@Ilc() -export class Disabled - extends EntityItem - implements AfterContentInit -{ - @ViewChild(MatInput) _inputRefCom!: MatInput; - - public display_name: string | undefined; - public icon: string | undefined; - - public ngAfterContentInit() { - this.env().subscriber.register( - this.provider.subjects.get().edit.subscribe((guid: string | undefined) => { - if (this.entity.uuid() === guid) { - this.detectChanges(); - if (this._inputRefCom !== undefined) { - this._inputRefCom.focus(); - } - } - }), - ); - const entity = this.entity.extract().entity(); - this.display_name = entity.disabled().displayName(); - this.icon = entity.disabled().icon(); - } -} -export interface Disabled extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/disabled/entity/styles.less b/application/client/src/app/ui/views/sidebar/search/disabled/entity/styles.less deleted file mode 100644 index 97a292fd37..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/disabled/entity/styles.less +++ /dev/null @@ -1,56 +0,0 @@ -@import '../../../../../styles/variables.less'; - - -:host { - display: flex; - position: relative; - flex-flow: row; - padding: 3px 12px 5px 24px; - overflow: hidden; - height: 20px; - cursor: default; - width: calc(100% - 36px); - &:hover{ - background: var(--scheme-color-5); - } - &.selected{ - background: var(--scheme-color-accent-fadeout-50); - } - span.icon { - flex: 0; - width: 18px; - max-width: 18px; - min-width: 18px; - display: block; - position: relative; - margin: 2px 0 0 0; - & .mat-icon{ - height: 18px; - width: 18px; - font-size: 18px; - } - } - span.request{ - flex: auto; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - padding-left: 6px; - color: var(--scheme-color-0); - cursor: default; - } - &.cdk-drag-preview { - box-sizing: border-box; - box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), - 0 8px 10px 1px rgba(0, 0, 0, 0.14), - 0 3px 14px 2px rgba(0, 0, 0, 0.12); - font-size: 14px; - line-height: 20px; - } - &.cdk-drag-placeholder { - opacity: 0; - } - &.cdk-drag-animating { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/disabled/entity/template.html b/application/client/src/app/ui/views/sidebar/search/disabled/entity/template.html deleted file mode 100644 index e360561b02..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/disabled/entity/template.html +++ /dev/null @@ -1,4 +0,0 @@ - - {{icon}} - -{{display_name}} diff --git a/application/client/src/app/ui/views/sidebar/search/disabled/list/component.ts b/application/client/src/app/ui/views/sidebar/search/disabled/list/component.ts deleted file mode 100644 index ec107b9a6f..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/disabled/list/component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, AfterContentInit } from '@angular/core'; -import { DisabledRequest } from '@service/session/dependencies/search/disabled/request'; -import { ProviderDisabled } from '../provider'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { EntitiesList, ListId } from '../../base/list'; - -@Component({ - selector: 'app-sidebar-disabled-list', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - hostDirectives: [EntitiesList.HOST_DIRECTIVE], - standalone: false, -}) -@Initial() -@Ilc() -export class DisabledList - extends EntitiesList - implements AfterContentInit -{ - protected getListId(): ListId { - return ListId.Disabled; - } -} -export interface DisabledList extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/disabled/list/styles.less b/application/client/src/app/ui/views/sidebar/search/disabled/list/styles.less deleted file mode 100644 index 23193efe51..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/disabled/list/styles.less +++ /dev/null @@ -1,7 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - &.cdk-drop-list-dragging *:not(.cdk-drag-placeholder) { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/disabled/list/template.html b/application/client/src/app/ui/views/sidebar/search/disabled/list/template.html deleted file mode 100644 index 2ab1f9e313..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/disabled/list/template.html +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/search/disabled/provider.ts b/application/client/src/app/ui/views/sidebar/search/disabled/provider.ts deleted file mode 100644 index 35d2192f36..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/disabled/provider.ts +++ /dev/null @@ -1,262 +0,0 @@ -import { Entity } from '../providers/definitions/entity'; -import { Provider } from '../providers/definitions/provider'; -import { DisabledRequest } from '@service/session/dependencies/search/disabled/store'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { DisabledList } from './list/component'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { DisableConvertable } from '@service/session/dependencies/search/disabled/converting'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; - -export class ProviderDisabled extends Provider { - private readonly _entities: Map> = new Map(); - - public init(): void { - super.updatePanels(); - this.register( - this.session.search - .store() - .disabled() - .subjects.get() - .value.subscribe(() => { - super.change(); - this.select().drop(); - }), - ); - } - - public entities(): Array> { - const guids: string[] = []; - const entities = this.session.search - .store() - .disabled() - .get() - .map((item: DisabledRequest) => { - let entity = this._entities.get(item.uuid()); - if (entity === undefined) { - entity = new Entity(item); - } else { - entity.set(item); - } - this._entities.set(item.uuid(), entity); - guids.push(item.uuid()); - return entity; - }); - this._entities.forEach((_, guid: string) => { - if (guids.indexOf(guid) === -1) { - this._entities.delete(guid); - } - }); - return entities; - } - - public reorder(params: { prev: number; curt: number }) { - this.session.search.store().disabled().reorder(params); - super.change(); - } - - public getPanels(): { - list(): { - name(): string; - desc(): string; - comp(): IComponentDesc; - }; - details(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - nocontent(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - } { - return { - list: (): { - name(): string; - desc(): string; - comp(): IComponentDesc; - } => { - return { - name: (): string => { - return `Disabled`; - }, - desc: (): string => { - const count = this.entities().length; - return `${count} ${count > 1 ? 'entities' : 'entity'}`; - }, - comp: (): IComponentDesc => { - return { - factory: DisabledList, - inputs: { - provider: this, - session: this.session, - }, - }; - }, - }; - }, - details: (): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - } => { - return { - name: (): string | undefined => { - return undefined; - }, - desc: (): string | undefined => { - return undefined; - }, - comp: (): IComponentDesc | undefined => { - return undefined; - }, - }; - }, - nocontent: (): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - } => { - return { - name: (): string | undefined => { - return undefined; - }, - desc: (): string | undefined => { - return undefined; - }, - comp: (): IComponentDesc | undefined => { - return undefined; - }, - }; - }, - }; - } - - public getContextMenuItems(target: Entity, selected: Array>): IMenuItem[] { - const entities: DisableConvertable[] = selected - .filter((entity: Entity) => { - return !(entity.extract() instanceof DisabledRequest); - }) - .map((entity: Entity) => { - return entity.extract(); - }); - const disableds: DisabledRequest[] = selected - .filter((entity: Entity) => { - return entity.extract() instanceof DisabledRequest; - }) - .map((entity: Entity) => { - return entity.extract(); - }); - const items: IMenuItem[] = []; - if (entities.length > 0 && disableds.length === 0) { - items.push({ - caption: `Disable`, - handler: () => { - this.session.search.store().disabled().addFromEntity(entities); - this.session.search - .store() - .filters() - .delete(entities.map((en) => en.uuid())); - this.session.search - .store() - .charts() - .delete(entities.map((en) => en.uuid())); - }, - }); - } - if (entities.length === 0 && disableds.length > 0) { - items.push({ - caption: `Enable`, - handler: () => { - disableds.forEach((disabled: DisabledRequest) => { - let restored = false; - !restored && - (restored = this.session.search - .store() - .filters() - .tryRestore(disabled.entity())); - !restored && - (restored = this.session.search - .store() - .charts() - .tryRestore(disabled.entity())); - restored && - this.session.search.store().disabled().delete([disabled.uuid()]); - }); - }, - }); - } - return items; - } - - public search(target: Entity) { - const entity = target.extract(); - if (entity instanceof ChartRequest) { - this.session.search - .state() - .setActive({ - filter: entity.definition.filter, - flags: { reg: true, word: false, cases: false }, - }) - .catch((error: Error) => { - this.logger.error(`Fail to make search: ${error.message}`); - }); - } else if (entity instanceof FilterRequest) { - this.session.search - .state() - .setActive(entity.definition.filter) - .catch((error: Error) => { - this.logger.error(`Fail to make search: ${error.message}`); - }); - } - } - - public actions( - target: Entity, - selected: Array>, - ): { - activate?: () => void; - deactivate?: () => void; - remove?: () => void; - edit?: () => void; - } { - const disableds: DisabledRequest[] = selected - .filter((entity: Entity) => { - return entity.extract() instanceof DisabledRequest; - }) - .map((entity: Entity) => { - return entity.extract(); - }); - return { - remove: - disableds.length !== 0 - ? () => { - disableds.forEach((disabled: DisabledRequest) => { - this.session.search.store().disabled().delete([disabled.uuid()]); - }); - } - : undefined, - }; - } - - public tryToInsertEntity(entity: unknown, _index: number): boolean { - if (entity instanceof ChartRequest || entity instanceof FilterRequest) { - this.session.search.store().disabled().addFromEntity([entity]); - entity instanceof FilterRequest && - this.session.search.store().filters().delete([entity.uuid()]); - entity instanceof ChartRequest && - this.session.search.store().charts().delete([entity.uuid()]); - } - return false; - } - - public removeEntity(entity: unknown): boolean { - if (!(entity instanceof DisabledRequest)) { - return false; - } - this.session.search.store().disabled().delete([entity.uuid()]); - return true; - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/filters/details/component.ts b/application/client/src/app/ui/views/sidebar/search/filters/details/component.ts deleted file mode 100644 index ef138b488f..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/details/component.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterContentInit, - Input, - ViewChild, - ChangeDetectionStrategy, -} from '@angular/core'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; -import { MatSelectChange, MatSelect } from '@angular/material/select'; -import { ProviderFilters } from '../provider'; -import { Entity } from '../../providers/definitions/entity'; -import { getContrastColor, CColors } from '@styles/colors'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -type TColorType = 'color' | 'background'; - -interface IColorOption { - title: string; - value: TColorType; -} - -@Component({ - selector: 'app-sidebar-filters-details', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Initial() -@Ilc() -export class FilterDetails extends ChangesDetector implements AfterContentInit { - @ViewChild(MatSelect) _refSelect!: MatSelect; - - @Input() provider!: ProviderFilters; - - public request: string | undefined; - public color: string | undefined; - public background: string | undefined; - public colorOptions: IColorOption[] = [ - { title: 'Background', value: 'background' }, - { title: 'Foreground', value: 'color' }, - ]; - public colorType: TColorType = 'background'; - public currentColor: string | undefined; - public colors: string[] = []; - - private _entity: Entity | undefined; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit() { - this.env().subscriber.register( - this.provider.subjects.get().selection.subscribe(this._init.bind(this)), - ); - this.env().subscriber.register( - this.provider.subjects.get().change.subscribe(this._onChange.bind(this)), - ); - this._init(); - } - - public _ng_onColorTypeChange(event: MatSelectChange) { - this.colorType = event.value; - switch (this.colorType) { - case 'color': - this.currentColor = this.color; - break; - case 'background': - this.currentColor = this.background; - break; - } - this._refSelect.close(); - this._setColors(); - this.detectChanges(); - } - - public _ng_onColorChange(color: string) { - if (this._entity === undefined) { - return; - } - switch (this.colorType) { - case 'color': - this.color = color; - this.background = getContrastColor(color, false); - break; - case 'background': - this.background = color; - this.color = getContrastColor(color, true); - break; - } - this._entity.extract().set().background(this.background); - this._entity.extract().set().color(this.color); - this.currentColor = color; - this.detectChanges(); - } - - private _setColors() { - this.colors = CColors.slice(); - let color: string | undefined; - switch (this.colorType) { - case 'color': - color = this.color; - break; - case 'background': - color = this.background; - break; - } - if (color === undefined || this.colors.find((c) => c === color) !== undefined) { - return; - } - this.colors.push(color); - this.detectChanges(); - } - - private _init() { - this._entity = this.provider.select().single(); - if (this._entity === undefined) { - this.request = undefined; - this.color = undefined; - this.background = undefined; - this.currentColor = undefined; - } else { - const def = this._entity.extract().definition; - this.request = def.filter.filter; - this.color = def.colors.color; - this.background = def.colors.background; - this.currentColor = def.colors.background; - this.colorType = 'background'; - this._setColors(); - } - this._onChange(); - } - - private _onChange() { - if (this._entity === undefined) { - return; - } - this.request = this._entity.extract().definition.filter.filter; - this.detectChanges(); - } -} -export interface FilterDetails extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/filters/details/styles.less b/application/client/src/app/ui/views/sidebar/search/filters/details/styles.less deleted file mode 100644 index 9b72269a42..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/details/styles.less +++ /dev/null @@ -1,22 +0,0 @@ -@import '../../../../../styles/variables.less'; - - -:host { - position: relative; - display: block; - padding: 0 12px 0 24px; - & span.slitter{ - position: relative; - display: block; - height: 8px; - } - & p.sample{ - position: relative; - display: block; - margin: 0 4px; - padding: 2px 4px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/filters/details/template.html b/application/client/src/app/ui/views/sidebar/search/filters/details/template.html deleted file mode 100644 index 8fab214dc9..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/details/template.html +++ /dev/null @@ -1,16 +0,0 @@ - - Set color for - - - {{option.title}} - - - - - - - - - - -

    {{request}}

    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/search/filters/filter/component.ts b/application/client/src/app/ui/views/sidebar/search/filters/filter/component.ts deleted file mode 100644 index d84ea146ef..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/filter/component.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { - Component, - AfterContentInit, - HostBinding, - ViewChild, - ChangeDetectorRef, -} from '@angular/core'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; -import { MatCheckboxChange } from '@angular/material/checkbox'; -import { MatInput } from '@angular/material/input'; -import { MatCheckbox } from '@angular/material/checkbox'; -import { ProviderFilters } from '../provider'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { State } from './state'; -import { stop } from '@ui/env/dom'; -import { EFlag } from '@platform/types/filter'; -import { EntityItem } from '../../base/entity'; - -@Component({ - selector: 'app-sidebar-filters-filter', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - hostDirectives: EntityItem.HOST_DIRECTIVES, - standalone: false, -}) -@Ilc() -export class Filter extends EntityItem implements AfterContentInit { - @HostBinding('class.notvalid') get cssClassNotValid() { - return !FilterRequest.isValid({ - filter: this.state.filter.filter, - flags: { - cases: this.state.filter.flags.cases, - word: this.state.filter.flags.word, - reg: this.state.filter.flags.reg, - }, - }); - } - - @ViewChild(MatInput) _inputRefCom!: MatInput; - @ViewChild(MatCheckbox) _stateRefCom!: MatCheckbox; - - public state!: State; - public EFlag = EFlag; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit() { - this.env().subscriber.register( - this.provider.subjects.get().edit.subscribe((guid: string | undefined) => { - if (this.entity.uuid() === guid) { - this.update(); - if (this._inputRefCom !== undefined) { - this._inputRefCom.focus(); - } - } - }), - ); - this.env().subscriber.register( - this.entity.extract().updated.subscribe((event) => { - if (event.inner().filter) { - this.state.update().filter(); - } else if (event.inner().colors) { - this.state.update().colors(); - } else if (event.inner().state) { - this.state.update().state(); - } else if (event.inner().stat) { - this.state.update().stat(); - } - this.update(); - }), - ); - this.state = new State(this.entity, this.provider); - } - - public _ng_onStateChange(event: MatCheckboxChange) { - this.state.setState(event.checked); - this.update(); - } - - public _ng_flagsToggle(event: MouseEvent, flag: EFlag) { - this.state.toggleFilter(flag); - stop(event); - } - - public _ng_onRequestInputKeyUp(event: KeyboardEvent) { - if (this.provider === undefined) { - return; - } - if (['Escape', 'Enter'].indexOf(event.code) === -1) { - return; - } - switch (event.code) { - case 'Escape': - this.state.edit().drop(); - break; - case 'Enter': - this.state.edit().accept(); - break; - } - this.update(); - } - - public _ng_onRequestInputBlur() { - if (this.provider === undefined) { - return; - } - this.state.edit().drop(); - this.update(); - } - - public _ng_onDoubleClick(event: MouseEvent) { - this.provider !== undefined && this.provider.select().doubleclick(event, this.entity); - } - - public update() { - this.detectChanges(); - ChangesDetector.detectChanges(this._stateRefCom); - } -} -export interface Filter extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/filters/filter/state.ts b/application/client/src/app/ui/views/sidebar/search/filters/filter/state.ts deleted file mode 100644 index 5cbaa3ca42..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/filter/state.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { EFlag, IFilter } from '@platform/types/filter'; -import { Entity } from '../../providers/definitions/entity'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; -import { ProviderFilters } from '../provider'; - -import * as obj from '@platform/env/obj'; - -export interface IFilterColors { - color: string; - background: string; -} - -export class State { - public filter: IFilter; - public colors: IFilterColors; - public active: boolean = false; - public provider: ProviderFilters; - public entity: Entity; - public found: number = 0; - - private _isValidRegex: boolean = true; - private _error: string | undefined; - - constructor(entity: Entity, prodider: ProviderFilters) { - this.filter = obj.clone(entity.extract().definition.filter); - this.colors = obj.clone(entity.extract().definition.colors); - this.active = entity.extract().definition.active; - this.provider = prodider; - this.entity = entity; - this._update(); - } - - public get isValidRegex(): boolean { - return this._isValidRegex; - } - - public setState(checked: boolean) { - this.active = checked; - this.entity.extract().set().state(checked); - } - - public update(): { - filter(): void; - colors(): void; - state(): void; - stat(): void; - } { - return { - filter: (): void => { - this.filter = obj.clone(this.entity.extract().definition.filter); - }, - colors: (): void => { - this.colors = obj.clone(this.entity.extract().definition.colors); - }, - state: (): void => { - this.active = this.entity.extract().definition.active; - }, - stat: (): void => { - this.found = this.entity.extract().found; - }, - }; - } - - public toggleFilter(flag: EFlag) { - if (!this._canToggle(flag)) { - return; - } - this.filter.flags[flag] = !this.filter.flags[flag]; - this.entity.extract().set().flags(this.filter.flags); - } - - public edit(): { - drop(): void; - accept(): void; - } { - return { - drop: (): void => { - this.filter.filter = this.entity.extract().definition.filter.filter; - this.provider.edit().out(); - }, - accept: (): void => { - this._update(); - if (this.filter.filter.trim() !== '' && this._error === undefined) { - this.entity.extract().set().filter(this.filter.filter); - } else { - this.filter.filter = this.entity.extract().definition.filter.filter; - } - this.provider.edit().out(); - }, - }; - } - - public get error(): string | undefined { - return this._error; - } - - private _canToggle(flag: EFlag): boolean { - return ( - (flag === EFlag.reg && !this.filter.flags.reg && this._isValidRegex) || - this.filter.flags.reg - ); - } - - private _update() { - this._checkSpecifiedRegex(); - this._checkGeneralRegex(); - } - - private _checkSpecifiedRegex() { - this._error = FilterRequest.getValidationError(this.filter); - } - - private _checkGeneralRegex() { - this._isValidRegex = FilterRequest.isValid({ - filter: this.filter.filter, - flags: { - cases: this.filter.flags.cases, - word: this.filter.flags.word, - reg: true, - }, - }); - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/filters/filter/styles.less b/application/client/src/app/ui/views/sidebar/search/filters/filter/styles.less deleted file mode 100644 index ce6d055350..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/filter/styles.less +++ /dev/null @@ -1,146 +0,0 @@ -@import '../../../../../styles/variables.less'; - - -:host { - display: flex; - position: relative; - flex-flow: row; - padding: 3px 12px 5px 24px; - overflow: hidden; - height: 20px; - cursor: default; - align-items: center; - width: calc(100% - 24px); - &.notvalid { - background: var(--scheme-color-warning-fadeout-50); - &::after { - display: block; - content: '⚠'; - font-size: 8px; - color: #fd1515; - top: 3px; - left: 8px; - position: absolute; - } - input.request { - color: var(--scheme-color-error); - border-bottom: dashed 1px var(--scheme-color-error); - } - } - &:hover{ - background: var(--scheme-color-5); - } - &.selected{ - background: var(--scheme-color-accent-fadeout-50); - } - div.doubleclick { - display: contents; - flex: auto; - } - span.color { - flex: 0; - width: 8px; - max-width: 8px; - min-width: 8px; - min-height: 16px; - display: block; - position: relative; - margin: 2px 0 2px 0; - } - span.background { - flex: 0; - width: 8px; - max-width: 8px; - min-width: 8px; - min-height: 16px; - display: block; - position: relative; - margin: 2px 0 2px 0; - } - span.request{ - flex: auto; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - padding-left: 6px; - color: var(--scheme-color-0); - cursor: default; - } - span.found { - flex: 0; - white-space: nowrap; - color: var(--scheme-color-0); - padding: 0 6px; - font-size: 12px; - margin: 0; - border: thin solid var(--scheme-color-active); - background: var(--scheme-color-active); - border-radius: 6px; - } - input.request { - margin: 0 8px; - padding: 0; - border: none; - border-bottom: dashed 1px var(--scheme-color-1); - flex: auto; - white-space: nowrap; - color: var(--scheme-color-0); - background: none; - outline: none; - } - span.flags { - display: flex; - flex-direction: row; - align-items: center; - flex: 0; - padding-right: 8px; - & span { - font-size: 14px; - line-height: 14px; - vertical-align: bottom; - cursor: default; - &.active{ - color: var(--scheme-color-0); - } - &.inactive{ - color: var(--scheme-color-3); - } - &.invalid { - color: var(--scheme-color-error); - } - } - } - &.edited { - &::after{ - display: none; - } - padding-left: 0; - background: var(--scheme-color-6); - mat-checkbox { - display: none; - } - span.color { - display: none; - } - span.background { - display: none; - } - span.flags { - display: none; - } - } - &.cdk-drag-preview { - box-sizing: border-box; - box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), - 0 8px 10px 1px rgba(0, 0, 0, 0.14), - 0 3px 14px 2px rgba(0, 0, 0, 0.12); - font-size: 14px; - line-height: 20px; - } - &.cdk-drag-placeholder { - opacity: 0; - } - &.cdk-drag-animating { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/filters/filter/template.html b/application/client/src/app/ui/views/sidebar/search/filters/filter/template.html deleted file mode 100644 index 02f049c6ba..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/filter/template.html +++ /dev/null @@ -1,19 +0,0 @@ - -
    - - - {{state.filter.filter}} - -
    -{{state.found}} - - - - - diff --git a/application/client/src/app/ui/views/sidebar/search/filters/list/component.ts b/application/client/src/app/ui/views/sidebar/search/filters/list/component.ts deleted file mode 100644 index 096d7567d4..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/list/component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Component } from '@angular/core'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; -import { ProviderFilters } from '../provider'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { EntitiesList, ListId } from '../../base/list'; - -@Component({ - selector: 'app-sidebar-filters-list', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - hostDirectives: [EntitiesList.HOST_DIRECTIVE], - standalone: false, -}) -@Initial() -@Ilc() -export class FiltersList extends EntitiesList { - protected getListId(): ListId { - return ListId.Filters; - } -} -export interface FiltersList extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/filters/list/styles.less b/application/client/src/app/ui/views/sidebar/search/filters/list/styles.less deleted file mode 100644 index 23193efe51..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/list/styles.less +++ /dev/null @@ -1,7 +0,0 @@ -@import '../../../../../styles/variables.less'; - -:host { - &.cdk-drop-list-dragging *:not(.cdk-drag-placeholder) { - transition: transform 250ms cubic-bezier(0, 0, 0.2, 1); - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/filters/list/template.html b/application/client/src/app/ui/views/sidebar/search/filters/list/template.html deleted file mode 100644 index 2f16f6444c..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/list/template.html +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/search/filters/placeholder/component.ts b/application/client/src/app/ui/views/sidebar/search/filters/placeholder/component.ts deleted file mode 100644 index 8536746921..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/placeholder/component.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Component } from '@angular/core'; -import { ProviderFilters } from '../provider'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { EntitiesList, ListId } from '../../base/list'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; - -@Component({ - selector: 'app-sidebar-filters-placeholder', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - hostDirectives: [EntitiesList.HOST_DIRECTIVE], - standalone: false, -}) -@Initial() -@Ilc() -export class FiltersPlaceholder extends EntitiesList { - protected getListId(): ListId { - return ListId.Filters; - } -} -export interface FiltersPlaceholder extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/search/filters/placeholder/styles.less b/application/client/src/app/ui/views/sidebar/search/filters/placeholder/styles.less deleted file mode 100644 index e25d6a97e6..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/placeholder/styles.less +++ /dev/null @@ -1,4 +0,0 @@ -:host { - display: block; - padding: 0 24px; -} \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/search/filters/placeholder/template.html b/application/client/src/app/ui/views/sidebar/search/filters/placeholder/template.html deleted file mode 100644 index 8906226b41..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/placeholder/template.html +++ /dev/null @@ -1 +0,0 @@ -

    No filters

    \ No newline at end of file diff --git a/application/client/src/app/ui/views/sidebar/search/filters/provider.ts b/application/client/src/app/ui/views/sidebar/search/filters/provider.ts deleted file mode 100644 index 265a72caec..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/filters/provider.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { Entity } from '../providers/definitions/entity'; -import { Provider } from '../providers/definitions/provider'; -import { FilterRequest } from '@service/session/dependencies/search/filters/store'; -import { DisabledRequest } from '@service/session/dependencies/search/disabled/request'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { FiltersList } from './list/component'; -import { FiltersPlaceholder } from './placeholder/component'; -import { FilterDetails } from './details/component'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; - -export class ProviderFilters extends Provider { - private _entities: Map> = new Map(); - - public init(): void { - this.updatePanels(); - this.register( - this.session.search - .store() - .filters() - .subjects.get() - .value.subscribe(() => { - super.change(); - }), - ); - this.register( - this.session.search.subjects.get().updated.subscribe((event) => { - this._entities.forEach((entity) => { - const alias = entity.extract().alias(); - const stat = event.stat.get(alias); - entity - .extract() - .set() - .found(stat === undefined ? 0 : stat); - }); - }), - ); - } - - public entities(): Array> { - const guids: string[] = []; - const entities = this.session.search - .store() - .filters() - .get() - .map((filter: FilterRequest) => { - let entity = this._entities.get(filter.definition.uuid); - if (entity === undefined) { - entity = new Entity(filter); - } else { - entity.set(filter); - } - this._entities.set(filter.definition.uuid, entity); - guids.push(filter.definition.uuid); - return entity; - }); - this._entities.forEach((_, guid: string) => { - if (guids.indexOf(guid) === -1) { - this._entities.delete(guid); - } - }); - return entities; - } - - public reorder(params: { prev: number; curt: number }) { - this.session.search.store().filters().reorder(params); - super.change(); - } - - public getPanels(): { - list(): { - name(): string; - desc(): string; - comp(): IComponentDesc; - }; - details(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - nocontent(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - } { - return { - list: (): { - name(): string; - desc(): string; - comp(): IComponentDesc; - } => { - return { - name: (): string => { - return `Filters`; - }, - desc: (): string => { - const count = this.entities().length; - return `${count} filter${count > 1 ? 's' : ''}`; - }, - comp: (): IComponentDesc => { - return { - factory: FiltersList, - inputs: { - provider: this, - session: this.session, - }, - }; - }, - }; - }, - details: (): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - } => { - return { - name: (): string | undefined => { - return `Filter Details`; - }, - desc: (): string | undefined => { - if (this.select().get().length !== 1) { - return ''; - } - const selection = this._entities.get(this.select().get()[0]); - if (selection === undefined) { - return ''; - } - return selection.extract().definition.filter.filter; - }, - comp: (): IComponentDesc | undefined => { - return { - factory: FilterDetails, - inputs: { - provider: this, - }, - }; - }, - }; - }, - nocontent: (): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - } => { - return { - name: (): string | undefined => { - return `Filters`; - }, - desc: (): string | undefined => { - return undefined; - }, - comp: (): IComponentDesc | undefined => { - return { - factory: FiltersPlaceholder, - inputs: { - provider: this, - }, - }; - }, - }; - }, - }; - } - - public getContextMenuItems(_target: Entity, selected: Array>): IMenuItem[] { - if (selected.length !== 1) { - return []; - } - const entity = selected[0].extract(); - const items: IMenuItem[] = []; - if (selected[0].extract() instanceof FilterRequest) { - items.push( - ...[ - { - caption: `Show Matches`, - handler: () => { - this.search(selected[0]); - }, - }, - {}, - { - caption: `Into Chart`, - disabled: !this.session.search.store().charts().isConvertableFrom(entity), - handler: () => { - if (!this.session.search.store().charts().tryFromFilter(entity)) { - return; - } - this.session.search.store().filters().delete([entity.uuid()]); - }, - }, - ], - ); - } - return items; - } - - public search(entity: Entity) { - this.session.switch().toolbar.search(); - this.session.search - .state() - .setActive(entity.extract().definition.filter) - .catch((error: Error) => { - this.logger.error(`Fail to make search: ${error.message}`); - }); - } - - public actions( - target: Entity, - selected: Array>, - ): { - activate?: () => void; - deactivate?: () => void; - remove?: () => void; - edit?: () => void; - } { - const actions: { - activate?: () => void; - deactivate?: () => void; - remove?: () => void; - edit?: () => void; - } = {}; - const self = this; - const entities = selected.filter((entity: Entity) => { - return entity.extract() instanceof FilterRequest; - }); - actions.activate = - entities.filter((entity: Entity) => { - return entity.extract().definition.active === false; - }).length !== 0 - ? () => { - entities.forEach((entity: Entity) => { - entity.extract().set(true).state(true); - }); - this.session.search.store().filters().refresh(); - } - : undefined; - actions.deactivate = - entities.filter((entity: Entity) => { - return entity.extract().definition.active === true; - }).length !== 0 - ? () => { - entities.forEach((entity: Entity) => { - entity.extract().set(true).state(false); - }); - this.session.search.store().filters().refresh(); - } - : undefined; - actions.edit = - selected.length === 1 && entities.length === 1 - ? () => { - // View should be focused to switch to edit-mode, but while context - // menu is open, there are no focus. Well, that's why settimer here. - setTimeout(() => { - self.edit().in(); - }); - } - : undefined; - actions.remove = - entities.length !== 0 - ? () => { - if (entities.length === self.entities().length) { - this.session.search.store().filters().clear(); - self.change(); - } else { - entities.forEach((entity: Entity) => { - this.session.search.store().filters().delete([entity.uuid()]); - }); - } - } - : undefined; - return actions; - } - - public tryToInsertEntity(entity: unknown, _index: number): boolean { - if (entity instanceof ChartRequest) { - if ( - this.session.search - .store() - .filters() - .addFromFilter({ - filter: entity.as().filter(), - flags: { reg: true, word: false, cases: false }, - }) - ) { - this.session.search.store().charts().delete([entity.uuid()]); - return true; - } else { - return false; - } - } else if (entity instanceof DisabledRequest) { - if (this.session.search.store().filters().tryRestore(entity.entity())) { - this.session.search.store().disabled().delete([entity.uuid()]); - return true; - } else { - return false; - } - } - return false; - } - - public removeEntity(entity: unknown): boolean { - if (!(entity instanceof FilterRequest)) { - return false; - } - this.session.search.store().filters().delete([entity.uuid()]); - return true; - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/module.ts b/application/client/src/app/ui/views/sidebar/search/module.ts deleted file mode 100644 index 03b8a50032..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/module.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ContainersModule } from '@elements/containers/module'; -import { AppDirectiviesModule } from '@directives/module'; -import { DragDropModule } from '@angular/cdk/drag-drop'; -import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule } from '@angular/material/button'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatOptionModule } from '@angular/material/core'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatSelectModule } from '@angular/material/select'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatSliderModule } from '@angular/material/slider'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { ColorSelectorModule } from '@elements/color.selector/module'; -import { Filters } from './component'; -import { FilterDetails } from './filters/details/component'; -import { Filter } from './filters/filter/component'; -import { FiltersList } from './filters/list/component'; -import { FiltersPlaceholder } from './filters/placeholder/component'; -import { ChartrDetails } from './charts/details/component'; -import { Chart } from './charts/chart/component'; -import { ChartsList } from './charts/list/component'; -import { ChartsPlaceholder } from './charts/placeholder/component'; -import { Disabled } from './disabled/entity/component'; -import { DisabledList } from './disabled/list/component'; -import { TeamworkAppletModule } from '@elements/teamwork/module'; -import { Bin } from './bin/component'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - AppDirectiviesModule, - MatIconModule, - MatAutocompleteModule, - MatOptionModule, - MatFormFieldModule, - MatInputModule, - MatProgressBarModule, - MatProgressSpinnerModule, - MatSelectModule, - MatCheckboxModule, - MatExpansionModule, - MatButtonModule, - FormsModule, - ReactiveFormsModule, - DragDropModule, - MatSliderModule, - ColorSelectorModule, - TeamworkAppletModule, - ], - declarations: [ - Filters, - FilterDetails, - Filter, - FiltersList, - FiltersPlaceholder, - ChartrDetails, - Chart, - ChartsList, - ChartsPlaceholder, - Disabled, - DisabledList, - Bin, - ], - exports: [Filters], - bootstrap: [Filters], -}) -export class FiltersModule {} diff --git a/application/client/src/app/ui/views/sidebar/search/providers/definitions/entity.data.ts b/application/client/src/app/ui/views/sidebar/search/providers/definitions/entity.data.ts deleted file mode 100644 index a1774a87da..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/providers/definitions/entity.data.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Entity } from './entity'; -import { DisabledRequest } from '@service/session/dependencies/search/disabled/request'; - -export class EntityData { - private _entries: Entity[] | undefined; - private _disabled: Entity[] | undefined; - - constructor(params: { entities?: Entity[]; disabled?: Entity[] }) { - this._entries = params.entities instanceof Array ? params.entities : undefined; - this._disabled = params.disabled instanceof Array ? params.disabled : undefined; - } - - public get entries(): Entity[] | undefined { - return this._entries; - } - - public get disabled(): Entity[] | undefined { - return this._disabled; - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/providers/definitions/entity.state.edit.ts b/application/client/src/app/ui/views/sidebar/search/providers/definitions/entity.state.edit.ts deleted file mode 100644 index e632bd8d18..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/providers/definitions/entity.state.edit.ts +++ /dev/null @@ -1,15 +0,0 @@ -export class EntityEditState { - private _edit: boolean = false; - - public in() { - this._edit = true; - } - - public out() { - this._edit = false; - } - - public state(): boolean { - return this._edit; - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/providers/definitions/entity.ts b/application/client/src/app/ui/views/sidebar/search/providers/definitions/entity.ts deleted file mode 100644 index 0c4684c558..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/providers/definitions/entity.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { EntityEditState } from './entity.state.edit'; -import { Recognizable } from '@platform/types/storage/entry'; - -export class Entity { - private _entity: T & Recognizable; - private _editState: EntityEditState = new EntityEditState(); - - constructor(entity: T & Recognizable) { - this._entity = entity; - } - - public uuid(): string { - return this._entity.uuid(); - } - - public extract(): T & Recognizable { - return this._entity; - } - - public set(entity: T & Recognizable) { - this._entity = entity; - } - - public getEditState(): EntityEditState { - return this._editState; - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/providers/definitions/events.ts b/application/client/src/app/ui/views/sidebar/search/providers/definitions/events.ts deleted file mode 100644 index 6386816c1b..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/providers/definitions/events.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Subject } from '@platform/env/subscription'; -import { ISelectEvent, IContextMenuEvent, IDoubleclickEvent } from './provider'; - -export interface ProvidersEvents { - select: Subject; - context: Subject; - doubleclick: Subject; - change: Subject; - edit: Subject; - dragging: Subject; -} - -export interface ProviderEvents { - change: Subject; - selection: Subject; - edit: Subject; - context: Subject; - doubleclick: Subject; -} diff --git a/application/client/src/app/ui/views/sidebar/search/providers/definitions/keyboard.listener.ts b/application/client/src/app/ui/views/sidebar/search/providers/definitions/keyboard.listener.ts deleted file mode 100644 index 3639169e94..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/providers/definitions/keyboard.listener.ts +++ /dev/null @@ -1,48 +0,0 @@ -export class KeyboardListener { - private _ctrl: boolean = false; - private _shift: boolean = false; - - constructor() { - this._keyup = this._keyup.bind(this); - this._keydown = this._keydown.bind(this); - window.addEventListener('keyup', this._keyup); - window.addEventListener('keydown', this._keydown); - } - - public destroy() { - window.removeEventListener('keyup', this._keyup); - window.removeEventListener('keydown', this._keydown); - } - - public ctrl(): boolean { - return this._ctrl; - } - - public shift(): boolean { - return this._shift; - } - - public ignore_ctrl_shift() { - this._shift = false; - this._ctrl = false; - } - - private _keyup() { - this._ctrl = false; - this._shift = false; - } - - private _keydown(event: KeyboardEvent) { - if (event.shiftKey) { - this._shift = true; - return; - } - if (['MetaLeft', 'MetaRight'].indexOf(event.code) !== -1) { - // OSX - this._ctrl = true; - } else { - // Others - this._ctrl = event.ctrlKey; - } - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/providers/definitions/provider.ts b/application/client/src/app/ui/views/sidebar/search/providers/definitions/provider.ts deleted file mode 100644 index 54ab9aa9f0..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/providers/definitions/provider.ts +++ /dev/null @@ -1,433 +0,0 @@ -import { Subject, Subscriber, Subjects } from '@platform/env/subscription'; -import { Entity } from './entity'; -import { IComponentDesc } from '@elements/containers/dynamic/component'; -import { KeyboardListener } from './keyboard.listener'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { unique } from '@platform/env/sequence'; -import { Logger } from '@platform/log'; -import { Session } from '@service/session/session'; -import { ProvidersEvents, ProviderEvents } from './events'; -import { Mutable } from '@platform/types/unity/mutable'; - -export interface ProviderConstructor { - new (session: Session, logger: Logger): Provider; -} - -export enum ProviderData { - filters = 'filters', - charts = 'charts', - ranges = 'ranges', - disabled = 'disabled', -} - -export interface ISelectEvent { - provider: Provider; - entity: Entity | undefined; - guids: string[]; - sender?: string; -} - -export interface IContextMenuEvent { - event: MouseEvent; - provider: Provider; - entity: Entity; - items?: IMenuItem[]; -} - -export interface IDoubleclickEvent { - event: MouseEvent; - provider: Provider; - entity: Entity; -} - -export interface ISelection { - guid: string; // GUID of entity - sender?: string; // Name of provider/controller/etc who emits actions (we need it to prevent loop in event circle) - ignore?: boolean; // true - drops state of ctrl and shift; false - ctrl and shift would be considering - toggle?: boolean; // used only with single selection - // true - if entity already selected, selection would be dropped - // false - defined entity would be selected in anyway -} - -export enum EActions { - enable = 'enable', - disable = 'disable', - remove = 'remove', - activate = 'activate', - deactivate = 'deactivate', - edit = 'edit', -} - -interface IStoredSelection { - current: string[]; - last: Entity | undefined; -} - -type ProvidersGetter = () => Provider[]; - -export abstract class Provider extends Subscriber { - public subjects: Subjects = new Subjects({ - change: new Subject(), - selection: new Subject(), - edit: new Subject(), - context: new Subject(), - doubleclick: new Subject(), - }); - public readonly session: Session; - public readonly logger: Logger; - public readonly uuid: string = unique(); - public readonly events!: Subjects; - - public panels!: { - list: { - name: string; - desc: string; - comp: IComponentDesc; - }; - details: { - name: string | undefined; - desc: string | undefined; - comp: IComponentDesc | undefined; - }; - nocontent: { - name: string | undefined; - desc: string | undefined; - comp: IComponentDesc | undefined; - }; - }; - - private _selection: IStoredSelection = { - current: [], - last: undefined, - }; - private _keyboard: KeyboardListener | undefined; - private _providers: ProvidersGetter | undefined; - - constructor(session: Session, logger: Logger) { - super(); - this.session = session; - this.logger = logger; - } - - public destroy() { - this.unsubscribe(); - this.subjects.destroy(); - } - - public setKeyboardListener(listener: KeyboardListener) { - this._keyboard = listener; - } - - public setProvidersGetter(getter: () => Provider[]) { - this._providers = getter; - } - - public setProvidersEvents(subjects: Subjects): void { - (this as Mutable>).events = subjects; - } - - public setLastSelection(selection: Entity | undefined) { - this._selection.last = selection; - } - - public select(): { - first: () => void; - last: () => void; - next: () => boolean; - prev: () => boolean; - drop: (sender?: string) => void; - apply: (sender: string, guids: string[]) => void; - get: () => string[]; - getEntities: () => Array>; - set: (selection: ISelection) => void; - single: () => Entity | undefined; - context: (event: MouseEvent, entity: Entity) => void; - doubleclick: (event: MouseEvent, entity: Entity) => void; - } { - const setSelection: (selection: ISelection) => void = (selection: ISelection) => { - const index: number = this._selection.current.indexOf(selection.guid); - let entity: Entity | undefined; - if (this._keyboard !== undefined && selection.ignore) { - this._keyboard.ignore_ctrl_shift(); - } - if (this._keyboard !== undefined && this._keyboard.ctrl()) { - if (index === -1) { - this._selection.current.push(selection.guid); - entity = this.entities().find((e) => e.uuid() === selection.guid); - } - } else if ( - this._keyboard !== undefined && - this._providers !== undefined && - this._keyboard.shift() && - this._selection.last !== undefined - ) { - let guids: string[] = ([] as string[]).concat.apply( - [], - this._providers().map((p) => p.entities().map((e) => e.uuid())), - ); - const from: number = guids.findIndex((g) => g === this._selection.last?.uuid()); - const to: number = guids.findIndex((g) => g === selection.guid); - if (from !== -1 && to !== -1) { - guids = guids.slice(Math.min(from, to), Math.max(from, to) + 1); - this._selection.current = this._selection.current.concat( - guids.filter((g) => this._selection.current.indexOf(g) === -1), - ); - } - entity = this._selection.last; - } else { - if (index === -1) { - this._selection.current = [selection.guid]; - entity = this.entities().find((e) => e.uuid() === selection.guid); - } else { - if (selection.toggle !== false) { - this._selection.current = []; - } - } - } - this.subjects.get().selection.emit({ - provider: this, - entity: entity, - guids: this.select().get(), - sender: selection.sender, - }); - }; - return { - first: () => { - const entities = this.entities(); - if (entities.length === 0) { - return; - } - setSelection({ - guid: entities[0].uuid(), - sender: 'self.first', - }); - }, - last: () => { - const entities = this.entities(); - if (entities.length === 0) { - return; - } - setSelection({ - guid: entities[entities.length - 1].uuid(), - sender: 'self.last', - }); - }, - next: () => { - if (this._selection.current.length !== 1) { - return false; - } - const entities = this.entities(); - let index: number = -1; - entities.forEach((entity, i) => { - if (entity.uuid() === this._selection.current[0]) { - index = i; - } - }); - if (index === -1) { - return false; - } - if (index + 1 > entities.length - 1) { - return false; - } - setSelection({ - guid: entities[index + 1].uuid(), - sender: 'self.next', - }); - return true; - }, - prev: () => { - if (this._selection.current.length !== 1) { - return false; - } - const entities = this.entities(); - let index: number = -1; - entities.forEach((entity, i) => { - if (entity.uuid() === this._selection.current[0]) { - index = i; - } - }); - if (index === -1) { - return false; - } - if (index - 1 < 0) { - return false; - } - setSelection({ - guid: entities[index - 1].uuid(), - sender: 'self.next', - }); - return true; - }, - drop: (sender?: string) => { - if (this._selection.current.length === 0) { - return; - } - this._selection.current = []; - this.subjects.get().selection.emit({ - provider: this, - entity: undefined, - guids: this.select().get(), - sender: sender, - }); - }, - apply: (sender: string, guids: string[]) => { - const own: string[] = this.entities().map((e) => e.uuid()); - this._selection.current = guids.filter((g) => own.indexOf(g) !== -1); - this.subjects.get().selection.emit({ - provider: this, - entity: undefined, - guids: this.select().get(), - sender: sender, - }); - }, - get: () => { - return this._selection.current.slice(); - }, - getEntities: () => { - const entities: Entity[] = []; - this.entities().forEach((entity: Entity) => { - if (this._selection.current.indexOf(entity.uuid()) === -1) { - return; - } - entities.push(entity); - }); - return entities; - }, - set: setSelection, - single: () => { - if (this._selection.current.length !== 1) { - return undefined; - } - return this.entities().find((entity: Entity) => { - return entity.uuid() === this._selection.current[0]; - }); - }, - context: (event: MouseEvent, entity: Entity) => { - this.subjects.get().context.emit({ - event: event, - entity: entity, - provider: this, - }); - }, - doubleclick: (event: MouseEvent, entity: Entity) => { - this.subjects.get().doubleclick.emit({ - event: event, - entity: entity, - provider: this, - }); - setSelection({ - guid: entity.uuid(), - sender: 'self.doubleclick', - toggle: false, - }); - }, - }; - } - - public edit(): { - in: () => void; - out: () => void; - } { - return { - in: () => { - if (this._selection.current.length !== 1) { - return; - } - const guid: string = this._selection.current[0]; - this.entities().forEach((entity: Entity) => { - if (entity.uuid() === guid) { - entity.getEditState().in(); - } else { - entity.getEditState().out(); - } - }); - this.subjects.get().edit.emit(guid); - }, - out: () => { - this.entities().forEach((entity: Entity) => { - entity.getEditState().out(); - }); - this.subjects.get().edit.emit(undefined); - this.change(); - }, - }; - } - - public change() { - this.subjects.get().change.emit(); - } - - public isEmpty(): boolean { - return this.entities().length === 0; - } - - public updatePanels(): void { - this.panels = { - list: { - name: this.getPanels().list().name(), - desc: this.getPanels().list().desc(), - comp: this.getPanels().list().comp(), - }, - details: { - name: this.getPanels().details().name(), - desc: this.getPanels().details().desc(), - comp: this.getPanels().details().comp(), - }, - nocontent: { - name: this.getPanels().nocontent().name(), - desc: this.getPanels().nocontent().desc(), - comp: this.getPanels().nocontent().comp(), - }, - }; - } - - public getEntityByIndex(index: number): T | undefined { - const entities = this.entities(); - return entities[index] !== undefined ? entities[index].extract() : undefined; - } - - public abstract init(): void; - - public abstract entities(): Entity[]; - - public abstract reorder(params: { prev: number; curt: number }): void; - - public abstract getPanels(): { - list(): { - name(): string; - desc(): string; - comp(): IComponentDesc; - }; - details(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - nocontent(): { - name(): string | undefined; - desc(): string | undefined; - comp(): IComponentDesc | undefined; - }; - }; - - public abstract search(entity: Entity): void; - - public abstract getContextMenuItems( - target: Entity, - selected: Array>, - ): IMenuItem[]; - - public abstract actions( - target: Entity | undefined, - selected: Array>, - ): { - activate?: () => void; - deactivate?: () => void; - remove?: () => void; - edit?: () => void; - }; - - public abstract tryToInsertEntity(entity: unknown, index: number): boolean; - - public abstract removeEntity(entity: unknown): boolean; -} diff --git a/application/client/src/app/ui/views/sidebar/search/providers/providers.ts b/application/client/src/app/ui/views/sidebar/search/providers/providers.ts deleted file mode 100644 index 379e150361..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/providers/providers.ts +++ /dev/null @@ -1,547 +0,0 @@ -import { - Provider, - ProviderConstructor, - ProviderData, - ISelectEvent, - IContextMenuEvent, - EActions, - IDoubleclickEvent, -} from './definitions/provider'; -import { Subject, Subjects } from '@platform/env/subscription'; -import { Session } from '@service/session/session'; -import { KeyboardListener } from './definitions/keyboard.listener'; -import { IMenuItem } from '@ui/service/contextmenu'; -import { Entity } from './definitions/entity'; -import { unique } from '@platform/env/sequence'; -import { Logger } from '@platform/log'; -import { ProvidersEvents } from './definitions/events'; -import { history } from '@service/history'; -import { bridge } from '@service/bridge'; -import { HistorySession } from '@service/history/session'; -import { Notification, notifications } from '@ui/service/notifications'; - -export class Providers { - public readonly subjects: Subjects = new Subjects({ - select: new Subject(), - context: new Subject(), - doubleclick: new Subject(), - change: new Subject(), - edit: new Subject(), - dragging: new Subject(), - }); - public readonly session: Session; - public readonly logger: Logger; - - private readonly SENDER = unique(); - private readonly PROVIDERS_ORDER: ProviderData[] = [ - ProviderData.filters, - ProviderData.charts, - ProviderData.ranges, - ProviderData.disabled, - ]; - - private readonly _providers: Map> = new Map(); - private readonly _keyboard: KeyboardListener = new KeyboardListener(); - - constructor(session: Session, logger: Logger) { - this.session = session; - this.logger = logger; - } - - public destroy() { - this.subjects.destroy(); - this._providers.forEach((provider: Provider) => { - provider.destroy(); - }); - this._keyboard.destroy(); - } - - public add(name: ProviderData, providerConstructor: ProviderConstructor): boolean { - if (this._providers.has(name)) { - return false; - } - const provider = new providerConstructor(this.session, this.logger); - provider.setKeyboardListener(this._keyboard); - provider.setProvidersGetter(this.list.bind(this)); - provider.setProvidersEvents(this.subjects); - provider.subjects.get().selection.subscribe(this._onSelectionEntity.bind(this)); - provider.subjects.get().context.subscribe(this._onContextMenuEvent.bind(this)); - provider.subjects.get().doubleclick.subscribe(this._onDoubleclickEvent.bind(this)); - provider.subjects.get().change.subscribe(this._onChange.bind(this)); - provider.subjects.get().edit.subscribe(this._onEdit.bind(this)); - provider.init(); - this._providers.set(name, provider); - return true; - } - - public all(): any[] { - let entries: any[] = []; - this.list().forEach((provider: Provider) => { - entries = entries.concat(provider.entities()); - }); - return entries; - } - - public list(): Provider[] { - const list: Provider[] = []; - this.PROVIDERS_ORDER.forEach((ref: ProviderData) => { - const provider: Provider | undefined = this._providers.get(ref); - if (provider !== undefined) { - list.push(provider); - } - }); - return list; - } - - public select(): { - next(): void; - prev(): void; - drop(): void; - first(): void; - last(): void; - single(): - | { provider: Provider; next?: Provider; prev?: Provider; guid: string } - | undefined; - getEntities(): Array>; - getProviders(): Array>; - } { - return { - next: (): void => { - if (this._providers.size === 0) { - return; - } - const sel = this.select().single(); - if (sel === undefined) { - this.select().drop(); - this.select().first(); - } else { - if (!sel.provider.select().next()) { - sel.provider.select().drop(); - if (sel.next !== undefined) { - sel.next.select().first(); - } else { - this.select().first(); - } - } - } - }, - prev: (): void => { - if (this._providers.size === 0) { - return; - } - const sel = this.select().single(); - if (sel === undefined) { - this.select().drop(); - this.select().last(); - } else { - if (!sel.provider.select().prev()) { - sel.provider.select().drop(); - if (sel.prev !== undefined) { - sel.prev.select().last(); - } else { - this.select().last(); - } - } - } - }, - drop: (): void => { - this._providers.forEach((provider: Provider) => { - provider.select().drop(this.SENDER); - }); - }, - first: (): void => { - if (this._providers.size === 0) { - return; - } - (Array.from(this._providers.values())[0] as Provider).select().first(); - }, - last: (): void => { - if (this._providers.size === 0) { - return; - } - const entities = Array.from(this._providers.values()); - (entities[entities.length - 1] as Provider).select().last(); - }, - single: (): - | { - provider: Provider; - next?: Provider; - prev?: Provider; - guid: string; - } - | undefined => { - if (this._providers.size === 0) { - return undefined; - } - const providers: Array> = []; - let next: Provider | undefined; - let prev: Provider | undefined; - Array.from(this._providers.values()).forEach( - (provider: Provider, i: number, all: Array>) => { - if (provider.select().single() !== undefined) { - providers.push(provider); - for (let k = i + 1; k <= all.length - 1; k += 1) { - if (next === undefined && all[k].entities().length > 0) { - next = all[k]; - } - } - for (let k = i - 1; k >= 0; k -= 1) { - if (prev === undefined && all[k].entities().length > 0) { - prev = all[k]; - } - } - } - }, - ); - if (providers.length !== 1) { - return undefined; - } - const guid: string | undefined = (providers[0] as Provider) - .select() - .single() - ?.uuid(); - return guid === undefined - ? undefined - : { - provider: providers[0], - next: next, - prev: prev, - guid: guid, - }; - }, - getEntities: (): Array> => { - let entities: Entity[] = []; - this._providers.forEach((provider: Provider) => { - entities = entities.concat(provider.select().getEntities()); - }); - return entities; - }, - getProviders: (): Array> => { - const list: Provider[] = []; - this.PROVIDERS_ORDER.forEach((ref: ProviderData) => { - const provider: Provider | undefined = this._providers.get(ref); - if (provider !== undefined && provider.select().getEntities().length !== 0) { - list.push(provider); - } - }); - return list; - }, - }; - } - - public edit(): { - in: () => void; - out: () => void; - } { - return { - in: () => { - let count: number = 0; - this._providers.forEach((provider: Provider) => { - count += provider.select().get().length; - }); - if (count !== 1) { - return; - } - this._providers.forEach((provider: Provider) => { - if (provider.select().get().length === 1) { - provider.edit().in(); - } - }); - }, - out: () => { - this._providers.forEach((provider: Provider) => { - provider.edit().out(); - }); - }, - }; - } - - private _onSelectionEntity(event: ISelectEvent) { - if (event.sender === this.SENDER) { - // Ignore events triggered by holder - return; - } - if (!this._keyboard.ctrl() && !this._keyboard.shift()) { - this._providers.forEach((provider: Provider) => { - // Drop selection on all others providers - if (provider.uuid !== event.provider.uuid) { - provider.select().drop(this.SENDER); - } - }); - } else if (this._keyboard.shift()) { - this._providers.forEach((provider: Provider) => { - // Force selection - provider.select().apply(this.SENDER, event.guids); - }); - } - let guids: string[] = []; - this._providers.forEach((provider: Provider) => { - guids = guids.concat(provider.select().get()); - }); - if (guids.length === 1) { - this._providers.forEach((provider: Provider) => { - if (provider.select().get().length === 1) { - this.subjects.get().select.emit({ - entity: event.entity, - provider: provider, - guids: provider.select().get(), - }); - } - }); - this.session.charts.selecting().set(guids[0]); - } else { - this.subjects.get().select.emit(undefined); - this.session.charts.selecting().set(undefined); - } - this._providers.forEach((provider: Provider) => { - provider.setLastSelection(guids.length > 0 ? event.entity : undefined); - }); - } - - private _onContextMenuEvent(event: IContextMenuEvent) { - const isActionAvailable = ( - action: EActions, - insel: Array>, - _entities: Entity[], - ) => { - let count: number = 0; - insel.forEach((provider: Provider) => { - (provider.actions(event.entity, _entities) as any)[action] !== undefined && - (count += 1); - }); - return count === insel.length; - }; - let entities = this.select().getEntities(); - if (entities.length === 0) { - // Context menu is called without active selection - // Set selection to target element - event.provider.select().set({ guid: event.entity.uuid() }); - entities = [event.entity]; - } else if (entities.length === 1) { - if (entities[0].uuid() !== event.entity.uuid()) { - this.select().drop(); - event.provider.select().set({ guid: event.entity.uuid() }); - entities = [event.entity]; - } - } else if (entities.length > 1) { - if (entities.map((entity) => entity.uuid()).indexOf(event.entity.uuid()) === -1) { - // Context menu is called out of selection - this.select().drop(); - event.provider.select().set({ guid: event.entity.uuid() }); - entities = [event.entity]; - } - } - const providers = this.select().getProviders(); - const actions: { - activate: boolean; - deactivate: boolean; - remove: boolean; - edit: boolean; - } = { - activate: isActionAvailable(EActions.activate, providers, entities), - deactivate: isActionAvailable(EActions.deactivate, providers, entities), - remove: isActionAvailable(EActions.remove, providers, entities), - edit: isActionAvailable(EActions.edit, providers, entities), - }; - event.items = []; - if (providers.length === 1 && entities.length === 1 && actions.edit) { - event.items.push({ - caption: 'Edit', - handler: () => { - const actions = providers[0].actions(event.entity, entities); - actions.edit !== undefined && actions.edit(); - }, - shortcut: 'Enter', - }); - } - - event.items.length > 0 && - event.items.push({ - /* Delimiter */ - }); - - actions.activate && - event.items.push({ - caption: 'Activate', - handler: () => { - providers.forEach((provider: Provider) => { - const actions = provider.actions(event.entity, entities); - actions.activate !== undefined && actions.activate(); - }); - }, - }); - actions.deactivate && - event.items.push({ - caption: 'Deactivate', - handler: () => { - providers.forEach((provider: Provider) => { - const actions = provider.actions(event.entity, entities); - actions.deactivate !== undefined && actions.deactivate(); - }); - }, - }); - actions.remove && - event.items.push({ - caption: 'Remove', - handler: () => { - providers.forEach((provider: Provider) => { - const actions = provider.actions(event.entity, entities); - actions.remove !== undefined && actions.remove(); - }); - }, - }); - - event.items.length > 0 && - event.items.push({ - /* Delimiter */ - }); - - actions.activate && - event.items.push({ - caption: 'Activate All', - handler: () => { - providers.forEach((provider: Provider) => { - const actions = provider.actions(event.entity, provider.entities()); - actions.activate !== undefined && actions.activate(); - }); - }, - }); - actions.deactivate && - event.items.push({ - caption: 'Deactivate All', - handler: () => { - providers.forEach((provider: Provider) => { - const actions = provider.actions(event.entity, provider.entities()); - actions.deactivate !== undefined && actions.deactivate(); - }); - }, - }); - actions.remove && - event.items.push({ - caption: 'Remove All', - handler: () => { - providers.forEach((provider: Provider) => { - const actions = provider.actions(event.entity, provider.entities()); - actions.remove !== undefined && actions.remove(); - }); - }, - }); - - this._providers.forEach((provider: Provider) => { - const custom: IMenuItem[] = provider.getContextMenuItems( - event.entity, - this.select().getEntities(), - ); - if (custom.length > 0 && event.items !== undefined) { - event.items.push({ - /* Delimiter */ - }); - event.items = event.items.concat(custom); - } - }); - - this.injectGeneralMenuItems(event.items); - - this.subjects.get().context.emit(event); - } - - public injectGeneralMenuItems(items: IMenuItem[]): void { - const historySession = history.get(this.session); - if (historySession === undefined) { - this.logger.error('History session is not defined'); - return; - } - items.push({ - /* Delimiter */ - }); - const store = this.session.search.store(); - const showExport: boolean = - store.filters().get().length + - store.charts().get().length + - store.disabled().get().length !== - 0; - showExport && - items.push({ - caption: 'Export All to File', - handler: () => this.filters(historySession).export(), - }); - items.push({ - caption: 'Import from File', - handler: () => this.filters(historySession).import(), - }); - } - - protected filters(historySession: HistorySession): { import(): void; export(): void } { - const logAndNotifyError = (error: Error): void => { - this.logger.error(error.message); - notifications.notify( - new Notification({ - message: error.message, - session: this.session.uuid(), - actions: [], - }), - ); - }; - return { - import: (): void => { - bridge - .files() - .select.text() - .then((file) => { - if (file.length !== 1) { - this.logger.error('No file selected'); - return; - } - history - .import(file[0].filename) - .then((uuids: string[]) => { - if (uuids.length === 0) { - this.logger.warn('File does not have a collection'); - return; - } - if (uuids.length > 1) { - this.session.switch().toolbar.presets(); - return; - } else { - const collection = history.collections.get(uuids[0]); - if (collection === undefined) { - this.logger.error( - `Cannot find imported collection with UUID: ${uuids[0]}`, - ); - return; - } - historySession.apply(collection); - } - }) - .catch((error) => logAndNotifyError(error)); - }) - .catch((error) => logAndNotifyError(error)); - }, - export: (): void => { - bridge - .files() - .select.save(undefined, undefined) - .then((filename: string | undefined) => { - if (filename === undefined) return; - history - .export([historySession.collections.uuid], filename) - .catch((error) => logAndNotifyError(error)); - }) - .catch((error) => logAndNotifyError(error)); - }, - }; - } - - private _onDoubleclickEvent(event: IDoubleclickEvent) { - event.provider.search(event.entity); - } - - private _onChange() { - this._providers.forEach((p) => p.updatePanels()); - this.subjects.get().change.emit(); - } - - private _onEdit(guid: string | undefined) { - this.subjects.get().edit.emit(guid); - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/styles.less b/application/client/src/app/ui/views/sidebar/search/styles.less deleted file mode 100644 index 2516166fbf..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/styles.less +++ /dev/null @@ -1,57 +0,0 @@ -@import '../../../styles/variables.less'; - -app-views-filters { - position: absolute; - display: flex; - flex-direction: column; - padding: 0; - margin: 0; - bottom: 0.5rem; - right: 0.5rem; - left: 0.5rem; - top: 0.5rem; - overflow-x: hidden; - overflow-y: hidden; - outline: none; - & app-views-teamwork-applet { - & div.content { - padding: 16px 21px; - } - } - & div.holder { - position: relative; - flex: auto; - left:0; - width: 100%;; - overflow-y: auto; - top: 0; - bottom: 32px; - } - & div.controlls{ - position: absolute; - left:0; - width: 100%; - bottom: 0; - height: 32px; - overflow: hidden; - text-align: right; - } - & div.wrapper{ - position: relative; - display: block; - margin-top: 8px; - &:first-child{ - margin-top: 0; - } - } - & .controlls{ - text-align: right; - } - - & app-sidebar-app-searchmanager-bin { - pointer-events: none; - } - & div.mat-expansion-panel-body{ - padding: 0 0 16px; - } -} diff --git a/application/client/src/app/ui/views/sidebar/search/template.html b/application/client/src/app/ui/views/sidebar/search/template.html deleted file mode 100644 index 777c9b3c8f..0000000000 --- a/application/client/src/app/ui/views/sidebar/search/template.html +++ /dev/null @@ -1,43 +0,0 @@ -
    -
    - - - {{provider.panels.list.name}} - {{provider.panels.list.desc}} - -
    - -
    - -
    -
    -
    - - - {{selected.panels.details.name}} - {{selected.panels.details.desc}} - - - -
    -
    - -
    - -
    - diff --git a/application/client/src/app/ui/views/sidebar/teamwork/component.ts b/application/client/src/app/ui/views/sidebar/teamwork/component.ts deleted file mode 100644 index b25112ea55..0000000000 --- a/application/client/src/app/ui/views/sidebar/teamwork/component.ts +++ /dev/null @@ -1,250 +0,0 @@ -import { Component, Input, ChangeDetectorRef, AfterContentInit } from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Notification } from '@ui/service/notifications'; -import { GitHubRepo, getDefaultSharingSettings } from '@platform/types/github'; -import { GitHubError } from '@service/session/dependencies/teamwork'; -import { session } from '@service/session'; -import { Help } from '@tabs/help/component'; -import { DEFAULT_ENTRY } from '@service/session/dependencies/teamwork'; - -import * as dom from '@ui/env/dom'; -import * as obj from '@platform/env/obj'; -import { unique } from '@platform/env/sequence'; - -@Component({ - selector: 'app-views-teamwork', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class TeamWork extends ChangesDetector implements AfterContentInit { - @Input() session!: Session; - - public repos: GitHubRepo[] = []; - public active: GitHubRepo | undefined; - public editable: GitHubRepo | undefined; - public errors: GitHubError[] = []; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public onRepoContextMenu(event: MouseEvent, repo: GitHubRepo) { - const items = [ - { - caption: 'Edit', - handler: () => { - this.repo().edit(repo); - this.detectChanges(); - }, - }, - {}, - { - caption: 'Remove', - handler: () => { - this.repo().delete(repo.uuid); - this.detectChanges(); - }, - }, - ]; - this.ilc().emitter.ui.contextmenu.open({ - items, - x: event.x, - y: event.y, - }); - dom.stop(event); - } - - public onErrorsContextMenu(event: MouseEvent) { - const items = [ - { - caption: 'Clear All', - handler: () => { - this.session.teamwork.error().clear(); - this.detectChanges(); - }, - }, - ]; - this.ilc().emitter.ui.contextmenu.open({ - items, - x: event.x, - y: event.y, - }); - dom.stop(event); - } - - public ngAfterContentInit(): void { - this.repos = this.session.teamwork.repo().list(); - this.active = this.session.teamwork.repo().getActive(); - this.errors = this.session.teamwork.error().get().reverse(); - this.env().subscriber.register( - this.session.teamwork.subjects.get().active.subscribe(() => { - this.active = this.session.teamwork.repo().getActive(); - this.detectChanges(); - }), - ); - this.env().subscriber.register( - this.session.teamwork.subjects.get().loaded.subscribe(() => { - this.repos = this.session.teamwork.repo().list(); - this.active = this.session.teamwork.repo().getActive(); - this.detectChanges(); - }), - ); - this.env().subscriber.register( - this.session.teamwork.subjects.get().error.subscribe(() => { - this.errors = this.session.teamwork.error().get().reverse(); - this.detectChanges(); - }), - ); - } - - public onSharingSettingsChange(value: boolean, target: string) { - if (this.active === undefined) { - return; - } - if ((this.active.settings as unknown as { [key: string]: boolean })[target] === undefined) { - return; - } - (this.active.settings as unknown as { [key: string]: boolean })[target] = value; - this.session.teamwork - .repo() - .update(obj.clone(this.active)) - .catch((err: Error) => { - this.log().error(`Fail to save settings: ${err.message}`); - }); - this.detectChanges(); - } - - public repo(): { - create(): void; - edit(editable: GitHubRepo): void; - save(): void; - cancel(): void; - delete(uuid: string): void; - isPossibleToSave(): boolean; - setActive(repo: GitHubRepo | undefined): void; - isActive(repo: GitHubRepo): boolean; - } { - return { - create: (): void => { - this.editable = { - uuid: '', - repo: '', - branch: 'master', - owner: '', - token: '', - settings: getDefaultSharingSettings(), - entry: DEFAULT_ENTRY, - }; - this.detectChanges(); - }, - edit: (editable: GitHubRepo): void => { - this.editable = Object.assign({}, editable); - if (typeof this.editable.entry !== 'string' || this.editable.entry.trim() === '') { - this.editable.entry = DEFAULT_ENTRY; - } - this.detectChanges(); - }, - save: (): void => { - if (this.editable === undefined || !this.repo().isPossibleToSave()) { - return; - } - (() => { - if (this.editable.uuid.trim() === '') { - return this.session.teamwork.repo().create(this.editable); - } else { - return this.session.teamwork.repo().update(this.editable); - } - })() - .then(() => { - this.editable = undefined; - this.detectChanges(); - this.session.teamwork - .repo() - .reload() - .then(() => { - this.repos = this.session.teamwork.repo().list(); - this.active = this.session.teamwork.repo().getActive(); - }) - .catch((err: Error) => { - this.log().error(`Fail reload repos: ${err.message}`); - }) - .finally(() => { - this.detectChanges(); - }); - }) - .catch((err: Error) => { - this.ilc().services.ui.notifications.notify( - new Notification({ - message: `Fail to save GitHub Reference: ${err.message}`, - actions: [], - session: this.session.uuid(), - }), - ); - }); - }, - cancel: (): void => { - this.editable = undefined; - this.detectChanges(); - }, - delete: (uuid: string): void => { - this.session.teamwork - .repo() - .delete(uuid) - .then(() => { - this.detectChanges(); - }) - .catch((err: Error) => { - this.ilc().services.ui.notifications.notify( - new Notification({ - message: `Fail to delete GitHub Reference: ${err.message}`, - actions: [], - session: this.session.uuid(), - }), - ); - }); - }, - - isPossibleToSave: (): boolean => { - if (this.editable === undefined) { - return false; - } - if ( - this.editable.repo.trim() === '' || - this.editable.branch.trim() === '' || - this.editable.token.trim() === '' - ) { - return false; - } - return true; - }, - setActive: (repo: GitHubRepo | undefined): void => { - this.session.teamwork.repo().setActive(repo); - }, - isActive: (repo: GitHubRepo): boolean => { - return this.active === undefined ? false : this.active.uuid === repo.uuid; - }, - }; - } - - public help() { - session.add().tab({ - name: 'Documentation', - active: true, - closable: true, - content: { - factory: Help, - inputs: { - location: '/teamwork/readme.md', - }, - }, - uuid: unique(), - }); - } -} -export interface TeamWork extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/teamwork/module.ts b/application/client/src/app/ui/views/sidebar/teamwork/module.ts deleted file mode 100644 index bc6b42393f..0000000000 --- a/application/client/src/app/ui/views/sidebar/teamwork/module.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ContainersModule } from '@elements/containers/module'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatIconModule } from '@angular/material/icon'; -import { TeamWork } from './component'; -import { MatCardModule } from '@angular/material/card'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatSelectModule } from '@angular/material/select'; -import { RepositoryModule } from './repository/module'; -import { MatInputModule } from '@angular/material/input'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - MatButtonModule, - MatCardModule, - MatExpansionModule, - MatMenuModule, - MatIconModule, - MatDividerModule, - MatSelectModule, - RepositoryModule, - MatInputModule, - MatCheckboxModule, - FormsModule, - ReactiveFormsModule, - ], - declarations: [TeamWork], - exports: [TeamWork], - bootstrap: [TeamWork], -}) -export class TeamWorkModule {} diff --git a/application/client/src/app/ui/views/sidebar/teamwork/repository/component.ts b/application/client/src/app/ui/views/sidebar/teamwork/repository/component.ts deleted file mode 100644 index 98f9703bb7..0000000000 --- a/application/client/src/app/ui/views/sidebar/teamwork/repository/component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { GitHubRepo } from '@platform/types/github'; - -@Component({ - selector: 'app-views-teamwork-repository', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Repository { - @Input() repo!: GitHubRepo | undefined; -} -export interface Repository extends IlcInterface {} diff --git a/application/client/src/app/ui/views/sidebar/teamwork/repository/module.ts b/application/client/src/app/ui/views/sidebar/teamwork/repository/module.ts deleted file mode 100644 index e5cb4ba2c9..0000000000 --- a/application/client/src/app/ui/views/sidebar/teamwork/repository/module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { Repository } from './component'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { AppDirectiviesModule } from '@directives/module'; - -@NgModule({ - imports: [CommonModule, MatButtonModule, MatIconModule, AppDirectiviesModule], - declarations: [Repository], - exports: [Repository], -}) -export class RepositoryModule {} diff --git a/application/client/src/app/ui/views/sidebar/teamwork/repository/styles.less b/application/client/src/app/ui/views/sidebar/teamwork/repository/styles.less deleted file mode 100644 index 140b7c9906..0000000000 --- a/application/client/src/app/ui/views/sidebar/teamwork/repository/styles.less +++ /dev/null @@ -1,52 +0,0 @@ -@import '../../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - padding: 0; - margin: 0; - flex-direction: row; - align-items: center; - width: 100%; - margin-left: -24px; - height: 32px; - overflow: hidden; - padding: 3px 24px; - cursor: default; - & span.extention { - position: relative; - display: flex; - width: 64px; - height: 32px; - text-transform: uppercase; - align-items: center; - align-content: center; - color: var(--scheme-color-1); - font-size: 12px; - overflow: hidden; - } - & div.desc { - position: relative; - display: flex; - height: 32px; - overflow: hidden; - flex-direction: column; - padding-left: 8px; - & p.name, - & p.size { - font-size: 14px; - font-weight: 400; - line-height: 14px; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - } - & p.name { - color: var(--scheme-color-1); - } - & p.size { - color: var(--scheme-color-3); - - } - } -} diff --git a/application/client/src/app/ui/views/sidebar/teamwork/repository/template.html b/application/client/src/app/ui/views/sidebar/teamwork/repository/template.html deleted file mode 100644 index 3f9633b24a..0000000000 --- a/application/client/src/app/ui/views/sidebar/teamwork/repository/template.html +++ /dev/null @@ -1,14 +0,0 @@ - - local -
    -

    Do not use remote repository.

    -

    Data will be saved locally

    -
    -
    - - {{repo.branch}} -
    -

    {{repo.owner}}

    -

    {{repo.repo}}

    -
    -
    diff --git a/application/client/src/app/ui/views/sidebar/teamwork/repository/wrapper.ts b/application/client/src/app/ui/views/sidebar/teamwork/repository/wrapper.ts deleted file mode 100644 index 79b9a75f8e..0000000000 --- a/application/client/src/app/ui/views/sidebar/teamwork/repository/wrapper.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Attachment } from '@platform/types/content'; - -export class Wrapped { - public selected: boolean = false; - constructor(public readonly attachment: Attachment) {} - public select(): void { - this.selected = true; - } - public unselect(): void { - this.selected = false; - } - public toggle(): void { - this.selected = !this.selected; - } - public equal(attachment: Attachment): boolean { - return this.attachment.uuid === attachment.uuid; - } - public ext(ext: string): boolean { - return this.attachment.extAsString().toLowerCase() === ext.toLowerCase(); - } -} diff --git a/application/client/src/app/ui/views/sidebar/teamwork/styles.less b/application/client/src/app/ui/views/sidebar/teamwork/styles.less deleted file mode 100644 index f42b1cc003..0000000000 --- a/application/client/src/app/ui/views/sidebar/teamwork/styles.less +++ /dev/null @@ -1,109 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: absolute; - display: flex; - flex-direction: column; - padding: 0; - margin: 0; - bottom: 0.5rem; - right: 0.5rem; - left: 0.5rem; - top: 0.5rem; - overflow-y: auto; - overflow-x: hidden; - outline: none; - & > div.caption { - position: sticky !important; - top: 0; - left: 0; - z-index: 1; - background: var(--scheme-color-5); - display: flex; - padding: 0 24px; - margin: 0; - text-align: left; - align-items: center; - white-space: nowrap; - font-size: 0.9rem; - font-weight: 400; - span.title{ - color: var(--scheme-color-2); - } - span.subtitle{ - padding-left: 6px; - color: var(--scheme-color-3); - } - & span.filler { - flex: auto; - } - - } - & p.info { - font-size: 13px; - color: var(--scheme-color-2); - margin: 16px 24px; - } - & div.controls { - text-align: right; - & button { - margin-left: 12px; - } - } - & div.field { - display: flex; - flex-direction: row; - align-items: center; - margin: 4px 0; - } - & ul.errors { - max-height: 300px; - overflow-x: hidden; - list-style: none; - overflow-y: auto; - & li.error { - border-bottom: dashed thin var(--scheme-color-3); - & > p.t-small { - color: var(--scheme-color-3); - } - & > p { - word-break: break-all; - } - } - } - & mat-expansion-panel { - margin: 6px 0!important; - } - & div.mat-expansion-panel-body { - padding-left: 0; - padding-right: 0; - } - & mat-expansion-panel.list { - flex:auto; - overflow-y: auto; - overflow-x: hidden; - & mat-expansion-panel-header { - position: sticky; - background-color: var(--scheme-bk-color-0); - z-index: 1; - top: 0; - } - & app-views-teamwork-repository.selected { - background: var(--scheme-color-4); - &::after { - position: absolute; - content: ''; - display: block; - top: 0; - height: 100%; - width: 4px; - left:0; - background: var(--scheme-color-active); - } - } - & app-views-teamwork-repository:hover { - background: var(--scheme-color-5); - } - } - -} diff --git a/application/client/src/app/ui/views/sidebar/teamwork/template.html b/application/client/src/app/ui/views/sidebar/teamwork/template.html deleted file mode 100644 index 13a487b418..0000000000 --- a/application/client/src/app/ui/views/sidebar/teamwork/template.html +++ /dev/null @@ -1,155 +0,0 @@ -
    - Teamwork - - -
    -

    - GitHub repository can be assigned with filters/charts/comments -

    - - - GitHub References - -
    - - -
    -
    - - - Sharing Settings - -
    -

    - Checked entities will be synchronized with the selected GitHub repository. Unselected - entities will be stored only locally and will not be downloaded from the GitHub - repository. Comments are available only with the linked GitHub repository. -

    -
    - - Filters -
    -
    - - Charts -
    -
    - - Bookmarks -
    -
    - - Comments -
    -

    - Read-only Mode allows to read a remote repository, but not modify it. Local changes will - be available only during the session. -

    -
    - - Read-only Mode -
    -
    -
    - - - Errors - -
      -
    • -

      {{error.time}}

      -

      {{error.msg}}

      -
    • -
    -
    - - - - New GitHub Reference - -
    - - Owner - - - - Repositary - - - - Branch - - - - GitHub Token - - -

    Optionally can be defined a custom entry point for private networks.

    - - Custom entry point - - -
    -
    - - -
    -
    - - - - - - diff --git a/application/client/src/app/ui/views/statusbar/info/component.ts b/application/client/src/app/ui/views/statusbar/info/component.ts deleted file mode 100644 index 34ca36bb44..0000000000 --- a/application/client/src/app/ui/views/statusbar/info/component.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Component, ChangeDetectorRef, AfterViewInit, OnDestroy } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Session as ActiveSession } from '@service/session'; -import { Subscriber } from '@platform/env/subscription'; -import { IInfoBlock } from '@service/session/dependencies/info'; - -@Component({ - selector: 'app-statusbar-info', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class SessionInfo extends ChangesDetector implements AfterViewInit, OnDestroy { - protected subscriber: Subscriber = new Subscriber(); - - protected bind(): void { - this.subscriber.unsubscribe(); - !this.access().session((active: ActiveSession) => { - this.subscriber.register( - active.info.updated.subscribe(() => { - this.blocks = active.info.get(); - this.detectChanges(); - }), - ); - this.blocks = active.info.get(); - this.detectChanges(); - }) && (this.blocks = []); - } - - public blocks: IInfoBlock[] = []; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngOnDestroy(): void { - this.subscriber.unsubscribe(); - } - - ngAfterViewInit(): void { - this.ilc().channel.session.change(() => { - this.bind(); - }); - this.bind(); - } -} -export interface SessionInfo extends IlcInterface {} diff --git a/application/client/src/app/ui/views/statusbar/info/module.ts b/application/client/src/app/ui/views/statusbar/info/module.ts deleted file mode 100644 index af35597c27..0000000000 --- a/application/client/src/app/ui/views/statusbar/info/module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { SessionInfo } from './component'; - -@NgModule({ - imports: [CommonModule], - declarations: [SessionInfo], - exports: [SessionInfo], -}) -export class SessionInfoModule {} diff --git a/application/client/src/app/ui/views/statusbar/info/styles.less b/application/client/src/app/ui/views/statusbar/info/styles.less deleted file mode 100644 index 17856eae23..0000000000 --- a/application/client/src/app/ui/views/statusbar/info/styles.less +++ /dev/null @@ -1,21 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - vertical-align: middle; - display: flex; - flex-direction: row; - & span { - position: relative; - display: block; - color: var(--scheme-color-1); - font-size: 12px; - max-width: 300px; - overflow: hidden; - text-overflow: ellipsis; - margin-right: 8px; - padding-right: 8px; - border-right: thin solid var(--scheme-color-3); - height: 100%; - } - -} \ No newline at end of file diff --git a/application/client/src/app/ui/views/statusbar/info/template.html b/application/client/src/app/ui/views/statusbar/info/template.html deleted file mode 100644 index e6908cf539..0000000000 --- a/application/client/src/app/ui/views/statusbar/info/template.html +++ /dev/null @@ -1 +0,0 @@ -{{block.caption}} diff --git a/application/client/src/app/ui/views/statusbar/jobs/component.ts b/application/client/src/app/ui/views/statusbar/jobs/component.ts deleted file mode 100644 index 5e4adf1932..0000000000 --- a/application/client/src/app/ui/views/statusbar/jobs/component.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterViewInit, - ChangeDetectionStrategy, - ViewEncapsulation, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Job } from '@service/jobs'; - -@Component({ - selector: 'app-statusbar-jobs', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class Jobs extends ChangesDetector implements AfterViewInit { - private _session: string | undefined; - public done: { - globals: Job[]; - session: Job[]; - } = { - globals: [], - session: [], - }; - public actual: { - globals: Job[]; - session: Job[]; - } = { - globals: [], - session: [], - }; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngAfterViewInit(): void { - this.ilc().channel.session.change((session) => { - this._session = session; - this._update(); - }); - this.ilc().channel.backend.job(() => { - this._update(); - }); - this._update(); - } - - private _update() { - if (this._session === undefined) { - this.done.session = []; - this.actual.session = []; - } else { - const all = this.ilc().services.system.jobs.session(this._session); - this.actual.session = []; - all.filter((j) => !j.isDone()).forEach((job: Job) => { - if (this.actual.session.find((j) => j.name === job.name)) { - return; - } - this.actual.session.push(job); - }); - this.done.session = all.filter((j) => j.isDone()); - } - const all = this.ilc().services.system.jobs.globals(); - this.actual.globals = []; - all.filter((j) => !j.isDone()).forEach((job: Job) => { - if (this.actual.globals.find((j) => j.name === job.name)) { - return; - } - this.actual.globals.push(job); - }); - this.done.globals = all.filter((j) => j.isDone()); - this.detectChanges(); - } -} -export interface Jobs extends IlcInterface {} diff --git a/application/client/src/app/ui/views/statusbar/jobs/module.ts b/application/client/src/app/ui/views/statusbar/jobs/module.ts deleted file mode 100644 index 64f2ce21cf..0000000000 --- a/application/client/src/app/ui/views/statusbar/jobs/module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDividerModule } from '@angular/material/divider'; - -import { Jobs } from './component'; - -@NgModule({ - imports: [ - CommonModule, - MatProgressSpinnerModule, - MatIconModule, - MatMenuModule, - MatButtonModule, - MatDividerModule, - ], - declarations: [Jobs], - exports: [Jobs] -}) -export class JobsModule {} diff --git a/application/client/src/app/ui/views/statusbar/jobs/styles.less b/application/client/src/app/ui/views/statusbar/jobs/styles.less deleted file mode 100644 index f9d8ceb3fb..0000000000 --- a/application/client/src/app/ui/views/statusbar/jobs/styles.less +++ /dev/null @@ -1,93 +0,0 @@ -@import '../../../styles/variables.less'; - -app-statusbar-jobs { - position: relative; - display: flex; - flex-direction: row; - margin-right: 12px; - & div.global, - & div.session, - & div.pinned { - position: relative; - display: flex; - flex-direction: row; - align-items: center; - align-content: center; - border-left: 1px solid var(--scheme-color-4); - padding: 0 6px; - } - & mat-spinner { - margin-right: 6px; - } - & .mat-progress-spinner circle, .mat-spinner circle { - stroke: var(--scheme-color-accent); - } - & span.pinned-job { - position: relative; - display: flex; - flex-direction: row; - margin-left: 6px; - align-items: center; - &:first-child{ - margin-left: 0; - } - & mat-icon { - height: 16px; - width: 16px; - color: var(--scheme-color-0); - font-size: 16px; - padding-right: 6px; - } - } - & span.name{ - font-size: 10px; - color: var(--scheme-color-2); - } - & span.indicator { - position: relative; - display: inline-block; - width: 8px; - height: 8px; - border-radius: 4px; - background-color: var(--scheme-color-accent); - margin-right: 6px; - } - -} - -& div.status-bar-jobs-list { - position: relative; - max-height: 300px; - overflow-x: hidden; - overflow-y: auto; - padding: 12px; - & div.job{ - position: relative; - display: flex; - flex-direction: row; - align-items: center; - padding: 3px 0; - & mat-icon { - height: 16px; - width: 16px; - color: var(--scheme-color-0); - font-size: 16px; - padding-right: 6px; - } - & span.description{ - flex:auto; - & span.name { - position: relative; - display: block; - color: var(--scheme-color-0); - line-height: 16px; - } - & span.desc { - position: relative; - display: block; - color: var(--scheme-color-2); - line-height: 16px; - } - } - } -} diff --git a/application/client/src/app/ui/views/statusbar/jobs/template.html b/application/client/src/app/ui/views/statusbar/jobs/template.html deleted file mode 100644 index 146c6c75a4..0000000000 --- a/application/client/src/app/ui/views/statusbar/jobs/template.html +++ /dev/null @@ -1,44 +0,0 @@ -
    - - - - {{job.icon}} - {{job.name}} - -
    -
    - - - - {{job.icon}} - {{job.name}} - -
    - - -
    -
    - {{job.icon}} - - {{job.name}} - {{job.desc}} - -
    - -
    - {{job.icon}} - - {{job.name}} - {{job.desc}} - -
    -
    -
    diff --git a/application/client/src/app/ui/views/statusbar/session/component.ts b/application/client/src/app/ui/views/statusbar/session/component.ts deleted file mode 100644 index 793a72d5cd..0000000000 --- a/application/client/src/app/ui/views/statusbar/session/component.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { - Component, - ChangeDetectorRef, - AfterViewInit, - ChangeDetectionStrategy, - ViewEncapsulation, - OnDestroy, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Session as ActiveSession } from '@service/session'; -import { State } from './state'; -import { Subscriber } from '@platform/env/subscription'; - -@Component({ - selector: 'app-statusbar-session', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class Session extends ChangesDetector implements AfterViewInit, OnDestroy { - private _subscriber: Subscriber = new Subscriber(); - public state: State = new State(); - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - ngOnDestroy(): void { - this._subscriber.unsubscribe(); - } - - ngAfterViewInit(): void { - this.ilc().channel.session.change(() => { - this._bind(); - }); - this._bind(); - } - - private _bind() { - this._subscriber.unsubscribe(); - !this.access().session((active: ActiveSession) => { - this._subscriber.register( - active.stream.subjects.get().updated.subscribe(() => { - this._update(active); - }), - ); - this._subscriber.register( - active.search.subjects.get().updated.subscribe(() => { - this._update(active); - }), - ); - this._subscriber.register( - active.cursor.subjects.get().updated.subscribe(() => { - this._update(active); - }), - ); - this._update(active); - }) && this.state.drop(); - this.markChangesForCheck(); - } - - private _update(active: ActiveSession) { - this.state.len = active.stream.len(); - this.state.found = active.search.len(); - const selection = active.cursor.get(); - this.state.pos = selection.length === 0 ? 0 : selection[0]; - this.state.selected = selection.length; - this.detectChanges(); - } -} -export interface Session extends IlcInterface {} diff --git a/application/client/src/app/ui/views/statusbar/session/module.ts b/application/client/src/app/ui/views/statusbar/session/module.ts deleted file mode 100644 index 0bd3e72fd4..0000000000 --- a/application/client/src/app/ui/views/statusbar/session/module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; - -import { Session } from './component'; - -@NgModule({ - imports: [CommonModule, MatProgressSpinnerModule], - declarations: [Session], - exports: [Session] -}) -export class SessionModule {} diff --git a/application/client/src/app/ui/views/statusbar/session/state.ts b/application/client/src/app/ui/views/statusbar/session/state.ts deleted file mode 100644 index 3d2ab27a47..0000000000 --- a/application/client/src/app/ui/views/statusbar/session/state.ts +++ /dev/null @@ -1,17 +0,0 @@ -export class State { - public pos: number = 0; - public selected: number = 0; - public len: number = 0; - public found: number = 0; - - public drop() { - this.pos = 0; - this.selected = 0; - this.len = 0; - this.found = 0; - } - - public isEmpty(): boolean { - return this.pos + this.len === 0; - } -} diff --git a/application/client/src/app/ui/views/statusbar/session/styles.less b/application/client/src/app/ui/views/statusbar/session/styles.less deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/application/client/src/app/ui/views/statusbar/session/template.html b/application/client/src/app/ui/views/statusbar/session/template.html deleted file mode 100644 index e37cad0475..0000000000 --- a/application/client/src/app/ui/views/statusbar/session/template.html +++ /dev/null @@ -1 +0,0 @@ -{{state.pos}} ({{state.selected}}) : {{state.found}} / {{state.len}} \ No newline at end of file diff --git a/application/client/src/app/ui/views/toolbar/chart/base/component.ts b/application/client/src/app/ui/views/toolbar/chart/base/component.ts deleted file mode 100644 index 342fbf2633..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/base/component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { - Component, - Input, - ViewChild, - OnDestroy, - AfterViewInit, - ChangeDetectorRef, - ElementRef, -} from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { State } from '../state'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-views-chart-base', - template: '', - standalone: false, -}) -@Ilc() -export class OutputBase extends ChangesDetector implements AfterViewInit, OnDestroy { - @Input() public session!: Session; - @Input() public state!: State; - - @ViewChild('canvas') canvasElRef!: ElementRef; - - public rect: { width: number; height: number } = { width: 100, height: 100 }; - - protected elRef: ElementRef; - protected resizeObserve!: ResizeObserver; - - constructor(chRef: ChangeDetectorRef, elRef: ElementRef) { - super(chRef); - this.elRef = elRef; - } - - public ngOnDestroy(): void { - this.resizeObserve.disconnect(); - } - - public ngAfterViewInit(): void { - this.resizeObserve = new ResizeObserver((entries: ResizeObserverEntry[]) => { - if (entries.length !== 1) { - return; - } - const rect = entries[0].contentRect; - const changes = { - height: this.rect.height !== rect.height, - width: this.rect.width !== rect.width, - }; - this.rect = rect; - this.detectChanges(); - if (changes.width) { - this.state.cursor.setWidth(this.rect.width); - } else if (!changes.width && changes.height) { - this.session.charts.refresh(); - } - }); - this.resizeObserve.observe(this.elRef.nativeElement); - this.rect = this.elRef.nativeElement.getBoundingClientRect(); - this.detectChanges(); - this.state.cursor.setWidth(this.rect.width); - } -} -export interface OutputBase extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/chart/component.ts b/application/client/src/app/ui/views/toolbar/chart/component.ts deleted file mode 100644 index f9599b5692..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/component.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - Component, - Input, - AfterContentInit, - ChangeDetectorRef, - OnDestroy, - HostBinding, - HostListener, -} from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { State } from './state'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { unique } from '@platform/env/sequence'; - -const STATE_ID_REF = unique(); - -@Component({ - selector: 'app-views-chart', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class ViewChart extends ChangesDetector implements AfterContentInit, OnDestroy { - @Input() public session!: Session; - - @HostBinding('attr.tabindex') get tabindex() { - return 0; - } - @HostListener('focus', ['$event.target']) onFocus() { - this.focused = true; - } - @HostListener('blur', ['$event.target']) onBlur() { - this.focused = false; - } - - @HostListener('keyup', ['$event']) keyup(event: KeyboardEvent): void { - if (!this.focused) { - return; - } - if (event.key === 'ArrowLeft') { - this.state.cursor.change(Math.round(-State.KEY_MOVE_STEP)).move(); - } else if (event.key === 'ArrowRight') { - this.state.cursor.change(Math.round(State.KEY_MOVE_STEP)).move(); - } - } - - protected focused = false; - - public state: State = new State(); - - constructor(chRef: ChangeDetectorRef) { - super(chRef); - } - - public ngOnDestroy(): void { - this.session.storage.set(STATE_ID_REF, this.state); - } - - public ngAfterContentInit(): void { - const state = this.session.storage.get(STATE_ID_REF); - this.state = state === undefined ? this.state : state; - this.state.init(this, this.session); - } -} -export interface ViewChart extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/chart/cursor.ts b/application/client/src/app/ui/views/toolbar/chart/cursor.ts deleted file mode 100644 index 1f00a7917d..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/cursor.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { Subject } from '@platform/env/subscription'; -import { IRange } from '@platform/types/range'; -import { Session } from '@service/session'; - -const MIN_CURSOR_WIDTH = 16; - -export class Cursor { - public updated: Subject = new Subject(); - - public stream: number = 0; - public from: number = 0; - public to: number = 0; - public left: number = 0; - public right: number = 0; - public leftPx: string = '0px'; - public rightPx: string = '0px'; - public width: number = 0; - public visible: boolean = false; - - protected session!: Session; - - public init(session: Session) { - this.session = session; - this.setStreamLen(this.session.stream.len()); - } - - public destroy() { - this.updated.destroy(); - } - - public asRange(): IRange | undefined { - if (!this.visible) { - return undefined; - } - return { start: this.from, end: this.to }; - } - - public setStreamLen(len: number): void { - if (this.stream === this.to && this.from === 0) { - this.to = len; - } - this.stream = len; - this.update().frame(); - } - - public setWidth(width: number): void { - if (this.width === width) { - return; - } - this.width = width; - this.session.charts.cursor.setWidth(this.width); - this.update().frame(); - } - - public fromPx(left: number, width: number): void { - if (width < MIN_CURSOR_WIDTH) { - width = MIN_CURSOR_WIDTH; - } - if (left < 0) { - left = 0; - } - if (left + width > this.width) { - left = this.width - width; - } - this.left = left; - this.right = this.width - left - width; - this.update().coors(); - } - - public change(diff: number): { - left(): void; - right(): void; - resize(): void; - move(): void; - } { - const safeLeft = (left: number): number => { - const max = this.width - this.right - MIN_CURSOR_WIDTH; - if (left > max) { - left = max; - } - if (left < 0) { - left = 0; - } - return left; - }; - const safeRight = (right: number): number => { - const max = this.width - this.left - MIN_CURSOR_WIDTH; - if (right > max) { - right = max; - } - if (right < 0) { - right = 0; - } - return right; - }; - return { - left: (): void => { - this.left = safeLeft(this.left + diff); - this.update().coors(); - }, - right: (): void => { - this.right = safeRight(this.right - diff); - this.update().coors(); - }, - resize: (): void => { - const lSide = Math.round(diff / 2); - this.left = safeLeft(this.left + lSide); - const rSide = diff - lSide; - this.right = safeRight(this.right + rSide); - this.update().coors(); - }, - move: (): void => { - const width = this.width - this.left - this.right; - let left = this.left + diff; - if (left < 0) { - left = 0; - } - if (left + width > this.width) { - left = this.width - width; - } - this.left = left; - this.right = this.width - left - width; - this.update().coors(); - }, - }; - } - - public rowsRangeByX(x: number): IRange { - const frame = this.to - this.from; - const rate = this.width / frame; - const start = Math.floor(x / rate) + this.from; - if (rate < 1) { - return { start, end: start + Math.floor(frame / this.width) }; - } else { - return { start, end: start }; - } - } - - protected update(): { - coors(): void; - frame(): void; - notify(): void; - } { - const getRate = (): number | undefined => { - if (this.stream === 0) { - this.to = 0; - this.from = 0; - this.left = 0; - this.right = 0; - this.visible = false; - return undefined; - } - const rate = this.width / this.stream; - this.visible = rate < 1; - return rate > 1 ? undefined : rate; - }; - return { - coors: (): void => { - const rate = getRate(); - if (rate === undefined) { - return; - } - const from = Math.floor(this.left / rate); - const to = Math.floor((this.width - this.right) / rate); - this.from = from > 0 ? (from > this.stream ? this.stream : from) : 0; - this.to = to > 0 ? (to > this.stream ? this.stream : to) : 0; - this.update().notify(); - }, - frame: (): void => { - const rate = getRate(); - if (rate === undefined) { - return; - } - this.left = Math.floor(this.from * rate); - this.right = this.width - Math.floor(this.to * rate); - this.update().notify(); - }, - notify: (): void => { - if (this.visible) { - this.leftPx = `${this.left}px`; - this.rightPx = `${this.right}px`; - } - this.updated.emit(); - const frame = this.asRange(); - frame !== undefined && this.session.charts.cursor.setFrame(frame); - }, - }; - } -} diff --git a/application/client/src/app/ui/views/toolbar/chart/cursor/component.ts b/application/client/src/app/ui/views/toolbar/chart/cursor/component.ts deleted file mode 100644 index ceddc2a138..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/cursor/component.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { Component, Input, ChangeDetectorRef, AfterViewInit, HostListener } from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { State } from '../state'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Initial } from '@env/decorators/initial'; -import { stop } from '@ui/env/dom'; - -enum Target { - Left = 'left', - Right = 'right', - Move = 'move', - Select = 'select', - None = 'none', -} - -@Component({ - selector: 'app-views-chart-cursor', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class ViewChartCursor extends ChangesDetector implements AfterViewInit { - public readonly Target = Target; - - @Input() public session!: Session; - @Input() public state!: State; - - @HostListener('window:mousemove', ['$event']) mousemove(event: MouseEvent): void { - if (this.selecting.x !== -1) { - const diff = event.x - this.selecting.x; - this.selecting.x = event.x; - this.selecting.w += diff; - if (this.selecting.w < 0) { - this.selecting.leftPx = `${this.selecting.l + this.selecting.w}px`; - } else { - this.selecting.leftPx = `${this.selecting.l}px`; - } - this.selecting.widthPx = `${Math.abs(this.selecting.w)}px`; - } else { - if (this.movement.target === Target.None) { - return; - } - const diff = event.x - this.movement.x; - if (this.movement.target === Target.Left) { - this.state.cursor.change(diff).left(); - } else if (this.movement.target === Target.Right) { - this.state.cursor.change(diff).right(); - } else if (this.movement.target === Target.Move) { - this.state.cursor.change(diff).move(); - } - this.movement.x = event.x; - } - } - - @HostListener('window:mouseup', ['$event']) mouseup(_event: MouseEvent): void { - if (this.selecting.x !== -1) { - const left = (() => { - if (this.selecting.w < 0) { - return this.selecting.l + this.selecting.w; - } else { - return this.selecting.l; - } - })(); - this.state.cursor.fromPx(left, Math.abs(this.selecting.w)); - } - this.movement.target = Target.None; - this.movement.x = 0; - this.selecting.x = -1; - } - - @HostListener('wheel', ['$event']) wheel(event: WheelEvent): void { - if (Math.abs(event.deltaY) > Math.abs(event.deltaX)) { - this.state.cursor - .change(Math.round(event.deltaY / State.REDUCE_ZOOM_ON_WHEEL)) - .resize(); - } else { - this.state.cursor.change(Math.round(event.deltaX / State.REDUCE_MOVE_ON_WHEEL)).move(); - } - stop(event); - } - - @HostListener('mousedown', ['$event']) mousedown(event: MouseEvent): void { - this.selecting.x = event.x; - this.selecting.w = 0; - this.selecting.l = event.x; - this.selecting.leftPx = `${event.x}px`; - this.selecting.widthPx = `0px`; - stop(event); - } - - protected movement: { - target: Target; - x: number; - } = { - target: Target.None, - x: 0, - }; - - protected selecting: { - x: number; - w: number; - l: number; - leftPx: string; - widthPx: string; - } = { - w: 0, - x: -1, - l: 0, - leftPx: '', - widthPx: '', - }; - - constructor(chRef: ChangeDetectorRef) { - super(chRef); - } - - public ngAfterViewInit(): void { - this.env().subscriber.register( - this.state.cursor.updated.subscribe(() => { - this.detectChanges(); - }), - ); - } - - public mousedownOnFrame(event: MouseEvent, target: Target): void { - if (target === Target.Select) { - this.mousedown(event); - } else { - this.movement.target = target; - this.movement.x = event.x; - } - stop(event); - } - - public wheelOnFrame(event: WheelEvent): void { - if (Math.abs(event.deltaY) > Math.abs(event.deltaX)) { - this.state.cursor - .change(Math.round(event.deltaY / State.REDUCE_ZOOM_ON_WHEEL)) - .resize(); - } else { - this.state.cursor.change(Math.round(event.deltaX / State.REDUCE_MOVE_ON_WHEEL)).move(); - } - stop(event); - } -} -export interface ViewChartCursor extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/chart/cursor/styles.less b/application/client/src/app/ui/views/toolbar/chart/cursor/styles.less deleted file mode 100644 index acaf10e9bd..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/cursor/styles.less +++ /dev/null @@ -1,110 +0,0 @@ -@import '../../../../styles/variables.less'; - -:host { - display: block; - position: absolute; - height: 3rem; - left: 0; - right: 0; - bottom: 0; - overflow: hidden; - & div.selection { - position: absolute; - height: 100%; - top: 0; - background: var(--scheme-color-accent-50); - } - & div.cover { - position: absolute; - height: 100%; - top: 0; - background: var(--scheme-color-active-75); - cursor: default; - pointer-events: none; - &.left { - left: 0; - } - &.right { - right: 0; - } - } - & div.cursor { - position: absolute; - height: 100%; - top: 0; - border-left: thin solid var(--scheme-color-0); - border-right: thin solid var(--scheme-color-0); - background: none; - cursor: default; - & div.move-trigger { - position: absolute; - top: 0; - height: 16px; - width: 100%; - cursor: move; - } - & div.left, - & div.right { - position: absolute; - height: 100%; - width: 6px; - margin-left: -3px; - cursor: col-resize; - &::after { - position: absolute; - display: none; - font-size: 12px; - color: var(--scheme-color-1); - content: attr(row); - background: var(--scheme-color-active-75); - padding: 2px 4px; - border-radius: 2px; - top: 0; - z-index: 10; - } - &::before{ - position: absolute; - height: 16px; - width: 3px; - content: ''; - background: var(--scheme-color-0); - top: 0; - right: 0; - } - } - & div.left { - left: 0; - &::after { - right: 5px; - } - } - & div.right { - right: 0; - &::after { - left: 8px; - } - } - &.move { - & div.left, - & div.right { - &::after { - display: block; - } - } - } - &.left { - & div.left { - &::after { - display: block; - } - } - } - &.right { - & div.right { - &::after { - display: block; - } - } - } - } -} diff --git a/application/client/src/app/ui/views/toolbar/chart/cursor/template.html b/application/client/src/app/ui/views/toolbar/chart/cursor/template.html deleted file mode 100644 index 937b14ca67..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/cursor/template.html +++ /dev/null @@ -1,12 +0,0 @@ -
    -
    -
    -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/application/client/src/app/ui/views/toolbar/chart/module.ts b/application/client/src/app/ui/views/toolbar/chart/module.ts deleted file mode 100644 index 056e24a5e1..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ViewChart } from './component'; -import { ContainersModule } from '@elements/containers/module'; -import { AppDirectiviesModule } from '@directives/module'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatIconModule } from '@angular/material/icon'; -import { ViewChartOutput } from './output/component'; -import { ViewChartSummary } from './summary/component'; -import { ViewChartCursor } from './cursor/component'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - AppDirectiviesModule, - MatIconModule, - MatProgressSpinnerModule, - ], - declarations: [ViewChart, ViewChartOutput, ViewChartSummary, ViewChartCursor], - exports: [ViewChart], - bootstrap: [ViewChart], -}) -export class ChartModule {} diff --git a/application/client/src/app/ui/views/toolbar/chart/output/component.ts b/application/client/src/app/ui/views/toolbar/chart/output/component.ts deleted file mode 100644 index de300f012b..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/output/component.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { Component, AfterViewInit, HostListener } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { OutputBase } from '../base/component'; -import { Render as ChartsRender } from '../render/chart'; -import { Render as FiltersRender } from '../render/filters'; -import { State } from '../state'; -import { stop } from '@ui/env/dom'; -import { Label } from '../render/chart.label'; -import { getContrastColor } from '@styles/colors'; -import { Owner } from '@schema/content/row'; -import { IRange } from '@platform/types/range'; - -const MAX_LABELS_COUNT = 5; - -@Component({ - selector: 'app-views-chart-output', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class ViewChartOutput extends OutputBase implements AfterViewInit { - protected renders!: { - charts: ChartsRender; - filters: FiltersRender; - }; - - @HostListener('mousemove', ['$event']) mousemove(event: MouseEvent): void { - this.labels = this.renders.charts.coors.get(event.offsetX); - if (this.labels.length > MAX_LABELS_COUNT) { - this.cutted = this.labels.splice(MAX_LABELS_COUNT, this.labels.length).length; - } else { - this.cutted = 0; - } - this.x = `${event.offsetX}px`; - this.range = this.state.cursor.rowsRangeByX(event.offsetX); - this.detectChanges(); - } - - @HostListener('mouseleave', ['$event']) mouseleave(_event: MouseEvent): void { - this.x = undefined; - this.detectChanges(); - } - - @HostListener('click', ['$event']) click(event: MouseEvent): void { - const labels: Label[] = this.renders.charts.coors.get(event.offsetX); - if (labels.length === 0) { - this.session.cursor.select( - this.state.cursor.rowsRangeByX(event.offsetX).start, - Owner.Chart, - undefined, - undefined, - ); - } else { - this.session.cursor.select(labels[0].position, Owner.Chart, undefined, undefined); - } - } - - @HostListener('wheel', ['$event']) wheel(event: WheelEvent): void { - if (Math.abs(event.deltaY) > Math.abs(event.deltaX)) { - this.state.cursor - .change(Math.round(event.deltaY / State.REDUCE_ZOOM_ON_WHEEL)) - .resize(); - } else { - this.state.cursor.change(Math.round(event.deltaX / State.REDUCE_MOVE_ON_WHEEL)).move(); - } - stop(event); - } - - public x: string | undefined; - public labels: Label[] = []; - public range: IRange | undefined; - public cutted: number = 0; - - public override ngAfterViewInit(): void { - super.ngAfterViewInit(); - this.renders = { - charts: new ChartsRender(this.canvasElRef.nativeElement), - filters: new FiltersRender(this.canvasElRef.nativeElement), - }; - this.env().subscriber.register( - this.session.charts.subjects.get().output.subscribe((event) => { - this.renders.filters - .setMap(event.map) - .setFilters(event.filters) - .setActive(event.active) - .setFrame(event.frame) - .clear() - .refresh(); - this.renders.charts - .setSelected(event.selected) - .setValues(event.values) - .setPeaks(event.peaks) - .setCharts(event.charts) - .setFrame(event.frame) - .refresh(); - }), - ); - this.session.charts.refresh(); - } - - public getLabelColor(color: string): string { - return getContrastColor(color, true); - } -} -export interface ViewChartOutput extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/chart/output/styles.less b/application/client/src/app/ui/views/toolbar/chart/output/styles.less deleted file mode 100644 index 5dea0041cd..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/output/styles.less +++ /dev/null @@ -1,61 +0,0 @@ -@import '../../../../styles/variables.less'; - -:host { - display: block; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 3rem; - overflow: hidden; - & canvas { - position: absolute; - display: block; - padding: 0; - margin: 0; - bottom: 0; - right: 0; - left: 0; - top: 0; - } - & span.pointer{ - display: block; - position: absolute; - height: 100%; - top:0; - border-left: solid thin var(--scheme-color-1); - pointer-events: none; - & span.label { - display: flex; - position: relative; - flex-direction: row; - margin: 3px 6px; - border-radius: 2px; - padding: 2px 6px; - font-size: 13px; - white-space: nowrap; - & span.value, - & span.row { - color: inherit; - } - & span.value { - font-weight: 700; - } - & span.row { - font-weight: 400; - } - &.more { - background: var(--scheme-color-5-95); - color: var(--scheme-color-1); - font-size: 11px; - white-space: nowrap; - } - &.range { - background: var(--scheme-color-5-95); - color: var(--scheme-color-1); - font-size: 11px; - white-space: nowrap; - } - } - } -} diff --git a/application/client/src/app/ui/views/toolbar/chart/output/template.html b/application/client/src/app/ui/views/toolbar/chart/output/template.html deleted file mode 100644 index a612f0c0be..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/output/template.html +++ /dev/null @@ -1,25 +0,0 @@ - - - {{range.start}} - {{range.end}} - {{range.start}} - - - {{label.position}}: - {{label.value}} - - - {{label.position}}: - {{label.value}} - ({{label.min}}-{{label.max}}) - - - and more {{cutted}} - diff --git a/application/client/src/app/ui/views/toolbar/chart/render/chart.coors.ts b/application/client/src/app/ui/views/toolbar/chart/render/chart.coors.ts deleted file mode 100644 index 28179f6ca9..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/render/chart.coors.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; -import { Label } from './chart.label'; - -export type TChartValues = [string, number, number, number, number][]; - -export class ChartCoors { - static DEFAULT_OFFSET_AROUND = 3; - - protected coors: Map = new Map(); - - public drop(): void { - this.coors.clear(); - } - - public add( - x: number, - value: number, - row: number, - min: number, - max: number, - request: ChartRequest | undefined, - ): void { - if (request === undefined) { - return; - } - let values = this.coors.get(x); - if (values === undefined) { - values = []; - } - values.push([request.definition.color, value, row, min, max]); - this.coors.set(x, values); - } - - public get(x: number, offset = ChartCoors.DEFAULT_OFFSET_AROUND): Label[] { - const left = x - offset; - const right = x + offset; - let closed: number | undefined = undefined; - let distance: number = Infinity; - Array.from(this.coors.keys()) - .filter((k) => k >= left && k <= right) - .forEach((k) => { - const dist = Math.abs(k - x); - if (dist < distance) { - closed = k; - distance = dist; - } - }); - if (closed === undefined) { - return []; - } - const values = this.coors.get(closed); - return values === undefined - ? [] - : values.map((v) => new Label(v[0], v[1], v[2], v[3], v[4])); - } -} diff --git a/application/client/src/app/ui/views/toolbar/chart/render/chart.label.ts b/application/client/src/app/ui/views/toolbar/chart/render/chart.label.ts deleted file mode 100644 index f3a9d37013..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/render/chart.label.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { getContrastColor } from '@ui/styles/colors'; - -export class Label { - public readonly value: string; - public readonly candle: boolean; - public readonly color: string; - constructor( - public readonly bk: string, - value: number, - public readonly position: number, - public readonly min: number, - public readonly max: number, - ) { - this.color = getContrastColor(bk, true); - this.candle = !(min === value && max === value); - this.value = value.toFixed(2); - } -} diff --git a/application/client/src/app/ui/views/toolbar/chart/render/chart.ts b/application/client/src/app/ui/views/toolbar/chart/render/chart.ts deleted file mode 100644 index 8a3523e0b3..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/render/chart.ts +++ /dev/null @@ -1,291 +0,0 @@ -import { ResultSearchValues, Point } from '@platform/types/bindings'; -import { shadeColor } from '@styles/colors'; -import { styles } from '@ui/service/styles'; -import { Base } from './render'; -import { ChartRequest, ChartType } from '@service/session/dependencies/search/charts/request'; -import { ChartCoors } from './chart.coors'; -import { IRange } from '@platform/types/range'; - -const GRID_LINES_COUNT = 5; - -export class Render extends Base { - protected values: ResultSearchValues = new Map(); - protected peaks: Map = new Map(); - protected charts: ChartRequest[] = []; - protected points: boolean = true; - protected selected: number | undefined; - - protected yAxisRender(): void { - if (this.selected === undefined) { - return; - } - const selected = this.values.get(this.selected); - const peaks = this.peaks.get(this.selected); - if (selected === undefined || peaks === undefined) { - return; - } - const min = peaks[0]; - const diff = peaks[1] - min; - const size = this.size(); - this.context.beginPath(); - const step = Math.floor(size.height / GRID_LINES_COUNT); - for (let s = 0; s <= GRID_LINES_COUNT; s += 1) { - const y = s * step + (s === GRID_LINES_COUNT ? -0.5 : 0.5); - this.context.moveTo(0, y); - this.context.lineTo(size.width, y); - } - this.context.lineWidth = 1; - this.context.strokeStyle = styles.colors().scheme_color_0; - this.context.setLineDash([1, 1]); - this.context.stroke(); - this.context.closePath(); - this.context.fillStyle = styles.colors().scheme_color_0; - this.context.font = '10px sans-serif'; - this.context.textAlign = 'right'; - const diffStep = diff / GRID_LINES_COUNT; - for (let s = 0; s <= GRID_LINES_COUNT; s += 1) { - const y = s * step; - const text = (min + diffStep * (GRID_LINES_COUNT - s)).toFixed(2); - const box = this.context.measureText(text); - let yOffset = -2; - this.context.fillStyle = shadeColor(styles.colors().scheme_color_5, 75); - if (s === 0) { - this.context.textBaseline = 'top'; - yOffset = 2; - this.context.fillRect(size.width - 18 - box.width - 6, y, box.width + 12, 16); - } else { - this.context.textBaseline = 'bottom'; - this.context.fillRect(size.width - 18 - box.width - 6, y - 16, box.width + 12, 16); - } - this.context.fillStyle = styles.colors().scheme_color_0; - this.context.fillText(text, size.width - 18, y + yOffset); - } - this.context.setLineDash([]); - } - - public readonly coors: ChartCoors = new ChartCoors(); - - public ignorePoints(): Render { - this.points = false; - return this; - } - - public setSelected(index: number | undefined): Render { - this.selected = index; - return this; - } - - public setValues(values: ResultSearchValues): Render { - this.values = values; - return this; - } - - public setPeaks(peaks: Map): Render { - this.peaks = peaks; - return this; - } - - public setCharts(charts: ChartRequest[]): Render { - this.charts = charts; - return this; - } - - public render(): void { - const frame = this.frame; - if (frame === undefined) { - return; - } - if (frame.end - frame.start <= 0) { - return; - } - this.coors.drop(); - const size = this.size(); - this.values.forEach((points: Point[], k: number) => { - const peaks = this.peaks.get(k); - if (peaks === undefined) { - console.error(`No peaks for chart #${k}`); - return; - } - const chart = this.charts[k]; - const type = chart === undefined ? ChartType.Linear : chart.definition.type; - const render = this.modes(frame, peaks, points, size, chart); - switch (type) { - case ChartType.Linear: - render.linear(); - break; - case ChartType.Stepper: - render.stepper(); - break; - case ChartType.Temperature: - render.temperature(); - break; - } - }); - this.yAxisRender(); - } - - protected modes( - frame: IRange, - peaks: [number, number], - values: Point[], - size: { - width: number; - height: number; - }, - chart: ChartRequest | undefined, - ): { - linear(): void; - stepper(): void; - temperature(): void; - } { - const rate = { - byX: size.width / (frame.end - frame.start), - byY: size.height / (peaks[1] - peaks[0]), - }; - return { - linear: (): void => { - this.context.beginPath(); - const coors: [number, number][] = []; - values.forEach((point: Point, i: number) => { - const position = point.row; - const value = point.y_value; - const x = Math.round((position - frame.start) * rate.byX); - const y = size.height - Math.round((value - peaks[0]) * rate.byY); - if (i === 0) { - this.context.moveTo(x, y); - } else { - this.context.lineTo(x, y); - } - coors.push([x, y]); - this.coors.add(x, value, position, point.min, point.max, chart); - }); - const color = - chart === undefined ? styles.colors().scheme_color_0 : chart.definition.color; - const lineWidth = - chart === undefined - ? ChartRequest.DEFAULT_LINE_WIDTH - : chart.definition.widths.line; - this.context.lineWidth = lineWidth; - this.context.strokeStyle = color; - this.context.stroke(); - this.context.closePath(); - const pointRadius = - chart === undefined - ? ChartRequest.DEFAULT_POINT_RADIUS - : chart.definition.widths.point; - if (!this.points || pointRadius === 0) { - return; - } - coors.forEach((coors: [number, number]) => { - this.context.beginPath(); - this.context.arc(coors[0], coors[1], pointRadius, 0, Math.PI * 2, true); - this.context.fillStyle = color; - this.context.fill(); - this.context.closePath(); - }); - }, - stepper: (): void => { - this.context.beginPath(); - const coors: [number, number][] = []; - let prevY = 0; - values.forEach((point: Point, i: number) => { - const position = point.row; - const value = point.y_value; - const x = Math.round((position - frame.start) * rate.byX); - const y = size.height - Math.round((value - peaks[0]) * rate.byY); - if (i === 0) { - this.context.moveTo(x, y); - } else { - this.context.lineTo(x, prevY); - this.context.lineTo(x, y); - } - prevY = y; - coors.push([x, y]); - this.coors.add(x, value, position, point.min, point.max, chart); - }); - const color = - chart === undefined ? styles.colors().scheme_color_0 : chart.definition.color; - const lineWidth = - chart === undefined - ? ChartRequest.DEFAULT_LINE_WIDTH - : chart.definition.widths.line; - this.context.lineWidth = lineWidth; - this.context.strokeStyle = color; - this.context.stroke(); - this.context.closePath(); - const pointRadius = - chart === undefined - ? ChartRequest.DEFAULT_POINT_RADIUS - : chart.definition.widths.point; - if (!this.points || pointRadius === 0) { - return; - } - coors.forEach((coors: [number, number]) => { - this.context.beginPath(); - this.context.arc(coors[0], coors[1], pointRadius, 0, Math.PI * 2, true); - this.context.fillStyle = color; - this.context.fill(); - this.context.closePath(); - }); - }, - temperature: (): void => { - this.context.beginPath(); - const coors: [number, number][] = []; - const start = { x: 0, y: 0 }; - const end = { x: 0, y: 0 }; - values.forEach((point: Point, i: number) => { - const position = point.row; - const value = point.y_value; - const x = Math.round((position - frame.start) * rate.byX); - const y = size.height - Math.round((value - peaks[0]) * rate.byY); - if (i === 0) { - this.context.moveTo(x, y); - start.x = x; - start.y = y; - } else { - this.context.lineTo(x, y); - } - if (i === values.length - 1) { - end.x = x; - end.y = y; - } - coors.push([x, y]); - this.coors.add(x, value, position, point.min, point.max, chart); - }); - const color = - chart === undefined ? styles.colors().scheme_color_0 : chart.definition.color; - const lineWidth = - chart === undefined - ? ChartRequest.DEFAULT_LINE_WIDTH - : chart.definition.widths.line; - this.context.lineWidth = lineWidth; - this.context.strokeStyle = color; - this.context.stroke(); - this.context.lineTo(end.x, size.height); - this.context.lineTo(start.x, size.height); - this.context.lineTo(start.x, start.y); - this.context.closePath(); - const wHalf = Math.round(size.width / 2); - const gradient = this.context.createLinearGradient(wHalf, 0, wHalf, size.height); - gradient.addColorStop(0, color); - gradient.addColorStop(1, shadeColor(color, 200)); - this.context.fillStyle = gradient; - this.context.fill(); - const pointRadius = - chart === undefined - ? ChartRequest.DEFAULT_POINT_RADIUS - : chart.definition.widths.point; - if (!this.points || pointRadius === 0) { - return; - } - coors.forEach((coors: [number, number]) => { - this.context.beginPath(); - this.context.arc(coors[0], coors[1], pointRadius, 0, Math.PI * 2, true); - this.context.fillStyle = color; - this.context.fill(); - this.context.closePath(); - }); - }, - }; - } -} diff --git a/application/client/src/app/ui/views/toolbar/chart/render/filters.ts b/application/client/src/app/ui/views/toolbar/chart/render/filters.ts deleted file mode 100644 index 58645b7882..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/render/filters.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { ISearchMap } from '@platform/types/filter'; -import { styles } from '@ui/service/styles'; -import { Base } from './render'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; - -export class Render extends Base { - static COLUMN_WIDTH = 2; - - protected map: ISearchMap = []; - protected filters: FilterRequest[] = []; - protected active: boolean = false; - - public setMap(map: ISearchMap): Render { - this.map = map; - return this; - } - - public setFilters(filters: FilterRequest[]): Render { - this.filters = filters; - return this; - } - - public setActive(active: boolean): Render { - this.active = active; - return this; - } - - public render(): void { - const frame = this.frame; - if (frame === undefined) { - return; - } - const frameLength = frame.end - frame.start; - if (frameLength <= 0) { - return; - } - let max = 0; - this.map.forEach((matches: [number, number][]) => { - const m = Math.max(...matches.map((p) => p[1])); - max = m > max ? m : max; - }); - if (max === 0) { - return; - } - const size = this.size(); - const rateByY = size.height / max; - const maxColumns = size.width / Render.COLUMN_WIDTH; - const columnWidth = - maxColumns <= frameLength ? Render.COLUMN_WIDTH : size.width / frameLength; - this.map.forEach((matches: [number, number][], left: number) => { - matches.forEach((pair: [number, number]) => { - const color = this.active - ? styles.colors().scheme_color_2 - : this.filters[pair[0]] === undefined - ? styles.colors().scheme_color_match - : this.filters[pair[0]].definition.colors.background; - const h = Math.round(pair[1] * rateByY); - this.context.fillStyle = color; - this.context.fillRect(left * columnWidth, size.height - h, columnWidth, h); - }); - }); - } -} diff --git a/application/client/src/app/ui/views/toolbar/chart/render/render.ts b/application/client/src/app/ui/views/toolbar/chart/render/render.ts deleted file mode 100644 index 7f2a7a7fff..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/render/render.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { IRange } from '@platform/types/range'; -import { styles } from '@ui/service/styles'; - -export abstract class Base { - protected context: CanvasRenderingContext2D; - protected frame: IRange | undefined; - protected rendering: { - processing: boolean; - recalled: boolean; - } = { - processing: false, - recalled: false, - }; - - constructor(protected readonly canvasElementRef: HTMLCanvasElement) { - const context: CanvasRenderingContext2D | null = canvasElementRef.getContext('2d'); - if (context === null) { - throw new Error(`Fail to get access to canvas context`); - } - this.context = context; - } - - protected size(): { width: number; height: number } { - return { - width: this.canvasElementRef.width, - height: this.canvasElementRef.height, - }; - } - - public setFrame(frame: IRange): Base { - this.frame = frame; - return this; - } - - public clear(): Base { - this.context.fillStyle = styles.colors().scheme_color_5; - this.context.fillRect(0, 0, this.canvasElementRef.width, this.canvasElementRef.height); - return this; - } - - public refresh(): Base { - if (this.rendering.processing) { - this.rendering.recalled = true; - return this; - } - this.rendering.processing = true; - this.render(); - const recalled = this.rendering.recalled; - this.rendering.processing = false; - this.rendering.recalled = false; - if (recalled) { - this.refresh(); - } - return this; - } - - protected abstract render(): void; -} diff --git a/application/client/src/app/ui/views/toolbar/chart/service.ts b/application/client/src/app/ui/views/toolbar/chart/service.ts deleted file mode 100644 index 0823c79707..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/service.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { Subscriber, Subject, Subscription } from '@platform/env/subscription'; -import { Destroy } from '@platform/types/env/types'; -import { Session } from '@service/session'; - -const CHART_SERVICE = 'workspace_chart_service'; - -export interface IPosition { - left: number; - width: number; - full: number; -} - -export interface IPositionChange { - session: string; - position: IPosition; -} - -export class Service extends Subscriber implements Destroy { - private _noData: boolean = true; - private _positions: Map = new Map(); - private readonly _subjects: { - change: Subject; - wheel: Subject; - } = { - change: new Subject(), - wheel: new Subject(), - }; - - static from(session: Session): Service { - const restored = session.storage.get(CHART_SERVICE); - if (restored === undefined) { - const service = new Service(); - session.storage.set(CHART_SERVICE, service); - return service; - } else { - return restored; - } - } - - public correction(session: string, width: number): IPosition | undefined { - const position: IPosition | undefined = this._positions.get(session); - if (position === undefined || position.full <= 0) { - return; - } - const change: number = width / position.full; - position.width = position.width * change; - position.left = position.left * change; - return position; - } - - public setPosition(data: IPositionChange) { - this._positions.set(data.session, data.position); - this._subjects.change.emit(data); - } - - public getPosition(session: string): IPositionChange { - let position: IPosition | undefined = this._positions.get(session); - if (position === undefined) { - position = { - full: 0, - left: 0, - width: 0, - }; - this._positions.set(session, position); - } - return { session: session, position: position }; - } - - public get noData(): boolean { - return this._noData; - } - - public set noData(noData: boolean) { - this._noData = noData; - } - - public get wheel(): Subject { - return this._subjects.wheel; - } - - public onChange(handler: (event: IPositionChange) => void): Subscription { - return this._subjects.change.subscribe(handler); - } - - public destroy() { - this._subjects.change.destroy(); - } -} diff --git a/application/client/src/app/ui/views/toolbar/chart/state.ts b/application/client/src/app/ui/views/toolbar/chart/state.ts deleted file mode 100644 index 5f39fdc835..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/state.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Destroy } from '@platform/types/env/types'; -import { IlcInterface } from '@service/ilc'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Subscriber } from '@platform/env/subscription'; -import { Session } from '@service/session'; -import { Cursor } from './cursor'; - -export class State extends Subscriber implements Destroy { - public static REDUCE_MOVE_ON_WHEEL = 5; - public static REDUCE_ZOOM_ON_WHEEL = 3; - public static KEY_MOVE_STEP = 15; - - protected session!: Session; - - public ref!: IlcInterface & ChangesDetector; - public cursor: Cursor = new Cursor(); - public hasData: boolean = false; - - public destroy(): void { - this.unsubscribe(); - this.cursor.destroy(); - } - - public init(ref: IlcInterface & ChangesDetector, session: Session): void { - this.ref = ref; - this.session = session; - this.register( - session.stream.subjects.get().updated.subscribe((len: number) => { - this.cursor.setStreamLen(len); - }), - session.charts.subjects.get().summary.subscribe((_event) => { - this.hasData = this.session.charts.hasData(); - this.ref.detectChanges(); - }), - session.charts.subjects.get().output.subscribe((_event) => { - this.hasData = this.session.charts.hasData(); - this.ref.detectChanges(); - }), - ); - this.cursor.init(session); - } -} diff --git a/application/client/src/app/ui/views/toolbar/chart/styles.less b/application/client/src/app/ui/views/toolbar/chart/styles.less deleted file mode 100644 index c04c9b5ffd..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/styles.less +++ /dev/null @@ -1,32 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: absolute; - display: block; - padding: 0; - margin: 0; - bottom: 0.5rem; - right: 0.5rem; - left: 0.5rem; - top: 0.5rem; - overflow: hidden; - outline: none; - & div.placeholder { - position: absolute; - display: flex; - align-items: center; - justify-content: center; - padding: 0; - margin: 0; - bottom: 0; - right: 0; - left: 0; - top: 0; - overflow: hidden; - & p { - position: relative; - color: var(--scheme-color-2); - max-width: 300px; - } - } -} diff --git a/application/client/src/app/ui/views/toolbar/chart/summary/component.ts b/application/client/src/app/ui/views/toolbar/chart/summary/component.ts deleted file mode 100644 index 3556fd27b8..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/summary/component.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Component, AfterViewInit } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { OutputBase } from '../base/component'; -import { Render as ChartsRender } from '../render/chart'; -import { Render as FiltersRender } from '../render/filters'; - -@Component({ - selector: 'app-views-chart-summary', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class ViewChartSummary extends OutputBase implements AfterViewInit { - protected renders!: { - charts: ChartsRender; - filters: FiltersRender; - }; - - public override ngAfterViewInit(): void { - super.ngAfterViewInit(); - this.renders = { - charts: new ChartsRender(this.canvasElRef.nativeElement).ignorePoints(), - filters: new FiltersRender(this.canvasElRef.nativeElement), - }; - this.env().subscriber.register( - this.session.charts.subjects.get().summary.subscribe((event) => { - this.renders.filters - .setMap(event.map) - .setFilters(event.filters) - .setActive(event.active) - .setFrame(event.frame) - .clear() - .refresh(); - this.renders.charts - .setSelected(undefined) - .setValues(event.values) - .setPeaks(event.peaks) - .setCharts(event.charts) - .setFrame(event.frame) - .refresh(); - }), - ); - this.session.charts.refresh(); - } -} -export interface ViewChartSummary extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/chart/summary/styles.less b/application/client/src/app/ui/views/toolbar/chart/summary/styles.less deleted file mode 100644 index 5fd8b32ac5..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/summary/styles.less +++ /dev/null @@ -1,22 +0,0 @@ -@import '../../../../styles/variables.less'; - -:host { - display: block; - position: absolute; - height: 3rem; - left: 0; - right: 0; - bottom: 0; - overflow: hidden; - border-top: thin dotted var(--scheme-color-1); - & canvas { - position: absolute; - display: block; - padding: 0; - margin: 0; - bottom: 0; - right: 0; - left: 0; - top: 0; - } -} diff --git a/application/client/src/app/ui/views/toolbar/chart/summary/template.html b/application/client/src/app/ui/views/toolbar/chart/summary/template.html deleted file mode 100644 index e8a8b0f61d..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/summary/template.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/application/client/src/app/ui/views/toolbar/chart/template.html b/application/client/src/app/ui/views/toolbar/chart/template.html deleted file mode 100644 index 872452028a..0000000000 --- a/application/client/src/app/ui/views/toolbar/chart/template.html +++ /dev/null @@ -1,6 +0,0 @@ - - - -
    -

    As soon as some filter will be created, the frequency of matching will be shown. Also as soon as some chart term will be created, the chart will be rendered.

    -
    diff --git a/application/client/src/app/ui/views/toolbar/details/component.ts b/application/client/src/app/ui/views/toolbar/details/component.ts deleted file mode 100644 index 840f2d8519..0000000000 --- a/application/client/src/app/ui/views/toolbar/details/component.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { Component, AfterViewInit, ChangeDetectorRef, OnDestroy } from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Subscriber } from '@platform/env/subscription'; -import { Row, RowSrc } from '@schema/content/row'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; - -@Component({ - selector: 'app-views-details', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class Details extends ChangesDetector implements AfterViewInit, OnDestroy { - protected session: Session | undefined; - protected subscriber: Subscriber = new Subscriber(); - protected sanitizer: DomSanitizer; - - public row: RowSrc | undefined; - public origin: SafeHtml | undefined; - public parsed: SafeHtml | undefined; - - constructor(cdRef: ChangeDetectorRef, sanitizer: DomSanitizer) { - super(cdRef); - this.sanitizer = sanitizer; - } - - public ngOnDestroy(): void { - this.subscriber.unsubscribe(); - } - - public ngAfterViewInit(): void { - this.env().subscriber.register( - this.ilc().channel.session.change(this.bind.bind(this)), - this.ilc().services.system.hotkeys.listen('Ctrl + C', () => { - const selection = document.getSelection(); - if (selection === null) { - return; - } - this.copy(selection.toString()); - }), - ); - this.bind().update(); - } - - public copy(content?: string): void { - const row = this.row; - if (row === undefined) { - return; - } - navigator.clipboard.writeText( - (() => { - if (content !== undefined) { - return content; - } - const parsed = document.querySelector('pre[id="parsed_content_holder"]'); - if (parsed !== null) { - return parsed.textContent as string; - } else { - return row.content; - } - })() - .replace(/\u0006/gi, '\n') - .replace(/\t/gi, ' '.repeat(4)), - ); - } - - protected bind(): Details { - this.subscriber.unsubscribe(); - this.session = this.ilc().services.system.session.active().session(); - this.session !== undefined && - this.subscriber.register( - this.session.cursor.subjects.get().selected.subscribe(this.update.bind(this)), - this.session.cursor.subjects.get().loaded.subscribe(this.update.bind(this)), - ); - return this; - } - - protected update() { - if (this.session === undefined) { - this.row = undefined; - this.origin = undefined; - this.parsed = undefined; - } else { - this.row = this.session.cursor.getSingle().row(); - if (this.row === undefined) { - this.origin = undefined; - this.parsed = undefined; - } else { - this.origin = this.sanitizer.bypassSecurityTrustHtml( - this.row.content.replace(/\u0006/gi, '
    ').replace(/\t/gi, ' '.repeat(4)), - ); - const row = new Row(this.row); - this.parsed = - row.html !== undefined - ? this.sanitizer.bypassSecurityTrustHtml(row.html) - : undefined; - row.destroy(); - } - } - this.detectChanges(); - } -} -export interface Details extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/details/module.ts b/application/client/src/app/ui/views/toolbar/details/module.ts deleted file mode 100644 index f347ffecca..0000000000 --- a/application/client/src/app/ui/views/toolbar/details/module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { Details } from './component'; - -@NgModule({ - imports: [CommonModule], - declarations: [Details], - exports: [Details], - bootstrap: [Details], -}) -export class DetailsModule {} diff --git a/application/client/src/app/ui/views/toolbar/details/styles.less b/application/client/src/app/ui/views/toolbar/details/styles.less deleted file mode 100644 index 90c3cf2867..0000000000 --- a/application/client/src/app/ui/views/toolbar/details/styles.less +++ /dev/null @@ -1,44 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - top: 6px; - left: 6px; - bottom: 6px; - right: 6px; - position: absolute; - overflow: hidden; - div.summary { - position: absolute; - top: 0; - left: 0; - height: 24px; - width: 100%; - overflow: hidden; - display: flex; - flex-direction: row; - vertical-align: middle; - align-items: center; - & span.filler { - flex: auto; - } - } - div.content { - position: absolute; - top:24px; - left: 0; - bottom: 0; - width: 100%; - overflow: auto; - & p.caption{ - margin: 6px 0px 3px 0; - } - & pre { - user-select: text; - font-size: 16px; - white-space: break-spaces; - & * { - user-select: text; - } - } - } -} diff --git a/application/client/src/app/ui/views/toolbar/details/template.html b/application/client/src/app/ui/views/toolbar/details/template.html deleted file mode 100644 index 4253581985..0000000000 --- a/application/client/src/app/ui/views/toolbar/details/template.html +++ /dev/null @@ -1,17 +0,0 @@ -
    - Row #: {{row.position}} - - -
    -
    - -

    Origin

    -
    
    -    
    - -

    Parsed

    -
    
    -    
    -
    diff --git a/application/client/src/app/ui/views/toolbar/history/component.ts b/application/client/src/app/ui/views/toolbar/history/component.ts deleted file mode 100644 index bee33ea732..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/component.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { Component, Input, AfterContentInit, ChangeDetectorRef, HostListener } from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { IMenuItem, contextmenu } from '@ui/service/contextmenu'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Collections } from '@service/history/collections'; -import { MatSelectChange } from '@angular/material/select'; -import { State } from './state'; - -import * as dom from '@ui/env/dom'; - -@Component({ - selector: 'app-views-history', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class History extends ChangesDetector implements AfterContentInit { - @Input() session!: Session; - - public state: State = new State(); - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - @HostListener('contextmenu', ['$event']) onContextMenu(event: MouseEvent) { - const items: IMenuItem[] = [ - { - caption: `Remove All Presets`, - handler: () => { - this.state.history.clear(); - this.state.update(); - this.detectChanges(); - }, - }, - {}, - { - caption: `Export all`, - handler: () => { - this.state.selection().all().export(); - }, - }, - {}, - { - caption: `Import from file`, - handler: () => { - this.state.import(); - }, - }, - ]; - contextmenu.show({ - items: items, - x: event.pageX, - y: event.pageY, - }); - return dom.stop(event); - } - - public onCollectionContextmenu(collection: Collections, event: MouseEvent) { - const items: IMenuItem[] = [ - { - caption: `Remove`, - handler: () => { - collection.delete(); - this.state.update(); - this.detectChanges(); - }, - }, - {}, - { - caption: `Select for export`, - handler: () => { - this.state.selection().select(collection); - this.detectChanges(); - }, - }, - {}, - { - caption: `Import from file`, - handler: () => { - this.state.import(); - }, - }, - ]; - contextmenu.show({ - items: items, - x: event.pageX, - y: event.pageY, - }); - return dom.stop(event); - } - - public ngAfterContentInit(): void { - this.state.init(this, this.session); - this.env().subscriber.register( - this.ilc().services.system.history.collections.saved.subscribe(() => { - this.state.update(); - this.detectChanges(); - }), - ); - } - - public use(collection: Collections) { - this.state.history.apply(collection); - } - - public onListFilterChange(_event: MatSelectChange) { - this.state.list().update(); - this.detectChanges(); - } -} -export interface History extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/history/module.ts b/application/client/src/app/ui/views/toolbar/history/module.ts deleted file mode 100644 index 635ebffe60..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; - -import { MatIconModule } from '@angular/material/icon'; -import { MatCardModule } from '@angular/material/card'; -import { MatButtonModule } from '@angular/material/button'; -import { EditableModule } from '@ui/elements/editable/module'; -import { MatSelectModule } from '@angular/material/select'; -import { MatCheckboxModule } from '@angular/material/checkbox'; - -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -import { Preset } from './preset/component'; -import { History } from './component'; -import { FilterPreview } from './preview/filter/component'; -import { ChartPreview } from './preview/chart/component'; - -@NgModule({ - imports: [ - CommonModule, - MatIconModule, - MatButtonModule, - MatCardModule, - MatSelectModule, - MatCheckboxModule, - FormsModule, - ReactiveFormsModule, - EditableModule, - ], - declarations: [Preset, History, FilterPreview, ChartPreview], - exports: [History], - bootstrap: [History], -}) -export class HistoryModule {} diff --git a/application/client/src/app/ui/views/toolbar/history/preset/component.ts b/application/client/src/app/ui/views/toolbar/history/preset/component.ts deleted file mode 100644 index c535279bd7..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/preset/component.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { Component, Input, AfterContentInit, ChangeDetectorRef } from '@angular/core'; -import { Collections } from '@service/history/collections'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -import * as dom from '@ui/env/dom'; - -const CUT_LIST_ON = 5; - -enum Target { - Filters, - Charts, - DisabledFilters, - DisabledCharts, -} - -@Component({ - selector: 'app-toolbar-history-preset', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class Preset extends ChangesDetector implements AfterContentInit { - @Input() public collections!: Collections; - - public filters: FilterRequest[] = []; - public charts: ChartRequest[] = []; - public disabled: { - filters: FilterRequest[]; - charts: ChartRequest[]; - } = { - filters: [], - charts: [], - }; - public origin: { - filters: FilterRequest[]; - charts: ChartRequest[]; - disabled: { - filters: FilterRequest[]; - charts: ChartRequest[]; - }; - } = { - filters: [], - charts: [], - disabled: { - filters: [], - charts: [], - }, - }; - - public get Target(): typeof Target { - return Target; - } - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.origin.filters = this.collections.collections.filters.as().elements(); - this.origin.charts = this.collections.collections.charts.as().elements(); - this.origin.disabled.filters = this.collections.collections.disabled - .as() - .elements() - .map((el) => el.as().filter()) - .filter((f) => f !== undefined) as FilterRequest[]; - this.origin.disabled.charts = this.collections.collections.disabled - .as() - .elements() - .map((el) => el.as().chart()) - .filter((f) => f !== undefined) as ChartRequest[]; - this.filters = this.origin.filters.slice(0, CUT_LIST_ON); - this.charts = this.origin.charts.slice(0, CUT_LIST_ON); - this.disabled.filters = this.origin.disabled.filters.slice(0, CUT_LIST_ON); - this.disabled.charts = this.origin.disabled.charts.slice(0, CUT_LIST_ON); - } - - public getName(): string { - if (this.collections.name === '-') { - return `${new Date(this.collections.last).toLocaleDateString('en-US')} (${ - this.collections.applied_sessions.size - })`; - } else { - return `${this.collections.name}(${this.collections.applied_sessions.size})`; - } - } - - public getValue(): string { - return this.collections.name === '-' ? '' : this.collections.name; - } - - public onRename(value: string) { - if (value.trim() === '') { - this.collections.name = '-'; - } else { - this.collections.name = value; - } - this.collections.setName(this.collections.name); - this.detectChanges(); - } - - public more(event: MouseEvent, target: Target) { - dom.stop(event); - if (target === Target.Filters) { - this.filters = this.origin.filters; - } else if (target === Target.Charts) { - this.charts = this.origin.charts; - } else if (target === Target.DisabledCharts) { - this.disabled.charts = this.origin.disabled.charts; - } else if (target === Target.DisabledFilters) { - this.disabled.filters = this.origin.disabled.filters; - } - this.detectChanges(); - } -} -export interface Preset extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/history/preset/styles.less b/application/client/src/app/ui/views/toolbar/history/preset/styles.less deleted file mode 100644 index 91d7054db3..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/preset/styles.less +++ /dev/null @@ -1,40 +0,0 @@ -@import '../../../../styles/variables.less'; -:host { - position: relative; - display: block; - width: 256px; - div.section { - position: relative; - padding: 3px 0; - border-bottom: solid thin var(--scheme-color-4); - } - & input { - margin: 0 6px; - padding: 0; - border-bottom: dashed 1px var(--scheme-color-1); - flex: auto; - white-space: nowrap; - color: var(--scheme-color-0); - } - & mat-card { - margin: 12px 6px 12px 12px; - & mat-card-title { - color: var(--scheme-color-1); - font-size: 12px; - } - & mat-card-subtitle { - color: var(--scheme-color-3); - font-size: 12px; - } - &.no-left-margin { - margin-left: 6px; - } - &::hover { - background: var(--scheme-color-4); - } - & div.more { - position: relative; - text-align: center; - } - } -} \ No newline at end of file diff --git a/application/client/src/app/ui/views/toolbar/history/preset/template.html b/application/client/src/app/ui/views/toolbar/history/preset/template.html deleted file mode 100644 index 7d61902870..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/preset/template.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - -
    -

    Filters

    - -
    - show more ({{origin.filters.length - filters.length}}) -
    -
    -
    -

    Charts

    - -
    - show more ({{origin.charts.length - charts.length}}) -
    -
    -
    -

    Disabled filters

    - -
    - show more ({{origin.disabled.filters.length - disabled.filters.length}}) -
    -
    -
    -

    Disabled charts

    - -
    - show more ({{origin.disabled.charts.length - disabled.charts.length}}) -
    -
    -
    -
    diff --git a/application/client/src/app/ui/views/toolbar/history/preview/chart/component.ts b/application/client/src/app/ui/views/toolbar/history/preview/chart/component.ts deleted file mode 100644 index 3b6b4813ea..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/preview/chart/component.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Component, Input, ChangeDetectorRef } from '@angular/core'; -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-toolbar-history-chart-preview', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class ChartPreview extends ChangesDetector { - @Input() chart!: ChartRequest; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } -} -export interface ChartPreview extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/history/preview/chart/styles.less b/application/client/src/app/ui/views/toolbar/history/preview/chart/styles.less deleted file mode 100644 index f7ab18971c..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/preview/chart/styles.less +++ /dev/null @@ -1,68 +0,0 @@ -@import '../../../../../styles/variables.less'; - - -:host { - display: flex; - position: relative; - flex-flow: row; - padding: 3px 0px 5px 0; - overflow: hidden; - height: 20px; - cursor: default; - align-items: center; - div.doubleclick { - display: flex; - flex: auto; - align-items: center; - font-size: 13px; - } - span.color { - flex: 0; - width: 8px; - max-width: 8px; - min-width: 8px; - min-height: 16px; - display: block; - position: relative; - margin: 2px 0 2px 0; - transition: all 150ms ease-in-out; - } - span.background { - flex: 0; - width: 8px; - max-width: 8px; - min-width: 8px; - min-height: 16px; - display: block; - position: relative; - margin: 2px 0 2px 0; - transition: all 150ms ease-in-out; - } - span.request{ - flex: auto; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - padding-left: 6px; - color: var(--scheme-color-0); - cursor: default; - } - span.flags { - flex: 0; - white-space: nowrap; - width: auto; - transition: all 150ms ease-in-out; - & span { - font-size: 14px; - line-height: 14px; - vertical-align: bottom; - cursor: default; - &.active{ - color: var(--scheme-color-0); - } - &.inactive{ - color: var(--scheme-color-3); - } - } - } -} diff --git a/application/client/src/app/ui/views/toolbar/history/preview/chart/template.html b/application/client/src/app/ui/views/toolbar/history/preview/chart/template.html deleted file mode 100644 index 61b339ce68..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/preview/chart/template.html +++ /dev/null @@ -1,4 +0,0 @@ -
    - - {{chart.definition.filter}} -
    \ No newline at end of file diff --git a/application/client/src/app/ui/views/toolbar/history/preview/filter/component.ts b/application/client/src/app/ui/views/toolbar/history/preview/filter/component.ts deleted file mode 100644 index 1948e7947f..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/preview/filter/component.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Component, Input, ChangeDetectorRef } from '@angular/core'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-toolbar-history-filter-preview', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class FilterPreview extends ChangesDetector { - @Input() filter!: FilterRequest; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } -} -export interface FilterPreview extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/history/preview/filter/styles.less b/application/client/src/app/ui/views/toolbar/history/preview/filter/styles.less deleted file mode 100644 index f7ab18971c..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/preview/filter/styles.less +++ /dev/null @@ -1,68 +0,0 @@ -@import '../../../../../styles/variables.less'; - - -:host { - display: flex; - position: relative; - flex-flow: row; - padding: 3px 0px 5px 0; - overflow: hidden; - height: 20px; - cursor: default; - align-items: center; - div.doubleclick { - display: flex; - flex: auto; - align-items: center; - font-size: 13px; - } - span.color { - flex: 0; - width: 8px; - max-width: 8px; - min-width: 8px; - min-height: 16px; - display: block; - position: relative; - margin: 2px 0 2px 0; - transition: all 150ms ease-in-out; - } - span.background { - flex: 0; - width: 8px; - max-width: 8px; - min-width: 8px; - min-height: 16px; - display: block; - position: relative; - margin: 2px 0 2px 0; - transition: all 150ms ease-in-out; - } - span.request{ - flex: auto; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - padding-left: 6px; - color: var(--scheme-color-0); - cursor: default; - } - span.flags { - flex: 0; - white-space: nowrap; - width: auto; - transition: all 150ms ease-in-out; - & span { - font-size: 14px; - line-height: 14px; - vertical-align: bottom; - cursor: default; - &.active{ - color: var(--scheme-color-0); - } - &.inactive{ - color: var(--scheme-color-3); - } - } - } -} diff --git a/application/client/src/app/ui/views/toolbar/history/preview/filter/template.html b/application/client/src/app/ui/views/toolbar/history/preview/filter/template.html deleted file mode 100644 index d1466443a2..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/preview/filter/template.html +++ /dev/null @@ -1,10 +0,0 @@ -
    - - - {{filter.definition.filter.filter}} -
    - - - - - diff --git a/application/client/src/app/ui/views/toolbar/history/state.ts b/application/client/src/app/ui/views/toolbar/history/state.ts deleted file mode 100644 index b45053b275..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/state.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { HistorySession, SuitableGroup, Suitable } from '@service/history/session'; -import { IlcInterface } from '@env/decorators/component'; -import { Session } from '@service/session'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Collections } from '@service/history/collections'; -import { notifications, Notification } from '@ui/service/notifications'; - -export interface Selection { - select(collection: Collections): Selection; - has(): boolean; - export(): Selection; - all(): Selection; - drop(): Selection; -} - -export class State { - protected parent!: IlcInterface & ChangesDetector; - protected recentImport: number | undefined = undefined; - - public history!: HistorySession; - public groups: SuitableGroup[] = []; - public filters: { caption: string; value: number }[] = []; - public filtered: number = -2; - public session!: Session; - public selected: { [key: string]: boolean } = {}; - - public init(parent: IlcInterface & ChangesDetector, session: Session) { - this.parent = parent; - this.session = session; - const history = this.parent.ilc().services.system.history.get(this.session); - if (history === undefined) { - this.parent.log().error(`Fail to get history-session instance`); - return; - } - this.history = history; - history.subjects.get().suitable.subscribe((_collections: Suitable) => { - this.list().update(); - this.parent.detectChanges(); - }); - this.list().update(); - } - - public selection(): Selection { - const self = { - select: (collection: Collections): Selection => { - this.selected[collection.uuid] = true; - return self; - }, - has: (): boolean => { - return Object.keys(this.selected).filter((k) => this.selected[k]).length > 0; - }, - export: (): Selection => { - this.parent - .ilc() - .services.system.bridge.files() - .select.save(undefined, undefined) - .then((filename: string | undefined) => { - if (filename === undefined) { - return; - } - this.parent - .ilc() - .services.system.history.export( - Object.keys(this.selected) - .map((k) => (this.selected[k] ? k : undefined)) - .filter((u) => u !== undefined) as string[], - filename, - ) - .then(() => { - this.selection().drop(); - }) - .catch((err: Error) => { - this.parent.log().error(`Fail to export: ${err.message}`); - }); - }) - .catch((err: Error) => { - this.parent.log().error(`Fail to export: ${err.message}`); - }); - return self; - }, - all: (): Selection => { - this.groups.forEach((group) => { - group.collections.forEach((col) => { - this.selected[col.uuid] = true; - }); - }); - this.parent.detectChanges(); - return self; - }, - drop: (): Selection => { - Object.keys(this.selected).forEach((k) => (this.selected[k] = false)); - this.parent.detectChanges(); - return self; - }, - }; - return self; - } - - public import(): void { - this.parent - .ilc() - .services.system.bridge.files() - .select.any() - .then((files) => { - if (files.length !== 1) { - return; - } - this.recentImport = Date.now(); - this.parent - .ilc() - .services.system.history.import(files[0].filename) - .then(() => { - this.filtered = -4; - this.list().update(); - this.parent.detectChanges(); - }) - .catch((err: Error) => { - notifications.notify( - new Notification({ - message: this.parent - .log() - .error(`Fail import filters/charts: ${err.message}`), - session: this.session.uuid(), - actions: [], - }), - ); - }); - }) - .catch((err: Error) => { - notifications.notify( - new Notification({ - message: this.parent - .log() - .error(`Fail open file to import filters/charts: ${err.message}`), - session: this.session.uuid(), - actions: [], - }), - ); - }); - } - - public update(): State { - const groups: SuitableGroup[] = (() => { - switch (this.filtered) { - case -4: - return [ - { - caption: 'Recently Added', - rank: 0, - collections: - this.recentImport !== undefined - ? this.history.find().byTimeStamp(this.recentImport) - : this.history.find().all(), - }, - ]; - case -3: - return [{ caption: 'All', rank: 0, collections: this.history.find().all() }]; - case -2: - return this.history.find().suitable().asGroups(); - case -1: - return [ - { - caption: 'All Named Presets', - rank: 0, - collections: this.history.find().named(), - }, - ]; - default: - return this.history.find().suitable().asGroups(); - } - })(); - if (this.filtered < 0) { - this.groups = groups; - return this; - } - const unnamed: SuitableGroup = { caption: 'Unnamed group', rank: 1000, collections: [] }; - this.groups = []; - groups.forEach((group) => { - if (group.caption !== undefined) { - this.groups.push(group); - } else { - unnamed.collections = unnamed.collections.concat(group.collections); - } - }); - if (unnamed.collections.length > 0) { - this.groups.push(unnamed); - } - this.groups = this.groups.filter((g) => g.rank === this.filtered); - this.selected = {}; - this.groups.forEach((group) => { - group.collections.forEach((col) => { - this.selected[col.uuid] = false; - }); - }); - return this; - } - - public list(): State { - const suitable = this.history.find().suitable(); - const groups = suitable.asGroups(); - this.filters = [ - ...(this.recentImport === undefined ? [] : [{ caption: 'Recently Added', value: -4 }]), - { caption: 'All', value: -3 }, - { caption: 'All Suitable', value: -2 }, - { caption: 'Named Presets', value: -1 }, - ]; - const unnamed: SuitableGroup = { caption: 'Unnamed group', rank: 1000, collections: [] }; - groups.forEach((group) => { - if (group.caption !== undefined) { - this.filters.push({ caption: group.caption, value: group.rank }); - } else { - unnamed.collections = unnamed.collections.concat(group.collections); - } - }); - if (unnamed.collections.length > 0) { - this.filters.push({ caption: 'Unnamed group', value: 1000 }); - } - return this; - } -} diff --git a/application/client/src/app/ui/views/toolbar/history/styles.less b/application/client/src/app/ui/views/toolbar/history/styles.less deleted file mode 100644 index 4337f27b1a..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/styles.less +++ /dev/null @@ -1,63 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - width: 100%; - position: absolute; - height: 100%; - overflow: hidden; - & div.sorting { - position: absolute; - top: 0; - right: 16px; - height: 42px; - background: var(--scheme-color-5-lighten-15); - padding: 3px 12px 6px 12px; - } - & div.controlls { - position: absolute; - bottom: 0; - right: 0; - padding: 6px 0 6px 12px; - background: var(--scheme-color-5-lighten-15); - & button { - margin-right: 12px; - color: var(--scheme-color-0); - } - } - & div.collection { - position: relative; - & div.selection { - position: absolute; - width: 24px; - height: 24px; - top: 0; - padding: 4px; - right: 0; - border-radius: 8px; - background: var(--scheme-color-5-lighten-15); - box-shadow: 3px 3px 3px rgba(0,0,0,0.4); - - } - } - & div.list { - width: 100%; - position: absolute; - height: 100%; - overflow-x: hidden; - overflow-y: auto; - & p.no-content { - margin: 12px 12px 0px 12px; - border-bottom: dotted thin var(--scheme-color-4); - padding-bottom: 3px; - } - & div.group { - width: 100%; - display: flex; - flex-direction: row; - flex-wrap: wrap; - & div.collections{ - position: relative; - } - } - } -} diff --git a/application/client/src/app/ui/views/toolbar/history/template.html b/application/client/src/app/ui/views/toolbar/history/template.html deleted file mode 100644 index 78f2099530..0000000000 --- a/application/client/src/app/ui/views/toolbar/history/template.html +++ /dev/null @@ -1,32 +0,0 @@ -
    -

    No recently used filters

    -
    -

    {{group.caption}}

    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    - - - -
    -
    - - List filter - - - {{option.caption}} - - - -
    diff --git a/application/client/src/app/ui/views/toolbar/module.ts b/application/client/src/app/ui/views/toolbar/module.ts deleted file mode 100644 index 4cb9868fda..0000000000 --- a/application/client/src/app/ui/views/toolbar/module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { SearchModule } from './search/module'; -import { HistoryModule } from './history/module'; -import { DetailsModule } from './details/module'; -import { ChartModule } from './chart/module'; - -@NgModule({ - imports: [CommonModule, SearchModule, HistoryModule, ChartModule, DetailsModule], - declarations: [], - exports: [SearchModule, HistoryModule, ChartModule, DetailsModule], - bootstrap: [], -}) -export class ToolbarModule {} diff --git a/application/client/src/app/ui/views/toolbar/search/component.ts b/application/client/src/app/ui/views/toolbar/search/component.ts deleted file mode 100644 index b133724763..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/component.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { - Component, - Input, - AfterContentInit, - ChangeDetectorRef, - ChangeDetectionStrategy, -} from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { Service } from '@elements/scrollarea/controllers/service'; -import { Columns } from '@schema/render/columns'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-views-search', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Initial() -@Ilc() -export class ViewSearch extends ChangesDetector implements AfterContentInit { - @Input() public session!: Session; - - public service!: Service; - public columns: Columns | undefined; - public nested!: boolean; - - constructor(chRef: ChangeDetectorRef) { - super(chRef); - } - - public ngAfterContentInit(): void { - this.nested = this.session.search.state().nested().visible(); - this.env().subscriber.register( - this.session.search.state().subjects.nested.subscribe((visible: boolean) => { - this.nested = visible; - this.detectChanges(); - }), - this.ilc().services.system.hotkeys.listen('Ctrl + Shift + F', () => { - this.session.search.state().nested().toggle(); - }), - ); - } -} -export interface ViewSearch extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/search/input/active.ts b/application/client/src/app/ui/views/toolbar/search/input/active.ts deleted file mode 100644 index 7daf632d14..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/input/active.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { IFilter } from '@platform/types/filter'; -import { Search } from '@service/session/dependencies/search'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; -import { DisabledRequest } from '@service/session/dependencies/search/disabled/request'; -import { ChartRequest } from '@service/session/dependencies/search/charts/request'; - -export class ActiveSearch { - public filter: IFilter; - protected readonly search: Search; - - constructor(search: Search, filter: IFilter) { - this.filter = filter; - this.search = search; - } - - public apply(): Promise { - return this.search.state().setActive(this.filter); - } - - public isPossibleToSaveAsFilter(): boolean { - const request = new FilterRequest({ filter: this.filter }); - return ( - !this.search.store().filters().has(request) && - !this.search.store().disabled().has(new DisabledRequest(request)) - ); - } - - public isPossibleToSaveAsChart(): boolean { - const request = new ChartRequest({ filter: this.filter.filter }); - return ( - !this.search.store().charts().has(request) && - !this.search.store().disabled().has(new DisabledRequest(request)) - ); - } -} diff --git a/application/client/src/app/ui/views/toolbar/search/input/component.ts b/application/client/src/app/ui/views/toolbar/search/input/component.ts deleted file mode 100644 index 97e898d0ea..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/input/component.ts +++ /dev/null @@ -1,226 +0,0 @@ -import { - Component, - OnDestroy, - ViewChild, - Input, - AfterContentInit, - AfterViewInit, - ChangeDetectorRef, - ElementRef, - ViewEncapsulation, -} from '@angular/core'; -import { MatAutocompleteTrigger } from '@angular/material/autocomplete'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { SearchInput } from './input'; -import { List } from '@env/storages/recent/list'; -import { Progress } from './progress'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { ActiveSearch } from './active'; -import { Indexed } from '@service/session/dependencies/indexed'; -import { ISearchFinishEvent } from '@service/session/dependencies/search/state'; -import { Notification } from '@ui/service/notifications'; -import { IFilter } from '@platform/types/filter'; - -@Component({ - selector: 'app-views-search-input', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class ViewSearchInput - extends ChangesDetector - implements AfterViewInit, AfterContentInit, OnDestroy -{ - @Input() public session!: Session; - - @ViewChild('searchinput') searchInputRef!: ElementRef; - @ViewChild(MatAutocompleteTrigger) recentPanelRef!: MatAutocompleteTrigger; - - public readonly input = new SearchInput(); - public readonly recent: List; - public occupied: boolean = false; - public active: ActiveSearch | undefined; - public progress!: Progress; - public indexed!: Indexed; - - constructor(chRef: ChangeDetectorRef) { - super(chRef); - this.recent = new List(this.input.control, 'RecentFilters', 'recent_filters'); - } - - public ngOnDestroy(): void { - this.session.search.state().nonActive = this.input.getNonActive(); - this.input.destroy(); - this.progress.destroy(); - } - - public ngAfterContentInit(): void { - this.progress = new Progress(this.session, this.session.search.state().progress().search()); - this.indexed = this.session.indexed; - this.env().subscriber.register( - this.progress.updated.subscribe(() => { - this.detectChanges(); - }), - ); - this.env().subscriber.register( - this.ilc().channel.ui.toolbar.resize(() => { - this.toolbar().resized(); - }), - ); - this.env().subscriber.register( - this.input.error.updated.subscribe(() => { - this.detectChanges(); - }), - ); - this.env().subscriber.register( - this.session.search - .state() - .subjects.search.get() - .start.subscribe(() => { - this.progress.start(); - this.detectChanges(); - }), - ); - this.env().subscriber.register( - this.session.search - .state() - .subjects.search.get() - .finish.subscribe((result: ISearchFinishEvent) => { - this.progress.stop(); - this.detectChanges(); - if (result.error !== undefined) { - this.log().error(result.error); - this.ilc().services.ui.notifications.notify( - new Notification({ message: result.error, actions: [] }), - ); - } - }), - ); - this.env().subscriber.register( - this.session.search - .state() - .subjects.search.get() - .active.subscribe((filter: IFilter | undefined) => { - if (filter !== undefined) { - this.active = new ActiveSearch(this.session.search, filter); - this.input.drop(); - } else { - this.active = undefined; - } - }), - ); - this.env().subscriber.register( - this.ilc().services.system.hotkeys.listen('Ctrl + F', () => { - this.input.focus(); - }), - this.ilc().services.system.hotkeys.listen('/', () => { - this.input.focus(); - }), - ); - } - - public ngAfterViewInit(): void { - this.input.bind(this.searchInputRef.nativeElement, this.recentPanelRef); - this.input.actions.accept.subscribe(() => { - if (this.active === undefined || this.input.value.trim() !== '') { - const filter = this.input.asFilter(); - if (filter.filter.trim() === '') { - return; - } - this.recent.update(filter.filter); - this.session.search - .state() - .setActive(filter) - .catch((err: Error) => { - this.log().error(`Fail to accept search: ${err.message}`); - }) - .finally(() => { - this.markChangesForCheck(); - }); - } else if (this.active.isPossibleToSaveAsFilter()) { - this.onSaveAsFilter(); - } - }); - this.input.actions.drop.subscribe(() => { - this.drop(); - }); - this.input.actions.edit.subscribe(() => { - if (this.active === undefined) { - return; - } - this.input.set().value(this.active.filter); - this.drop(); - this.markChangesForCheck(); - }); - this.input.actions.recent.subscribe(() => { - this.markChangesForCheck(); - }); - this._restore(); - this.input.focus(); - } - - public drop() { - this.active = undefined; - this.session.search - .state() - .reset() - .search() - .catch((err: Error) => { - this.log().error(`Fail to drop a search: ${err.message}`); - }) - .finally(() => { - this.markChangesForCheck(); - }); - } - - public onSaveAsFilter(): void { - if (this.active === undefined) { - return; - } - this.session.search.store().filters().addFromFilter(this.active.filter); - this.drop(); - } - - public onSaveAsChart(): void { - if (this.active === undefined) { - return; - } - this.session.search.store().charts().addFromFilter(this.active.filter); - this.drop(); - } - - protected toolbar(): { - resized(): void; - } { - return { - resized: (): void => { - this.ilc() - .services.ui.layout.toolbar() - .state( - (state: { - min: boolean; - max: boolean; - occupied: boolean; - size: number; - }) => { - this.occupied = state.occupied; - this.detectChanges(); - }, - ); - }, - }; - } - - private _restore() { - const active = this.session.search.state().getActive(); - if (active !== undefined) { - this.active = new ActiveSearch(this.session.search, active); - this.input.drop(); - } - this.input.set().value(this.session.search.state().nonActive); - } -} -export interface ViewSearchInput extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/search/input/error.ts b/application/client/src/app/ui/views/toolbar/search/input/error.ts deleted file mode 100644 index 29a88a8113..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/input/error.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { IFilter } from '@platform/types/filter'; -import { Subject } from '@platform/env/subscription'; -import { FilterRequest } from '@service/session/dependencies/search/filters/request'; - -export class ErrorHandler { - public updated: Subject = new Subject(); - public readonly filter: IFilter = { - filter: '', - flags: { - reg: true, - word: false, - cases: false, - }, - }; - - private _error: string | undefined; - - public destroy(): void { - this.updated.destroy(); - } - - public get error(): string | undefined { - return this.filter.flags.reg ? this._error : undefined; - } - - public hasError(): boolean { - return this.filter.flags.reg && this.error !== undefined; - } - - public isValidRegex(): boolean { - return this._error === undefined; - } - - public set(): { - value(value: string): void; - caseSensitive(value: boolean): void; - wholeWord(value: boolean): void; - regex(value: boolean): void; - } { - return { - value: (value: string) => { - this.filter.filter = value; - this._checkRegex(); - }, - caseSensitive: (value: boolean) => { - this.filter.flags.cases = value; - this._checkRegex(); - }, - wholeWord: (value: boolean) => { - this.filter.flags.word = value; - this._checkRegex(); - }, - regex: (value: boolean) => { - this.filter.flags.reg = value; - this._checkRegex(); - }, - }; - } - - public recentSelected(value: string) { - this.set().value(value); - } - - private _checkRegex() { - this._error = FilterRequest.getValidationError({ - filter: this.filter.filter, - flags: { - cases: this.filter.flags.cases, - word: this.filter.flags.word, - reg: true, - }, - }); - } -} diff --git a/application/client/src/app/ui/views/toolbar/search/input/input.ts b/application/client/src/app/ui/views/toolbar/search/input/input.ts deleted file mode 100644 index 6633e3c866..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/input/input.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { UntypedFormControl } from '@angular/forms'; -import { Subject } from '@platform/env/subscription'; -import { IFilter, IFilterFlags } from '@platform/types/filter'; -import { MatAutocompleteTrigger } from '@angular/material/autocomplete'; -import { ErrorHandler } from './error'; - -import * as obj from '@platform/env/obj'; - -export class SearchInput { - public readonly control: UntypedFormControl = new UntypedFormControl(); - public readonly error: ErrorHandler = new ErrorHandler(); - public ref!: HTMLInputElement; - public value: string = ''; - public readonly: boolean = false; - public focused: boolean = false; - public recent: boolean = false; - public flags: IFilterFlags = { - word: false, - cases: false, - reg: true, - }; - public actions: { - drop: Subject; - clear: Subject; - accept: Subject; - recent: Subject; - edit: Subject; - } = { - drop: new Subject(), - clear: new Subject(), - accept: new Subject(), - recent: new Subject(), - edit: new Subject(), - }; - - private _prev: string = ''; - private _panel!: MatAutocompleteTrigger; - - public destroy() { - this.actions.accept.destroy(); - this.actions.drop.destroy(); - this.actions.recent.destroy(); - this.actions.edit.destroy(); - this.actions.clear.destroy(); - this.error.destroy(); - } - - public bind(ref: HTMLInputElement, panel: MatAutocompleteTrigger) { - this.control.setValue(''); - this.ref = ref; - this._panel = panel; - } - - public focus() { - this.ref.focus(); - } - - public blur() { - this.ref.blur(); - } - - public isEmpty(): boolean { - return this.value.trim() === ''; - } - - public asFilter(): IFilter { - return { - filter: this.value, - flags: this.flags, - }; - } - - public getNonActive(): IFilter { - return { - filter: this.control.value, - flags: this.flags, - }; - } - - public keydown() { - this._prev = this.control.value; - } - - public keyup(event: KeyboardEvent) { - if (event.key === 'Escape') { - this.recent = false; - if (this.control.value.trim() !== '') { - this.drop(); - this.actions.clear.emit(); - } else { - this.actions.drop.emit(); - } - this.blur(); - } else if (event.key === 'Enter') { - if (this.recent) { - this.recent = false; - this._panel.closePanel(); - } - if (this.control.value.trim() === '') { - this.drop(); - this.actions.accept.emit(); - } else { - this.value = this.control.value; - this.error.set().value(this.control.value); - !this.error.hasError() && this.actions.accept.emit(); - } - } else if (event.key === 'Backspace' && this.control.value === '' && this._prev === '') { - this.actions.edit.emit(); - } else if ( - (this.control.value !== '' || event.key === 'ArrowUp' || event.key === 'ArrowDown') && - !this.recent - ) { - this.recent = true; - this._panel.openPanel(); - this.actions.recent.emit(); - } - this.error.set().value(this.control.value); - } - - public drop() { - this.control.setValue(''); - this.error.set().value(this.control.value); - this.value = ''; - this._prev = ''; - } - - public set(): { - value(value: string | IFilter): void; - caseSensitive(): void; - wholeWord(): void; - regex(): void; - } { - return { - value: (value: string | IFilter): void => { - if (typeof value === 'string') { - this.control.setValue(value); - this._prev = value; - } else { - this.control.setValue(value.filter); - this.flags = obj.clone(value.flags); - } - this.error.set().value(this.control.value); - }, - caseSensitive: () => { - this.flags.cases = !this.flags.cases; - this.error.set().caseSensitive(this.flags.cases); - }, - wholeWord: () => { - this.flags.word = !this.flags.word; - this.error.set().wholeWord(this.flags.word); - }, - regex: () => { - if (!this.flags.reg && !this.error.isValidRegex()) { - return; - } - this.flags.reg = !this.flags.reg; - this.error.set().regex(this.flags.reg); - }, - }; - } - - public onPanelClosed() { - this.recent = false; - } -} diff --git a/application/client/src/app/ui/views/toolbar/search/input/progress.ts b/application/client/src/app/ui/views/toolbar/search/input/progress.ts deleted file mode 100644 index 6082d79845..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/input/progress.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Session } from '@service/session'; -import { Subject, Subscriber } from '@platform/env/subscription'; - -export class Progress { - public working: boolean = false; - public readonly updated: Subject = new Subject(); - - private _session: Session; - private _subscriber: Subscriber = new Subscriber(); - - constructor(session: Session, working: boolean) { - this._session = session; - this.working = working; - this._subscriber.register( - this._session.search.subjects.get().updated.subscribe((_event) => { - this.updated.emit(); - }), - ); - } - - public destroy() { - this.updated.destroy(); - this._subscriber.unsubscribe(); - } - - public start() { - this.working = true; - } - - public stop() { - this.working = false; - } - - public visible(): boolean { - if (this._session.stream.len() === 0) { - return false; - } - if ( - this._session.search.store().filters().getActiveCount() > 0 || - this._session.search.state().hasActiveSearch() - ) { - return true; - } - return false; - } - - public summary(): string { - const total = this._session.stream.len(); - const found = this._session.search.len(); - return `${found} in ${total} (${((found / total) * 100).toFixed(2)}%)`; - } -} diff --git a/application/client/src/app/ui/views/toolbar/search/input/styles.less b/application/client/src/app/ui/views/toolbar/search/input/styles.less deleted file mode 100644 index 01d1ff7cd3..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/input/styles.less +++ /dev/null @@ -1,122 +0,0 @@ -@import '../../../../styles/variables.less'; - -app-views-search-input { - display: flex; - position: relative; - flex-direction: row; - height: 41px; - width: 100%; - background: var(--scheme-color-5); - overflow: hidden; - justify-content: center; - align-items: center; - div.input { - display: block; - flex: auto; - height: 24px; - overflow: hidden; - align-items: center; - padding-left: 6px; - } - div.flags, - div.extantions { - display: flex; - padding: 0px 8px 0 8px; - & span { - display: inline-block; - height: 24px; - width: 24px; - color: var(--scheme-color-0); - text-align: center; - padding-top: 4px; - box-sizing: border-box; - &:hover{ - background: var(--scheme-color-4); - } - &.active{ - background: var(--scheme-color-active); - } - &.invalid { - color: var(--scheme-color-error); - } - } - } - div.summary { - position: relative; - display: flex; - flex-direction: row; - align-items: center; - padding: 0 6px 0 0; - & mat-spinner { - margin-left: 6px; - } - & span.error { - display: flex; - align-items: center; - padding-right: 6px; - & span.message { - color: var(--scheme-color-error); - max-width: 150px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - & mat-icon { - color: var(--scheme-color-error); - height: 16px; - width: 16px; - font-size: 16px; - margin: 0 6px 0 1px; - line-height: 16px; - } - } - } - & span.active-filter { - position: relative; - display: flex; - flex-direction: row; - border-radius: 2px; - background: var(--scheme-color-active); - height: 20px; - overflow: hidden; - flex: none; - margin-right: 8px; - margin-left: -8px; - & span.filter { - position: relative; - display: inline-block; - padding: 5px 6px; - color: var(--scheme-color-0); - font-weight: 500; - } - & button { - height: 20px; - width: 20px; - padding: 0; - background: none; - border:none; - &.enabled { - &:hover{ - background: var(--scheme-color-4); - } - } - & mat-icon{ - height: 20px; - width: 20px; - font-size: 16px; - text-align: center; - color: var(--scheme-color-0); - padding-top: 2px; - &.disabled { - color: var(--scheme-color-2); - } - } - } - } - & span.small-icon-button.occupied { - font-size: 13px; - line-height: 13px; - padding-top: 6px; - } - -} diff --git a/application/client/src/app/ui/views/toolbar/search/input/template.html b/application/client/src/app/ui/views/toolbar/search/input/template.html deleted file mode 100644 index 472c4fc61a..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/input/template.html +++ /dev/null @@ -1,94 +0,0 @@ -
    - - - {{active.filter.filter}} - - - - - - - - - - - -
    -
    - - - -
    -
    - - error - {{input.error.error}} - - {{progress.summary()}} - -
    -
    - - -
    diff --git a/application/client/src/app/ui/views/toolbar/search/module.ts b/application/client/src/app/ui/views/toolbar/search/module.ts deleted file mode 100644 index f412aa54c6..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/module.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ViewSearch } from './component'; -import { ViewSearchInput } from './input/component'; -import { ViewSearchResults } from './results/component'; -import { ViewSearchNested } from './nested/component'; -import { ScrollAreaModule } from '@elements/scrollarea/module'; -import { ContainersModule } from '@elements/containers/module'; -import { AppDirectiviesModule } from '@directives/module'; - -import { MatIconModule } from '@angular/material/icon'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatOptionModule } from '@angular/material/core'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - ScrollAreaModule, - AppDirectiviesModule, - MatIconModule, - MatAutocompleteModule, - MatOptionModule, - MatFormFieldModule, - MatInputModule, - MatProgressBarModule, - MatProgressSpinnerModule, - FormsModule, - ReactiveFormsModule, - ], - declarations: [ViewSearch, ViewSearchInput, ViewSearchNested, ViewSearchResults], - exports: [ViewSearch], - bootstrap: [ViewSearch], -}) -export class SearchModule {} diff --git a/application/client/src/app/ui/views/toolbar/search/nested/component.ts b/application/client/src/app/ui/views/toolbar/search/nested/component.ts deleted file mode 100644 index bc810e9ed3..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/nested/component.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { - Component, - OnDestroy, - ViewChild, - Input, - AfterContentInit, - AfterViewInit, - ChangeDetectorRef, - ElementRef, - ViewEncapsulation, - HostListener, -} from '@angular/core'; -import { MatAutocompleteTrigger } from '@angular/material/autocomplete'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { SearchInput } from '../input/input'; -import { List } from '@env/storages/recent/list'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-views-search-nested', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class ViewSearchNested - extends ChangesDetector - implements AfterViewInit, AfterContentInit, OnDestroy -{ - @Input() public session!: Session; - - @ViewChild('searchinput') searchInputRef!: ElementRef; - @ViewChild(MatAutocompleteTrigger) recentPanelRef!: MatAutocompleteTrigger; - @HostListener('window:keydown', ['$event']) onKeyDown(event: KeyboardEvent) { - if (event.key === 'Escape') { - this.close(); - } - } - public readonly input = new SearchInput(); - public readonly recent: List; - public pendding: boolean = false; - public progress: boolean = false; - - protected action(action: Promise) { - this.pendding = true; - action - .catch((err: Error) => { - this.log().error(`Fail go to next/prev nested match: ${err.message}`); - }) - .finally(() => { - clearTimeout(tm); - this.progress = false; - this.pendding = false; - this.detectChanges(); - }); - // Show progress bar with delay to prevent showing it for quick done work - const tm = setTimeout(() => { - this.progress = true; - this.detectChanges(); - }, 250) as unknown as number; - } - constructor(chRef: ChangeDetectorRef) { - super(chRef); - this.recent = new List(this.input.control, 'RecentNestedFilters', 'recent_nested_filters'); - } - - public ngOnDestroy(): void { - this.session.search.state().nested().drop(); - this.input.destroy(); - } - - public ngAfterContentInit(): void { - this.env().subscriber.register( - this.ilc().services.system.hotkeys.listen(']', () => { - if (this.session.search.state().nested().get() === undefined) { - return; - } - this.next(); - }), - this.ilc().services.system.hotkeys.listen('[', () => { - if (this.session.search.state().nested().get() === undefined) { - return; - } - this.prev(); - }), - ); - } - - public ngAfterViewInit(): void { - this.input.bind(this.searchInputRef.nativeElement, this.recentPanelRef); - this.input.actions.accept.subscribe(() => { - const value = this.input.value.trim(); - if (value === '') { - this.drop(); - return; - } - const current = this.session.search.state().nested().get(); - if (current !== undefined && current.filter === value) { - this.next(); - return; - } - const filter = this.input.asFilter(); - this.recent.update(filter.filter); - this.session.search - .state() - .nested() - .set(filter) - .then((pos: number | undefined) => { - if (pos === undefined) { - return; - } - }); - }); - this.input.actions.drop.subscribe(() => { - this.drop(); - }); - this.input.actions.edit.subscribe(() => { - this.detectChanges(); - }); - this.input.actions.recent.subscribe(() => { - this.detectChanges(); - }); - this.input.focus(); - } - - public next() { - if (this.pendding) { - return; - } - this.action(this.session.search.state().nested().next()); - } - - public prev() { - if (this.pendding) { - return; - } - this.action(this.session.search.state().nested().prev()); - } - - public drop() { - this.session.search.state().nested().drop(); - } - - public close() { - this.session.search.state().nested().toggle(); - } -} -export interface ViewSearchNested extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/search/nested/styles.less b/application/client/src/app/ui/views/toolbar/search/nested/styles.less deleted file mode 100644 index 38f87405e9..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/nested/styles.less +++ /dev/null @@ -1,55 +0,0 @@ -@import '../../../../styles/variables.less'; - -app-views-search-nested { - display: flex; - position: relative; - flex-direction: row; - height: 32px; - width: 300px; - background: var(--scheme-color-5); - overflow: hidden; - justify-content: center; - align-items: center; - z-index: 1; - box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.4); - div.input { - display: block; - flex: auto; - height: 24px; - overflow: hidden; - align-items: center; - padding-left: 6px; - } - div.flags, - div.arrows { - display: flex; - padding: 0px 8px 0 8px; - align-items: center; - & span { - display: inline-block; - height: 24px; - width: 24px; - color: var(--scheme-color-0); - text-align: center; - padding-top: 4px; - box-sizing: border-box; - &:hover{ - background: var(--scheme-color-4); - } - &.active{ - background: var(--scheme-color-active); - } - &.invalid { - color: var(--scheme-color-error); - } - } - } - & span.progress { - position: absolute; - bottom: 0; - left:0; - width: 100%; - height: 2px; - overflow: hidden; - } -} diff --git a/application/client/src/app/ui/views/toolbar/search/nested/template.html b/application/client/src/app/ui/views/toolbar/search/nested/template.html deleted file mode 100644 index e39b9e7bbf..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/nested/template.html +++ /dev/null @@ -1,81 +0,0 @@ -
    - - - - - - - - -
    -
    - - - -
    -
    - - - -
    - - - diff --git a/application/client/src/app/ui/views/toolbar/search/results/backing.ts b/application/client/src/app/ui/views/toolbar/search/results/backing.ts deleted file mode 100644 index 1aa911f718..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/results/backing.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { Session } from '@service/session'; -import { IRowsPacket, Service } from '@elements/scrollarea/controllers/service'; -import { Range, IRange } from '@platform/types/range'; -import { Owner, RowSrc } from '@schema/content/row'; -import { GrabbedElement } from '@platform/types/bindings/miscellaneous'; -import { Nature } from '@platform/types/content'; - -const SCROLLAREA_SERVICE = 'search_scroll_area_service'; - -async function getRowFrom( - session: Session, - element: GrabbedElement, - elements: GrabbedElement[], - index: number, -): Promise { - const row: RowSrc = { - position: element.pos, - content: element.content, - session: session, - owner: Owner.Search, - source: - typeof element.source_id === 'string' - ? parseInt(element.source_id, 10) - : element.source_id, - nature: new Nature(element.nature), - }; - if (!row.nature.seporator) { - return row; - } - if (index > 0 && index < elements.length - 1) { - row.nature.hidden = elements[index + 1].pos - elements[index - 1].pos; - return row; - } - const around = await session.indexed.getIndexesAround(element.pos); - if (around.before !== undefined && around.after !== undefined) { - row.nature.hidden = around.after - around.before; - } else { - row.nature.hidden = - around.before !== undefined - ? element.pos - around.before - : around.after !== undefined - ? around.after - element.pos - : 0; - } - return row; -} -function getRows(session: Session, range: Range | IRange): Promise { - return new Promise((resolve, reject) => { - session.indexed - .grab(range) - .then(async (elements) => { - const rows = []; - for (let i = 0; i < elements.length; i += 1) { - rows.push(await getRowFrom(session, elements[i], elements, i)); - } - resolve({ rows, range }); - }) - .catch(reject); - }); -} - -export function getScrollAreaService(session: Session): Service { - const restored = session.storage.get(SCROLLAREA_SERVICE); - if (restored === undefined) { - const service = new Service({ - getRows: (range: Range) => { - return getRows(session, range); - }, - setFrame: (range: Range) => { - getRows(session, range) - .then((packet) => { - service.setRows(packet); - }) - .catch((err: Error) => { - throw new Error(`Fail get indexed chunk: ${err.message}`); - }); - }, - getLen: (): number => { - return session.indexed.len(); - }, - getItemHeight: (): number => { - return 16; - }, - }); - service.setLen(session.indexed.len()); - return service; - } else { - restored.setLen(session.indexed.len()); - return restored; - } -} - -export function setScrollAreaService(session: Session, service: Service) { - session.storage.set(SCROLLAREA_SERVICE, service); -} diff --git a/application/client/src/app/ui/views/toolbar/search/results/component.ts b/application/client/src/app/ui/views/toolbar/search/results/component.ts deleted file mode 100644 index 0df7a51507..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/results/component.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { Component, OnDestroy, ViewChild, Input, AfterContentInit } from '@angular/core'; -import { Session } from '@service/session'; -import { Owner } from '@schema/content/row'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { ScrollAreaComponent } from '@elements/scrollarea/component'; -import { Service } from '@elements/scrollarea/controllers/service'; -import { Columns } from '@schema/render/columns'; -import { getScrollAreaService, setScrollAreaService } from './backing'; - -enum PendingScroll { - Prev, - Next, - Unset, -} - -@Component({ - selector: 'app-views-search-results', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class ViewSearchResults implements AfterContentInit, OnDestroy { - @ViewChild(ScrollAreaComponent) scrollAreaComponent!: ScrollAreaComponent; - - @Input() public session!: Session; - - public service!: Service; - public columns: Columns | undefined; - - protected navigation: { - pending: PendingScroll; - } = { - pending: PendingScroll.Unset, - }; - - public ngOnDestroy(): void { - setScrollAreaService(this.session, this.service); - } - - public ngAfterContentInit(): void { - this.service = getScrollAreaService(this.session); - this.env().subscriber.register( - this.session.cursor.subjects.get().selected.subscribe((event) => { - if (this.session.search.len() === 0) { - return; - } - const single = this.session.cursor.getSingle().position(); - if (event.initiator === Owner.Search && single !== undefined) { - this.session.search - .nearest(single) - .then((location) => { - location !== undefined && - this.session.search.state().nested().setFrom(location.index); - }) - .catch((err: Error) => { - this.log().error(`Fail to get nearest content: ${err.message}`); - }); - return; - } else if (single !== undefined) { - this.session.search - .nearest(single) - .then((location) => { - if (location === undefined) { - return; - } - this.service.scrollTo(location.index - 2 < 0 ? 0 : location.index - 2); - this.service.refresh(); - }) - .catch((err: Error) => { - this.log().error(`Fail to get nearest content: ${err.message}`); - }); - } - }), - this.session.indexed.subjects.get().updated.subscribe((len: number) => { - this.service.setLen(len); - }), - this.session.indexed.subjects.get().changed.subscribe(() => { - this.service.refresh(); - }), - this.service.onBound(() => { - this.env().subscriber.register( - this.service.getFrame().onFrameChange(() => { - if (this.navigation.pending === PendingScroll.Unset) { - return; - } - const rows = this.service.getFrame().getRows(); - if (rows.length === 0) { - return; - } - this.session.cursor.select( - this.navigation.pending === PendingScroll.Next - ? rows[rows.length - 1].position - : rows[0].position, - Owner.Search, - undefined, - undefined, - ); - this.navigation.pending = PendingScroll.Unset; - }), - this.ilc().services.system.hotkeys.listen(']', () => { - if (this.session.search.state().nested().get() !== undefined) { - return; - } - this.move().next(); - }), - this.ilc().services.system.hotkeys.listen('[', () => { - if (this.session.search.state().nested().get() !== undefined) { - return; - } - this.move().prev(); - }), - this.ilc().services.system.hotkeys.listen('Ctrl + 2', () => { - this.service.focus().set(); - }), - ); - }), - ); - const bound = this.session.render.getBoundEntity(); - this.columns = bound instanceof Columns ? bound : undefined; - } - - protected move(): { - next(): void; - prev(): void; - top(): void; - bottom(): void; - } { - const frame = this.service.getFrame(); - const rows = frame.getRows(); - const range = frame.get(); - const selected = (() => { - if (this.session.indexed.len() === 0) { - return undefined; - } - if (rows.length === 0) { - return undefined; - } - const single = this.session.cursor.getSingle().position(); - if (single === undefined) { - this.session.cursor.select(rows[0].position, Owner.Search, undefined, undefined); - return undefined; - } - const selected = rows.findIndex((r) => r.position === single); - return selected !== -1 ? selected : undefined; - })(); - return { - next: (): void => { - if (selected === undefined) { - return; - } - if (selected < rows.length - 1) { - this.session.cursor.select( - rows[selected + 1].position, - Owner.Search, - undefined, - undefined, - ); - return; - } - if ( - range.start + 1 >= this.service.getLen() - 1 || - range.end >= this.service.getLen() - 1 - ) { - return; - } - this.navigation.pending = PendingScroll.Next; - this.service.scrollTo(range.start + 1); - }, - prev: (): void => { - if (selected === undefined) { - return; - } - if (rows[selected] === undefined) { - return; - } - if (selected >= 1) { - this.session.cursor.select( - rows[selected - 1].position, - Owner.Search, - undefined, - undefined, - ); - return; - } - if (range.start === 0) { - return; - } - this.navigation.pending = PendingScroll.Prev; - this.service.scrollTo(range.start - 1); - }, - top: (): void => { - this.service.getLen() > 0 && this.service.focus().get() && this.service.scrollTo(0); - }, - bottom: (): void => { - this.service.getLen() > 0 && - this.service.focus().get() && - this.service.scrollTo(this.service.getLen()); - }, - }; - } -} -export interface ViewSearchResults extends IlcInterface {} diff --git a/application/client/src/app/ui/views/toolbar/search/results/styles.less b/application/client/src/app/ui/views/toolbar/search/results/styles.less deleted file mode 100644 index 5055446c5b..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/results/styles.less +++ /dev/null @@ -1,9 +0,0 @@ -@import '../../../../styles/variables.less'; - -:host { - display: block; - position: relative; - height: 100%; - width: 100%; - background: var(--scheme-color-5); -} diff --git a/application/client/src/app/ui/views/toolbar/search/results/template.html b/application/client/src/app/ui/views/toolbar/search/results/template.html deleted file mode 100644 index 2360baa5d6..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/results/template.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/application/client/src/app/ui/views/toolbar/search/styles.less b/application/client/src/app/ui/views/toolbar/search/styles.less deleted file mode 100644 index 0bb9ad3b53..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/styles.less +++ /dev/null @@ -1,22 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - display: flex; - position: absolute; - flex-direction: column; - height: 100%; - width: 100%; - background: var(--scheme-color-5); - overflow: hidden; - & app-views-search-input { - position: relative; - } - & app-views-search-nested { - position: absolute; - right: 17px; - top: 42px; - } - & app-views-search-results { - flex: auto; - } -} diff --git a/application/client/src/app/ui/views/toolbar/search/template.html b/application/client/src/app/ui/views/toolbar/search/template.html deleted file mode 100644 index c8ed9b1a46..0000000000 --- a/application/client/src/app/ui/views/toolbar/search/template.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/application/client/src/app/ui/views/workspace/backing.ts b/application/client/src/app/ui/views/workspace/backing.ts deleted file mode 100644 index db96f131d7..0000000000 --- a/application/client/src/app/ui/views/workspace/backing.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Session } from '@service/session'; -import { IRowsPacket, Service } from '@elements/scrollarea/controllers/service'; -import { Range } from '@platform/types/range'; -import { Owner, RowSrc } from '@schema/content/row'; -import { Nature } from '@platform/types/content'; - -const SCROLLAREA_SERVICE = 'workspace_scroll_area_service'; - -function getRows(session: Session, range: Range): Promise { - return new Promise((resolve, reject) => { - session.stream - .chunk(range) - .then((rows) => { - const converted: RowSrc[] = rows.map((row) => { - return { - position: row.pos, - content: row.content, - session, - owner: Owner.Output, - source: - typeof row.source_id === 'string' - ? parseInt(row.source_id, 10) - : row.source_id, - nature: new Nature(row.nature), - }; - }); - session.cursor.recent(converted); - resolve({ - rows: converted, - range, - }); - }) - .catch(reject); - }); -} -export function getScrollAreaService(session: Session): Service { - const restored = session.storage.get(SCROLLAREA_SERVICE); - if (restored === undefined) { - const service = new Service({ - getRows: (range: Range) => { - return getRows(session, range); - }, - setFrame: (range: Range) => { - getRows(session, range) - .then((packet) => { - session.cursor.frame().set(range.asObj()); - service.setRows(packet); - }) - .catch((err: Error) => { - throw new Error(`Fail get chunk: ${err.message}`); - }); - }, - getLen: (): number => { - return session.stream.len(); - }, - getItemHeight: (): number => { - return 16; - }, - }); - service.setLen(session.stream.len()); - return service; - } else { - restored.setLen(session.stream.len()); - return restored; - } -} - -export function setScrollAreaService(session: Session, service: Service) { - session.storage.set(SCROLLAREA_SERVICE, service); -} diff --git a/application/client/src/app/ui/views/workspace/component.ts b/application/client/src/app/ui/views/workspace/component.ts deleted file mode 100644 index 457ef14ac2..0000000000 --- a/application/client/src/app/ui/views/workspace/component.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { Component, OnDestroy, ViewChild, Input, AfterContentInit } from '@angular/core'; -import { Session } from '@service/session'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Initial } from '@env/decorators/initial'; -import { ScrollAreaComponent } from '@elements/scrollarea/component'; -import { Service } from '@elements/scrollarea/controllers/service'; -import { getScrollAreaService, setScrollAreaService } from './backing'; -import { Columns } from '@schema/render/columns'; -import { Owner } from '@schema/content/row'; -import { ColumnsHeaders } from './headers/component'; -import { Notification } from '@ui/service/notifications'; - -@Component({ - selector: 'app-views-workspace', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Initial() -@Ilc() -export class ViewWorkspace implements AfterContentInit, OnDestroy { - @ViewChild(ScrollAreaComponent) scrollAreaComponent!: ScrollAreaComponent; - @ViewChild('headers') headers!: ColumnsHeaders; - - @Input() public session!: Session; - - public service!: Service; - public columns: Columns | undefined; - - public ngOnDestroy(): void { - setScrollAreaService(this.session, this.service); - } - - public ngAfterContentInit(): void { - this.service = getScrollAreaService(this.session); - const bound = this.session.render.getBoundEntity(); - this.columns = bound instanceof Columns ? bound : undefined; - this.env().subscriber.register( - this.session.getTabAPI().subjects.onTitleContextMenu.subscribe((event: MouseEvent) => { - const filename = this.session.stream.observe().getSourceFileName(); - this.ilc().emitter.ui.contextmenu.open({ - items: [ - { - caption: 'Generate CLI command', - disabled: !this.session.cli.isSupported(), - handler: async () => { - const command = await this.session.cli.generate(); - if (command === undefined) { - this.ilc().services.ui.notifications.notify( - new Notification({ - message: - 'Fail to generate CLI command for this session', - actions: [], - }), - ); - } else { - navigator.clipboard.writeText(command); - this.ilc().services.ui.notifications.notify( - new Notification({ - message: 'CLI command has been copied into clipboard', - actions: [], - }), - ); - } - }, - }, - {}, - { - caption: 'Copy Path', - disabled: filename === undefined, - handler: () => { - if (!filename) { - return; - } - this.ilc() - .services.system.bridge.files() - .name(filename) - .then((info) => { - navigator.clipboard.writeText(info.parent); - }) - .catch((err: Error) => { - this.log().error( - `Fail get file info for ${filename}: ${err.message}`, - ); - }); - }, - }, - { - caption: 'Copy Full Path', - disabled: filename === undefined, - handler: () => { - filename && navigator.clipboard.writeText(filename); - }, - }, - { - caption: 'Copy File Name', - disabled: filename === undefined, - handler: () => { - if (!filename) { - return; - } - this.ilc() - .services.system.bridge.files() - .name(filename) - .then((info) => { - navigator.clipboard.writeText(info.name); - }) - .catch((err: Error) => { - this.log().error( - `Fail get file info for ${filename}: ${err.message}`, - ); - }); - }, - }, - {}, - { - caption: 'Open Containing Folder', - disabled: filename === undefined, - handler: () => { - if (!filename) { - return; - } - this.ilc() - .services.system.bridge.files() - .name(filename) - .then((info) => { - this.ilc() - .services.system.bridge.folders() - .open(info.parent) - .catch((err: Error) => { - this.log().error(`Fail to open: ${err.message}`); - }); - }) - .catch((err: Error) => { - this.log().error( - `Fail get file info for ${filename}: ${err.message}`, - ); - }); - }, - }, - {}, - { - caption: 'Close', - disabled: false, - handler: () => { - this.session.close(); - }, - }, - ], - x: event.x, - y: event.y, - }); - }), - this.session.stream.subjects.get().updated.subscribe((len: number) => { - this.service.setLen(len); - }), - this.session.cursor.subjects.get().selected.subscribe((event) => { - if (event.initiator === Owner.Output) { - return; - } - this.service.scrollTo(event.row); - }), - this.service.onBound(() => { - this.service.setAdhered(!this.session.stream.observe().isFileSource()); - this.env().subscriber.register( - this.ilc().services.system.hotkeys.listen('Ctrl + 1', () => { - this.service.focus().set(); - }), - ); - }), - this.ilc().services.system.hotkeys.listen('Ctrl + W', () => { - this.session.close(); - }), - this.ilc().services.system.hotkeys.listen('Ctrl + F', () => { - this.session.switch().toolbar.search(); - }), - this.ilc().services.system.hotkeys.listen('/', () => { - this.session.switch().toolbar.search(); - }), - this.ilc().services.system.hotkeys.listen('Shift + Ctrl + P', () => { - this.session.switch().toolbar.presets(); - }), - this.ilc().services.system.hotkeys.listen('Ctrl + 2', () => { - this.session.switch().toolbar.search(); - }), - ); - } - - public onHorizontalScrolling(offset: number): void { - if (this.headers === undefined || this.headers === null) { - return; - } - this.headers.setOffset(offset); - } - - protected move(): { - top(): void; - bottom(): void; - } { - return { - top: (): void => { - this.service.getLen() > 0 && this.service.focus().get() && this.service.scrollTo(0); - }, - bottom: (): void => { - this.service.getLen() > 0 && - this.service.focus().get() && - this.service.scrollTo(this.service.getLen()); - }, - }; - } -} -export interface ViewWorkspace extends IlcInterface {} diff --git a/application/client/src/app/ui/views/workspace/headers/component.ts b/application/client/src/app/ui/views/workspace/headers/component.ts deleted file mode 100644 index 26d88645c6..0000000000 --- a/application/client/src/app/ui/views/workspace/headers/component.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { - Component, - Input, - ChangeDetectionStrategy, - ChangeDetectorRef, - AfterContentInit, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Columns, Header } from '@schema/render/columns'; -import { Session } from '@service/session'; -import { contextmenu } from '@ui/service/contextmenu'; -import { LimittedValue } from '@ui/env/entities/value.limited'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Direction } from '@directives/resizer'; -import { ViewWorkspaceHeadersMenuComponent } from './menu/component'; - -class RenderedHeader { - public caption: string; - public styles: { [key: string]: string } = {}; - public width: LimittedValue | undefined; - public color: string | undefined; - public index: number; - - private _ref: Header; - - constructor(ref: Header) { - this._ref = ref; - this.caption = ref.caption; - this.width = ref.width; - this.color = ref.color; - this.width !== undefined && this.resize(this.width.value); - this.index = ref.index; - } - - public resize(width: number) { - if (this._ref.width === undefined || this.width === undefined) { - return; - } - this._ref.width.set(width); - this.styles = { - width: `${this.width.value}px`, - minWidth: `${this.width.value}px`, - }; - } -} - -@Component({ - selector: 'app-scrollarea-row-columns-headers', - styleUrls: ['./styles.less'], - templateUrl: './template.html', - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -@Ilc() -export class ColumnsHeaders extends ChangesDetector implements AfterContentInit { - protected load(): void { - this.headers = this.controller - .get() - .visible() - .map((h) => new RenderedHeader(h)); - } - - public readonly Direction = Direction; - public offset: number = 0; - - @Input() public controller!: Columns; - @Input() public session!: Session; - - public headers: RenderedHeader[] = []; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.env().subscriber.register( - this.session.stream.subjects.get().rank.subscribe(() => { - this.detectChanges(); - }), - this.controller.subjects.get().visibility.subscribe(() => { - this.load(); - this.detectChanges(); - }), - this.controller.subjects.get().restored.subscribe(() => { - this.load(); - this.detectChanges(); - }), - ); - this.load(); - } - - public contextmenu(event: MouseEvent, index: number): void { - contextmenu.show({ - component: { - factory: ViewWorkspaceHeadersMenuComponent, - inputs: { - index, - controller: this.controller, - }, - }, - x: event.pageX, - y: event.pageY, - }); - } - - public ngGetOffsetStyle(): { [key: string]: string } { - return { - width: `${this.session.stream.rank.width()}px`, - minWidth: `${this.session.stream.rank.width()}px`, - marginLeft: `-${this.offset}px`, - }; - } - - public ngResize(width: number, header: RenderedHeader) { - header.resize(width); - this.controller.width(header.index).set(width); - this.detectChanges(); - } - - public setOffset(left: number): void { - this.offset = left; - this.detectChanges(); - } -} -export interface ColumnsHeaders extends IlcInterface {} diff --git a/application/client/src/app/ui/views/workspace/headers/menu/component.ts b/application/client/src/app/ui/views/workspace/headers/menu/component.ts deleted file mode 100644 index ddf696ffbb..0000000000 --- a/application/client/src/app/ui/views/workspace/headers/menu/component.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { - ChangeDetectionStrategy, - ChangeDetectorRef, - Component, - Input, - SimpleChange, - AfterContentInit, -} from '@angular/core'; -import { Columns } from '@schema/render/columns'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { CColors } from '@ui/styles/colors'; - -@Component({ - selector: 'app-scrollarea-rows-columns-headers-context-menu', - styleUrls: ['./styles.less'], - templateUrl: './template.html', - changeDetection: ChangeDetectionStrategy.OnPush, - standalone: false, -}) -export class ViewWorkspaceHeadersMenuComponent extends ChangesDetector implements AfterContentInit { - protected clickOnCheckbox: boolean = false; - protected switch(index: number): void { - this.index = index; - const header = this.controller.get().byIndex(index); - this.color = header === undefined ? undefined : header.color; - } - - public colors: string[] = CColors; - public color: string | undefined; - - @Input() public index!: number; - @Input() public controller!: Columns; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngAfterContentInit(): void { - this.switch(this.index); - } - - public ngOnContainerClick(index: number): void { - if (this.clickOnCheckbox) { - this.clickOnCheckbox = false; - return; - } - this.switch(index); - this.detectChanges(); - } - - public ngOnCheckboxClick(): void { - this.clickOnCheckbox = true; - } - - public ngOnCheckboxChange(event: SimpleChange, index: number): void { - this.controller.visibility(index).set(event as unknown as boolean); - this.detectChanges(); - } - - public ngOnColorClick(color: string): void { - this.controller.color(this.index).set(color === CColors[0] ? undefined : color); - this.switch(this.index); - this.detectChanges(); - } - - public isColorSelected(color: string): boolean { - if (this.color === undefined && color === CColors[0]) { - return true; - } - return this.color === color; - } - - public reset() { - this.controller.reset(); - this.switch(this.index); - this.detectChanges(); - } -} diff --git a/application/client/src/app/ui/views/workspace/headers/menu/styles.less b/application/client/src/app/ui/views/workspace/headers/menu/styles.less deleted file mode 100644 index a5111c68a1..0000000000 --- a/application/client/src/app/ui/views/workspace/headers/menu/styles.less +++ /dev/null @@ -1,100 +0,0 @@ -@import '../../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - flex-direction: row; - padding: 8px; - & ul.columns{ - position: relative; - display: block; - padding: 0; - margin: 0; - margin-right: 28px; - list-style: none; - & li.column{ - position: relative; - display: block; - padding: 4px 10px 0px 6px; - margin: 0; - list-style: none; - width: 100%; - white-space: nowrap; - &:hover{ - background: var(--scheme-color-4); - } - &.selected { - &::after{ - position: absolute; - display: block; - content: ''; - width: 2px; - left: -2px; - top: 0; - height: 100%; - background: var(--scheme-color-accent); - } - } - - } - } - & div.controls { - position: relative; - display: flex; - flex-direction: column; - & ul.colors{ - position: relative; - display: block; - padding: 0; - margin: 0; - list-style: none; - width: 104px; - white-space: normal; - flex: auto; - & li.color{ - position: relative; - display: inline-block; - height: 22px; - width: 22px; - margin: 0 4px 2px 0; - padding: 0; - list-style: none; - line-height: 0; - box-sizing: border-box; - vertical-align: top; - &:hover, - &.selected { - border: 1px solid var(--scheme-color-0); - &::after{ - position: absolute; - content: ''; - top:0; - left:0; - width: 0; - height: 0; - border-top: 6px solid var(--scheme-color-0); - border-right: 6px solid transparent; - } - &:hover{ - &::after{ - display: none; - } - } - } - } - } - & div.buttons { - text-align: right; - } - } - - & span.label { - position: relative; - display: inline-block; - padding: 2px 0px 0px 4px; - cursor: default; - color: var(--scheme-color-1); - vertical-align: top; - } -} - diff --git a/application/client/src/app/ui/views/workspace/headers/menu/template.html b/application/client/src/app/ui/views/workspace/headers/menu/template.html deleted file mode 100644 index 26c49fe6bb..0000000000 --- a/application/client/src/app/ui/views/workspace/headers/menu/template.html +++ /dev/null @@ -1,29 +0,0 @@ -
      -
    • - - - {{header.value.caption}} - -
    • -
    -
    -
      -
    • -
    • -
    -
    - -
    -
    diff --git a/application/client/src/app/ui/views/workspace/headers/styles.less b/application/client/src/app/ui/views/workspace/headers/styles.less deleted file mode 100644 index 34ddce787d..0000000000 --- a/application/client/src/app/ui/views/workspace/headers/styles.less +++ /dev/null @@ -1,49 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - display: flex; - flex-direction: row; - position: relative; - font-family: 'console', monospace; - font-size: 13.5px; - font-variant-numeric: tabular-nums; - padding: 0; - margin: 0; - line-height: 16px; - height: 16px; - max-height: 16px; - color: var(--scheme-color-2); - font-weight: 500; - user-select: none; - cursor: default; - span.header { - display: block; - position: relative; - overflow: hidden; - padding: 0 12px; - color: var(--scheme-color-2); - border-left: thin solid var(--scheme-color-3); - } - & span:nth-child(2) { - border-left: none; - } - span.offset { - display: block; - } - span.resizer { - position: absolute; - display: block; - width: 4px; - right: 0px; - top: 0; - height: 100%; - cursor: e-resize; - } - & mat-icon.more { - position: relative; - float: right; - margin-top: -24px; - color: var(--scheme-color-0); - background-color: var(--scheme-color-5); - } -} diff --git a/application/client/src/app/ui/views/workspace/headers/template.html b/application/client/src/app/ui/views/workspace/headers/template.html deleted file mode 100644 index 249137daec..0000000000 --- a/application/client/src/app/ui/views/workspace/headers/template.html +++ /dev/null @@ -1,16 +0,0 @@ - - - {{header.caption}} - - diff --git a/application/client/src/app/ui/views/workspace/map/component.ts b/application/client/src/app/ui/views/workspace/map/component.ts deleted file mode 100644 index 5a1969988b..0000000000 --- a/application/client/src/app/ui/views/workspace/map/component.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { - Component, - Input, - AfterViewInit, - ViewChild, - ElementRef, - ChangeDetectorRef, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Session } from '@service/session'; -import { State } from './state'; -import { ChangesDetector } from '@ui/env/extentions/changes'; - -@Component({ - selector: 'app-views-content-map', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class ViewContentMapComponent extends ChangesDetector implements AfterViewInit { - @ViewChild('canvas') canvasElementRef!: ElementRef; - @Input() public session!: Session; - - public state: State = new State(); - - constructor(cdRef: ChangeDetectorRef, private elRef: ElementRef) { - super(cdRef); - } - - public ngAfterViewInit(): void { - this.state.init( - this.session, - this.elRef.nativeElement, - this.canvasElementRef.nativeElement, - this.detectChanges.bind(this), - ); - this.env().subscriber.register( - this.session.search.subjects.get().updated.subscribe((_event) => { - this.state.update(); - }), - ); - this.env().subscriber.register( - this.session.search - .store() - .filters() - .subjects.get() - .highlights.subscribe(() => { - this.state.draw(); - }), - ); - this.ilc().channel.ui.toolbar.resize(() => { - this.state.resize().update(); - }); - } -} -export interface ViewContentMapComponent extends IlcInterface {} diff --git a/application/client/src/app/ui/views/workspace/map/state.ts b/application/client/src/app/ui/views/workspace/map/state.ts deleted file mode 100644 index 9a246af535..0000000000 --- a/application/client/src/app/ui/views/workspace/map/state.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { ISearchMap } from '@platform/types/filter'; -import { Session } from '@service/session'; -import { styles } from '@ui/service/styles'; -import { settings } from '@service/settings'; - -export class State { - static COLUMN_WIDTH = 4; - - public width: number = 0; - public height: number = 0; - - protected session!: Session; - protected holderElementRef!: HTMLElement; - protected canvasElementRef!: HTMLCanvasElement; - protected context!: CanvasRenderingContext2D; - protected map: ISearchMap = []; - protected detectChanges!: () => void; - - public init( - session: Session, - holderElementRef: HTMLElement, - canvasElementRef: HTMLCanvasElement, - detectChanges: () => void, - ) { - this.session = session; - this.holderElementRef = holderElementRef; - this.canvasElementRef = canvasElementRef; - const context: CanvasRenderingContext2D | null = this.canvasElementRef.getContext('2d'); - if (context === null) { - throw new Error(`Fail to get access to canvas context`); - } - this.context = context; - this.detectChanges = detectChanges; - this.resize().update(); - } - - public update(): State { - if (this.height === 0) { - return this; - } - this.session.search - .getScaledMap(this.height) - .then((map) => { - this.map = map; - this.draw(); - }) - .catch((err: Error) => { - console.log(err); - }); - return this; - } - - public resize(): State { - this.detectChanges(); - const size = this.holderElementRef.getBoundingClientRect(); - this.height = size.height; - return this; - } - - public draw(): State { - const activeSearchMatchColor = - settings.defaults['general.colors.match'] === undefined - ? styles.colors().scheme_color_2 - : settings.defaults['general.colors.match']; - const filters = this.session.search - .store() - .filters() - .get() - .filter((f) => f.definition.active); - const isActive = this.session.search.state().getActive() !== undefined; - this.context.fillStyle = styles.colors().scheme_color_5; - this.context.fillRect(0, 0, this.width, this.height); - const scale = (() => { - if (this.map.length === 0 || this.height === 0) { - return 1; - } else if (this.map.length < this.height) { - return this.height / this.map.length; - } else { - return 1; - } - })(); - const indexes: { [key: number]: number } = {}; - if (isActive) { - this.width = State.COLUMN_WIDTH; - } else { - let index = 0; - this.map.forEach((value: number[][]) => { - value.forEach((matches) => { - if (indexes[matches[0]] === undefined) { - indexes[matches[0]] = index; - index += 1; - } - }); - }); - this.width = Object.keys(indexes).length * State.COLUMN_WIDTH; - } - this.context.fillRect(0, 0, this.width, this.height); - this.detectChanges(); - this.map.forEach((value: number[][], top: number) => { - value.forEach((matches) => { - if (isActive) { - this.context.fillStyle = activeSearchMatchColor; - } else { - const filter = filters[matches[0]]; - this.context.fillStyle = - filter === undefined - ? styles.colors().scheme_color_match - : filter.definition.colors.background; - } - this.context.fillRect( - isActive ? 0 : indexes[matches[0]] * State.COLUMN_WIDTH, - top * scale, - State.COLUMN_WIDTH, - scale, - ); - }); - }); - return this; - } -} diff --git a/application/client/src/app/ui/views/workspace/map/styles.less b/application/client/src/app/ui/views/workspace/map/styles.less deleted file mode 100644 index f87007745b..0000000000 --- a/application/client/src/app/ui/views/workspace/map/styles.less +++ /dev/null @@ -1,19 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: absolute; - width: fit-content; - height: 100%; - display: block; - top: 0; - right: 8px; - background: var(--scheme-color-7); - z-index: 1; - & canvas { - cursor: default; - position: relative; - display: block; - margin: 0; - padding: 0; - } -} diff --git a/application/client/src/app/ui/views/workspace/map/template.html b/application/client/src/app/ui/views/workspace/map/template.html deleted file mode 100644 index 3881c7acd7..0000000000 --- a/application/client/src/app/ui/views/workspace/map/template.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/application/client/src/app/ui/views/workspace/module.ts b/application/client/src/app/ui/views/workspace/module.ts deleted file mode 100644 index 8373d10a95..0000000000 --- a/application/client/src/app/ui/views/workspace/module.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ViewWorkspace } from './component'; -import { ViewContentMapComponent } from './map/component'; -import { ViewSdeComponent } from './sde/component'; -import { ViewWorkspaceTitleComponent } from './title/component'; -import { ViewWorkspaceHeadersMenuComponent } from './headers/menu/component'; -import { ColumnsHeaders } from './headers/component'; -import { ScrollAreaModule } from '@elements/scrollarea/module'; -import { ContainersModule } from '@elements/containers/module'; -import { AppDirectiviesModule } from '@directives/module'; -import { AutocompleteModule } from '@elements/autocomplete/module'; -import { AttachSourceMenuModule } from '@elements/menu.attachsource/module'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -@NgModule({ - imports: [ - CommonModule, - ContainersModule, - ScrollAreaModule, - AppDirectiviesModule, - AutocompleteModule, - MatMenuModule, - MatCheckboxModule, - MatDividerModule, - MatIconModule, - MatProgressBarModule, - MatProgressSpinnerModule, - MatButtonModule, - AttachSourceMenuModule, - FormsModule, - ReactiveFormsModule, - ], - declarations: [ - ViewWorkspace, - ViewContentMapComponent, - ColumnsHeaders, - ViewSdeComponent, - ViewWorkspaceHeadersMenuComponent, - ViewWorkspaceTitleComponent, - ], - exports: [ViewWorkspace], - bootstrap: [ViewWorkspace], -}) -export class WorkspaceModule {} diff --git a/application/client/src/app/ui/views/workspace/sde/component.ts b/application/client/src/app/ui/views/workspace/sde/component.ts deleted file mode 100644 index a11a403e29..0000000000 --- a/application/client/src/app/ui/views/workspace/sde/component.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { - Component, - Input, - AfterContentInit, - ChangeDetectorRef, - HostBinding, - ViewChild, - ViewEncapsulation, - OnDestroy, - SkipSelf, -} from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Session } from '@service/session'; -import { State } from './state'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { - AutocompleteInput, - Options as AutocompleteOptions, -} from '@elements/autocomplete/component'; -import { Subject } from '@platform/env/subscription'; -import { unique } from '@platform/env/sequence'; - -const SDE_STATE = unique(); - -@Component({ - selector: 'app-views-sde', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - encapsulation: ViewEncapsulation.None, - standalone: false, -}) -@Ilc() -export class ViewSdeComponent extends ChangesDetector implements AfterContentInit, OnDestroy { - @ViewChild('sde') public sdeInputRef!: AutocompleteInput; - - @Input() public session!: Session; - - @HostBinding('style.display') get cssDisplayProp() { - return this.state === undefined - ? 'none' - : this.state.operations.length > 0 - ? this.state.hidden - ? 'none' - : 'flex' - : 'none'; - } - public state!: State; - public options: AutocompleteOptions = { - name: 'SdeRecentList', - storage: 'sde_sent_recent', - defaults: '', - placeholder: 'Enter command/data to send', - label: 'Data to send', - recent: new Subject(), - }; - - constructor(@SkipSelf() selfCdRef: ChangeDetectorRef, cdRef: ChangeDetectorRef) { - super([selfCdRef, cdRef]); - } - - public ngOnDestroy(): void { - this.state.destroy().catch((err: Error) => { - this.log().error(`Fail to drop state: ${err.message}`); - }); - this.session.storage.set(SDE_STATE, this.state); - } - - public ngAfterContentInit(): void { - const stored = this.session.storage.get(SDE_STATE); - this.state = stored !== undefined ? stored : new State(); - this.state.bind(this, this.session); - this.env().subscriber.register( - this.session.stream.subjects.get().finished.subscribe(() => { - this.detectChanges(); - }), - this.session.stream.subjects.get().started.subscribe(() => { - this.detectChanges(); - }), - ); - } - - public enter(): void { - const value = this.sdeInputRef.control.value; - this.state - .send(value) - .then(() => { - value.trim() !== '' && this.options.recent.emit(value); - }) - .finally(() => { - this.sdeInputRef.control.drop(); - }); - this.markChangesForCheck(); - } - - public panel(): void { - this.markChangesForCheck(); - } -} -export interface ViewSdeComponent extends IlcInterface {} diff --git a/application/client/src/app/ui/views/workspace/sde/state.ts b/application/client/src/app/ui/views/workspace/sde/state.ts deleted file mode 100644 index 50967b31cf..0000000000 --- a/application/client/src/app/ui/views/workspace/sde/state.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { Session } from '@service/session'; -import { IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { ObserveOperation } from '@service/session/dependencies/stream'; -import { IOriginDetails } from '@platform/types/observe'; -import { Destroyable } from '@platform/types/life/destroyable'; -import { Notification } from '@ui/service/notifications'; -import { getSourceColor } from '@ui/styles/colors'; - -export class State implements Destroyable { - protected ref: undefined | (IlcInterface & ChangesDetector); - protected session!: Session; - - public operations: ObserveOperation[] = []; - public progress: boolean = false; - public hidden: boolean = false; - public selected: ObserveOperation | undefined; - - public bind(ref: IlcInterface & ChangesDetector, session: Session): State { - this.ref = ref; - this.session = session; - ref.env().subscriber.register( - session.stream.sde.subjects.get().updated.subscribe(() => { - this.update(); - }), - session.stream.sde.subjects.get().selected.subscribe(() => { - this.update(); - }), - session.stream.sde.subjects.get().visibility.subscribe(() => { - if (this.session === undefined) { - return; - } - const sde = this.session.stream.sde; - this.hidden = sde.visibility().hidden(); - this.safe().updateRefComp(); - }), - ); - this.update(); - return this; - } - - public destroy(): Promise { - this.ref = undefined; - return Promise.resolve(); - } - - public isSelected(source: ObserveOperation): boolean { - const selection = this.session.stream.sde.selecting().get(); - return selection === undefined ? false : selection.uuid === source.uuid; - } - - public getSourceColor(source: ObserveOperation): string { - const id = this.session.stream.observe().descriptions.id(source.uuid); - return id === undefined ? '' : getSourceColor(id); - } - - public desc(source: ObserveOperation): IOriginDetails { - return source.asOrigin().desc(); - } - - public send(data: string): Promise { - const selected = this.session.stream.sde.selecting().get(); - if (selected === undefined) { - return Promise.resolve(); - } - this.progress = true; - this.safe().updateRefComp(); - return selected - .send() - .text(data) - .then(() => undefined) - .catch((err: Error) => { - this.safe().notify(err.message); - }) - .finally(() => { - this.progress = false; - this.safe().updateRefComp(); - }); - } - - public select(source: ObserveOperation | undefined): void { - this.session.stream.sde.selecting().select(source === undefined ? undefined : source.uuid); - this.selected = this.session.stream.sde.selecting().get(); - if (this.selected !== undefined) { - this.progress = this.selected.getSdeTasksCount() > 0; - } - this.safe().updateRefComp(); - } - - protected update(): void { - if (this.session === undefined) { - return; - } - const sde = this.session.stream.sde; - this.selected = sde.selecting().get(); - this.hidden = sde.visibility().hidden(); - this.operations = sde.get(); - if (this.selected !== undefined) { - this.progress = this.selected.getSdeTasksCount() > 0; - } - this.safe().updateRefComp(); - } - - protected safe(): { - updateRefComp(): void; - unsubscribe(): void; - error(msg: string): void; - notify(err: string): void; - } { - return { - updateRefComp: (): void => { - if (this.ref === undefined) { - return; - } - this.ref.detectChanges(); - }, - unsubscribe: (): void => { - if (this.ref === undefined) { - return; - } - this.ref.env().subscriber.unsubscribe(); - }, - error: (msg: string): void => { - if (this.ref === undefined) { - return; - } - this.ref.log().error(msg); - }, - notify: (err: string): void => { - if (this.ref === undefined) { - return; - } - this.ref.log().warn(err); - this.ref.ilc().services.ui.notifications.notify( - new Notification({ - message: err.replace('{"Sde":"', '').replace('"}', ''), - actions: [], - }), - ); - }, - }; - } -} diff --git a/application/client/src/app/ui/views/workspace/sde/styles.less b/application/client/src/app/ui/views/workspace/sde/styles.less deleted file mode 100644 index f9fa9fef0f..0000000000 --- a/application/client/src/app/ui/views/workspace/sde/styles.less +++ /dev/null @@ -1,87 +0,0 @@ -@import '../../../styles/variables.less'; - -app-views-sde { - position: relative; - display: flex; - align-items: center; - padding: 6px; - & div.container { - position: relative; - width: 100%; - display: flex; - align-items: center; - padding: 0; - & button { - margin-left: 6px; - & > span.label { - max-width: 128px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - } - & span.prompt{ - color: var(--scheme-color-1); - padding-left: 3px; - } - } - & mat-progress-bar { - position: absolute!important; - bottom: 2px!important; - height: 1px!important; - width: calc(100% - 12px)!important; - } -} - -.app-views-sde-list { - & button[mat-menu-item] { - & div.source { - position: relative; - margin-top: -7px; - & > span.marker { - display: block; - position: absolute; - width: 2px; - height: 24px; - left: -9px; - top: 7px; - content: ''; - } - & > span { - display: inline-block; - height: 16px; - line-height: 16px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - max-width: 250px; - } - & > span.minor { - position: relative; - display: block; - color: var(--scheme-color-3); - font-size: 10px; - margin-top: -8px; - white-space: nowrap; - direction: rtl; - max-width: 200px; - } - } - // &[data-selected="true"] { - // & div.source { - // &::before { - // display: block; - // position: absolute; - // width: 4px; - // height: 4px; - // border-radius: 2px; - // background: var(--scheme-color-accent); - // left: -9px; - // top: 7px; - // content: ''; - // } - // } - // } - } - -} diff --git a/application/client/src/app/ui/views/workspace/sde/template.html b/application/client/src/app/ui/views/workspace/sde/template.html deleted file mode 100644 index 552bf24662..0000000000 --- a/application/client/src/app/ui/views/workspace/sde/template.html +++ /dev/null @@ -1,29 +0,0 @@ -
    - - >> - -
    - - -

    Send command/data to:

    - -
    \ No newline at end of file diff --git a/application/client/src/app/ui/views/workspace/styles.less b/application/client/src/app/ui/views/workspace/styles.less deleted file mode 100644 index fcb6599403..0000000000 --- a/application/client/src/app/ui/views/workspace/styles.less +++ /dev/null @@ -1,18 +0,0 @@ -@import '../../styles/variables.less'; - -:host { - display: flex; - position: absolute; - flex-direction: column; - height: 100%; - width: 100%; - background: var(--scheme-color-5); - overflow: hidden; - & div { - position: relative; - overflow: hidden; - } - & div.content { - flex: auto; - } -} diff --git a/application/client/src/app/ui/views/workspace/template.html b/application/client/src/app/ui/views/workspace/template.html deleted file mode 100644 index 66d9196b29..0000000000 --- a/application/client/src/app/ui/views/workspace/template.html +++ /dev/null @@ -1,9 +0,0 @@ - -
    - -
    -
    - - -
    - diff --git a/application/client/src/app/ui/views/workspace/title/component.ts b/application/client/src/app/ui/views/workspace/title/component.ts deleted file mode 100644 index 44f5d2cfb4..0000000000 --- a/application/client/src/app/ui/views/workspace/title/component.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Component, Input, AfterContentInit, ChangeDetectorRef, OnDestroy } from '@angular/core'; -import { Ilc, IlcInterface } from '@env/decorators/component'; -import { Session } from '@service/session'; -import { State } from './state'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { unique } from '@platform/env/sequence'; - -const TITLE_STATE = unique(); - -@Component({ - selector: 'app-views-workspace-title', - templateUrl: './template.html', - styleUrls: ['./styles.less'], - standalone: false, -}) -@Ilc() -export class ViewWorkspaceTitleComponent - extends ChangesDetector - implements AfterContentInit, OnDestroy -{ - @Input() public session!: Session; - - public state!: State; - public title!: string; - - constructor(cdRef: ChangeDetectorRef) { - super(cdRef); - } - - public ngOnDestroy(): void { - this.state.destroy().catch((err: Error) => { - this.log().error(`Fail to drop state: ${err.message}`); - }); - this.session.storage.set(TITLE_STATE, this.state); - } - - public ngAfterContentInit(): void { - const stored = this.session.storage.get(TITLE_STATE); - this.state = stored !== undefined ? stored : new State(); - this.state.bind(this, this.session); - } -} -export interface ViewWorkspaceTitleComponent extends IlcInterface {} diff --git a/application/client/src/app/ui/views/workspace/title/state.ts b/application/client/src/app/ui/views/workspace/title/state.ts deleted file mode 100644 index 73df2cc93a..0000000000 --- a/application/client/src/app/ui/views/workspace/title/state.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Session } from '@service/session'; -import { IlcInterface } from '@env/decorators/component'; -import { ChangesDetector } from '@ui/env/extentions/changes'; -import { Destroyable } from '@platform/types/life/destroyable'; - -export class State implements Destroyable { - protected ref: undefined | (IlcInterface & ChangesDetector); - protected session: Session | undefined; - - public title: string = ''; - public flags: { - sde: boolean; - } = { - sde: false, - }; - public states: { - sde: boolean; - } = { - sde: false, - }; - - public bind(ref: IlcInterface & ChangesDetector, session: Session): State { - this.ref = ref; - this.session = session; - ref.env().subscriber.register( - session.stream.sde.subjects.get().updated.subscribe(() => { - this.update(); - }), - session.stream.subjects.get().started.subscribe(() => { - this.update(); - }), - session.stream.subjects.get().finished.subscribe(() => { - this.update(); - }), - ); - this.update(); - return this; - } - - public destroy(): Promise { - this.ref = undefined; - return Promise.resolve(); - } - - public toggleSde() { - if (this.session === undefined) { - return; - } - const sde = this.session.stream.sde; - if (sde.visibility().hidden()) { - sde.visibility().show(); - } else { - sde.visibility().hide(); - } - this.states.sde = !sde.visibility().hidden(); - } - - protected update(): void { - if (this.session === undefined) { - return; - } - this.flags.sde = this.session.stream.sde.isAvailable(); - const sources = this.session.stream.observe().sources(); - if (sources.length === 0) { - this.states.sde = false; - this.title = 'no sources are bound with session'; - } else if (sources.length === 1) { - this.states.sde = !this.session.stream.sde.visibility().hidden(); - this.title = ((): string => { - const observe = sources[0].observe; - const desc = observe.origin.desc(); - return `${desc.major}: ${desc.minor}`; - })(); - } else { - const running = sources.filter((s) => s.observer !== undefined).length; - this.title = `multiple ${sources.length} sources; ${running} running; ${ - sources.length - running - } stopped`; - } - this.safe().updateRefComp(); - } - - protected safe(): { - updateRefComp(): void; - unsubscribe(): void; - error(msg: string): void; - } { - return { - updateRefComp: (): void => { - if (this.ref === undefined) { - return; - } - this.ref.detectChanges(); - }, - unsubscribe: (): void => { - if (this.ref === undefined) { - return; - } - this.ref.env().subscriber.unsubscribe(); - }, - error: (msg: string): void => { - if (this.ref === undefined) { - return; - } - this.ref.log().error(msg); - }, - }; - } -} diff --git a/application/client/src/app/ui/views/workspace/title/styles.less b/application/client/src/app/ui/views/workspace/title/styles.less deleted file mode 100644 index 0cea491024..0000000000 --- a/application/client/src/app/ui/views/workspace/title/styles.less +++ /dev/null @@ -1,24 +0,0 @@ -@import '../../../styles/variables.less'; - -:host { - position: relative; - display: flex; - align-items: center; - padding: 6px; - height: 16px; - overflow: hidden; - z-index: 2; - box-shadow: 0 3px 3px rgba(0,0,0,0.4); - margin-bottom: 3px; - span.title { - display: inline-block; - position: relative; - flex:auto; - color: var(--scheme-color-2); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } -} - - diff --git a/application/client/src/app/ui/views/workspace/title/template.html b/application/client/src/app/ui/views/workspace/title/template.html deleted file mode 100644 index 4f715bd9c8..0000000000 --- a/application/client/src/app/ui/views/workspace/title/template.html +++ /dev/null @@ -1,5 +0,0 @@ -{{state.title}} - - \ No newline at end of file diff --git a/application/client/src/assets/.gitkeep b/application/client/src/assets/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/application/client/src/assets/about.gif b/application/client/src/assets/about.gif deleted file mode 100644 index d3d05f7f3b6072cedbeb9458c90cda39837549ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4546328 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≶(7B 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
    1yV4pOsfS^Km`?MKomQuw3&`Q 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

    t9avZc$HDjCU~Nwa37o2GK6vb1E&7A&DiQ7Sbm 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 z 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

    mYrfZA)JK^mv<&i8j#r% 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 z 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≦43^-vg61rcH*j-iA#R|NU@ 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½`f7_Rx$0! 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ǡN}PDHSv_{gJP0Y8O2u4uZobgNWp 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

    !SyI~G)Y|nGMI=}R9aPIDN6Z!Fs?}x>P{%+L< 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 z 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%0D~K6Z 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 z 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

  • j$bPe?(C}B5PR6-4(LwR2uzj)UveBGn(~J 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 JMtU;<008;lyX61? diff --git a/application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.woff2 b/application/client/src/app/ui/styles/fontawesome/webfonts/fa-solid-900.woff2 deleted file mode 100644 index f0b9b0cd327555a94e682390736cddef232850b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79100 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