@navios/commander-tui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +275 -0
- package/coverage/__tests__/utils/factories.ts.html +1147 -0
- package/coverage/__tests__/utils/index.html +131 -0
- package/coverage/__tests__/utils/render-utils.tsx.html +202 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +959 -0
- package/coverage/components/filter/filter_bar.tsx.html +322 -0
- package/coverage/components/filter/index.html +116 -0
- package/coverage/components/log/index.html +131 -0
- package/coverage/components/log/index.ts.html +88 -0
- package/coverage/components/log/log_message.tsx.html +391 -0
- package/coverage/components/prompt/index.html +116 -0
- package/coverage/components/prompt/prompt_renderer.tsx.html +1123 -0
- package/coverage/components/screen/index.html +131 -0
- package/coverage/components/screen/loading_message.tsx.html +217 -0
- package/coverage/components/screen/progress_message.tsx.html +265 -0
- package/coverage/components/sidebar/index.html +146 -0
- package/coverage/components/sidebar/sidebar.tsx.html +391 -0
- package/coverage/components/sidebar/sidebar_item.tsx.html +235 -0
- package/coverage/components/sidebar/sidebar_separator.tsx.html +124 -0
- package/coverage/context/index.html +131 -0
- package/coverage/context/index.ts.html +88 -0
- package/coverage/context/logger_context.tsx.html +412 -0
- package/coverage/coverage-final.json +55 -0
- package/coverage/favicon.png +0 -0
- package/coverage/filter/filter_engine.ts.html +424 -0
- package/coverage/filter/index.html +116 -0
- package/coverage/hooks/index.html +131 -0
- package/coverage/hooks/index.ts.html +88 -0
- package/coverage/hooks/use_theme.ts.html +121 -0
- package/coverage/index.html +356 -0
- package/coverage/keyboard/index.html +116 -0
- package/coverage/keyboard/keyboard_manager.ts.html +784 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/schemas/index.html +161 -0
- package/coverage/schemas/index.ts.html +94 -0
- package/coverage/schemas/logger-options.ts.html +124 -0
- package/coverage/schemas/prompt-options.ts.html +112 -0
- package/coverage/schemas/screen-options.ts.html +127 -0
- package/coverage/services/index.html +146 -0
- package/coverage/services/logger.ts.html +1192 -0
- package/coverage/services/prompt.ts.html +568 -0
- package/coverage/services/screen.ts.html +1804 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/themes/dark.ts.html +604 -0
- package/coverage/themes/high-contrast.ts.html +619 -0
- package/coverage/themes/index.html +176 -0
- package/coverage/themes/index.ts.html +97 -0
- package/coverage/themes/light.ts.html +601 -0
- package/coverage/themes/utils.ts.html +334 -0
- package/coverage/tokens/index.html +161 -0
- package/coverage/tokens/index.ts.html +94 -0
- package/coverage/tokens/logger.ts.html +115 -0
- package/coverage/tokens/prompt.ts.html +115 -0
- package/coverage/tokens/screen.ts.html +115 -0
- package/coverage/types/file.types.ts.html +265 -0
- package/coverage/types/filter.types.ts.html +238 -0
- package/coverage/types/index.html +236 -0
- package/coverage/types/index.ts.html +151 -0
- package/coverage/types/keyboard.types.ts.html +364 -0
- package/coverage/types/log.types.ts.html +268 -0
- package/coverage/types/message.types.ts.html +445 -0
- package/coverage/types/prompt.types.ts.html +403 -0
- package/coverage/types/screen.types.ts.html +451 -0
- package/coverage/types/theme.types.ts.html +841 -0
- package/coverage/utils/colors/file-colors.ts.html +112 -0
- package/coverage/utils/colors/helpers.ts.html +235 -0
- package/coverage/utils/colors/index.html +221 -0
- package/coverage/utils/colors/index.ts.html +145 -0
- package/coverage/utils/colors/log-colors.ts.html +253 -0
- package/coverage/utils/colors/progress-colors.ts.html +160 -0
- package/coverage/utils/colors/prompt-colors.ts.html +175 -0
- package/coverage/utils/colors/sidebar-colors.ts.html +241 -0
- package/coverage/utils/colors/table-colors.ts.html +118 -0
- package/coverage/utils/filetype.ts.html +277 -0
- package/coverage/utils/format.ts.html +241 -0
- package/coverage/utils/index.html +161 -0
- package/coverage/utils/index.ts.html +118 -0
- package/coverage/utils/stdout-printer.ts.html +523 -0
- package/dist/src/components/file/file_log.d.ts +35 -0
- package/dist/src/components/file/file_log.d.ts.map +1 -0
- package/dist/src/components/file/index.d.ts +2 -0
- package/dist/src/components/file/index.d.ts.map +1 -0
- package/dist/src/components/filter/filter_bar.d.ts +10 -0
- package/dist/src/components/filter/filter_bar.d.ts.map +1 -0
- package/dist/src/components/filter/index.d.ts +2 -0
- package/dist/src/components/filter/index.d.ts.map +1 -0
- package/dist/src/components/help/help_overlay.d.ts +10 -0
- package/dist/src/components/help/help_overlay.d.ts.map +1 -0
- package/dist/src/components/help/index.d.ts +2 -0
- package/dist/src/components/help/index.d.ts.map +1 -0
- package/dist/src/components/index.d.ts +27 -0
- package/dist/src/components/index.d.ts.map +1 -0
- package/dist/src/components/log/debug_log.d.ts +3 -0
- package/dist/src/components/log/debug_log.d.ts.map +1 -0
- package/dist/src/components/log/error_log.d.ts +3 -0
- package/dist/src/components/log/error_log.d.ts.map +1 -0
- package/dist/src/components/log/fatal_log.d.ts +3 -0
- package/dist/src/components/log/fatal_log.d.ts.map +1 -0
- package/dist/src/components/log/index.d.ts +9 -0
- package/dist/src/components/log/index.d.ts.map +1 -0
- package/dist/src/components/log/info_log.d.ts +3 -0
- package/dist/src/components/log/info_log.d.ts.map +1 -0
- package/dist/src/components/log/log_message.d.ts +33 -0
- package/dist/src/components/log/log_message.d.ts.map +1 -0
- package/dist/src/components/log/success_log.d.ts +3 -0
- package/dist/src/components/log/success_log.d.ts.map +1 -0
- package/dist/src/components/log/trace_log.d.ts +3 -0
- package/dist/src/components/log/trace_log.d.ts.map +1 -0
- package/dist/src/components/log/warning_log.d.ts +3 -0
- package/dist/src/components/log/warning_log.d.ts.map +1 -0
- package/dist/src/components/prompt/index.d.ts +3 -0
- package/dist/src/components/prompt/index.d.ts.map +1 -0
- package/dist/src/components/prompt/prompt_renderer.d.ts +6 -0
- package/dist/src/components/prompt/prompt_renderer.d.ts.map +1 -0
- package/dist/src/components/screen/group_renderer.d.ts +19 -0
- package/dist/src/components/screen/group_renderer.d.ts.map +1 -0
- package/dist/src/components/screen/index.d.ts +13 -0
- package/dist/src/components/screen/index.d.ts.map +1 -0
- package/dist/src/components/screen/loading_message.d.ts +6 -0
- package/dist/src/components/screen/loading_message.d.ts.map +1 -0
- package/dist/src/components/screen/message_renderer.d.ts +8 -0
- package/dist/src/components/screen/message_renderer.d.ts.map +1 -0
- package/dist/src/components/screen/progress_message.d.ts +8 -0
- package/dist/src/components/screen/progress_message.d.ts.map +1 -0
- package/dist/src/components/screen/screen_bridge.d.ts +20 -0
- package/dist/src/components/screen/screen_bridge.d.ts.map +1 -0
- package/dist/src/components/screen/table_message.d.ts +6 -0
- package/dist/src/components/screen/table_message.d.ts.map +1 -0
- package/dist/src/components/screen_manager_bridge.d.ts +11 -0
- package/dist/src/components/screen_manager_bridge.d.ts.map +1 -0
- package/dist/src/components/sidebar/index.d.ts +6 -0
- package/dist/src/components/sidebar/index.d.ts.map +1 -0
- package/dist/src/components/sidebar/sidebar.d.ts +18 -0
- package/dist/src/components/sidebar/sidebar.d.ts.map +1 -0
- package/dist/src/components/sidebar/sidebar_item.d.ts +14 -0
- package/dist/src/components/sidebar/sidebar_item.d.ts.map +1 -0
- package/dist/src/components/sidebar/sidebar_separator.d.ts +2 -0
- package/dist/src/components/sidebar/sidebar_separator.d.ts.map +1 -0
- package/dist/src/context/logger_context.d.ts +60 -0
- package/dist/src/context/logger_context.d.ts.map +1 -0
- package/dist/src/filter/filter_engine.d.ts +20 -0
- package/dist/src/filter/filter_engine.d.ts.map +1 -0
- package/dist/src/filter/index.d.ts +4 -0
- package/dist/src/filter/index.d.ts.map +1 -0
- package/dist/src/hooks/index.d.ts +2 -0
- package/dist/src/hooks/index.d.ts.map +1 -0
- package/dist/src/hooks/use_theme.d.ts +7 -0
- package/dist/src/hooks/use_theme.d.ts.map +1 -0
- package/dist/src/index.d.ts +88 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/keyboard/create_bindings.d.ts +31 -0
- package/dist/src/keyboard/create_bindings.d.ts.map +1 -0
- package/dist/src/keyboard/index.d.ts +12 -0
- package/dist/src/keyboard/index.d.ts.map +1 -0
- package/dist/src/keyboard/keyboard_manager.d.ts +69 -0
- package/dist/src/keyboard/keyboard_manager.d.ts.map +1 -0
- package/dist/src/services/index.d.ts +5 -0
- package/dist/src/services/index.d.ts.map +1 -0
- package/dist/src/services/logger.d.ts +61 -0
- package/dist/src/services/logger.d.ts.map +1 -0
- package/dist/src/services/prompt.d.ts +37 -0
- package/dist/src/services/prompt.d.ts.map +1 -0
- package/dist/src/services/screen.d.ts +165 -0
- package/dist/src/services/screen.d.ts.map +1 -0
- package/dist/src/services/screen_manager.d.ts +124 -0
- package/dist/src/services/screen_manager.d.ts.map +1 -0
- package/dist/src/themes/dark.d.ts +7 -0
- package/dist/src/themes/dark.d.ts.map +1 -0
- package/dist/src/themes/high-contrast.d.ts +7 -0
- package/dist/src/themes/high-contrast.d.ts.map +1 -0
- package/dist/src/themes/index.d.ts +18 -0
- package/dist/src/themes/index.d.ts.map +1 -0
- package/dist/src/themes/light.d.ts +6 -0
- package/dist/src/themes/light.d.ts.map +1 -0
- package/dist/src/themes/utils.d.ts +22 -0
- package/dist/src/themes/utils.d.ts.map +1 -0
- package/dist/src/types/file.types.d.ts +40 -0
- package/dist/src/types/file.types.d.ts.map +1 -0
- package/dist/src/types/filter.types.d.ts +31 -0
- package/dist/src/types/filter.types.d.ts.map +1 -0
- package/dist/src/types/index.d.ts +81 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/keyboard.types.d.ts +83 -0
- package/dist/src/types/keyboard.types.d.ts.map +1 -0
- package/dist/src/types/log.types.d.ts +32 -0
- package/dist/src/types/log.types.d.ts.map +1 -0
- package/dist/src/types/message.types.d.ts +91 -0
- package/dist/src/types/message.types.d.ts.map +1 -0
- package/dist/src/types/prompt.types.d.ts +89 -0
- package/dist/src/types/prompt.types.d.ts.map +1 -0
- package/dist/src/types/screen.types.d.ts +85 -0
- package/dist/src/types/screen.types.d.ts.map +1 -0
- package/dist/src/types/theme.types.d.ts +216 -0
- package/dist/src/types/theme.types.d.ts.map +1 -0
- package/dist/src/utils/colors/file-colors.d.ts +10 -0
- package/dist/src/utils/colors/file-colors.d.ts.map +1 -0
- package/dist/src/utils/colors/helpers.d.ts +29 -0
- package/dist/src/utils/colors/helpers.d.ts.map +1 -0
- package/dist/src/utils/colors/index.d.ts +13 -0
- package/dist/src/utils/colors/index.d.ts.map +1 -0
- package/dist/src/utils/colors/log-colors.d.ts +15 -0
- package/dist/src/utils/colors/log-colors.d.ts.map +1 -0
- package/dist/src/utils/colors/progress-colors.d.ts +25 -0
- package/dist/src/utils/colors/progress-colors.d.ts.map +1 -0
- package/dist/src/utils/colors/prompt-colors.d.ts +22 -0
- package/dist/src/utils/colors/prompt-colors.d.ts.map +1 -0
- package/dist/src/utils/colors/sidebar-colors.d.ts +50 -0
- package/dist/src/utils/colors/sidebar-colors.d.ts.map +1 -0
- package/dist/src/utils/colors/table-colors.d.ts +12 -0
- package/dist/src/utils/colors/table-colors.d.ts.map +1 -0
- package/dist/src/utils/filetype.d.ts +19 -0
- package/dist/src/utils/filetype.d.ts.map +1 -0
- package/dist/src/utils/format.d.ts +9 -0
- package/dist/src/utils/format.d.ts.map +1 -0
- package/dist/src/utils/index.d.ts +20 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/stdout-printer.d.ts +10 -0
- package/dist/src/utils/stdout-printer.d.ts.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/tsdown.config.d.mts +5 -0
- package/dist/tsdown.config.d.mts.map +1 -0
- package/dist/vitest.config.d.mts +3 -0
- package/dist/vitest.config.d.mts.map +1 -0
- package/lib/index.cjs +6349 -0
- package/lib/index.cjs.map +1 -0
- package/lib/index.d.cts +1720 -0
- package/lib/index.d.cts.map +1 -0
- package/lib/index.d.mts +1720 -0
- package/lib/index.d.mts.map +1 -0
- package/lib/index.mjs +6264 -0
- package/lib/index.mjs.map +1 -0
- package/lib/screen_manager_bridge-BpDgVu3e.cjs +3357 -0
- package/lib/screen_manager_bridge-BpDgVu3e.cjs.map +1 -0
- package/lib/screen_manager_bridge-CkV7637i.cjs +3 -0
- package/lib/screen_manager_bridge-DN2J6_k1.mjs +3 -0
- package/lib/screen_manager_bridge-Dfg4QUrl.mjs +3034 -0
- package/lib/screen_manager_bridge-Dfg4QUrl.mjs.map +1 -0
- package/package.json +43 -0
- package/project.json +60 -0
- package/src/__tests__/components/__snapshots__/filter_bar.spec.tsx.snap +2245 -0
- package/src/__tests__/components/__snapshots__/loading_message.spec.tsx.snap +1382 -0
- package/src/__tests__/components/__snapshots__/log_message.spec.tsx.snap +3169 -0
- package/src/__tests__/components/__snapshots__/progress_message.spec.tsx.snap +1743 -0
- package/src/__tests__/components/__snapshots__/prompt_renderer.spec.tsx.snap +3135 -0
- package/src/__tests__/components/__snapshots__/sidebar.spec.tsx.snap +2617 -0
- package/src/__tests__/components/filter_bar.spec.tsx +190 -0
- package/src/__tests__/components/loading_message.spec.tsx +110 -0
- package/src/__tests__/components/log_message.spec.tsx +166 -0
- package/src/__tests__/components/progress_message.spec.tsx +147 -0
- package/src/__tests__/components/prompt_renderer.spec.tsx +274 -0
- package/src/__tests__/components/sidebar.spec.tsx +305 -0
- package/src/__tests__/filter/filter_engine.spec.ts +325 -0
- package/src/__tests__/keyboard/keyboard_manager.spec.ts +557 -0
- package/src/__tests__/mocks/scm-mock.ts +5 -0
- package/src/__tests__/services/logger.spec.ts +630 -0
- package/src/__tests__/services/prompt.spec.ts +411 -0
- package/src/__tests__/services/screen.spec.ts +721 -0
- package/src/__tests__/setup.ts +43 -0
- package/src/__tests__/utils/factories.ts +354 -0
- package/src/__tests__/utils/filetype.spec.ts +195 -0
- package/src/__tests__/utils/format.spec.ts +178 -0
- package/src/__tests__/utils/render-utils.tsx +39 -0
- package/src/__tests__/utils/test-container.ts +48 -0
- package/src/components/file/file_log.tsx +241 -0
- package/src/components/file/index.ts +1 -0
- package/src/components/filter/filter_bar.tsx +79 -0
- package/src/components/filter/index.ts +1 -0
- package/src/components/help/help_overlay.tsx +100 -0
- package/src/components/help/index.ts +1 -0
- package/src/components/index.ts +15 -0
- package/src/components/log/index.ts +1 -0
- package/src/components/log/log_message.tsx +102 -0
- package/src/components/prompt/index.ts +2 -0
- package/src/components/prompt/prompt_renderer.tsx +346 -0
- package/src/components/screen/group_renderer.tsx +64 -0
- package/src/components/screen/index.ts +6 -0
- package/src/components/screen/loading_message.tsx +44 -0
- package/src/components/screen/message_renderer.tsx +108 -0
- package/src/components/screen/progress_message.tsx +60 -0
- package/src/components/screen/screen_bridge.tsx +149 -0
- package/src/components/screen/table_message.tsx +57 -0
- package/src/components/screen_manager_bridge.tsx +245 -0
- package/src/components/sidebar/index.ts +3 -0
- package/src/components/sidebar/sidebar.tsx +102 -0
- package/src/components/sidebar/sidebar_item.tsx +50 -0
- package/src/components/sidebar/sidebar_separator.tsx +13 -0
- package/src/context/index.ts +1 -0
- package/src/context/logger_context.tsx +109 -0
- package/src/factories/index.ts +1 -0
- package/src/factories/screen.factory.ts +22 -0
- package/src/filter/filter_engine.ts +113 -0
- package/src/filter/index.ts +1 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use_theme.ts +12 -0
- package/src/index.ts +64 -0
- package/src/keyboard/create_bindings.ts +457 -0
- package/src/keyboard/index.ts +2 -0
- package/src/keyboard/keyboard_manager.ts +233 -0
- package/src/overrides/console.logger.override.ts +61 -0
- package/src/overrides/index.ts +1 -0
- package/src/schemas/index.ts +3 -0
- package/src/schemas/logger-options.ts +13 -0
- package/src/schemas/prompt-options.ts +9 -0
- package/src/schemas/screen-options.ts +14 -0
- package/src/services/index.ts +4 -0
- package/src/services/logger.ts +369 -0
- package/src/services/prompt.ts +169 -0
- package/src/services/screen.ts +590 -0
- package/src/services/screen_manager.tsx +390 -0
- package/src/themes/dark.ts +173 -0
- package/src/themes/high-contrast.ts +178 -0
- package/src/themes/index.ts +4 -0
- package/src/themes/light.ts +172 -0
- package/src/themes/utils.ts +83 -0
- package/src/tokens/index.ts +3 -0
- package/src/tokens/logger.ts +10 -0
- package/src/tokens/prompt.ts +10 -0
- package/src/tokens/screen.ts +10 -0
- package/src/types/file.types.ts +60 -0
- package/src/types/filter.types.ts +51 -0
- package/src/types/index.ts +22 -0
- package/src/types/keyboard.types.ts +93 -0
- package/src/types/log.types.ts +61 -0
- package/src/types/message.types.ts +120 -0
- package/src/types/prompt.types.ts +106 -0
- package/src/types/screen.types.ts +124 -0
- package/src/types/theme.types.ts +252 -0
- package/src/utils/colors/file-colors.ts +9 -0
- package/src/utils/colors/helpers.ts +50 -0
- package/src/utils/colors/index.ts +20 -0
- package/src/utils/colors/log-colors.ts +56 -0
- package/src/utils/colors/progress-colors.ts +25 -0
- package/src/utils/colors/prompt-colors.ts +30 -0
- package/src/utils/colors/sidebar-colors.ts +52 -0
- package/src/utils/colors/table-colors.ts +11 -0
- package/src/utils/filetype.ts +64 -0
- package/src/utils/format.ts +52 -0
- package/src/utils/index.ts +11 -0
- package/src/utils/stdout-printer.ts +255 -0
- package/tsconfig.json +14 -0
- package/tsdown.config.mts +34 -0
- package/vitest.config.mts +10 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { FilterBar } from '../../components/filter/filter_bar.tsx'
|
|
4
|
+
import { createFilterState } from '../utils/factories.ts'
|
|
5
|
+
import { wrapWithContext } from '../utils/render-utils.tsx'
|
|
6
|
+
|
|
7
|
+
import type { LevelCounts } from '../../types/index.ts'
|
|
8
|
+
|
|
9
|
+
const defaultLevelCounts: LevelCounts = {
|
|
10
|
+
verbose: 0,
|
|
11
|
+
debug: 0,
|
|
12
|
+
log: 0,
|
|
13
|
+
warn: 0,
|
|
14
|
+
error: 0,
|
|
15
|
+
fatal: 0,
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
describe('FilterBar', () => {
|
|
19
|
+
describe('search input', () => {
|
|
20
|
+
it('should render search input', () => {
|
|
21
|
+
const filter = createFilterState({
|
|
22
|
+
searchQuery: '',
|
|
23
|
+
focusedField: 'search',
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const component = wrapWithContext(
|
|
27
|
+
<FilterBar filter={filter} levelCounts={defaultLevelCounts} />,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
expect(component).toMatchSnapshot()
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('should render with active search query', () => {
|
|
34
|
+
const filter = createFilterState({
|
|
35
|
+
searchQuery: 'error message',
|
|
36
|
+
focusedField: 'search',
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
const component = wrapWithContext(
|
|
40
|
+
<FilterBar filter={filter} levelCounts={defaultLevelCounts} />,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
expect(component).toMatchSnapshot()
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('should render search focused state', () => {
|
|
47
|
+
const filter = createFilterState({
|
|
48
|
+
focusedField: 'search',
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
const component = wrapWithContext(
|
|
52
|
+
<FilterBar filter={filter} levelCounts={defaultLevelCounts} />,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
expect(component).toMatchSnapshot()
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it('should render levels focused state', () => {
|
|
59
|
+
const filter = createFilterState({
|
|
60
|
+
focusedField: 'levels',
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
const component = wrapWithContext(
|
|
64
|
+
<FilterBar filter={filter} levelCounts={defaultLevelCounts} />,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
expect(component).toMatchSnapshot()
|
|
68
|
+
})
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
describe('log level toggles', () => {
|
|
72
|
+
it('should render log level toggles', () => {
|
|
73
|
+
const filter = createFilterState()
|
|
74
|
+
|
|
75
|
+
const component = wrapWithContext(
|
|
76
|
+
<FilterBar filter={filter} levelCounts={defaultLevelCounts} />,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
expect(component).toMatchSnapshot()
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
it('should render with some levels disabled', () => {
|
|
83
|
+
const filter = createFilterState({
|
|
84
|
+
enabledLevels: new Set(['error', 'fatal', 'warn']),
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
const component = wrapWithContext(
|
|
88
|
+
<FilterBar filter={filter} levelCounts={defaultLevelCounts} />,
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
expect(component).toMatchSnapshot()
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
it('should render with all levels enabled', () => {
|
|
95
|
+
const filter = createFilterState({
|
|
96
|
+
enabledLevels: new Set(['verbose', 'debug', 'log', 'warn', 'error', 'fatal']),
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
const component = wrapWithContext(
|
|
100
|
+
<FilterBar filter={filter} levelCounts={defaultLevelCounts} />,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
expect(component).toMatchSnapshot()
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
it('should render with only one level enabled', () => {
|
|
107
|
+
const filter = createFilterState({
|
|
108
|
+
enabledLevels: new Set(['error']),
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
const component = wrapWithContext(
|
|
112
|
+
<FilterBar filter={filter} levelCounts={defaultLevelCounts} />,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
expect(component).toMatchSnapshot()
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
describe('level counts', () => {
|
|
120
|
+
it('should render level counts', () => {
|
|
121
|
+
const filter = createFilterState()
|
|
122
|
+
const levelCounts: LevelCounts = {
|
|
123
|
+
verbose: 5,
|
|
124
|
+
debug: 12,
|
|
125
|
+
log: 25,
|
|
126
|
+
warn: 3,
|
|
127
|
+
error: 2,
|
|
128
|
+
fatal: 0,
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const component = wrapWithContext(<FilterBar filter={filter} levelCounts={levelCounts} />)
|
|
132
|
+
|
|
133
|
+
expect(component).toMatchSnapshot()
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
it('should truncate high counts to 99+', () => {
|
|
137
|
+
const filter = createFilterState()
|
|
138
|
+
const levelCounts: LevelCounts = {
|
|
139
|
+
verbose: 0,
|
|
140
|
+
debug: 0,
|
|
141
|
+
log: 150,
|
|
142
|
+
warn: 0,
|
|
143
|
+
error: 200,
|
|
144
|
+
fatal: 0,
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const component = wrapWithContext(<FilterBar filter={filter} levelCounts={levelCounts} />)
|
|
148
|
+
|
|
149
|
+
expect(component).toMatchSnapshot()
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
it('should not show counts when zero', () => {
|
|
153
|
+
const filter = createFilterState()
|
|
154
|
+
const levelCounts: LevelCounts = {
|
|
155
|
+
verbose: 0,
|
|
156
|
+
debug: 0,
|
|
157
|
+
log: 0,
|
|
158
|
+
warn: 0,
|
|
159
|
+
error: 0,
|
|
160
|
+
fatal: 0,
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const component = wrapWithContext(<FilterBar filter={filter} levelCounts={levelCounts} />)
|
|
164
|
+
|
|
165
|
+
expect(component).toMatchSnapshot()
|
|
166
|
+
})
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
describe('combined states', () => {
|
|
170
|
+
it('should render with search query and disabled levels', () => {
|
|
171
|
+
const filter = createFilterState({
|
|
172
|
+
searchQuery: 'api',
|
|
173
|
+
enabledLevels: new Set(['log', 'error']),
|
|
174
|
+
focusedField: 'search',
|
|
175
|
+
})
|
|
176
|
+
const levelCounts: LevelCounts = {
|
|
177
|
+
verbose: 2,
|
|
178
|
+
debug: 5,
|
|
179
|
+
log: 10,
|
|
180
|
+
warn: 1,
|
|
181
|
+
error: 3,
|
|
182
|
+
fatal: 0,
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const component = wrapWithContext(<FilterBar filter={filter} levelCounts={levelCounts} />)
|
|
186
|
+
|
|
187
|
+
expect(component).toMatchSnapshot()
|
|
188
|
+
})
|
|
189
|
+
})
|
|
190
|
+
})
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { LoadingMessage } from '../../components/screen/loading_message.tsx'
|
|
4
|
+
import { createLoadingMessage } from '../utils/factories.ts'
|
|
5
|
+
import { wrapWithContext } from '../utils/render-utils.tsx'
|
|
6
|
+
|
|
7
|
+
describe('LoadingMessage', () => {
|
|
8
|
+
describe('loading state', () => {
|
|
9
|
+
it('should render loading state', () => {
|
|
10
|
+
const message = createLoadingMessage({
|
|
11
|
+
content: 'Loading data...',
|
|
12
|
+
status: 'loading',
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
const component = wrapWithContext(<LoadingMessage message={message} />)
|
|
16
|
+
|
|
17
|
+
expect(component).toMatchSnapshot()
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('should render loading with custom content', () => {
|
|
21
|
+
const message = createLoadingMessage({
|
|
22
|
+
content: 'Fetching user information...',
|
|
23
|
+
status: 'loading',
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const component = wrapWithContext(<LoadingMessage message={message} />)
|
|
27
|
+
|
|
28
|
+
expect(component).toMatchSnapshot()
|
|
29
|
+
})
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
describe('success state', () => {
|
|
33
|
+
it('should render success state', () => {
|
|
34
|
+
const message = createLoadingMessage({
|
|
35
|
+
content: 'Loading...',
|
|
36
|
+
status: 'success',
|
|
37
|
+
resolvedContent: 'Successfully loaded!',
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
const component = wrapWithContext(<LoadingMessage message={message} />)
|
|
41
|
+
|
|
42
|
+
expect(component).toMatchSnapshot()
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('should show resolved content when success', () => {
|
|
46
|
+
const message = createLoadingMessage({
|
|
47
|
+
content: 'Original loading message',
|
|
48
|
+
status: 'success',
|
|
49
|
+
resolvedContent: 'Operation completed successfully',
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
const component = wrapWithContext(<LoadingMessage message={message} />)
|
|
53
|
+
|
|
54
|
+
expect(component).toMatchSnapshot()
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('should fall back to original content if no resolvedContent', () => {
|
|
58
|
+
const message = createLoadingMessage({
|
|
59
|
+
content: 'Loading completed',
|
|
60
|
+
status: 'success',
|
|
61
|
+
resolvedContent: undefined,
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
const component = wrapWithContext(<LoadingMessage message={message} />)
|
|
65
|
+
|
|
66
|
+
expect(component).toMatchSnapshot()
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
describe('fail state', () => {
|
|
71
|
+
it('should render fail state', () => {
|
|
72
|
+
const message = createLoadingMessage({
|
|
73
|
+
content: 'Loading...',
|
|
74
|
+
status: 'fail',
|
|
75
|
+
resolvedContent: 'Failed to load data',
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
const component = wrapWithContext(<LoadingMessage message={message} />)
|
|
79
|
+
|
|
80
|
+
expect(component).toMatchSnapshot()
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('should show error message when failed', () => {
|
|
84
|
+
const message = createLoadingMessage({
|
|
85
|
+
content: 'Connecting to server...',
|
|
86
|
+
status: 'fail',
|
|
87
|
+
resolvedContent: 'Connection timeout',
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
const component = wrapWithContext(<LoadingMessage message={message} />)
|
|
91
|
+
|
|
92
|
+
expect(component).toMatchSnapshot()
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
describe('with timestamp', () => {
|
|
97
|
+
it('should include timestamp in all states', () => {
|
|
98
|
+
const timestamp = new Date('2024-01-15T10:30:00.000Z')
|
|
99
|
+
const message = createLoadingMessage({
|
|
100
|
+
content: 'Loading...',
|
|
101
|
+
status: 'loading',
|
|
102
|
+
timestamp,
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
const component = wrapWithContext(<LoadingMessage message={message} />)
|
|
106
|
+
|
|
107
|
+
expect(component).toMatchSnapshot()
|
|
108
|
+
})
|
|
109
|
+
})
|
|
110
|
+
})
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { LogMessage } from '../../components/log/log_message.tsx'
|
|
4
|
+
import { wrapWithContext } from '../utils/render-utils.tsx'
|
|
5
|
+
|
|
6
|
+
import type { LogLevel } from '@navios/core'
|
|
7
|
+
|
|
8
|
+
describe('LogMessage', () => {
|
|
9
|
+
const LOG_LEVELS: LogLevel[] = ['verbose', 'debug', 'log', 'warn', 'error', 'fatal']
|
|
10
|
+
|
|
11
|
+
describe('renders log levels', () => {
|
|
12
|
+
for (const level of LOG_LEVELS) {
|
|
13
|
+
it(`should render ${level} level`, () => {
|
|
14
|
+
const component = wrapWithContext(<LogMessage level={level}>Test message</LogMessage>)
|
|
15
|
+
|
|
16
|
+
expect(component).toMatchSnapshot()
|
|
17
|
+
})
|
|
18
|
+
}
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
describe('variants', () => {
|
|
22
|
+
it('should render with success variant', () => {
|
|
23
|
+
const component = wrapWithContext(
|
|
24
|
+
<LogMessage level="log" variant="success">
|
|
25
|
+
Success message
|
|
26
|
+
</LogMessage>,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
expect(component).toMatchSnapshot()
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('should render with trace variant', () => {
|
|
33
|
+
const component = wrapWithContext(
|
|
34
|
+
<LogMessage level="verbose" variant="trace">
|
|
35
|
+
Trace message
|
|
36
|
+
</LogMessage>,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
expect(component).toMatchSnapshot()
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
describe('with timestamp', () => {
|
|
44
|
+
it('should render with Date timestamp', () => {
|
|
45
|
+
const timestamp = new Date('2024-01-15T10:30:00.000Z')
|
|
46
|
+
const component = wrapWithContext(
|
|
47
|
+
<LogMessage level="log" timestamp={timestamp}>
|
|
48
|
+
Message with timestamp
|
|
49
|
+
</LogMessage>,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
expect(component).toMatchSnapshot()
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('should render with string timestamp', () => {
|
|
56
|
+
const component = wrapWithContext(
|
|
57
|
+
<LogMessage level="log" timestamp="10:30:00">
|
|
58
|
+
Message with string timestamp
|
|
59
|
+
</LogMessage>,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
expect(component).toMatchSnapshot()
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
describe('with label', () => {
|
|
67
|
+
it('should render with label', () => {
|
|
68
|
+
const component = wrapWithContext(
|
|
69
|
+
<LogMessage level="log" label="API">
|
|
70
|
+
Message with label
|
|
71
|
+
</LogMessage>,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
expect(component).toMatchSnapshot()
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
it('should render with label and timestamp', () => {
|
|
78
|
+
const timestamp = new Date('2024-01-15T10:30:00.000Z')
|
|
79
|
+
const component = wrapWithContext(
|
|
80
|
+
<LogMessage level="log" label="Database" timestamp={timestamp}>
|
|
81
|
+
Message with both
|
|
82
|
+
</LogMessage>,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
expect(component).toMatchSnapshot()
|
|
86
|
+
})
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
describe('with trace content', () => {
|
|
90
|
+
it('should render with trace', () => {
|
|
91
|
+
const component = wrapWithContext(
|
|
92
|
+
<LogMessage level="verbose" trace=" at someFunction (file.ts:10:5)\n at main (index.ts:1:1)">
|
|
93
|
+
Message with trace
|
|
94
|
+
</LogMessage>,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
expect(component).toMatchSnapshot()
|
|
98
|
+
})
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
describe('with custom colors', () => {
|
|
102
|
+
it('should render with custom borderColor', () => {
|
|
103
|
+
const component = wrapWithContext(
|
|
104
|
+
<LogMessage level="log" borderColor="#ff0000">
|
|
105
|
+
Custom border color
|
|
106
|
+
</LogMessage>,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
expect(component).toMatchSnapshot()
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
it('should render with custom backgroundColor', () => {
|
|
113
|
+
const component = wrapWithContext(
|
|
114
|
+
<LogMessage level="log" backgroundColor="#111111">
|
|
115
|
+
Custom background color
|
|
116
|
+
</LogMessage>,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
expect(component).toMatchSnapshot()
|
|
120
|
+
})
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
describe('border styles', () => {
|
|
124
|
+
it('should render with thin border style (default)', () => {
|
|
125
|
+
const component = wrapWithContext(
|
|
126
|
+
<LogMessage level="log" borderStyle="thin">
|
|
127
|
+
Thin border
|
|
128
|
+
</LogMessage>,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
expect(component).toMatchSnapshot()
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
it('should render with thick border style', () => {
|
|
135
|
+
const component = wrapWithContext(
|
|
136
|
+
<LogMessage level="log" borderStyle="thick">
|
|
137
|
+
Thick border
|
|
138
|
+
</LogMessage>,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
expect(component).toMatchSnapshot()
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
describe('with padding and margin', () => {
|
|
146
|
+
it('should render with custom padding', () => {
|
|
147
|
+
const component = wrapWithContext(
|
|
148
|
+
<LogMessage level="log" padding={2}>
|
|
149
|
+
Custom padding
|
|
150
|
+
</LogMessage>,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
expect(component).toMatchSnapshot()
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
it('should render with custom margin', () => {
|
|
157
|
+
const component = wrapWithContext(
|
|
158
|
+
<LogMessage level="log" margin={1}>
|
|
159
|
+
Custom margin
|
|
160
|
+
</LogMessage>,
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
expect(component).toMatchSnapshot()
|
|
164
|
+
})
|
|
165
|
+
})
|
|
166
|
+
})
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { ProgressMessage } from '../../components/screen/progress_message.tsx'
|
|
4
|
+
import { createProgressMessage } from '../utils/factories.ts'
|
|
5
|
+
import { wrapWithContext } from '../utils/render-utils.tsx'
|
|
6
|
+
|
|
7
|
+
describe('ProgressMessage', () => {
|
|
8
|
+
describe('progress percentages', () => {
|
|
9
|
+
it('should render progress at 0%', () => {
|
|
10
|
+
const message = createProgressMessage({
|
|
11
|
+
label: 'Processing',
|
|
12
|
+
current: 0,
|
|
13
|
+
total: 100,
|
|
14
|
+
status: 'active',
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
const component = wrapWithContext(<ProgressMessage message={message} />)
|
|
18
|
+
|
|
19
|
+
expect(component).toMatchSnapshot()
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
it('should render progress at 50%', () => {
|
|
23
|
+
const message = createProgressMessage({
|
|
24
|
+
label: 'Downloading files',
|
|
25
|
+
current: 50,
|
|
26
|
+
total: 100,
|
|
27
|
+
status: 'active',
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
const component = wrapWithContext(<ProgressMessage message={message} />)
|
|
31
|
+
|
|
32
|
+
expect(component).toMatchSnapshot()
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('should render progress at 100%', () => {
|
|
36
|
+
const message = createProgressMessage({
|
|
37
|
+
label: 'Upload complete',
|
|
38
|
+
current: 100,
|
|
39
|
+
total: 100,
|
|
40
|
+
status: 'active',
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
const component = wrapWithContext(<ProgressMessage message={message} />)
|
|
44
|
+
|
|
45
|
+
expect(component).toMatchSnapshot()
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
it('should render progress at arbitrary percentage', () => {
|
|
49
|
+
const message = createProgressMessage({
|
|
50
|
+
label: 'Installing packages',
|
|
51
|
+
current: 37,
|
|
52
|
+
total: 100,
|
|
53
|
+
status: 'active',
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
const component = wrapWithContext(<ProgressMessage message={message} />)
|
|
57
|
+
|
|
58
|
+
expect(component).toMatchSnapshot()
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
it('should handle non-100 totals', () => {
|
|
62
|
+
const message = createProgressMessage({
|
|
63
|
+
label: 'Processing items',
|
|
64
|
+
current: 3,
|
|
65
|
+
total: 10,
|
|
66
|
+
status: 'active',
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
const component = wrapWithContext(<ProgressMessage message={message} />)
|
|
70
|
+
|
|
71
|
+
expect(component).toMatchSnapshot()
|
|
72
|
+
})
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
describe('with label', () => {
|
|
76
|
+
it('should render with label', () => {
|
|
77
|
+
const message = createProgressMessage({
|
|
78
|
+
label: 'Custom Label',
|
|
79
|
+
current: 25,
|
|
80
|
+
total: 100,
|
|
81
|
+
status: 'active',
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
const component = wrapWithContext(<ProgressMessage message={message} />)
|
|
85
|
+
|
|
86
|
+
expect(component).toMatchSnapshot()
|
|
87
|
+
})
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
describe('complete state', () => {
|
|
91
|
+
it('should render complete state', () => {
|
|
92
|
+
const message = createProgressMessage({
|
|
93
|
+
label: 'Processing',
|
|
94
|
+
current: 100,
|
|
95
|
+
total: 100,
|
|
96
|
+
status: 'complete',
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
const component = wrapWithContext(<ProgressMessage message={message} />)
|
|
100
|
+
|
|
101
|
+
expect(component).toMatchSnapshot()
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
it('should show resolved content when complete', () => {
|
|
105
|
+
const message = createProgressMessage({
|
|
106
|
+
label: 'Processing',
|
|
107
|
+
current: 100,
|
|
108
|
+
total: 100,
|
|
109
|
+
status: 'complete',
|
|
110
|
+
resolvedContent: 'All items processed successfully!',
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
const component = wrapWithContext(<ProgressMessage message={message} />)
|
|
114
|
+
|
|
115
|
+
expect(component).toMatchSnapshot()
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
describe('failed state', () => {
|
|
120
|
+
it('should render failed state', () => {
|
|
121
|
+
const message = createProgressMessage({
|
|
122
|
+
label: 'Uploading',
|
|
123
|
+
current: 42,
|
|
124
|
+
total: 100,
|
|
125
|
+
status: 'failed',
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
const component = wrapWithContext(<ProgressMessage message={message} />)
|
|
129
|
+
|
|
130
|
+
expect(component).toMatchSnapshot()
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
it('should show error content when failed', () => {
|
|
134
|
+
const message = createProgressMessage({
|
|
135
|
+
label: 'Uploading',
|
|
136
|
+
current: 42,
|
|
137
|
+
total: 100,
|
|
138
|
+
status: 'failed',
|
|
139
|
+
resolvedContent: 'Network error: connection lost',
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
const component = wrapWithContext(<ProgressMessage message={message} />)
|
|
143
|
+
|
|
144
|
+
expect(component).toMatchSnapshot()
|
|
145
|
+
})
|
|
146
|
+
})
|
|
147
|
+
})
|