@genome-spy/core 0.36.0 → 0.37.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 (523) hide show
  1. package/README.md +1 -0
  2. package/dist/{index.es.js → bundled/index.es.js} +4227 -4085
  3. package/dist/{index.js → bundled/index.js} +191 -55
  4. package/dist/src/data/collector.d.ts +36 -0
  5. package/dist/src/data/collector.d.ts.map +1 -0
  6. package/dist/src/data/collector.js +184 -0
  7. package/dist/src/data/collector.test.js +84 -0
  8. package/dist/src/data/dataFlow.d.ts +65 -0
  9. package/dist/src/data/dataFlow.d.ts.map +1 -0
  10. package/dist/src/data/dataFlow.js +142 -0
  11. package/dist/src/data/dataFlow.test.js +5 -0
  12. package/dist/src/data/facetNode.d.ts +17 -0
  13. package/dist/src/data/facetNode.d.ts.map +1 -0
  14. package/dist/src/data/facetNode.js +17 -0
  15. package/dist/src/data/flow.test.js +72 -0
  16. package/dist/src/data/flowNode.d.ts +136 -0
  17. package/dist/src/data/flowNode.d.ts.map +1 -0
  18. package/dist/src/data/flowNode.js +286 -0
  19. package/dist/src/data/flowNode.test.js +50 -0
  20. package/dist/src/data/flowOptimizer.d.ts +27 -0
  21. package/dist/src/data/flowOptimizer.d.ts.map +1 -0
  22. package/dist/src/data/flowOptimizer.js +133 -0
  23. package/dist/src/data/flowOptimizer.test.js +193 -0
  24. package/dist/src/data/flowTestUtils.d.ts +30 -0
  25. package/dist/src/data/flowTestUtils.d.ts.map +1 -0
  26. package/dist/src/data/flowTestUtils.js +63 -0
  27. package/dist/src/data/formats/fasta.d.ts +20 -0
  28. package/dist/src/data/formats/fasta.d.ts.map +1 -0
  29. package/dist/src/data/formats/fasta.js +32 -0
  30. package/dist/src/data/formats/fasta.test.js +27 -0
  31. package/dist/src/data/sources/dataSource.d.ts +12 -0
  32. package/dist/src/data/sources/dataSource.d.ts.map +1 -0
  33. package/dist/src/data/sources/dataSource.js +25 -0
  34. package/dist/src/data/sources/dataSourceFactory.d.ts +16 -0
  35. package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -0
  36. package/dist/src/data/sources/dataSourceFactory.js +127 -0
  37. package/dist/src/data/sources/dataUtils.d.ts +50 -0
  38. package/dist/src/data/sources/dataUtils.d.ts.map +1 -0
  39. package/dist/src/data/sources/dataUtils.js +83 -0
  40. package/dist/src/data/sources/dynamic/README.md +3 -0
  41. package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts +13 -0
  42. package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts.map +1 -0
  43. package/dist/src/data/sources/dynamic/axisGenomeSource.js +19 -0
  44. package/dist/src/data/sources/dynamic/axisTickSource.d.ts +18 -0
  45. package/dist/src/data/sources/dynamic/axisTickSource.d.ts.map +1 -0
  46. package/dist/src/data/sources/dynamic/axisTickSource.js +73 -0
  47. package/dist/src/data/sources/dynamic/bamSource.d.ts +46 -0
  48. package/dist/src/data/sources/dynamic/bamSource.d.ts.map +1 -0
  49. package/dist/src/data/sources/dynamic/bamSource.js +115 -0
  50. package/dist/src/data/sources/dynamic/bigBedSource.d.ts +51 -0
  51. package/dist/src/data/sources/dynamic/bigBedSource.d.ts.map +1 -0
  52. package/dist/src/data/sources/dynamic/bigBedSource.js +128 -0
  53. package/dist/src/data/sources/dynamic/bigWigSource.d.ts +58 -0
  54. package/dist/src/data/sources/dynamic/bigWigSource.d.ts.map +1 -0
  55. package/dist/src/data/sources/dynamic/bigWigSource.js +166 -0
  56. package/dist/src/data/sources/dynamic/gff3Source.d.ts +8 -0
  57. package/dist/src/data/sources/dynamic/gff3Source.d.ts.map +1 -0
  58. package/dist/src/data/sources/dynamic/gff3Source.js +19 -0
  59. package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts +30 -0
  60. package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts.map +1 -0
  61. package/dist/src/data/sources/dynamic/indexedFastaSource.js +86 -0
  62. package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts +42 -0
  63. package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts.map +1 -0
  64. package/dist/src/data/sources/dynamic/singleAxisLazySource.js +129 -0
  65. package/dist/src/data/sources/dynamic/tabixSource.d.ts +54 -0
  66. package/dist/src/data/sources/dynamic/tabixSource.d.ts.map +1 -0
  67. package/dist/src/data/sources/dynamic/tabixSource.js +140 -0
  68. package/dist/src/data/sources/dynamic/windowedMixin.d.ts +32 -0
  69. package/dist/src/data/sources/dynamic/windowedMixin.d.ts.map +1 -0
  70. package/dist/src/data/sources/dynamic/windowedMixin.js +53 -0
  71. package/dist/src/data/sources/inlineSource.d.ts +16 -0
  72. package/dist/src/data/sources/inlineSource.d.ts.map +1 -0
  73. package/dist/src/data/sources/inlineSource.js +68 -0
  74. package/dist/src/data/sources/inlineSource.test.js +56 -0
  75. package/dist/src/data/sources/namedSource.d.ts +25 -0
  76. package/dist/src/data/sources/namedSource.d.ts.map +1 -0
  77. package/dist/src/data/sources/namedSource.js +80 -0
  78. package/dist/src/data/sources/sequenceSource.d.ts +17 -0
  79. package/dist/src/data/sources/sequenceSource.d.ts.map +1 -0
  80. package/dist/src/data/sources/sequenceSource.js +47 -0
  81. package/dist/src/data/sources/sequenceSource.test.js +46 -0
  82. package/dist/src/data/sources/urlSource.d.ts +16 -0
  83. package/dist/src/data/sources/urlSource.d.ts.map +1 -0
  84. package/dist/src/data/sources/urlSource.js +74 -0
  85. package/dist/src/data/transforms/aggregate.d.ts +18 -0
  86. package/dist/src/data/transforms/aggregate.d.ts.map +1 -0
  87. package/dist/src/data/transforms/aggregate.js +67 -0
  88. package/dist/src/data/transforms/clone.d.ts +15 -0
  89. package/dist/src/data/transforms/clone.d.ts.map +1 -0
  90. package/dist/src/data/transforms/clone.js +40 -0
  91. package/dist/src/data/transforms/clone.test.js +11 -0
  92. package/dist/src/data/transforms/coverage.d.ts +30 -0
  93. package/dist/src/data/transforms/coverage.d.ts.map +1 -0
  94. package/dist/src/data/transforms/coverage.js +183 -0
  95. package/dist/src/data/transforms/coverage.test.js +123 -0
  96. package/dist/src/data/transforms/filter.d.ts +12 -0
  97. package/dist/src/data/transforms/filter.d.ts.map +1 -0
  98. package/dist/src/data/transforms/filter.js +33 -0
  99. package/dist/src/data/transforms/filter.test.js +18 -0
  100. package/dist/src/data/transforms/filterScoredLabels.d.ts +29 -0
  101. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -0
  102. package/dist/src/data/transforms/filterScoredLabels.js +134 -0
  103. package/dist/src/data/transforms/flatten.d.ts +10 -0
  104. package/dist/src/data/transforms/flatten.d.ts.map +1 -0
  105. package/dist/src/data/transforms/flatten.js +68 -0
  106. package/dist/src/data/transforms/flatten.test.js +93 -0
  107. package/dist/src/data/transforms/flattenCompressedExons.d.ts +19 -0
  108. package/dist/src/data/transforms/flattenCompressedExons.d.ts.map +1 -0
  109. package/dist/src/data/transforms/flattenCompressedExons.js +53 -0
  110. package/dist/src/data/transforms/flattenDelimited.d.ts +10 -0
  111. package/dist/src/data/transforms/flattenDelimited.d.ts.map +1 -0
  112. package/dist/src/data/transforms/flattenDelimited.js +66 -0
  113. package/dist/src/data/transforms/flattenDelimited.test.js +87 -0
  114. package/dist/src/data/transforms/flattenSequence.d.ts +11 -0
  115. package/dist/src/data/transforms/flattenSequence.d.ts.map +1 -0
  116. package/dist/src/data/transforms/flattenSequence.js +35 -0
  117. package/dist/src/data/transforms/flattenSequence.test.js +34 -0
  118. package/dist/src/data/transforms/formula.d.ts +13 -0
  119. package/dist/src/data/transforms/formula.d.ts.map +1 -0
  120. package/dist/src/data/transforms/formula.js +35 -0
  121. package/dist/src/data/transforms/formula.test.js +19 -0
  122. package/dist/src/data/transforms/identifier.d.ts +40 -0
  123. package/dist/src/data/transforms/identifier.d.ts.map +1 -0
  124. package/dist/src/data/transforms/identifier.js +106 -0
  125. package/dist/src/data/transforms/identifier.test.js +83 -0
  126. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts +10 -0
  127. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -0
  128. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +97 -0
  129. package/dist/src/data/transforms/measureText.d.ts +18 -0
  130. package/dist/src/data/transforms/measureText.d.ts.map +1 -0
  131. package/dist/src/data/transforms/measureText.js +42 -0
  132. package/dist/src/data/transforms/pileup.d.ts +10 -0
  133. package/dist/src/data/transforms/pileup.d.ts.map +1 -0
  134. package/dist/src/data/transforms/pileup.js +126 -0
  135. package/dist/src/data/transforms/pileup.test.js +70 -0
  136. package/dist/src/data/transforms/project.d.ts +13 -0
  137. package/dist/src/data/transforms/project.d.ts.map +1 -0
  138. package/dist/src/data/transforms/project.js +38 -0
  139. package/dist/src/data/transforms/project.test.js +32 -0
  140. package/dist/src/data/transforms/regexExtract.d.ts +13 -0
  141. package/dist/src/data/transforms/regexExtract.d.ts.map +1 -0
  142. package/dist/src/data/transforms/regexExtract.js +57 -0
  143. package/dist/src/data/transforms/regexExtract.test.js +67 -0
  144. package/dist/src/data/transforms/regexFold.d.ts +14 -0
  145. package/dist/src/data/transforms/regexFold.d.ts.map +1 -0
  146. package/dist/src/data/transforms/regexFold.js +139 -0
  147. package/dist/src/data/transforms/regexFold.test.js +160 -0
  148. package/dist/src/data/transforms/sample.d.ts +42 -0
  149. package/dist/src/data/transforms/sample.d.ts.map +1 -0
  150. package/dist/src/data/transforms/sample.js +99 -0
  151. package/dist/src/data/transforms/sample.test.js +38 -0
  152. package/dist/src/data/transforms/stack.d.ts +11 -0
  153. package/dist/src/data/transforms/stack.d.ts.map +1 -0
  154. package/dist/src/data/transforms/stack.js +134 -0
  155. package/dist/src/data/transforms/stack.test.js +91 -0
  156. package/dist/src/data/transforms/transformFactory.d.ts +12 -0
  157. package/dist/src/data/transforms/transformFactory.d.ts.map +1 -0
  158. package/dist/src/data/transforms/transformFactory.js +59 -0
  159. package/dist/src/encoder/accessor.d.ts +15 -0
  160. package/dist/src/encoder/accessor.d.ts.map +1 -0
  161. package/dist/src/encoder/accessor.js +76 -0
  162. package/dist/src/encoder/accessor.test.js +47 -0
  163. package/dist/src/encoder/encoder.d.ts +144 -0
  164. package/dist/src/encoder/encoder.d.ts.map +1 -0
  165. package/dist/src/encoder/encoder.js +400 -0
  166. package/dist/src/encoder/encoder.test.js +98 -0
  167. package/dist/src/fonts/Lato-Regular.json +1267 -0
  168. package/dist/src/fonts/Lato-Regular.png +0 -0
  169. package/dist/src/fonts/OFL.txt +93 -0
  170. package/dist/src/fonts/README.md +3 -0
  171. package/dist/src/fonts/bmFontManager.d.ts +182 -0
  172. package/dist/src/fonts/bmFontManager.d.ts.map +1 -0
  173. package/dist/src/fonts/bmFontManager.js +359 -0
  174. package/dist/src/fonts/bmFontMetrics.d.ts +45 -0
  175. package/dist/src/fonts/bmFontMetrics.d.ts.map +1 -0
  176. package/dist/src/fonts/bmFontMetrics.js +108 -0
  177. package/dist/src/genome/genome.d.ts +172 -0
  178. package/dist/src/genome/genome.d.ts.map +1 -0
  179. package/dist/src/genome/genome.js +379 -0
  180. package/dist/src/genome/genome.test.js +226 -0
  181. package/dist/src/genome/genomeStore.d.ts +20 -0
  182. package/dist/src/genome/genomeStore.d.ts.map +1 -0
  183. package/dist/src/genome/genomeStore.js +54 -0
  184. package/dist/src/genome/locusFormat.d.ts +14 -0
  185. package/dist/src/genome/locusFormat.d.ts.map +1 -0
  186. package/dist/src/genome/locusFormat.js +37 -0
  187. package/dist/src/genome/scaleIndex.d.ts +6 -0
  188. package/dist/src/genome/scaleIndex.d.ts.map +1 -0
  189. package/dist/src/genome/scaleIndex.js +165 -0
  190. package/dist/src/genome/scaleIndex.test.js +78 -0
  191. package/dist/src/genome/scaleLocus.d.ts +3 -0
  192. package/dist/src/genome/scaleLocus.d.ts.map +1 -0
  193. package/dist/src/genome/scaleLocus.js +101 -0
  194. package/dist/src/genome/scaleLocus.test.js +4 -0
  195. package/dist/src/genomeSpy.d.ts +141 -0
  196. package/dist/src/genomeSpy.d.ts.map +1 -0
  197. package/dist/src/genomeSpy.js +788 -0
  198. package/dist/src/gl/arrayBuilder.d.ts +71 -0
  199. package/dist/src/gl/arrayBuilder.d.ts.map +1 -0
  200. package/dist/src/gl/arrayBuilder.js +199 -0
  201. package/dist/src/gl/dataToVertices.d.ts +194 -0
  202. package/dist/src/gl/dataToVertices.d.ts.map +1 -0
  203. package/dist/src/gl/dataToVertices.js +639 -0
  204. package/dist/src/gl/includes/common.glsl.js +2 -0
  205. package/dist/src/gl/includes/picking.fragment.glsl.js +2 -0
  206. package/dist/src/gl/includes/picking.vertex.glsl.js +2 -0
  207. package/dist/src/gl/includes/sampleFacet.glsl.js +2 -0
  208. package/dist/src/gl/includes/scales.glsl.js +2 -0
  209. package/dist/src/gl/link.fragment.glsl.js +2 -0
  210. package/dist/src/gl/link.vertex.glsl.js +2 -0
  211. package/dist/src/gl/point.fragment.glsl.js +2 -0
  212. package/dist/src/gl/point.vertex.glsl.js +2 -0
  213. package/dist/src/gl/rect.fragment.glsl.js +2 -0
  214. package/dist/src/gl/rect.vertex.glsl.js +2 -0
  215. package/dist/src/gl/rule.fragment.glsl.js +2 -0
  216. package/dist/src/gl/rule.vertex.glsl.js +2 -0
  217. package/dist/src/gl/text.fragment.glsl.js +2 -0
  218. package/dist/src/gl/text.vertex.glsl.js +2 -0
  219. package/dist/src/gl/webGLHelper.d.ts +118 -0
  220. package/dist/src/gl/webGLHelper.d.ts.map +1 -0
  221. package/dist/src/gl/webGLHelper.js +513 -0
  222. package/dist/src/img/bowtie.svg +1 -0
  223. package/dist/src/img/genomespy-favicon.svg +34 -0
  224. package/dist/src/index.d.ts +15 -0
  225. package/dist/src/index.d.ts.map +1 -0
  226. package/dist/src/index.html +11 -0
  227. package/dist/src/index.js +129 -0
  228. package/dist/src/marks/link.d.ts +11 -0
  229. package/dist/src/marks/link.d.ts.map +1 -0
  230. package/dist/src/marks/link.js +175 -0
  231. package/dist/src/marks/mark.d.ts +226 -0
  232. package/dist/src/marks/mark.d.ts.map +1 -0
  233. package/dist/src/marks/mark.js +1004 -0
  234. package/dist/src/marks/markUtils.d.ts +23 -0
  235. package/dist/src/marks/markUtils.d.ts.map +1 -0
  236. package/dist/src/marks/markUtils.js +125 -0
  237. package/dist/src/marks/pointMark.d.ts +11 -0
  238. package/dist/src/marks/pointMark.d.ts.map +1 -0
  239. package/dist/src/marks/pointMark.js +251 -0
  240. package/dist/src/marks/rectMark.d.ts +18 -0
  241. package/dist/src/marks/rectMark.d.ts.map +1 -0
  242. package/dist/src/marks/rectMark.js +255 -0
  243. package/dist/src/marks/rule.d.ts +6 -0
  244. package/dist/src/marks/rule.d.ts.map +1 -0
  245. package/dist/src/marks/rule.js +250 -0
  246. package/dist/src/marks/text.d.ts +13 -0
  247. package/dist/src/marks/text.d.ts.map +1 -0
  248. package/dist/src/marks/text.js +279 -0
  249. package/dist/src/scale/colorUtils.d.ts +34 -0
  250. package/dist/src/scale/colorUtils.d.ts.map +1 -0
  251. package/dist/src/scale/colorUtils.js +184 -0
  252. package/dist/src/scale/glslScaleGenerator.d.ts +45 -0
  253. package/dist/src/scale/glslScaleGenerator.d.ts.map +1 -0
  254. package/dist/src/scale/glslScaleGenerator.js +506 -0
  255. package/dist/src/scale/scale.d.ts +10 -0
  256. package/dist/src/scale/scale.d.ts.map +1 -0
  257. package/dist/src/scale/scale.js +456 -0
  258. package/dist/src/scale/scale.test.js +324 -0
  259. package/dist/src/scale/ticks.d.ts +47 -0
  260. package/dist/src/scale/ticks.d.ts.map +1 -0
  261. package/dist/src/scale/ticks.js +203 -0
  262. package/dist/src/scale/ticks.test.js +40 -0
  263. package/dist/src/singlePageApp.d.ts +2 -0
  264. package/dist/src/singlePageApp.d.ts.map +1 -0
  265. package/dist/src/singlePageApp.js +13 -0
  266. package/dist/src/spec/axis.d.ts +402 -0
  267. package/dist/src/spec/channel.d.ts +440 -0
  268. package/dist/src/spec/data.d.ts +370 -0
  269. package/dist/src/spec/font.d.ts +15 -0
  270. package/dist/src/spec/genome.d.ts +35 -0
  271. package/dist/src/spec/mark.d.ts +435 -0
  272. package/dist/src/spec/root.d.ts +22 -0
  273. package/dist/src/spec/sampleView.d.ts +185 -0
  274. package/dist/src/spec/scale.d.ts +273 -0
  275. package/dist/src/spec/title.d.ts +102 -0
  276. package/dist/src/spec/tooltip.d.ts +9 -0
  277. package/dist/src/spec/transform.d.ts +504 -0
  278. package/dist/src/spec/view.d.ts +214 -0
  279. package/dist/src/styles/genome-spy.css.d.ts +3 -0
  280. package/dist/src/styles/genome-spy.css.d.ts.map +1 -0
  281. package/dist/src/styles/genome-spy.css.js +114 -0
  282. package/dist/src/styles/genome-spy.scss +153 -0
  283. package/dist/src/tooltip/dataTooltipHandler.d.ts +2 -0
  284. package/dist/src/tooltip/dataTooltipHandler.d.ts.map +1 -0
  285. package/dist/src/tooltip/dataTooltipHandler.js +64 -0
  286. package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +2 -0
  287. package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts.map +1 -0
  288. package/dist/src/tooltip/refseqGeneTooltipHandler.js +78 -0
  289. package/dist/src/tooltip/tooltipHandler.d.ts +9 -0
  290. package/dist/src/tooltip/tooltipHandler.d.ts.map +1 -0
  291. package/dist/src/tooltip/tooltipHandler.ts +12 -0
  292. package/dist/src/types/bmFont.d.ts +58 -0
  293. package/dist/src/types/embedApi.d.ts +67 -0
  294. package/dist/src/types/encoder.d.ts +84 -0
  295. package/dist/src/types/flowBatch.d.ts +40 -0
  296. package/dist/src/types/rendering.d.ts +65 -0
  297. package/dist/src/types/scaleResolutionApi.d.ts +40 -0
  298. package/dist/src/types/viewContext.d.ts +85 -0
  299. package/dist/src/utils/addBaseUrl.d.ts +6 -0
  300. package/dist/src/utils/addBaseUrl.d.ts.map +1 -0
  301. package/dist/src/utils/addBaseUrl.js +19 -0
  302. package/dist/src/utils/addBaseUrl.test.js +22 -0
  303. package/dist/src/utils/animator.d.ts +41 -0
  304. package/dist/src/utils/animator.d.ts.map +1 -0
  305. package/dist/src/utils/animator.js +83 -0
  306. package/dist/src/utils/arrayUtils.d.ts +34 -0
  307. package/dist/src/utils/arrayUtils.d.ts.map +1 -0
  308. package/dist/src/utils/arrayUtils.js +61 -0
  309. package/dist/src/utils/binnedIndex.d.ts +23 -0
  310. package/dist/src/utils/binnedIndex.d.ts.map +1 -0
  311. package/dist/src/utils/binnedIndex.js +167 -0
  312. package/dist/src/utils/binnedIndex.test.js +155 -0
  313. package/dist/src/utils/clamp.d.ts +7 -0
  314. package/dist/src/utils/clamp.d.ts.map +1 -0
  315. package/dist/src/utils/clamp.js +8 -0
  316. package/dist/src/utils/cloner.d.ts +16 -0
  317. package/dist/src/utils/cloner.d.ts.map +1 -0
  318. package/dist/src/utils/cloner.js +34 -0
  319. package/dist/src/utils/cloner.test.js +24 -0
  320. package/dist/src/utils/coalesce.d.ts +6 -0
  321. package/dist/src/utils/coalesce.d.ts.map +1 -0
  322. package/dist/src/utils/coalesce.js +11 -0
  323. package/dist/src/utils/coalesce.test.js +16 -0
  324. package/dist/src/utils/concatIterables.d.ts +8 -0
  325. package/dist/src/utils/concatIterables.d.ts.map +1 -0
  326. package/dist/src/utils/concatIterables.js +26 -0
  327. package/dist/src/utils/concatIterables.test.js +8 -0
  328. package/dist/src/utils/debounce.d.ts +8 -0
  329. package/dist/src/utils/debounce.d.ts.map +1 -0
  330. package/dist/src/utils/debounce.js +37 -0
  331. package/dist/src/utils/domainArray.d.ts +61 -0
  332. package/dist/src/utils/domainArray.d.ts.map +1 -0
  333. package/dist/src/utils/domainArray.js +216 -0
  334. package/dist/src/utils/domainArray.test.js +130 -0
  335. package/dist/src/utils/eerp.d.ts +12 -0
  336. package/dist/src/utils/eerp.d.ts.map +1 -0
  337. package/dist/src/utils/eerp.js +13 -0
  338. package/dist/src/utils/expression.d.ts +9 -0
  339. package/dist/src/utils/expression.d.ts.map +1 -0
  340. package/dist/src/utils/expression.js +32 -0
  341. package/dist/src/utils/field.d.ts +17 -0
  342. package/dist/src/utils/field.d.ts.map +1 -0
  343. package/dist/src/utils/field.js +28 -0
  344. package/dist/src/utils/formatObject.d.ts +7 -0
  345. package/dist/src/utils/formatObject.d.ts.map +1 -0
  346. package/dist/src/utils/formatObject.js +37 -0
  347. package/dist/src/utils/indexer.d.ts +16 -0
  348. package/dist/src/utils/indexer.d.ts.map +1 -0
  349. package/dist/src/utils/indexer.js +43 -0
  350. package/dist/src/utils/indexer.test.js +47 -0
  351. package/dist/src/utils/inertia.d.ts +42 -0
  352. package/dist/src/utils/inertia.d.ts.map +1 -0
  353. package/dist/src/utils/inertia.js +124 -0
  354. package/dist/src/utils/interactionEvent.d.ts +26 -0
  355. package/dist/src/utils/interactionEvent.d.ts.map +1 -0
  356. package/dist/src/utils/interactionEvent.js +33 -0
  357. package/dist/src/utils/iterateNestedMaps.d.ts +11 -0
  358. package/dist/src/utils/iterateNestedMaps.d.ts.map +1 -0
  359. package/dist/src/utils/iterateNestedMaps.js +21 -0
  360. package/dist/src/utils/iterateNestedMaps.test.js +33 -0
  361. package/dist/src/utils/kWayMerge.d.ts +9 -0
  362. package/dist/src/utils/kWayMerge.d.ts.map +1 -0
  363. package/dist/src/utils/kWayMerge.js +42 -0
  364. package/dist/src/utils/kWayMerge.test.js +26 -0
  365. package/dist/src/utils/layout/flexLayout.d.ts +182 -0
  366. package/dist/src/utils/layout/flexLayout.d.ts.map +1 -0
  367. package/dist/src/utils/layout/flexLayout.js +381 -0
  368. package/dist/src/utils/layout/flexLayout.test.js +323 -0
  369. package/dist/src/utils/layout/grid.d.ts +29 -0
  370. package/dist/src/utils/layout/grid.d.ts.map +1 -0
  371. package/dist/src/utils/layout/grid.js +95 -0
  372. package/dist/src/utils/layout/grid.test.js +71 -0
  373. package/dist/src/utils/layout/padding.d.ts +83 -0
  374. package/dist/src/utils/layout/padding.d.ts.map +1 -0
  375. package/dist/src/utils/layout/padding.js +155 -0
  376. package/dist/src/utils/layout/point.d.ts +16 -0
  377. package/dist/src/utils/layout/point.d.ts.map +1 -0
  378. package/dist/src/utils/layout/point.js +23 -0
  379. package/dist/src/utils/layout/rectangle.d.ts +142 -0
  380. package/dist/src/utils/layout/rectangle.d.ts.map +1 -0
  381. package/dist/src/utils/layout/rectangle.js +296 -0
  382. package/dist/src/utils/layout/rectangle.test.js +172 -0
  383. package/dist/src/utils/mergeObjects.d.ts +15 -0
  384. package/dist/src/utils/mergeObjects.d.ts.map +1 -0
  385. package/dist/src/utils/mergeObjects.js +99 -0
  386. package/dist/src/utils/mergeObjects.test.js +42 -0
  387. package/dist/src/utils/numberExtractor.d.ts +9 -0
  388. package/dist/src/utils/numberExtractor.d.ts.map +1 -0
  389. package/dist/src/utils/numberExtractor.js +24 -0
  390. package/dist/src/utils/numberExtractor.test.js +6 -0
  391. package/dist/src/utils/point.d.ts +9 -0
  392. package/dist/src/utils/point.d.ts.map +1 -0
  393. package/dist/src/utils/point.js +14 -0
  394. package/dist/src/utils/propertyCacher.d.ts +30 -0
  395. package/dist/src/utils/propertyCacher.d.ts.map +1 -0
  396. package/dist/src/utils/propertyCacher.js +70 -0
  397. package/dist/src/utils/propertyCacher.test.js +85 -0
  398. package/dist/src/utils/propertyCoalescer.d.ts +15 -0
  399. package/dist/src/utils/propertyCoalescer.d.ts.map +1 -0
  400. package/dist/src/utils/propertyCoalescer.js +42 -0
  401. package/dist/src/utils/propertyCoalescer.test.js +22 -0
  402. package/dist/src/utils/reservationMap.d.ts +42 -0
  403. package/dist/src/utils/reservationMap.d.ts.map +1 -0
  404. package/dist/src/utils/reservationMap.js +103 -0
  405. package/dist/src/utils/reservationMap.test.js +20 -0
  406. package/dist/src/utils/scaleNull.d.ts +13 -0
  407. package/dist/src/utils/scaleNull.d.ts.map +1 -0
  408. package/dist/src/utils/scaleNull.js +21 -0
  409. package/dist/src/utils/setOperations.d.ts +31 -0
  410. package/dist/src/utils/setOperations.d.ts.map +1 -0
  411. package/dist/src/utils/setOperations.js +75 -0
  412. package/dist/src/utils/smoothstep.d.ts +7 -0
  413. package/dist/src/utils/smoothstep.d.ts.map +1 -0
  414. package/dist/src/utils/smoothstep.js +10 -0
  415. package/dist/src/utils/throttle.d.ts +8 -0
  416. package/dist/src/utils/throttle.d.ts.map +1 -0
  417. package/dist/src/utils/throttle.js +34 -0
  418. package/dist/src/utils/topK.d.ts +22 -0
  419. package/dist/src/utils/topK.d.ts.map +1 -0
  420. package/dist/src/utils/topK.js +76 -0
  421. package/dist/src/utils/topK.test.js +64 -0
  422. package/dist/src/utils/transition.d.ts +44 -0
  423. package/dist/src/utils/transition.d.ts.map +1 -0
  424. package/dist/src/utils/transition.js +74 -0
  425. package/dist/src/utils/trees.d.ts +56 -0
  426. package/dist/src/utils/trees.d.ts.map +1 -0
  427. package/dist/src/utils/trees.js +92 -0
  428. package/dist/src/utils/trees.test.js +130 -0
  429. package/dist/src/utils/ui/tooltip.d.ts +50 -0
  430. package/dist/src/utils/ui/tooltip.d.ts.map +1 -0
  431. package/dist/src/utils/ui/tooltip.js +189 -0
  432. package/dist/src/utils/url.d.ts +9 -0
  433. package/dist/src/utils/url.d.ts.map +1 -0
  434. package/dist/src/utils/url.js +22 -0
  435. package/dist/src/utils/variableTools.d.ts +14 -0
  436. package/dist/src/utils/variableTools.d.ts.map +1 -0
  437. package/dist/src/utils/variableTools.js +24 -0
  438. package/dist/src/utils/variableTools.test.js +13 -0
  439. package/dist/src/view/axisGridView.d.ts +39 -0
  440. package/dist/src/view/axisGridView.d.ts.map +1 -0
  441. package/dist/src/view/axisGridView.js +246 -0
  442. package/dist/src/view/axisResolution.d.ts +24 -0
  443. package/dist/src/view/axisResolution.d.ts.map +1 -0
  444. package/dist/src/view/axisResolution.js +141 -0
  445. package/dist/src/view/axisResolution.test.js +201 -0
  446. package/dist/src/view/axisView.d.ts +49 -0
  447. package/dist/src/view/axisView.d.ts.map +1 -0
  448. package/dist/src/view/axisView.js +629 -0
  449. package/dist/src/view/concatView.d.ts +16 -0
  450. package/dist/src/view/concatView.d.ts.map +1 -0
  451. package/dist/src/view/concatView.js +84 -0
  452. package/dist/src/view/containerView.d.ts +43 -0
  453. package/dist/src/view/containerView.d.ts.map +1 -0
  454. package/dist/src/view/containerView.js +137 -0
  455. package/dist/src/view/facetView.d.ts +71 -0
  456. package/dist/src/view/facetView.d.ts.map +1 -0
  457. package/dist/src/view/facetView.js +492 -0
  458. package/dist/src/view/flowBuilder.d.ts +37 -0
  459. package/dist/src/view/flowBuilder.d.ts.map +1 -0
  460. package/dist/src/view/flowBuilder.js +383 -0
  461. package/dist/src/view/flowBuilder.test.js +125 -0
  462. package/dist/src/view/gridView.d.ts +111 -0
  463. package/dist/src/view/gridView.d.ts.map +1 -0
  464. package/dist/src/view/gridView.js +1086 -0
  465. package/dist/src/view/implicitRootView.d.ts +9 -0
  466. package/dist/src/view/implicitRootView.d.ts.map +1 -0
  467. package/dist/src/view/implicitRootView.js +23 -0
  468. package/dist/src/view/importView.d.ts +17 -0
  469. package/dist/src/view/importView.d.ts.map +1 -0
  470. package/dist/src/view/importView.js +22 -0
  471. package/dist/src/view/layerView.d.ts +25 -0
  472. package/dist/src/view/layerView.d.ts.map +1 -0
  473. package/dist/src/view/layerView.js +77 -0
  474. package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts +30 -0
  475. package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -0
  476. package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +175 -0
  477. package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts +14 -0
  478. package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts.map +1 -0
  479. package/dist/src/view/renderingContext/compositeViewRenderingContext.js +51 -0
  480. package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts +51 -0
  481. package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts.map +1 -0
  482. package/dist/src/view/renderingContext/debuggingViewRenderingContext.js +94 -0
  483. package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts +60 -0
  484. package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts.map +1 -0
  485. package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.js +128 -0
  486. package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts +19 -0
  487. package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts.map +1 -0
  488. package/dist/src/view/renderingContext/simpleViewRenderingContext.js +64 -0
  489. package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts +22 -0
  490. package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts.map +1 -0
  491. package/dist/src/view/renderingContext/svgViewRenderingContext.js +125 -0
  492. package/dist/src/view/renderingContext/viewRenderingContext.d.ts +33 -0
  493. package/dist/src/view/renderingContext/viewRenderingContext.d.ts.map +1 -0
  494. package/dist/src/view/renderingContext/viewRenderingContext.js +41 -0
  495. package/dist/src/view/scaleResolution.d.ts +170 -0
  496. package/dist/src/view/scaleResolution.d.ts.map +1 -0
  497. package/dist/src/view/scaleResolution.js +874 -0
  498. package/dist/src/view/scaleResolution.test.js +658 -0
  499. package/dist/src/view/testUtils.d.ts +30 -0
  500. package/dist/src/view/testUtils.d.ts.map +1 -0
  501. package/dist/src/view/testUtils.js +101 -0
  502. package/dist/src/view/title.d.ts +6 -0
  503. package/dist/src/view/title.d.ts.map +1 -0
  504. package/dist/src/view/title.js +165 -0
  505. package/dist/src/view/unitView.d.ts +93 -0
  506. package/dist/src/view/unitView.d.ts.map +1 -0
  507. package/dist/src/view/unitView.js +345 -0
  508. package/dist/src/view/view.d.ts +291 -0
  509. package/dist/src/view/view.d.ts.map +1 -0
  510. package/dist/src/view/view.js +691 -0
  511. package/dist/src/view/view.test.js +214 -0
  512. package/dist/src/view/viewFactory.d.ts +76 -0
  513. package/dist/src/view/viewFactory.d.ts.map +1 -0
  514. package/dist/src/view/viewFactory.js +178 -0
  515. package/dist/src/view/viewFactory.test.js +17 -0
  516. package/dist/src/view/viewUtils.d.ts +90 -0
  517. package/dist/src/view/viewUtils.d.ts.map +1 -0
  518. package/dist/src/view/viewUtils.js +326 -0
  519. package/dist/src/view/zoom.d.ts +23 -0
  520. package/dist/src/view/zoom.d.ts.map +1 -0
  521. package/dist/src/view/zoom.js +89 -0
  522. package/package.json +15 -12
  523. package/dist/style.css +0 -1
