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.
Files changed (252) hide show
  1. package/.claude/mem/TIMELINE.md +36 -0
  2. package/.claude/mem/notes/2026-02-11-3d-visualization-docs-fix-external-script-solution.md +24 -0
  3. package/.claude/mem/notes/2026-02-11-3d-visualization-docs-fix-session-summary.md +43 -0
  4. package/.claude/mem/notes/2026-02-11-cli-fix-editor-command-alias.md +26 -0
  5. package/.claude/mem/notes/2026-02-11-phase-3-developer-experience-completed.md +51 -0
  6. package/.claude/mem/notes/2026-02-11-phase-4-web-workers-implementation-complete.md +59 -0
  7. package/.claude/mem/notes/2026-02-11-visualify-phase-2-3d-visualization-complete.md +50 -0
  8. package/.claude/mem/notes/2026-02-11-visualify-phase-2-committed-ready-for-phase-3.md +33 -0
  9. package/.claude/mem/notes/2026-02-11-visualify-phase-3-complete-developer-experience.md +52 -0
  10. package/.claude/mem/notes/2026-02-11-visualify-repository-cleanup-complete.md +28 -0
  11. package/.claude/mem/notes/2026-02-18-codebase-cleanup-docsify-plugin-documentation.md +37 -0
  12. package/.claude/mem/notes/2026-02-19-css-grid-layout-fix-displaycontents-on-vcontroller.md +18 -0
  13. package/.claude/mem/notes/2026-02-19-docsify-plugin-fixes-latex-and-visualify-code-bloc.md +26 -0
  14. package/.claude/mem/notes/2026-02-19-page-mode-docs-update-decisions.md +23 -0
  15. package/.claude/mem/notes/2026-02-19-react-context-infinite-re-render-loop-fix-pattern.md +31 -0
  16. package/.claude/mem/notes/2026-02-19-version-300-bump-and-build-fixes.md +32 -0
  17. package/.claude/mem/notes/2026-02-19-visualify-build-deployment-architecture-bug-fixes.md +25 -0
  18. package/.claude/mem/notes/2026-02-19-visualify-dist-iife-self-contained-build-config.md +30 -0
  19. package/.claude/mem/notes/2026-02-19-visualify-infinite-loop-i18n-fixes.md +31 -0
  20. package/.claude/mem/notes/2026-02-19-visualify-v3-bundle-splitting-docs-restructuring.md +32 -0
  21. package/.claude/mem/notes/2026-02-20-bundle-externalization-final-architecture.md +29 -0
  22. package/.claude/mem/notes/2026-02-20-chromium-page-fix-unstable-keys-and-double-event-b.md +27 -0
  23. package/.claude/mem/notes/2026-02-20-console-cleanup-bundle-optimization-commit.md +20 -0
  24. package/.claude/mem/notes/2026-02-20-dotbio-dot-plot-fix-useeffect-dependency.md +21 -0
  25. package/.claude/mem/notes/2026-02-20-public-folder-cleanup-and-readme-rewrite.md +25 -0
  26. package/.claude/mem/notes/2026-02-20-v300-release-and-beta-channel-strategy.md +29 -0
  27. package/.claude/mem/notes/2026-02-20-visium-background-image-unknown-legend-fix.md +19 -0
  28. package/.claude/mem/notes/2026-02-20-visualify-cdn-loader-bundle-externalization.md +34 -0
  29. package/.claude/mem/sessions/session-2026-02-20-031524.md +54 -0
  30. package/.claude/settings.local.json +21 -0
  31. package/.github/workflows/static.yml.bak +51 -51
  32. package/.sisyphus/boulder.json +65 -0
  33. package/.sisyphus/plans/phase-4-advanced-optimizations.md +217 -0
  34. package/LICENSE +674 -674
  35. package/README.md +94 -59
  36. package/config-overrides.js +31 -31
  37. package/dist/stats.html +4949 -0
  38. package/dist/visualify-3d.esm.js +1 -0
  39. package/dist/visualify-3d.js +1 -0
  40. package/dist/visualify-core.esm.js +1 -0
  41. package/dist/visualify-core.js +1 -0
  42. package/dist/visualify-docs.esm.js +1 -0
  43. package/dist/visualify-docs.js +1 -0
  44. package/dist/visualify-loader.js +1 -0
  45. package/dist/visualify-pages.esm.js +1 -0
  46. package/dist/visualify-pages.js +1 -0
  47. package/dist/visualify-portal.esm.js +1 -0
  48. package/dist/visualify-portal.js +1 -0
  49. package/dist/visualify-shared.js +26571 -0
  50. package/dist/visualify.js +1 -188
  51. package/docs/CHANGELOG.md +148 -0
  52. package/docs/cli/commands.md +513 -0
  53. package/docs/configuration/visualify-json.md +474 -0
  54. package/docs/docs/3d-visualization.md +374 -0
  55. package/docs/docs/CLI.md +303 -34
  56. package/docs/docs/README.md +65 -65
  57. package/docs/docs/Rechart/bar.md +190 -190
  58. package/docs/docs/Rechart/funnel.md +241 -193
  59. package/docs/docs/Rechart/line.md +355 -355
  60. package/docs/docs/Rechart/pie.md +225 -225
  61. package/docs/docs/Rechart/radar.md +253 -253
  62. package/docs/docs/Rechart/scatter.md +298 -0
  63. package/docs/docs/_404.md +51 -51
  64. package/docs/docs/_coverpage.md +11 -11
  65. package/docs/docs/_sidebar.md +54 -43
  66. package/docs/docs/components/dotBio.md +87 -34
  67. package/docs/docs/components/echart.md +171 -82
  68. package/docs/docs/components/html.md +61 -34
  69. package/docs/docs/components/macaron.md +156 -145
  70. package/docs/docs/components/markdown.md +42 -0
  71. package/docs/docs/components/more.md +183 -142
  72. package/docs/docs/components/plotly.md +132 -62
  73. package/docs/docs/components/scatterL.md +171 -70
  74. package/docs/docs/components/visium.md +112 -57
  75. package/docs/docs/configuration.md +121 -123
  76. package/docs/docs/deploy.md +31 -31
  77. package/docs/docs/docsify-plugin.md +655 -0
  78. package/docs/docs/hmr.md +165 -0
  79. package/docs/docs/i18n.md +332 -0
  80. package/docs/docs/log.md +30 -1
  81. package/docs/docs/more-pages.md +23 -23
  82. package/docs/docs/quickstart.md +148 -119
  83. package/docs/docs/rechart-attributes.md +74 -74
  84. package/docs/docs/rechart-basic-usage.md +160 -162
  85. package/docs/docs/theme.md +5 -5
  86. package/docs/docs/typescript.md +306 -0
  87. package/docs/docs/visual-editor.md +359 -0
  88. package/docs/index.html +85 -71
  89. package/docs/manifest.json +23 -23
  90. package/docs/migration/v3-migration.md +392 -0
  91. package/docs/static/css/fluff-stuff.css +169 -169
  92. package/docs/static/css/font-awesome.min.css +4 -4
  93. package/docs/static/css/visualify.css +6 -25
  94. package/docs/static/js/3d-viz-examples.js +181 -0
  95. package/docs/static/js/configuration.js +630 -448
  96. package/docs/static/js/visualify.js +1 -188
  97. package/package.json +106 -84
  98. package/rollup.config.mjs +766 -76
  99. package/src/_css/404.css +115 -115
  100. package/src/_css/App.css +37 -37
  101. package/src/_css/autoSuggestion.css +26 -26
  102. package/src/_css/circular-progress.css +32 -32
  103. package/src/_css/index.css +36 -36
  104. package/src/_css/modern.css +350 -25
  105. package/src/_media/corner.svg +8 -8
  106. package/src/_media/download.svg +3 -3
  107. package/src/_media/logo.svg +14 -14
  108. package/src/_test/App.test.js +15 -15
  109. package/src/_utils/reportWebVitals.js +13 -13
  110. package/src/a11y/README.md +177 -0
  111. package/src/a11y/aria-labels.js +339 -0
  112. package/src/a11y/color-contrast.js +535 -0
  113. package/src/a11y/index.js +197 -0
  114. package/src/a11y/keyboard-nav.js +523 -0
  115. package/src/a11y/styles.css +165 -0
  116. package/src/cli/commands/dev.js +214 -0
  117. package/src/cli/commands/docs.js +521 -0
  118. package/src/cli/commands/edit.js +379 -0
  119. package/src/cli/commands/init.js +213 -0
  120. package/src/cli/commands/portal.js +236 -0
  121. package/src/cli/dev-server.js +530 -0
  122. package/src/cli/hmr.js +456 -0
  123. package/src/cli/index.js +180 -0
  124. package/src/cli/utils/config.js +207 -0
  125. package/src/cli/utils/logger.js +241 -0
  126. package/src/config/defaults.ts +122 -0
  127. package/src/config/index.ts +72 -0
  128. package/src/config/loader.ts +478 -0
  129. package/src/config/schema.ts +227 -0
  130. package/src/config/validator.ts +337 -0
  131. package/src/core/appContext.js +34 -27
  132. package/src/core/components/Bar.js +383 -0
  133. package/src/core/components/Bar3D.js +473 -0
  134. package/src/core/components/LargeDatasetChart.js +296 -0
  135. package/src/core/components/Line3D.js +310 -0
  136. package/src/core/components/Scatter.js +392 -188
  137. package/src/core/components/Scatter3D.js +455 -0
  138. package/src/core/components/ScatterBio.js +601 -572
  139. package/src/core/components/Surface3D.js +326 -0
  140. package/src/core/components/ThreeCustom.js +648 -0
  141. package/src/core/components/ThreeScene.js +459 -0
  142. package/src/core/components/VisiumPlot.js +191 -165
  143. package/src/core/components/browser.js +42 -42
  144. package/src/core/components/dotplot.js +413 -413
  145. package/src/core/components/html.js +29 -29
  146. package/src/core/components/list.js +178 -178
  147. package/src/core/components/macaron.js +206 -201
  148. package/src/core/components/markdown.js +56 -56
  149. package/src/core/components/parser.scatterBio.js +582 -579
  150. package/src/core/components/ratio.js +82 -80
  151. package/src/core/components/scatterL.js +206 -173
  152. package/src/core/components/searchbar.js +156 -131
  153. package/src/core/components/selection.js +310 -193
  154. package/src/core/components/timeline.js +236 -281
  155. package/src/core/components/visium.js +114 -97
  156. package/src/core/data-processor.js +413 -0
  157. package/src/core/fetch/condfetch.js +82 -82
  158. package/src/core/fetch/fetch.js +92 -92
  159. package/src/core/fetch/json.js +29 -29
  160. package/src/core/fetch/vfetch.js +42 -42
  161. package/src/core/hmr-client.js +724 -0
  162. package/src/core/liveEditor.js +44 -44
  163. package/src/core/modules/codeEditorWithPreview.js +104 -104
  164. package/src/core/modules/echarts/common.js +20 -20
  165. package/src/core/modules/echarts/gl.js +228 -0
  166. package/src/core/modules/echarts/presetHandler.js +41 -41
  167. package/src/core/modules/echarts/presets/esodev.chromium.js +172 -172
  168. package/src/core/modules/echarts/presets/esodev.codex.js +130 -130
  169. package/src/core/modules/echarts/presets/esodev.visium.js +123 -123
  170. package/src/core/modules/echarts/presets/mmtrbc.js +186 -186
  171. package/src/core/modules/echarts.js +70 -71
  172. package/src/core/modules/echartsUtils.js +43 -43
  173. package/src/core/modules/echartswitcher.js +227 -152
  174. package/src/core/modules/replotly/presetHandler.js +24 -24
  175. package/src/core/modules/replotly/presets/minimum.js +18 -18
  176. package/src/core/modules/replotly/presets/mmtrbc.dot.js +114 -114
  177. package/src/core/modules/replotly/presets/mmtrbc.violin.js +100 -100
  178. package/src/core/modules/replotly.js +74 -71
  179. package/src/core/modules/threejs/Camera.js +373 -0
  180. package/src/core/modules/threejs/Lighting.js +459 -0
  181. package/src/core/modules/threejs/Renderer.js +364 -0
  182. package/src/core/modules/threejs/Scene.js +266 -0
  183. package/src/core/modules/threejs/index.js +155 -0
  184. package/src/core/pages/404.js +50 -50
  185. package/src/core/pages/error.js +27 -27
  186. package/src/core/pages/jsonPage.js +62 -62
  187. package/src/core/pages/loading.js +44 -44
  188. package/src/core/parser/echart.data.js +204 -183
  189. package/src/core/parser/echart.features.js +125 -125
  190. package/src/core/parser/echart.general.js +147 -143
  191. package/src/core/parser/echart.hilbert.js +57 -57
  192. package/src/core/parser/echart.parser.js +210 -210
  193. package/src/core/parser/echart.series.js +67 -67
  194. package/src/core/parser/echart.types.js +76 -76
  195. package/src/core/parser/plotly.config.js +10 -10
  196. package/src/core/parser/plotly.data.js +132 -132
  197. package/src/core/parser/plotly.layout.js +9 -9
  198. package/src/core/parser/plotly.violin.js +18 -18
  199. package/src/core/recharts.js +361 -62
  200. package/src/core/router/alias.js +49 -49
  201. package/src/core/router/jsonRouter.js +31 -31
  202. package/src/core/themes/modern.js +32 -32
  203. package/src/core/themes/themeSelector.js +33 -33
  204. package/src/core/visualify.js +213 -47
  205. package/src/core/widgets/circularProgress.js +23 -23
  206. package/src/core/widgets/controller.js +116 -83
  207. package/src/core/widgets/errorBoundary.js +36 -36
  208. package/src/core/widgets/footer.js +185 -177
  209. package/src/core/widgets/header.js +238 -234
  210. package/src/core/widgets/layout/Grid.js +31 -31
  211. package/src/core/widgets/layout.js +36 -36
  212. package/src/core/widgets/mapping.js +56 -42
  213. package/src/core/workers/data-worker.js +349 -0
  214. package/src/core/workers/worker-pool.js +396 -0
  215. package/src/docsify/bundle.js +215 -0
  216. package/src/docsify/markdown.js +271 -0
  217. package/src/docsify/plugin.js +268 -0
  218. package/src/editor/README.md +172 -0
  219. package/src/editor/components/ChartBuilder.jsx +341 -0
  220. package/src/editor/components/ChartTypeSidebar.jsx +91 -0
  221. package/src/editor/components/Editor.jsx +367 -0
  222. package/src/editor/components/Preview.jsx +446 -0
  223. package/src/editor/components/PropertyPanel.jsx +468 -0
  224. package/src/editor/components/StatusBar.jsx +85 -0
  225. package/src/editor/context/EditorContext.js +248 -0
  226. package/src/editor/hooks/useDebounce.js +32 -0
  227. package/src/editor/index.js +315 -0
  228. package/src/editor/styles/editor.css +637 -0
  229. package/src/editor/utils/chartValidator.js +263 -0
  230. package/src/entries/charts3d.js +70 -0
  231. package/src/entries/core.js +78 -0
  232. package/src/entries/docs.js +154 -0
  233. package/src/entries/pages.js +93 -0
  234. package/src/entries/portal.js +204 -0
  235. package/src/entries/shared.js +50 -0
  236. package/src/i18n/formatters.js +455 -0
  237. package/src/i18n/index.js +169 -0
  238. package/src/i18n/locales/ar.json +137 -0
  239. package/src/i18n/locales/de.json +137 -0
  240. package/src/i18n/locales/en.json +137 -0
  241. package/src/i18n/locales/es.json +137 -0
  242. package/src/i18n/locales/he.json +137 -0
  243. package/src/i18n/locales/zh.json +137 -0
  244. package/src/i18n/rtl.css +183 -0
  245. package/src/index.js +82 -62
  246. package/src/loader.js +103 -0
  247. package/src/setupTests.js +5 -5
  248. package/tsconfig.json +51 -0
  249. package/types/charts.d.ts +569 -0
  250. package/types/components.d.ts +441 -0
  251. package/types/config.d.ts +199 -0
  252. package/types/index.d.ts +353 -0
