visualifyjs 2.5.3 → 3.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/.claude/mem/TIMELINE.md +36 -0
- package/.claude/mem/notes/2026-02-11-3d-visualization-docs-fix-external-script-solution.md +24 -0
- package/.claude/mem/notes/2026-02-11-3d-visualization-docs-fix-session-summary.md +43 -0
- package/.claude/mem/notes/2026-02-11-cli-fix-editor-command-alias.md +26 -0
- package/.claude/mem/notes/2026-02-11-phase-3-developer-experience-completed.md +51 -0
- package/.claude/mem/notes/2026-02-11-phase-4-web-workers-implementation-complete.md +59 -0
- package/.claude/mem/notes/2026-02-11-visualify-phase-2-3d-visualization-complete.md +50 -0
- package/.claude/mem/notes/2026-02-11-visualify-phase-2-committed-ready-for-phase-3.md +33 -0
- package/.claude/mem/notes/2026-02-11-visualify-phase-3-complete-developer-experience.md +52 -0
- package/.claude/mem/notes/2026-02-11-visualify-repository-cleanup-complete.md +28 -0
- package/.claude/mem/notes/2026-02-18-codebase-cleanup-docsify-plugin-documentation.md +37 -0
- package/.claude/mem/notes/2026-02-19-css-grid-layout-fix-displaycontents-on-vcontroller.md +18 -0
- package/.claude/mem/notes/2026-02-19-docsify-plugin-fixes-latex-and-visualify-code-bloc.md +26 -0
- package/.claude/mem/notes/2026-02-19-page-mode-docs-update-decisions.md +23 -0
- package/.claude/mem/notes/2026-02-19-react-context-infinite-re-render-loop-fix-pattern.md +31 -0
- package/.claude/mem/notes/2026-02-19-version-300-bump-and-build-fixes.md +32 -0
- package/.claude/mem/notes/2026-02-19-visualify-build-deployment-architecture-bug-fixes.md +25 -0
- package/.claude/mem/notes/2026-02-19-visualify-dist-iife-self-contained-build-config.md +30 -0
- package/.claude/mem/notes/2026-02-19-visualify-infinite-loop-i18n-fixes.md +31 -0
- package/.claude/mem/notes/2026-02-19-visualify-v3-bundle-splitting-docs-restructuring.md +32 -0
- package/.claude/mem/notes/2026-02-20-bundle-externalization-final-architecture.md +29 -0
- package/.claude/mem/notes/2026-02-20-chromium-page-fix-unstable-keys-and-double-event-b.md +27 -0
- package/.claude/mem/notes/2026-02-20-console-cleanup-bundle-optimization-commit.md +20 -0
- package/.claude/mem/notes/2026-02-20-dotbio-dot-plot-fix-useeffect-dependency.md +21 -0
- package/.claude/mem/notes/2026-02-20-public-folder-cleanup-and-readme-rewrite.md +25 -0
- package/.claude/mem/notes/2026-02-20-v300-release-and-beta-channel-strategy.md +29 -0
- package/.claude/mem/notes/2026-02-20-visium-background-image-unknown-legend-fix.md +19 -0
- package/.claude/mem/notes/2026-02-20-visualify-cdn-loader-bundle-externalization.md +34 -0
- package/.claude/mem/sessions/session-2026-02-20-031524.md +54 -0
- package/.claude/settings.local.json +21 -0
- package/.github/workflows/static.yml.bak +51 -51
- package/.sisyphus/boulder.json +65 -0
- package/.sisyphus/plans/phase-4-advanced-optimizations.md +217 -0
- package/LICENSE +674 -674
- package/README.md +94 -59
- package/config-overrides.js +31 -31
- package/dist/stats.html +4949 -0
- package/dist/visualify-3d.esm.js +1 -0
- package/dist/visualify-3d.js +1 -0
- package/dist/visualify-core.esm.js +1 -0
- package/dist/visualify-core.js +1 -0
- package/dist/visualify-docs.esm.js +1 -0
- package/dist/visualify-docs.js +1 -0
- package/dist/visualify-loader.js +1 -0
- package/dist/visualify-pages.esm.js +1 -0
- package/dist/visualify-pages.js +1 -0
- package/dist/visualify-portal.esm.js +1 -0
- package/dist/visualify-portal.js +1 -0
- package/dist/visualify-shared.js +26571 -0
- package/dist/visualify.js +1 -188
- package/docs/CHANGELOG.md +148 -0
- package/docs/cli/commands.md +513 -0
- package/docs/configuration/visualify-json.md +474 -0
- package/docs/docs/3d-visualization.md +374 -0
- package/docs/docs/CLI.md +303 -34
- package/docs/docs/README.md +65 -65
- package/docs/docs/Rechart/bar.md +190 -190
- package/docs/docs/Rechart/funnel.md +241 -193
- package/docs/docs/Rechart/line.md +355 -355
- package/docs/docs/Rechart/pie.md +225 -225
- package/docs/docs/Rechart/radar.md +253 -253
- package/docs/docs/Rechart/scatter.md +298 -0
- package/docs/docs/_404.md +51 -51
- package/docs/docs/_coverpage.md +11 -11
- package/docs/docs/_sidebar.md +54 -43
- package/docs/docs/components/dotBio.md +87 -34
- package/docs/docs/components/echart.md +171 -82
- package/docs/docs/components/html.md +61 -34
- package/docs/docs/components/macaron.md +156 -145
- package/docs/docs/components/markdown.md +42 -0
- package/docs/docs/components/more.md +183 -142
- package/docs/docs/components/plotly.md +132 -62
- package/docs/docs/components/scatterL.md +171 -70
- package/docs/docs/components/visium.md +112 -57
- package/docs/docs/configuration.md +121 -123
- package/docs/docs/deploy.md +31 -31
- package/docs/docs/docsify-plugin.md +655 -0
- package/docs/docs/hmr.md +165 -0
- package/docs/docs/i18n.md +332 -0
- package/docs/docs/log.md +30 -1
- package/docs/docs/more-pages.md +23 -23
- package/docs/docs/quickstart.md +148 -119
- package/docs/docs/rechart-attributes.md +74 -74
- package/docs/docs/rechart-basic-usage.md +160 -162
- package/docs/docs/theme.md +5 -5
- package/docs/docs/typescript.md +306 -0
- package/docs/docs/visual-editor.md +359 -0
- package/docs/index.html +85 -71
- package/docs/manifest.json +23 -23
- package/docs/migration/v3-migration.md +392 -0
- package/docs/static/css/fluff-stuff.css +169 -169
- package/docs/static/css/font-awesome.min.css +4 -4
- package/docs/static/css/visualify.css +6 -25
- package/docs/static/js/3d-viz-examples.js +181 -0
- package/docs/static/js/configuration.js +630 -448
- package/docs/static/js/visualify.js +1 -188
- package/package.json +106 -84
- package/rollup.config.mjs +766 -76
- package/src/_css/404.css +115 -115
- package/src/_css/App.css +37 -37
- package/src/_css/autoSuggestion.css +26 -26
- package/src/_css/circular-progress.css +32 -32
- package/src/_css/index.css +36 -36
- package/src/_css/modern.css +350 -25
- package/src/_media/corner.svg +8 -8
- package/src/_media/download.svg +3 -3
- package/src/_media/logo.svg +14 -14
- package/src/_test/App.test.js +15 -15
- package/src/_utils/reportWebVitals.js +13 -13
- package/src/a11y/README.md +177 -0
- package/src/a11y/aria-labels.js +339 -0
- package/src/a11y/color-contrast.js +535 -0
- package/src/a11y/index.js +197 -0
- package/src/a11y/keyboard-nav.js +523 -0
- package/src/a11y/styles.css +165 -0
- package/src/cli/commands/dev.js +214 -0
- package/src/cli/commands/docs.js +521 -0
- package/src/cli/commands/edit.js +379 -0
- package/src/cli/commands/init.js +213 -0
- package/src/cli/commands/portal.js +236 -0
- package/src/cli/dev-server.js +530 -0
- package/src/cli/hmr.js +456 -0
- package/src/cli/index.js +180 -0
- package/src/cli/utils/config.js +207 -0
- package/src/cli/utils/logger.js +241 -0
- package/src/config/defaults.ts +122 -0
- package/src/config/index.ts +72 -0
- package/src/config/loader.ts +478 -0
- package/src/config/schema.ts +227 -0
- package/src/config/validator.ts +337 -0
- package/src/core/appContext.js +34 -27
- package/src/core/components/Bar.js +383 -0
- package/src/core/components/Bar3D.js +473 -0
- package/src/core/components/LargeDatasetChart.js +296 -0
- package/src/core/components/Line3D.js +310 -0
- package/src/core/components/Scatter.js +392 -188
- package/src/core/components/Scatter3D.js +455 -0
- package/src/core/components/ScatterBio.js +601 -572
- package/src/core/components/Surface3D.js +326 -0
- package/src/core/components/ThreeCustom.js +648 -0
- package/src/core/components/ThreeScene.js +459 -0
- package/src/core/components/VisiumPlot.js +191 -165
- package/src/core/components/browser.js +42 -42
- package/src/core/components/dotplot.js +413 -413
- package/src/core/components/html.js +29 -29
- package/src/core/components/list.js +178 -178
- package/src/core/components/macaron.js +206 -201
- package/src/core/components/markdown.js +56 -56
- package/src/core/components/parser.scatterBio.js +582 -579
- package/src/core/components/ratio.js +82 -80
- package/src/core/components/scatterL.js +206 -173
- package/src/core/components/searchbar.js +156 -131
- package/src/core/components/selection.js +310 -193
- package/src/core/components/timeline.js +236 -281
- package/src/core/components/visium.js +114 -97
- package/src/core/data-processor.js +413 -0
- package/src/core/fetch/condfetch.js +82 -82
- package/src/core/fetch/fetch.js +92 -92
- package/src/core/fetch/json.js +29 -29
- package/src/core/fetch/vfetch.js +42 -42
- package/src/core/hmr-client.js +724 -0
- package/src/core/liveEditor.js +44 -44
- package/src/core/modules/codeEditorWithPreview.js +104 -104
- package/src/core/modules/echarts/common.js +20 -20
- package/src/core/modules/echarts/gl.js +228 -0
- package/src/core/modules/echarts/presetHandler.js +41 -41
- package/src/core/modules/echarts/presets/esodev.chromium.js +172 -172
- package/src/core/modules/echarts/presets/esodev.codex.js +130 -130
- package/src/core/modules/echarts/presets/esodev.visium.js +123 -123
- package/src/core/modules/echarts/presets/mmtrbc.js +186 -186
- package/src/core/modules/echarts.js +70 -71
- package/src/core/modules/echartsUtils.js +43 -43
- package/src/core/modules/echartswitcher.js +227 -152
- package/src/core/modules/replotly/presetHandler.js +24 -24
- package/src/core/modules/replotly/presets/minimum.js +18 -18
- package/src/core/modules/replotly/presets/mmtrbc.dot.js +114 -114
- package/src/core/modules/replotly/presets/mmtrbc.violin.js +100 -100
- package/src/core/modules/replotly.js +74 -71
- package/src/core/modules/threejs/Camera.js +373 -0
- package/src/core/modules/threejs/Lighting.js +459 -0
- package/src/core/modules/threejs/Renderer.js +364 -0
- package/src/core/modules/threejs/Scene.js +266 -0
- package/src/core/modules/threejs/index.js +155 -0
- package/src/core/pages/404.js +50 -50
- package/src/core/pages/error.js +27 -27
- package/src/core/pages/jsonPage.js +62 -62
- package/src/core/pages/loading.js +44 -44
- package/src/core/parser/echart.data.js +204 -183
- package/src/core/parser/echart.features.js +125 -125
- package/src/core/parser/echart.general.js +147 -143
- package/src/core/parser/echart.hilbert.js +57 -57
- package/src/core/parser/echart.parser.js +210 -210
- package/src/core/parser/echart.series.js +67 -67
- package/src/core/parser/echart.types.js +76 -76
- package/src/core/parser/plotly.config.js +10 -10
- package/src/core/parser/plotly.data.js +132 -132
- package/src/core/parser/plotly.layout.js +9 -9
- package/src/core/parser/plotly.violin.js +18 -18
- package/src/core/recharts.js +361 -62
- package/src/core/router/alias.js +49 -49
- package/src/core/router/jsonRouter.js +31 -31
- package/src/core/themes/modern.js +32 -32
- package/src/core/themes/themeSelector.js +33 -33
- package/src/core/visualify.js +213 -47
- package/src/core/widgets/circularProgress.js +23 -23
- package/src/core/widgets/controller.js +116 -83
- package/src/core/widgets/errorBoundary.js +36 -36
- package/src/core/widgets/footer.js +185 -177
- package/src/core/widgets/header.js +238 -234
- package/src/core/widgets/layout/Grid.js +31 -31
- package/src/core/widgets/layout.js +36 -36
- package/src/core/widgets/mapping.js +56 -42
- package/src/core/workers/data-worker.js +349 -0
- package/src/core/workers/worker-pool.js +396 -0
- package/src/docsify/bundle.js +215 -0
- package/src/docsify/markdown.js +271 -0
- package/src/docsify/plugin.js +268 -0
- package/src/editor/README.md +172 -0
- package/src/editor/components/ChartBuilder.jsx +341 -0
- package/src/editor/components/ChartTypeSidebar.jsx +91 -0
- package/src/editor/components/Editor.jsx +367 -0
- package/src/editor/components/Preview.jsx +446 -0
- package/src/editor/components/PropertyPanel.jsx +468 -0
- package/src/editor/components/StatusBar.jsx +85 -0
- package/src/editor/context/EditorContext.js +248 -0
- package/src/editor/hooks/useDebounce.js +32 -0
- package/src/editor/index.js +315 -0
- package/src/editor/styles/editor.css +637 -0
- package/src/editor/utils/chartValidator.js +263 -0
- package/src/entries/charts3d.js +70 -0
- package/src/entries/core.js +78 -0
- package/src/entries/docs.js +154 -0
- package/src/entries/pages.js +93 -0
- package/src/entries/portal.js +204 -0
- package/src/entries/shared.js +50 -0
- package/src/i18n/formatters.js +455 -0
- package/src/i18n/index.js +169 -0
- package/src/i18n/locales/ar.json +137 -0
- package/src/i18n/locales/de.json +137 -0
- package/src/i18n/locales/en.json +137 -0
- package/src/i18n/locales/es.json +137 -0
- package/src/i18n/locales/he.json +137 -0
- package/src/i18n/locales/zh.json +137 -0
- package/src/i18n/rtl.css +183 -0
- package/src/index.js +82 -62
- package/src/loader.js +103 -0
- package/src/setupTests.js +5 -5
- package/tsconfig.json +51 -0
- package/types/charts.d.ts +569 -0
- package/types/components.d.ts +441 -0
- package/types/config.d.ts +199 -0
- package/types/index.d.ts +353 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accessibility Styles for Visualify.js
|
|
3
|
+
* Screen reader support, focus indicators, and motion preferences
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* Screen reader only content */
|
|
7
|
+
.sr-only {
|
|
8
|
+
position: absolute;
|
|
9
|
+
width: 1px;
|
|
10
|
+
height: 1px;
|
|
11
|
+
padding: 0;
|
|
12
|
+
margin: -1px;
|
|
13
|
+
overflow: hidden;
|
|
14
|
+
clip: rect(0, 0, 0, 0);
|
|
15
|
+
white-space: nowrap;
|
|
16
|
+
border: 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Screen reader only but focusable (for skip links) */
|
|
20
|
+
.sr-only-focusable:active,
|
|
21
|
+
.sr-only-focusable:focus {
|
|
22
|
+
position: static;
|
|
23
|
+
width: auto;
|
|
24
|
+
height: auto;
|
|
25
|
+
padding: inherit;
|
|
26
|
+
margin: inherit;
|
|
27
|
+
overflow: visible;
|
|
28
|
+
clip: auto;
|
|
29
|
+
white-space: normal;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* Focus indicators for keyboard navigation */
|
|
33
|
+
.visualify-chart:focus,
|
|
34
|
+
.visualify-chart:focus-visible {
|
|
35
|
+
outline: 3px solid #4A90E2;
|
|
36
|
+
outline-offset: 2px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* Remove focus outline for mouse users */
|
|
40
|
+
.visualify-chart:focus:not(:focus-visible) {
|
|
41
|
+
outline: none;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* High contrast mode support */
|
|
45
|
+
@media (prefers-contrast: high) {
|
|
46
|
+
.visualify-chart {
|
|
47
|
+
border: 2px solid currentColor;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.visualify-chart:focus,
|
|
51
|
+
.visualify-chart:focus-visible {
|
|
52
|
+
outline: 4px solid currentColor;
|
|
53
|
+
outline-offset: 2px;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Reduced motion support */
|
|
58
|
+
@media (prefers-reduced-motion: reduce) {
|
|
59
|
+
.visualify-chart,
|
|
60
|
+
.visualify-chart * {
|
|
61
|
+
animation-duration: 0.01ms !important;
|
|
62
|
+
animation-iteration-count: 1 !important;
|
|
63
|
+
transition-duration: 0.01ms !important;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* Skip link styles */
|
|
68
|
+
.visualify-skip-link {
|
|
69
|
+
position: absolute;
|
|
70
|
+
top: -40px;
|
|
71
|
+
left: 0;
|
|
72
|
+
background: #000;
|
|
73
|
+
color: #fff;
|
|
74
|
+
padding: 8px 16px;
|
|
75
|
+
z-index: 9999;
|
|
76
|
+
text-decoration: none;
|
|
77
|
+
transition: top 0.2s;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.visualify-skip-link:focus {
|
|
81
|
+
top: 0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* Controller container */
|
|
85
|
+
.visualify-controller {
|
|
86
|
+
position: relative;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.visualify-components-container {
|
|
90
|
+
position: relative;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Widget region styles */
|
|
94
|
+
.visualify-controller [role="region"] {
|
|
95
|
+
position: relative;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* Error alert styles */
|
|
99
|
+
.visualify-controller [role="alert"] {
|
|
100
|
+
padding: 1rem;
|
|
101
|
+
border: 2px solid #dc3545;
|
|
102
|
+
border-radius: 4px;
|
|
103
|
+
background-color: #f8d7da;
|
|
104
|
+
color: #721c24;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Data table styles for screen readers */
|
|
108
|
+
.visualify-chart table.sr-only {
|
|
109
|
+
/* Already covered by .sr-only, but ensuring tables are properly hidden */
|
|
110
|
+
display: block;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* Live region for announcements */
|
|
114
|
+
.visualify-live-region {
|
|
115
|
+
position: absolute;
|
|
116
|
+
left: -10000px;
|
|
117
|
+
width: 1px;
|
|
118
|
+
height: 1px;
|
|
119
|
+
overflow: hidden;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/* Focus visible polyfill support */
|
|
123
|
+
.js-focus-visible :focus:not(.focus-visible) {
|
|
124
|
+
outline: none;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.js-focus-visible .focus-visible {
|
|
128
|
+
outline: 3px solid #4A90E2;
|
|
129
|
+
outline-offset: 2px;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* Print styles - ensure charts are accessible when printed */
|
|
133
|
+
@media print {
|
|
134
|
+
.visualify-chart {
|
|
135
|
+
break-inside: avoid;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* Show screen reader content when printing */
|
|
139
|
+
.visualify-chart .sr-only {
|
|
140
|
+
position: static;
|
|
141
|
+
width: auto;
|
|
142
|
+
height: auto;
|
|
143
|
+
padding: inherit;
|
|
144
|
+
margin: inherit;
|
|
145
|
+
overflow: visible;
|
|
146
|
+
clip: auto;
|
|
147
|
+
white-space: normal;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/* Touch device optimizations */
|
|
152
|
+
@media (hover: none) and (pointer: coarse) {
|
|
153
|
+
.visualify-chart {
|
|
154
|
+
/* Larger touch targets on mobile */
|
|
155
|
+
min-height: 44px;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/* Dark mode support */
|
|
160
|
+
@media (prefers-color-scheme: dark) {
|
|
161
|
+
.visualify-chart:focus,
|
|
162
|
+
.visualify-chart:focus-visible {
|
|
163
|
+
outline-color: #6BB5FF;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Development server command for Visualify CLI
|
|
3
|
+
* @module cli/commands/dev
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { Command } = require('commander');
|
|
7
|
+
const logger = require('../utils/logger');
|
|
8
|
+
const { detectMode, loadConfig } = require('../utils/config');
|
|
9
|
+
const { createDevServer } = require('../dev-server');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Valid development modes
|
|
13
|
+
* @readonly
|
|
14
|
+
* @type {string[]}
|
|
15
|
+
*/
|
|
16
|
+
const VALID_MODES = ['auto', 'docs', 'portal'];
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Default mode when not specified
|
|
20
|
+
* @readonly
|
|
21
|
+
* @type {string}
|
|
22
|
+
*/
|
|
23
|
+
const DEFAULT_MODE = 'auto';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Active dev server instance for cleanup
|
|
27
|
+
* @type {DevServer|null}
|
|
28
|
+
*/
|
|
29
|
+
let activeServer = null;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Setup cleanup handlers for graceful shutdown
|
|
33
|
+
* @param {DevServer} server - The dev server instance
|
|
34
|
+
*/
|
|
35
|
+
function setupCleanupHandlers(server) {
|
|
36
|
+
const cleanup = async (signal) => {
|
|
37
|
+
logger.newline();
|
|
38
|
+
logger.info(`Received ${signal}, shutting down...`);
|
|
39
|
+
|
|
40
|
+
if (server) {
|
|
41
|
+
await server.stop();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
process.exit(0);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// Handle various termination signals
|
|
48
|
+
process.on('SIGINT', () => cleanup('SIGINT'));
|
|
49
|
+
process.on('SIGTERM', () => cleanup('SIGTERM'));
|
|
50
|
+
|
|
51
|
+
// Handle uncaught errors
|
|
52
|
+
process.on('uncaughtException', async (err) => {
|
|
53
|
+
logger.error('Uncaught exception:', err.message);
|
|
54
|
+
if (server) {
|
|
55
|
+
await server.stop();
|
|
56
|
+
}
|
|
57
|
+
process.exit(1);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
process.on('unhandledRejection', async (reason) => {
|
|
61
|
+
logger.error('Unhandled rejection:', reason);
|
|
62
|
+
if (server) {
|
|
63
|
+
await server.stop();
|
|
64
|
+
}
|
|
65
|
+
process.exit(1);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Execute the dev command
|
|
71
|
+
* @param {string} mode - The development mode
|
|
72
|
+
* @param {Object} options - Command options
|
|
73
|
+
* @param {boolean} options.verbose - Enable verbose logging
|
|
74
|
+
* @param {boolean} options.hmr - Enable HMR (default: true)
|
|
75
|
+
* @param {number} options.port - Port to run the server on
|
|
76
|
+
* @param {string} options.host - Host to bind the server to
|
|
77
|
+
* @returns {Promise<void>}
|
|
78
|
+
*/
|
|
79
|
+
async function executeDev(mode, options) {
|
|
80
|
+
try {
|
|
81
|
+
if (options.verbose) {
|
|
82
|
+
logger.enableVerbose();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
logger.debug('Starting dev command with mode:', mode);
|
|
86
|
+
logger.debug('Options:', options);
|
|
87
|
+
|
|
88
|
+
// Validate mode
|
|
89
|
+
if (!VALID_MODES.includes(mode)) {
|
|
90
|
+
logger.error(`Invalid mode: "${mode}"`);
|
|
91
|
+
logger.tip(`Valid modes are: ${VALID_MODES.join(', ')}`);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Determine actual mode to use
|
|
96
|
+
let actualMode = mode;
|
|
97
|
+
if (mode === 'auto') {
|
|
98
|
+
logger.info('Auto-detecting mode...');
|
|
99
|
+
actualMode = await detectMode();
|
|
100
|
+
logger.info(`Detected mode: ${actualMode}`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Load configuration
|
|
104
|
+
const config = await loadConfig();
|
|
105
|
+
logger.debug('Loaded config:', config);
|
|
106
|
+
|
|
107
|
+
// Execute the appropriate mode
|
|
108
|
+
switch (actualMode) {
|
|
109
|
+
case 'docs':
|
|
110
|
+
activeServer = await startDocsMode(config, options);
|
|
111
|
+
break;
|
|
112
|
+
case 'portal':
|
|
113
|
+
activeServer = await startPortalMode(config, options);
|
|
114
|
+
break;
|
|
115
|
+
default:
|
|
116
|
+
logger.error(`Unknown mode: "${actualMode}"`);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Setup cleanup handlers
|
|
121
|
+
if (activeServer) {
|
|
122
|
+
setupCleanupHandlers(activeServer);
|
|
123
|
+
}
|
|
124
|
+
} catch (err) {
|
|
125
|
+
logger.error('Failed to start development server:', err.message);
|
|
126
|
+
logger.debug('Stack trace:', err.stack);
|
|
127
|
+
|
|
128
|
+
// Cleanup on error
|
|
129
|
+
if (activeServer) {
|
|
130
|
+
await activeServer.stop();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Start documentation development mode
|
|
139
|
+
* @param {Object} config - Visualify configuration
|
|
140
|
+
* @param {Object} options - Command options
|
|
141
|
+
* @returns {Promise<DevServer>} The dev server instance
|
|
142
|
+
*/
|
|
143
|
+
async function startDocsMode(config, options) {
|
|
144
|
+
logger.header('Documentation Mode');
|
|
145
|
+
logger.info('Starting documentation development server with HMR...');
|
|
146
|
+
|
|
147
|
+
const server = await createDevServer({
|
|
148
|
+
port: options.port || config.port || 3000,
|
|
149
|
+
host: options.host || config.host || 'localhost',
|
|
150
|
+
hmr: options.hmr !== false,
|
|
151
|
+
mode: 'docs',
|
|
152
|
+
rootDir: process.cwd(),
|
|
153
|
+
staticDirs: ['docs', 'public', 'dist'],
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
logger.success('Documentation dev server started');
|
|
157
|
+
logger.tip('Edit your markdown files to see changes instantly');
|
|
158
|
+
|
|
159
|
+
return server;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Start portal development mode
|
|
164
|
+
* @param {Object} config - Visualify configuration
|
|
165
|
+
* @param {Object} options - Command options
|
|
166
|
+
* @returns {Promise<DevServer>} The dev server instance
|
|
167
|
+
*/
|
|
168
|
+
async function startPortalMode(config, options) {
|
|
169
|
+
logger.header('Portal Mode');
|
|
170
|
+
logger.info('Starting portal development server with HMR...');
|
|
171
|
+
|
|
172
|
+
const server = await createDevServer({
|
|
173
|
+
port: options.port || config.port || 3000,
|
|
174
|
+
host: options.host || config.host || 'localhost',
|
|
175
|
+
hmr: options.hmr !== false,
|
|
176
|
+
mode: 'portal',
|
|
177
|
+
rootDir: process.cwd(),
|
|
178
|
+
staticDirs: ['public', 'dist', 'build'],
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
logger.success('Portal dev server started');
|
|
182
|
+
logger.tip('Edit visualify.json or component files to see changes instantly');
|
|
183
|
+
|
|
184
|
+
return server;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Create and configure the dev command
|
|
189
|
+
* @returns {Command} The configured command
|
|
190
|
+
*/
|
|
191
|
+
function createDevCommand() {
|
|
192
|
+
const command = new Command('dev')
|
|
193
|
+
.description('Start the development server')
|
|
194
|
+
.argument(
|
|
195
|
+
'[mode]',
|
|
196
|
+
`Development mode: ${VALID_MODES.join(', ')}`,
|
|
197
|
+
DEFAULT_MODE
|
|
198
|
+
)
|
|
199
|
+
.option('-v, --verbose', 'Enable verbose logging')
|
|
200
|
+
.option('-p, --port <number>', 'Port to run the server on')
|
|
201
|
+
.option('-h, --host <host>', 'Host to bind the server to')
|
|
202
|
+
.option('--hmr', 'Enable Hot Module Replacement (default: true)', true)
|
|
203
|
+
.option('--no-hmr', 'Disable Hot Module Replacement')
|
|
204
|
+
.action(executeDev);
|
|
205
|
+
|
|
206
|
+
return command;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
module.exports = {
|
|
210
|
+
createDevCommand,
|
|
211
|
+
executeDev,
|
|
212
|
+
VALID_MODES,
|
|
213
|
+
DEFAULT_MODE,
|
|
214
|
+
};
|