@@ -0,0 +1,136 @@
1
+ /**
2
+ * @param {import("../types/flowBatch").FlowBatch} flowBatch
3
+ * @returns {flowBatch is import("../types/flowBatch").FileBatch}
4
+ */
5
+ export function isFileBatch(flowBatch: import("../types/flowBatch").FlowBatch): flowBatch is import("../types/flowBatch").FileBatch;
6
+ /**
7
+ * @param {import("../types/flowBatch").FlowBatch} flowBatch
8
+ * @returns {flowBatch is import("../types/flowBatch").FacetBatch}
9
+ */
10
+ export function isFacetBatch(flowBatch: import("../types/flowBatch").FlowBatch): flowBatch is import("../types/flowBatch").FacetBatch;
11
+ /**
12
+ * The FlowNode clones the data objects passing through or creates entirely
13
+ * new objects.
14
+ */
15
+ export const BEHAVIOR_CLONES: number;
16
+ /**
17
+ * FlowNode modifies the objects that pass through. Creating defensive copies
18
+ * (clones) in an upstream node may be appropriate, depending on branching.
19
+ */
20
+ export const BEHAVIOR_MODIFIES: number;
21
+ /**
22
+ * The flow node collects data objects and may emit the to its children.
23
+ * The collected data objects must not be modified by downstream transforms.
24
+ */
25
+ export const BEHAVIOR_COLLECTS: number;
26
+ /**
27
+ * This is heavily inspired by Vega's and Vega-Lite's data flow system.
28
+ *
29
+ * @typedef {Record<string, any>} Datum
30
+ * @typedef {Datum[]} Data
31
+ */
32
+ export default class FlowNode {
33
+ get behavior(): number;
34
+ /** @type {FlowNode[]} */
35
+ children: FlowNode[];
36
+ /** @type {FlowNode} */
37
+ parent: FlowNode;
38
+ /** True if all data have been processed */
39
+ completed: boolean;
40
+ /**
41
+ * Resets the node and all its descendants to their initial state, i.e., preparing
42
+ * for a new batch of data.
43
+ */
44
+ reset(): void;
45
+ /**
46
+ * Allows for doing final initialization after the flow structure has been
47
+ * built and optimized. Must be called before any data are to be propagated.
48
+ */
49
+ initialize(): void;
50
+ /**
51
+ * Dynamically updates the propagator method to allow the JavaScript engine
52
+ * to employ optimizations such as inlining.
53
+ */
54
+ _updatePropagator(): void;
55
+ /**
56
+ *
57
+ * @param {any} datum
58
+ */
59
+ _propagate(datum: any): void;
60
+ /**
61
+ *
62
+ * @param {FlowNode} parent
63
+ */
64
+ setParent(parent: FlowNode): void;
65
+ /**
66
+ *
67
+ * @param {FlowNode} child
68
+ */
69
+ addChild(child: FlowNode): FlowNode;
70
+ /**
71
+ * @param {FlowNode} node
72
+ */
73
+ adopt(node: FlowNode): void;
74
+ /**
75
+ * @param {FlowNode} otherParent
76
+ */
77
+ adoptChildrenOf(otherParent: FlowNode): void;
78
+ /**
79
+ * @param {FlowNode} newParent
80
+ */
81
+ insertAsParent(newParent: FlowNode): void;
82
+ /**
83
+ *
84
+ * @param {FlowNode} child
85
+ */
86
+ removeChild(child: FlowNode): void;
87
+ /**
88
+ * Removes this node and ligates (connects) the preceding and succeeding nodes.
89
+ */
90
+ excise(): void;
91
+ isRoot(): boolean;
92
+ isBranching(): boolean;
93
+ isTerminal(): boolean;
94
+ /**
95
+ * Visits child nodes in depth-first order.
96
+ *
97
+ * @param {(function(FlowNode):void) & { afterChildren?: function(FlowNode):void}} visitor
98
+ */
99
+ visit(visitor: ((arg0: FlowNode) => void) & {
100
+ afterChildren?: (arg0: FlowNode) => void;
101
+ }): void;
102
+ /**
103
+ * @param {number} [depth]
104
+ * @returns {string}
105
+ */
106
+ subtreeToString(depth?: number): string;
107
+ /**
108
+ * The global object for expressions (in formula and filter transforms).
109
+ * Nodes in the hierarchy may extend the object using Object.create to
110
+ * introduce variables that are visible downstream the flow.
111
+ *
112
+ * @returns {Record<string, any>}
113
+ */
114
+ getGlobalObject(): Record<string, any>;
115
+ /**
116
+ *
117
+ * @param {Datum} datum
118
+ */
119
+ handle(datum: Datum): void;
120
+ complete(): void;
121
+ /**
122
+ * Signals that a new batch of data will be propagated.
123
+ *
124
+ * @param {import("../types/flowBatch").FlowBatch} flowBatch
125
+ */
126
+ beginBatch(flowBatch: import("../types/flowBatch").FlowBatch): void;
127
+ }
128
+ /**
129
+ * This is heavily inspired by Vega's and Vega-Lite's data flow system.
130
+ */
131
+ export type Datum = Record<string, any>;
132
+ /**
133
+ * This is heavily inspired by Vega's and Vega-Lite's data flow system.
134
+ */
135
+ export type Data = Datum[];
136
+ //# sourceMappingURL=flowNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowNode.d.ts","sourceRoot":"","sources":["../../../src/data/flowNode.js"],"names":[],"mappings":"AA+QA;;;GAGG;AACH,uCAHW,OAAO,oBAAoB,EAAE,SAAS,uDAKhD;AAED;;;GAGG;AACH,wCAHW,OAAO,oBAAoB,EAAE,SAAS,wDAKhD;AA3RD;;;GAGG;AACH,qCAAsC;AAEtC;;;GAGG;AACH,uCAAwC;AAExC;;;GAGG;AACH,uCAAwC;AAIxC;;;;;GAKG;AACH;IACI,uBAEC;IAGG,yBAAyB;IACzB,UADW,QAAQ,EAAE,CACH;IAElB,uBAAuB;IACvB,QADW,QAAQ,CACI;IAEvB,2CAA2C;IAC3C,mBAAsB;IAG1B;;;OAGG;IACH,cAMC;IAED;;;OAGG;IACH,mBAEC;IAED;;;OAGG;IACH,0BAUC;IAwLD;;;OAGG;IACH,kBAFW,GAAG,QAIb;IA5LD;;;OAGG;IACH,kBAFW,QAAQ,QAIlB;IAED;;;OAGG;IACH,gBAFW,QAAQ,YAUlB;IAED;;OAEG;IACH,YAFW,QAAQ,QAQlB;IAED;;OAEG;IACH,6BAFW,QAAQ,QAMlB;IAED;;OAEG;IACH,0BAFW,QAAQ,QAalB;IAED;;;OAGG;IACH,mBAFW,QAAQ,QAWlB;IAED;;OAEG;IACH,eAiBC;IAED,kBAEC;IAED,uBAEC;IAED,sBAEC;IAED;;;;OAIG;IACH,eAFW,QAAU,QAAQ,KAAE,IAAI,CAAC,GAAG;QAAE,aAAa,CAAC,SAAW,QAAQ,KAAE,IAAI,CAAA;KAAC,QAchF;IAED;;;OAGG;IACH,wBAHW,MAAM,GACJ,MAAM,CAWlB;IAED;;;;;;OAMG;IACH,mBAFa,OAAO,MAAM,EAAE,GAAG,CAAC,CAM/B;IAED;;;OAGG;IACH,cAFW,KAAK,QAKf;IAED,iBAMC;IAED;;;;OAIG;IACH,sBAFW,OAAO,oBAAoB,EAAE,SAAS,QAMhD;CASJ;;;;oBApPY,OAAO,MAAM,EAAE,GAAG,CAAC;;;;mBACnB,KAAK,EAAE"}
@@ -0,0 +1,286 @@
1
+ import { range } from "d3-array";
2
+
3
+ /**
4
+ * The FlowNode clones the data objects passing through or creates entirely
5
+ * new objects.
6
+ */
7
+ export const BEHAVIOR_CLONES = 1 << 0;
8
+
9
+ /**
10
+ * FlowNode modifies the objects that pass through. Creating defensive copies
11
+ * (clones) in an upstream node may be appropriate, depending on branching.
12
+ */
13
+ export const BEHAVIOR_MODIFIES = 1 << 1;
14
+
15
+ /**
16
+ * The flow node collects data objects and may emit the to its children.
17
+ * The collected data objects must not be modified by downstream transforms.
18
+ */
19
+ export const BEHAVIOR_COLLECTS = 1 << 2;
20
+
21
+ const ROOT_CONTEXT_OBJECT = {};
22
+
23
+ /**
24
+ * This is heavily inspired by Vega's and Vega-Lite's data flow system.
25
+ *
26
+ * @typedef {Record<string, any>} Datum
27
+ * @typedef {Datum[]} Data
28
+ */
29
+ export default class FlowNode {
30
+ get behavior() {
31
+ return 0;
32
+ }
33
+
34
+ constructor() {
35
+ /** @type {FlowNode[]} */
36
+ this.children = [];
37
+
38
+ /** @type {FlowNode} */
39
+ this.parent = undefined;
40
+
41
+ /** True if all data have been processed */
42
+ this.completed = false;
43
+ }
44
+
45
+ /**
46
+ * Resets the node and all its descendants to their initial state, i.e., preparing
47
+ * for a new batch of data.
48
+ */
49
+ reset() {
50
+ this.completed = false;
51
+
52
+ for (const child of this.children) {
53
+ child.reset();
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Allows for doing final initialization after the flow structure has been
59
+ * built and optimized. Must be called before any data are to be propagated.
60
+ */
61
+ initialize() {
62
+ // override
63
+ }
64
+
65
+ /**
66
+ * Dynamically updates the propagator method to allow the JavaScript engine
67
+ * to employ optimizations such as inlining.
68
+ */
69
+ _updatePropagator() {
70
+ this._propagate = Function(
71
+ "children",
72
+ range(this.children.length)
73
+ .map((i) => `const child${i} = children[${i}];`)
74
+ .join("\n") +
75
+ `return function propagate(datum) {${range(this.children.length)
76
+ .map((i) => `child${i}.handle(datum);`)
77
+ .join("\n")}}`
78
+ )(this.children);
79
+ }
80
+
81
+ /**
82
+ *
83
+ * @param {FlowNode} parent
84
+ */
85
+ setParent(parent) {
86
+ this.parent = parent;
87
+ }
88
+
89
+ /**
90
+ *
91
+ * @param {FlowNode} child
92
+ */
93
+ addChild(child) {
94
+ if (child.parent) {
95
+ throw new Error("Cannot add the child! It already has a parent.");
96
+ }
97
+ this.children.push(child);
98
+ child.setParent(this);
99
+ this._updatePropagator();
100
+ return this;
101
+ }
102
+
103
+ /**
104
+ * @param {FlowNode} node
105
+ */
106
+ adopt(node) {
107
+ if (node.parent) {
108
+ node.parent.removeChild(node);
109
+ }
110
+
111
+ this.addChild(node);
112
+ }
113
+
114
+ /**
115
+ * @param {FlowNode} otherParent
116
+ */
117
+ adoptChildrenOf(otherParent) {
118
+ for (const child of otherParent.children) {
119
+ this.adopt(child);
120
+ }
121
+ }
122
+
123
+ /**
124
+ * @param {FlowNode} newParent
125
+ */
126
+ insertAsParent(newParent) {
127
+ if (this.isRoot()) {
128
+ // Root should always be a data source
129
+ throw new Error("Cannot insert a new parent for a root node!");
130
+ }
131
+
132
+ newParent.parent = this.parent;
133
+ this.parent.children[this.parent.children.indexOf(this)] = newParent;
134
+ this.parent._updatePropagator();
135
+ this.parent = undefined;
136
+ newParent.addChild(this);
137
+ }
138
+
139
+ /**
140
+ *
141
+ * @param {FlowNode} child
142
+ */
143
+ removeChild(child) {
144
+ const index = this.children.indexOf(child);
145
+ if (index > -1) {
146
+ this.children.splice(index, 1);
147
+ child.parent = undefined;
148
+ this._updatePropagator();
149
+ } else {
150
+ throw new Error("Trying to remove an unknown child node!");
151
+ }
152
+ }
153
+
154
+ /**
155
+ * Removes this node and ligates (connects) the preceding and succeeding nodes.
156
+ */
157
+ excise() {
158
+ if (this.isRoot()) {
159
+ // TODO: Implement
160
+ throw new Error("Cannot excise root node!");
161
+ } else if (this.isTerminal()) {
162
+ this.parent.removeChild(this);
163
+ } else if (this.children.length == 1) {
164
+ const child = this.children[0];
165
+ child.setParent(this.parent);
166
+ this.parent.children[this.parent.children.indexOf(this)] = child;
167
+ this.parent._updatePropagator();
168
+ this.setParent(undefined);
169
+ this.children.length = 0;
170
+ } else {
171
+ // TODO: Implement
172
+ throw new Error("Cannot excise a node that has multiple children!");
173
+ }
174
+ }
175
+
176
+ isRoot() {
177
+ return !this.parent;
178
+ }
179
+
180
+ isBranching() {
181
+ return this.children.length > 1;
182
+ }
183
+
184
+ isTerminal() {
185
+ return this.children.length == 0;
186
+ }
187
+
188
+ /**
189
+ * Visits child nodes in depth-first order.
190
+ *
191
+ * @param {(function(FlowNode):void) & { afterChildren?: function(FlowNode):void}} visitor
192
+ */
193
+ visit(visitor) {
194
+ // pre-order
195
+ visitor(this);
196
+
197
+ for (const child of this.children) {
198
+ child.visit(visitor);
199
+ }
200
+
201
+ // post-oder
202
+ if (visitor.afterChildren) {
203
+ visitor.afterChildren(this);
204
+ }
205
+ }
206
+
207
+ /**
208
+ * @param {number} [depth]
209
+ * @returns {string}
210
+ */
211
+ subtreeToString(depth = 0) {
212
+ const childTree = this.children
213
+ .map((child) => child.subtreeToString(depth + 1))
214
+ .join("");
215
+ return `${" ".repeat(depth * 2)}* ${this.constructor.name}${
216
+ ("identifier" in this && this.identifier
217
+ ? ": " + this.identifier
218
+ : "") ?? ""
219
+ } \n${childTree}`;
220
+ }
221
+
222
+ /**
223
+ * The global object for expressions (in formula and filter transforms).
224
+ * Nodes in the hierarchy may extend the object using Object.create to
225
+ * introduce variables that are visible downstream the flow.
226
+ *
227
+ * @returns {Record<string, any>}
228
+ */
229
+ getGlobalObject() {
230
+ return this.parent
231
+ ? this.parent.getGlobalObject()
232
+ : ROOT_CONTEXT_OBJECT;
233
+ }
234
+
235
+ /**
236
+ *
237
+ * @param {Datum} datum
238
+ */
239
+ handle(datum) {
240
+ // Default implementation just passes through
241
+ this._propagate(datum);
242
+ }
243
+
244
+ complete() {
245
+ this.completed = true;
246
+
247
+ for (const child of this.children) {
248
+ child.complete();
249
+ }
250
+ }
251
+
252
+ /**
253
+ * Signals that a new batch of data will be propagated.
254
+ *
255
+ * @param {import("../types/flowBatch").FlowBatch} flowBatch
256
+ */
257
+ beginBatch(flowBatch) {
258
+ for (const child of this.children) {
259
+ child.beginBatch(flowBatch);
260
+ }
261
+ }
262
+
263
+ /**
264
+ *
265
+ * @param {any} datum
266
+ */
267
+ _propagate(datum) {
268
+ // Implementation is set dynamically in add/removeChild
269
+ }
270
+ }
271
+
272
+ /**
273
+ * @param {import("../types/flowBatch").FlowBatch} flowBatch
274
+ * @returns {flowBatch is import("../types/flowBatch").FileBatch}
275
+ */
276
+ export function isFileBatch(flowBatch) {
277
+ return flowBatch.type == "file";
278
+ }
279
+
280
+ /**
281
+ * @param {import("../types/flowBatch").FlowBatch} flowBatch
282
+ * @returns {flowBatch is import("../types/flowBatch").FacetBatch}
283
+ */
284
+ export function isFacetBatch(flowBatch) {
285
+ return flowBatch.type == "facet";
286
+ }
@@ -0,0 +1,50 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import FlowNode from "./flowNode";
3
+ import { validateLinks } from "./flowOptimizer";
4
+
5
+ describe("Flow mutation", () => {
6
+ test("Excise a terminal node", () => {
7
+ const a = new FlowNode();
8
+ const b = new FlowNode();
9
+
10
+ a.addChild(b);
11
+ b.excise();
12
+
13
+ expect(a.children[0]).toBeUndefined();
14
+ expect(b.parent).toBeUndefined();
15
+
16
+ expect(validateLinks(a)).toBeTruthy();
17
+ });
18
+
19
+ test("Excise a node in the middle", () => {
20
+ const a = new FlowNode();
21
+ const b = new FlowNode();
22
+ const c = new FlowNode();
23
+
24
+ a.addChild(b);
25
+ b.addChild(c);
26
+ b.excise();
27
+
28
+ expect(a.children[0]).toBe(c);
29
+ expect(c.parent).toBe(a);
30
+
31
+ expect(validateLinks(a)).toBeTruthy();
32
+ });
33
+
34
+ test("Insert as parent", () => {
35
+ const a = new FlowNode();
36
+ const b = new FlowNode();
37
+ const c = new FlowNode();
38
+ const d = new FlowNode();
39
+
40
+ a.addChild(c);
41
+ a.addChild(d);
42
+ c.insertAsParent(b);
43
+
44
+ expect(a.children[0]).toBe(b);
45
+ expect(a.children[1]).toBe(d);
46
+ expect(a.children[0].children[0]).toBe(c);
47
+
48
+ expect(validateLinks(a)).toBeTruthy();
49
+ });
50
+ });
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @param {import("./flowNode").default} node
3
+ * @param {import("./flowNode").default} [parent]
4
+ */
5
+ export function validateLinks(node: import("./flowNode").default, parent?: import("./flowNode").default): boolean;
6
+ /**
7
+ * Removes possible redundant CloneTransforms that were added during graph construction.
8
+ *
9
+ * @param {import("./flowNode").default} node
10
+ */
11
+ export function removeRedundantCloneTransforms(node: import("./flowNode").default, cloneRequired?: boolean): void;
12
+ export function removeRedundantCollectors(): void;
13
+ export function combineAndPullCollectorsUp(): void;
14
+ /**
15
+ * @param {import("./dataFlow").default<any>} dataFlow
16
+ */
17
+ export function combineIdenticalDataSources(dataFlow: import("./dataFlow").default<any>): void;
18
+ /**
19
+ *
20
+ * @param {import("./flowNode").default} root
21
+ */
22
+ export function optimizeFlowGraph(root: import("./flowNode").default): void;
23
+ /**
24
+ * @param {import("./dataFlow").default<any>} dataFlow
25
+ */
26
+ export function optimizeDataFlow(dataFlow: import("./dataFlow").default<any>): void;
27
+ //# sourceMappingURL=flowOptimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowOptimizer.d.ts","sourceRoot":"","sources":["../../../src/data/flowOptimizer.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH,oCAHW,OAAO,YAAY,EAAE,OAAO,WAC5B,OAAO,YAAY,EAAE,OAAO,WActC;AAED;;;;GAIG;AACH,qDAFW,OAAO,YAAY,EAAE,OAAO,iCAgCtC;AAED,kDAEC;AAED,mDAEC;AAmBD;;GAEG;AACH,sDAFW,OAAO,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,QAwB3C;AAED;;;GAGG;AACH,wCAFW,OAAO,YAAY,EAAE,OAAO,QAStC;AAED;;GAEG;AACH,2CAFW,OAAO,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,QAQ3C"}
@@ -0,0 +1,133 @@
1
+ import { BEHAVIOR_CLONES, BEHAVIOR_COLLECTS } from "./flowNode";
2
+ import CloneTransform from "./transforms/clone";
3
+
4
+ /**
5
+ * @param {import("./flowNode").default} node
6
+ * @param {import("./flowNode").default} [parent]
7
+ */
8
+ export function validateLinks(node, parent = undefined) {
9
+ if (node.parent !== parent) {
10
+ return false;
11
+ }
12
+
13
+ for (const child of node.children) {
14
+ if (!validateLinks(child, node)) {
15
+ return false;
16
+ }
17
+ }
18
+
19
+ return true;
20
+ }
21
+
22
+ /**
23
+ * Removes possible redundant CloneTransforms that were added during graph construction.
24
+ *
25
+ * @param {import("./flowNode").default} node
26
+ */
27
+ export function removeRedundantCloneTransforms(node, cloneRequired = false) {
28
+ if (node.behavior & BEHAVIOR_COLLECTS) {
29
+ // If an object is modified downstream of a collector, it must be cloned
30
+ cloneRequired = true;
31
+ }
32
+
33
+ if (node instanceof CloneTransform) {
34
+ if (cloneRequired) {
35
+ cloneRequired = false;
36
+ } else {
37
+ const child = node.children[0];
38
+ node.excise();
39
+ if (child) {
40
+ removeRedundantCloneTransforms(child, cloneRequired);
41
+ }
42
+ return;
43
+ }
44
+ }
45
+
46
+ if (node.behavior & BEHAVIOR_CLONES) {
47
+ cloneRequired = false;
48
+ }
49
+
50
+ for (let i = 0, n = node.children.length; i < n; i++) {
51
+ // Clone transforms must be preserved at branches
52
+ removeRedundantCloneTransforms(
53
+ node.children[i],
54
+ cloneRequired || n > 1
55
+ );
56
+ }
57
+ }
58
+
59
+ export function removeRedundantCollectors() {
60
+ // TODO: Remove chained collectors, e.g., first collect and sort, then just collect
61
+ }
62
+
63
+ export function combineAndPullCollectorsUp() {
64
+ // TODO:
65
+ }
66
+
67
+ // TODO: Combine identical branches to prevent redundant work
68
+ // Example:
69
+ //
70
+ // --B--C--D
71
+ // /
72
+ // --A----B--C--E
73
+ // \
74
+ // --F--G
75
+ //
76
+ // should become:
77
+ //
78
+ // --D
79
+ // /
80
+ // --A----B--C----E
81
+ // \
82
+ // --F--G
83
+
84
+ /**
85
+ * @param {import("./dataFlow").default<any>} dataFlow
86
+ */
87
+ export function combineIdenticalDataSources(dataFlow) {
88
+ const dataSourceEntries = [...dataFlow._dataSourcesByHost.entries()];
89
+
90
+ /** @type {Map<string, import("./sources/dataSource").default>} */
91
+ const sourcesByIdentifiers = new Map();
92
+ for (const e of dataSourceEntries) {
93
+ const ds = e[1];
94
+ if (ds.identifier && !sourcesByIdentifiers.has(ds.identifier)) {
95
+ sourcesByIdentifiers.set(ds.identifier, ds);
96
+ }
97
+ }
98
+
99
+ dataFlow._dataSourcesByHost.clear();
100
+
101
+ for (let [key, dataSource] of dataSourceEntries) {
102
+ const target = sourcesByIdentifiers.get(dataSource.identifier);
103
+ if (target) {
104
+ target.adoptChildrenOf(dataSource);
105
+ dataSource = target;
106
+ }
107
+ dataFlow.addDataSource(dataSource, key);
108
+ }
109
+ }
110
+
111
+ /**
112
+ *
113
+ * @param {import("./flowNode").default} root
114
+ */
115
+ export function optimizeFlowGraph(root) {
116
+ removeRedundantCloneTransforms(root);
117
+ if (!validateLinks(root)) {
118
+ throw new Error(
119
+ "Encountered a bug! There's a problem in the data flow structure."
120
+ );
121
+ }
122
+ }
123
+
124
+ /**
125
+ * @param {import("./dataFlow").default<any>} dataFlow
126
+ */
127
+ export function optimizeDataFlow(dataFlow) {
128
+ for (const dataSource of dataFlow.dataSources) {
129
+ optimizeFlowGraph(dataSource);
130
+ }
131
+
132
+ combineIdenticalDataSources(dataFlow);
133
+ }