@@ -1,82 +1,82 @@
1
- /*
2
- * @Author : Lihao leolihao@arizona.edu
3
- * @Date : 2023-12-27 17:34:06
4
- * @FilePath : /visualifyjs/src/core/fetch/condfetch.js
5
- * @Description :
6
- * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
- */
8
- import fetchApi from './vfetch';
9
- import { isEmpty } from 'lodash';
10
-
11
- const conditionalFetch = async (
12
- source,
13
- sharedData,
14
- title,
15
- visualify = {},
16
- body = null,
17
- ) => {
18
- const {
19
- name,
20
- method = 'GET',
21
- url,
22
- responseKey,
23
- mapping: api_mapping = visualify?.api_mapping ?? {},
24
- trigger,
25
- } = source;
26
-
27
- if (!name) throw new Error('name is required for api sources');
28
- if (!url) throw new Error('url is required for api sources');
29
-
30
- if (Array.isArray(trigger)) {
31
- // Handle complex trigger configurations
32
- const triggerValues = trigger.map((triggerItem) => {
33
- const triggerValue =
34
- sharedData[triggerItem.name] || sharedData[triggerItem];
35
- if (triggerItem.title && title) title.text = triggerValue;
36
-
37
- return triggerValue !== undefined &&
38
- triggerValue !== null &&
39
- triggerValue !== '' &&
40
- !isEmpty(triggerValue)
41
- ? api_mapping?.[triggerValue] || triggerValue
42
- : null;
43
- });
44
-
45
- if (triggerValues.some((val) => val === null)) {
46
- // If any trigger value is not available, skip this source
47
- return null;
48
- }
49
-
50
- // Replace multiple {trigger} placeholders in the URL with trigger values
51
- let finalUrl = url;
52
- triggerValues.forEach((triggerValue) => {
53
- finalUrl = finalUrl.replace('{trigger}', triggerValue);
54
- });
55
-
56
- const response = await fetchApi(finalUrl, method, body, {}, true);
57
-
58
- return responseKey ? response[responseKey] : response;
59
- } else if (trigger) {
60
- // Handle simple string trigger
61
- const triggerValue = sharedData[trigger.name] || sharedData[trigger];
62
-
63
- if (
64
- triggerValue !== undefined &&
65
- triggerValue !== null &&
66
- triggerValue !== '' &&
67
- !isEmpty(triggerValue)
68
- ) {
69
- if (trigger.title && title) title.text = triggerValue;
70
- const triggerVal = api_mapping?.[triggerValue] || triggerValue;
71
- const finalUrl = url.replace('{trigger}', triggerVal);
72
-
73
- const response = await fetchApi(finalUrl, method, null, {}, true);
74
- return responseKey ? response[responseKey] : response;
75
- }
76
- } else {
77
- const response = await fetchApi(url, method, null, {}, true);
78
- return responseKey ? response[responseKey] : response;
79
- }
80
- };
81
-
82
- export default conditionalFetch;
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2023-12-27 17:34:06
4
+ * @FilePath : /visualifyjs/src/core/fetch/condfetch.js
5
+ * @Description :
6
+ * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+ import fetchApi from './vfetch';
9
+ import { isEmpty } from 'lodash';
10
+
11
+ const conditionalFetch = async (
12
+ source,
13
+ sharedData,
14
+ title,
15
+ visualify = {},
16
+ body = null,
17
+ ) => {
18
+ const {
19
+ name,
20
+ method = 'GET',
21
+ url,
22
+ responseKey,
23
+ mapping: api_mapping = visualify?.api_mapping ?? {},
24
+ trigger,
25
+ } = source;
26
+
27
+ if (!name) throw new Error('name is required for api sources');
28
+ if (!url) throw new Error('url is required for api sources');
29
+
30
+ if (Array.isArray(trigger)) {
31
+ // Handle complex trigger configurations
32
+ const triggerValues = trigger.map((triggerItem) => {
33
+ const triggerValue =
34
+ sharedData[triggerItem.name] || sharedData[triggerItem];
35
+ if (triggerItem.title && title) title.text = triggerValue;
36
+
37
+ return triggerValue !== undefined &&
38
+ triggerValue !== null &&
39
+ triggerValue !== '' &&
40
+ !isEmpty(triggerValue)
41
+ ? api_mapping?.[triggerValue] || triggerValue
42
+ : null;
43
+ });
44
+
45
+ if (triggerValues.some((val) => val === null)) {
46
+ // If any trigger value is not available, skip this source
47
+ return null;
48
+ }
49
+
50
+ // Replace multiple {trigger} placeholders in the URL with trigger values
51
+ let finalUrl = url;
52
+ triggerValues.forEach((triggerValue) => {
53
+ finalUrl = finalUrl.replace('{trigger}', triggerValue);
54
+ });
55
+
56
+ const response = await fetchApi(finalUrl, method, body, {}, true);
57
+
58
+ return responseKey ? response[responseKey] : response;
59
+ } else if (trigger) {
60
+ // Handle simple string trigger
61
+ const triggerValue = sharedData[trigger.name] || sharedData[trigger];
62
+
63
+ if (
64
+ triggerValue !== undefined &&
65
+ triggerValue !== null &&
66
+ triggerValue !== '' &&
67
+ !isEmpty(triggerValue)
68
+ ) {
69
+ if (trigger.title && title) title.text = triggerValue;
70
+ const triggerVal = api_mapping?.[triggerValue] || triggerValue;
71
+ const finalUrl = url.replace('{trigger}', triggerVal);
72
+
73
+ const response = await fetchApi(finalUrl, method, null, {}, true);
74
+ return responseKey ? response[responseKey] : response;
75
+ }
76
+ } else {
77
+ const response = await fetchApi(url, method, null, {}, true);
78
+ return responseKey ? response[responseKey] : response;
79
+ }
80
+ };
81
+
82
+ export default conditionalFetch;
@@ -1,92 +1,92 @@
1
- /*
2
- * @Author : Lihao leolihao@arizona.edu
3
- * @Date : 2023-09-22 21:19:16
4
- * @FilePath : /visualifyjs/src/core/fetch/fetch.js
5
- * @Description :
6
- * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
- */
8
-
9
- const MAX_CACHE_SIZE = 512 * 1024 * 1024; // 512MB
10
-
11
- const cache = {};
12
- const lruOrder = [];
13
-
14
- // Function to manage the cache size and eviction
15
- const manageCache = (cacheKey, data) => {
16
- // Add the cacheKey to the LRU order
17
- lruOrder.push(cacheKey);
18
-
19
- // Check if the cache size exceeds the maximum limit
20
- let currentCacheSize = 0;
21
- for (const key of lruOrder) {
22
- if (cache[key]) {
23
- currentCacheSize += JSON.stringify(cache[key]).length;
24
- }
25
- if (currentCacheSize > MAX_CACHE_SIZE) {
26
- // Remove the least recently used item from the cache and the LRU order
27
- const lruKey = lruOrder.shift();
28
- delete cache[lruKey];
29
- }
30
- }
31
-
32
- // Cache the data
33
- cache[cacheKey] = data;
34
- };
35
-
36
- const simplefetch = async (url, options = {}) => {
37
- const { id = undefined, type, key, debug = false, bbox = {} } = options;
38
- const hasBbox = Object.keys(bbox).length > 0;
39
- const cacheKey = hasBbox ? `${id}_${JSON.stringify(bbox)}` : `${id}_nobbox`;
40
-
41
- if (cache[cacheKey]) {
42
- if (debug) console.warn('simplefetch: cache hit ', cacheKey);
43
- return cache[cacheKey];
44
- }
45
-
46
- if (typeof url === 'object') {
47
- if (id && id !== '') return url[id] ?? {};
48
- else return url;
49
- } else if (typeof url === 'string') {
50
- let result = {};
51
- if (type && type === 'gene' && (id === '' || id === undefined))
52
- return {};
53
- if (type && (type === 'gene' || type === 'metadata') && id && id !== '')
54
- url += (url.charAt(url.length - 1) === '/' ? '' : '/') + id;
55
- if (type && type === 'metadata' && id && id !== '' && hasBbox) {
56
- const { xMin, yMin, xMax, yMax } = bbox;
57
- url += `/${xMin}/${yMin}/${xMax}/${yMax}`;
58
- //console.log('simplefetch: url', url);
59
- }
60
-
61
- //console.log("simplefetch: fetch url", url);
62
- const res = await fetch(url, debug ? { mode: 'cors' } : {}); // using await here
63
- //console.log("simplefetch: fetch res", res);
64
-
65
- if (res.ok) {
66
- const data = await res.json(); // using await here
67
- if (data.code === 200) {
68
- if (key) {
69
- result = data[key];
70
- } else if (type === 'metadata') result = data.metadata;
71
- else if (type === 'gene') result = data.gene;
72
- else if (type === 'image') result = data.image;
73
- else result = data;
74
-
75
- // When caching data, use the manageCache function
76
- if (id && !cache[cacheKey]) {
77
- manageCache(cacheKey, result);
78
- }
79
-
80
- if (debug) console.log('simplefetch: fetch success', result);
81
- } else console.error('simplefetch: fetch failed', data.code, data.msg);
82
- } else console.error('simplefetch: fetch error', res);
83
-
84
- //console.log("simplefetch: after fetch", result);
85
- return result;
86
- } else {
87
- console.error('Unsupported type or Invalid url:', url);
88
- return {};
89
- }
90
- };
91
-
92
- export default simplefetch;
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2023-09-22 21:19:16
4
+ * @FilePath : /visualifyjs/src/core/fetch/fetch.js
5
+ * @Description :
6
+ * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+
9
+ const MAX_CACHE_SIZE = 512 * 1024 * 1024; // 512MB
10
+
11
+ const cache = {};
12
+ const lruOrder = [];
13
+
14
+ // Function to manage the cache size and eviction
15
+ const manageCache = (cacheKey, data) => {
16
+ // Add the cacheKey to the LRU order
17
+ lruOrder.push(cacheKey);
18
+
19
+ // Check if the cache size exceeds the maximum limit
20
+ let currentCacheSize = 0;
21
+ for (const key of lruOrder) {
22
+ if (cache[key]) {
23
+ currentCacheSize += JSON.stringify(cache[key]).length;
24
+ }
25
+ if (currentCacheSize > MAX_CACHE_SIZE) {
26
+ // Remove the least recently used item from the cache and the LRU order
27
+ const lruKey = lruOrder.shift();
28
+ delete cache[lruKey];
29
+ }
30
+ }
31
+
32
+ // Cache the data
33
+ cache[cacheKey] = data;
34
+ };
35
+
36
+ const simplefetch = async (url, options = {}) => {
37
+ const { id = undefined, type, key, debug = false, bbox = {} } = options;
38
+ const hasBbox = Object.keys(bbox).length > 0;
39
+ const cacheKey = hasBbox ? `${id}_${JSON.stringify(bbox)}` : `${id}_nobbox`;
40
+
41
+ if (cache[cacheKey]) {
42
+ if (debug) console.warn('simplefetch: cache hit ', cacheKey);
43
+ return cache[cacheKey];
44
+ }
45
+
46
+ if (typeof url === 'object') {
47
+ if (id && id !== '') return url[id] ?? {};
48
+ else return url;
49
+ } else if (typeof url === 'string') {
50
+ let result = {};
51
+ if (type && type === 'gene' && (id === '' || id === undefined))
52
+ return {};
53
+ if (type && (type === 'gene' || type === 'metadata') && id && id !== '')
54
+ url += (url.charAt(url.length - 1) === '/' ? '' : '/') + id;
55
+ if (type && type === 'metadata' && id && id !== '' && hasBbox) {
56
+ const { xMin, yMin, xMax, yMax } = bbox;
57
+ url += `/${xMin}/${yMin}/${xMax}/${yMax}`;
58
+ //console.log('simplefetch: url', url);
59
+ }
60
+
61
+ //console.log("simplefetch: fetch url", url);
62
+ const res = await fetch(url, debug ? { mode: 'cors' } : {}); // using await here
63
+ //console.log("simplefetch: fetch res", res);
64
+
65
+ if (res.ok) {
66
+ const data = await res.json(); // using await here
67
+ if (data.code === 200) {
68
+ if (key) {
69
+ result = data[key];
70
+ } else if (type === 'metadata') result = data.metadata;
71
+ else if (type === 'gene') result = data.gene;
72
+ else if (type === 'image') result = data.image;
73
+ else result = data;
74
+
75
+ // When caching data, use the manageCache function
76
+ if (id && !cache[cacheKey]) {
77
+ manageCache(cacheKey, result);
78
+ }
79
+
80
+ if (debug) console.log('simplefetch: fetch success', result);
81
+ } else console.error('simplefetch: fetch failed', data.code, data.msg);
82
+ } else console.error('simplefetch: fetch error', res);
83
+
84
+ //console.log("simplefetch: after fetch", result);
85
+ return result;
86
+ } else {
87
+ console.error('Unsupported type or Invalid url:', url);
88
+ return {};
89
+ }
90
+ };
91
+
92
+ export default simplefetch;
@@ -1,29 +1,29 @@
1
- /*
2
- * @Author : Lihao leolihao@arizona.edu
3
- * @Date : 2023-12-01 12:28:29
4
- * @FilePath : /visualifyjs/src/core/fetch/json.js
5
- * @Description :
6
- * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
- */
8
- function fetchJson(jsonFileName, externalURL) {
9
- let jsonUrl;
10
- if (externalURL) {
11
- jsonUrl = externalURL;
12
- } else {
13
- jsonUrl = `./${jsonFileName}.json`;
14
- }
15
-
16
- return fetch(jsonUrl).then((response) => {
17
- if (!response.ok) {
18
- throw new Error(`Failed to fetch JSON for ${jsonFileName}`);
19
- }
20
- if (
21
- !response.headers.get('content-type')?.includes('application/json')
22
- ) {
23
- throw new TypeError('Response not in JSON format');
24
- }
25
- return response.json();
26
- });
27
- }
28
-
29
- export default fetchJson;
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2023-12-01 12:28:29
4
+ * @FilePath : /visualifyjs/src/core/fetch/json.js
5
+ * @Description :
6
+ * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+ function fetchJson(jsonFileName, externalURL) {
9
+ let jsonUrl;
10
+ if (externalURL) {
11
+ jsonUrl = externalURL;
12
+ } else {
13
+ jsonUrl = `./${jsonFileName}.json`;
14
+ }
15
+
16
+ return fetch(jsonUrl).then((response) => {
17
+ if (!response.ok) {
18
+ throw new Error(`Failed to fetch JSON for ${jsonFileName}`);
19
+ }
20
+ if (
21
+ !response.headers.get('content-type')?.includes('application/json')
22
+ ) {
23
+ throw new TypeError('Response not in JSON format');
24
+ }
25
+ return response.json();
26
+ });
27
+ }
28
+
29
+ export default fetchJson;
@@ -1,42 +1,42 @@
1
- /*
2
- * @Author : Lihao leolihao@arizona.edu
3
- * @Date : 2023-12-21 16:49:22
4
- * @FilePath : /visualifyjs/src/core/fetch/vfetch.js
5
- * @Description :
6
- * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
- */
8
- const fetchApi = async (
9
- url,
10
- method = 'GET',
11
- body = null,
12
- headers = {},
13
- debug = false,
14
- ) => {
15
- // Setup for CORS and headers
16
- let fetchOptions = {
17
- method: method,
18
- headers: {
19
- 'Content-Type': 'application/json',
20
- ...headers,
21
- },
22
- mode: debug ? 'cors' : 'same-origin',
23
- };
24
-
25
- // Add body for POST request
26
- if (method === 'POST' && body) {
27
- fetchOptions.body = JSON.stringify(body);
28
- }
29
-
30
- try {
31
- const response = await fetch(url, fetchOptions);
32
- if (!response.ok) {
33
- throw new Error(`HTTP error! status: ${response.status}`);
34
- }
35
- return await response.json();
36
- } catch (err) {
37
- console.error('Fetch API Error:', err);
38
- throw err;
39
- }
40
- };
41
-
42
- export default fetchApi;
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2023-12-21 16:49:22
4
+ * @FilePath : /visualifyjs/src/core/fetch/vfetch.js
5
+ * @Description :
6
+ * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+ const fetchApi = async (
9
+ url,
10
+ method = 'GET',
11
+ body = null,
12
+ headers = {},
13
+ debug = false,
14
+ ) => {
15
+ // Setup for CORS and headers
16
+ let fetchOptions = {
17
+ method: method,
18
+ headers: {
19
+ 'Content-Type': 'application/json',
20
+ ...headers,
21
+ },
22
+ mode: debug ? 'cors' : 'same-origin',
23
+ };
24
+
25
+ // Add body for POST request
26
+ if (method === 'POST' && body) {
27
+ fetchOptions.body = JSON.stringify(body);
28
+ }
29
+
30
+ try {
31
+ const response = await fetch(url, fetchOptions);
32
+ if (!response.ok) {
33
+ throw new Error(`HTTP error! status: ${response.status}`);
34
+ }
35
+ return await response.json();
36
+ } catch (err) {
37
+ console.error('Fetch API Error:', err);
38
+ throw err;
39
+ }
40
+ };
41
+
42
+ export default fetchApi;