diff --git a/examples/extra-large-graphs/edge.fast.frag.glsl b/examples/extra-large-graphs/edge.fast.frag.glsl
new file mode 100644
index 000000000..21bece896
--- /dev/null
+++ b/examples/extra-large-graphs/edge.fast.frag.glsl
@@ -0,0 +1,7 @@
+precision mediump float;
+
+varying vec4 v_color;
+
+void main(void) {
+ gl_FragColor = v_color;
+}
diff --git a/examples/extra-large-graphs/edge.fast.vert.glsl b/examples/extra-large-graphs/edge.fast.vert.glsl
new file mode 100644
index 000000000..ac4db39cb
--- /dev/null
+++ b/examples/extra-large-graphs/edge.fast.vert.glsl
@@ -0,0 +1,18 @@
+attribute vec2 a_position;
+attribute vec4 a_color;
+
+uniform mat3 u_matrix;
+
+varying vec4 v_color;
+
+void main() {
+ // Scale from [[-1 1] [-1 1]] to the container:
+ gl_Position = vec4(
+ (u_matrix * vec3(a_position, 1)).xy,
+ 0,
+ 1
+ );
+
+ // Extract the color:
+ v_color = a_color;
+}
diff --git a/examples/extra-large-graphs/edge.gpu.ts b/examples/extra-large-graphs/edge.gpu.ts
new file mode 100644
index 000000000..09a55822a
--- /dev/null
+++ b/examples/extra-large-graphs/edge.gpu.ts
@@ -0,0 +1,91 @@
+/**
+ * Sigma.js WebGL Renderer Fast Edge Program
+ * ==========================================
+ *
+ * Program rendering edges using GL_LINES which is presumably very fast but
+ * won't render thickness correctly on some GPUs and has some quirks.
+ * @module
+ */
+import { AbstractEdgeProgram } from "sigma/rendering/webgl/programs/common/edge";
+import { RenderParams } from "sigma/rendering/webgl/programs/common/program";
+
+import fragmentShaderSource from "./edge.fast.frag.glsl";
+import vertexShaderSource from "./edge.fast.vert.glsl";
+
+let POINTS = 2;
+const ATTRIBUTES = 3;
+
+export default class EdgeGpuProgram extends AbstractEdgeProgram {
+ positionLocation: GLint;
+ colorLocation: GLint;
+ matrixLocation: WebGLUniformLocation;
+
+ constructor(gl: WebGLRenderingContext) {
+ super(gl, vertexShaderSource, fragmentShaderSource, POINTS, ATTRIBUTES);
+
+ // Locations:
+ this.positionLocation = gl.getAttribLocation(this.program, "a_position");
+ this.colorLocation = gl.getAttribLocation(this.program, "a_color");
+
+ // Uniform locations:
+ const matrixLocation = gl.getUniformLocation(this.program, "u_matrix");
+ if (matrixLocation === null) throw new Error("EdgeGpuProgram: error while getting matrixLocation");
+ this.matrixLocation = matrixLocation;
+
+ this.bind();
+ }
+
+ bind(): void {
+ const gl = this.gl;
+
+ // Bindings
+ gl.enableVertexAttribArray(this.positionLocation);
+ gl.enableVertexAttribArray(this.colorLocation);
+
+ gl.vertexAttribPointer(
+ this.positionLocation,
+ 2,
+ gl.FLOAT,
+ false,
+ this.attributes * Float32Array.BYTES_PER_ELEMENT,
+ 0,
+ );
+ gl.vertexAttribPointer(
+ this.colorLocation,
+ 4,
+ gl.UNSIGNED_BYTE,
+ true,
+ this.attributes * Float32Array.BYTES_PER_ELEMENT,
+ 8,
+ );
+ }
+
+ computeIndices(): void {
+ //nothing to do
+ }
+
+ process(
+ sourceData,
+ targetData,
+ data,
+ hidden: boolean,
+ offset: number,
+ ): void {
+ this.array = data.buffer.getChild('edges').toArray();
+ POINTS = this.array.length / ATTRIBUTES;
+ this.points = POINTS;
+ }
+
+ render(params: RenderParams): void {
+ if (this.hasNothingToRender()) return;
+
+ const gl = this.gl;
+ const program = this.program;
+
+ gl.useProgram(program);
+
+ gl.uniformMatrix3fv(this.matrixLocation, false, params.matrix);
+
+ gl.drawArrays(gl.LINES, 0, this.array.length / ATTRIBUTES);
+ }
+}
diff --git a/examples/extra-large-graphs/generate-graph.js b/examples/extra-large-graphs/generate-graph.js
new file mode 100644
index 000000000..938f32c5c
--- /dev/null
+++ b/examples/extra-large-graphs/generate-graph.js
@@ -0,0 +1,47 @@
+/**
+ * This example aims at showcasing sigma's performances.
+ */
+
+const fs = require('fs');
+const seedrandom = require('seedrandom');
+
+const {Graph} = require('graphology');
+
+const circlepack = require( "graphology-layout/circlepack");
+const clusters = require( "graphology-generators/random/clusters");
+
+const rng = seedrandom("sigma");
+const state = {
+ order: 1000000,
+ size: 2000000,
+ clusters: 3,
+ edgesRenderer: 'edges-fast'
+};
+
+// 1. Generate a graph:
+const graph = clusters(Graph, { ...state, rng });
+circlepack.assign(graph, {
+ hierarchyAttributes: ["cluster"],
+});
+const colors = {};
+for (let i = 0; i < +state.clusters; i++) {
+ colors[i] = "#" + Math.floor(rng() * 16777215).toString(16);
+}
+let i = 0;
+graph.forEachNode((node, { cluster }) => {
+ graph.mergeNodeAttributes(node, {
+ size: graph.degree(node) / 3,
+ label: `Node n°${++i}, in cluster n°${cluster}`,
+ color: colors[cluster + ""],
+ });
+});
+
+// 2. Save the graph:
+fs.writeFile('./large-graph.json', JSON.stringify(graph.toJSON(), {}, 2), (err) => {
+ if(err) {
+ console.log('unable to savfe file');
+ } else {
+ console.log('file saved?');
+ }
+});
+console.log('Finished step 2');
diff --git a/examples/extra-large-graphs/generate-graph.ts b/examples/extra-large-graphs/generate-graph.ts
new file mode 100644
index 000000000..67cda889c
--- /dev/null
+++ b/examples/extra-large-graphs/generate-graph.ts
@@ -0,0 +1,49 @@
+/**
+ * This example aims at showcasing sigma's performances.
+ */
+
+const fs = require('fs');
+const seedrandom = require('seedrandom');
+
+const {Graph} = require('graphology');
+
+const circlepack = require('graphology-layout/circlepack');
+const clusters = require('graphology-generators/random/clusters');
+const FA2Layout = require('graphology-layout-forceatlas2/worker');
+const forceAtlas2 = require('graphology-layout-forceatlas2');
+
+const rng = seedrandom('sigma');
+const state = {
+ order: parseInt(process.argv[2]),
+ size: parseInt(process.argv[3]),
+ clusters: parseInt(process.argv[4]),
+ edgesRenderer: 'edges-fast'
+};
+
+// 1. Generate a graph:
+const graph = clusters(Graph, {...state, rng});
+circlepack.assign(graph, {
+ hierarchyAttributes: ['cluster'],
+});
+const colors = {};
+for (let i = 0; i < +state.clusters; i++) {
+ colors[i] = '#' + Math.floor(rng() * 16777215).toString(16);
+}
+let i = 0;
+graph.forEachNode((node, {cluster}) => {
+ graph.mergeNodeAttributes(node, {
+ size: graph.degree(node),
+ label: `Node n°${++i}, in cluster n°${cluster}`,
+ color: colors[cluster + ''],
+ });
+});
+
+// 2. Save the graph:
+fs.writeFile(process.argv[5], JSON.stringify(graph.toJSON(), null, 2), (err) => {
+ if (err) {
+ console.log('unable to save file');
+ } else {
+ console.log('file saved?');
+ }
+});
+console.log('Finished step 2');
diff --git a/examples/extra-large-graphs/gpu-loader.ts b/examples/extra-large-graphs/gpu-loader.ts
new file mode 100644
index 000000000..ffb6f6648
--- /dev/null
+++ b/examples/extra-large-graphs/gpu-loader.ts
@@ -0,0 +1,61 @@
+/**
+ * This example aims at showcasing sigma's performances.
+ */
+
+import arrow from 'apache-arrow';
+
+async function request(obj) {
+ return new Promise((resolve, reject) => {
+ let xhr = new XMLHttpRequest();
+ xhr.open(obj.method || 'GET', obj.url || obj);
+ if (obj.headers) {
+ Object.keys(obj.headers).forEach(key => { xhr.setRequestHeader(key, obj.headers[key]); });
+ }
+ xhr.onload = () => {
+ try {
+ if (xhr.status >= 200 && xhr.status < 300) {
+ resolve(xhr.response);
+ } else {
+ reject(xhr.statusText);
+ }
+ } catch (e) { reject(e); }
+ };
+ xhr.onerror = () => reject(xhr.statusText);
+ xhr.send(obj.body);
+ });
+}
+
+const SERVER = 'http://localhost:3010';
+const DATASET_ROUTE = '/graphology/read_large_demo?filename=../../public/fewer-edges.json';
+const NODES_ROUTE = '/graphology/get_column/nodes';
+const NODES_BOUNDS_ROUTE = '/graphology/nodes/bounds';
+const NODES_BUFFER_ROUTE = '/graphology/nodes';
+const EDGES_BUFFER_ROUTE = '/graphology/edges';
+const TABLE_ROUTE = '/graphology/get_table';
+
+const GpuLoader = {
+ init: async () => request({method: 'POST', url: SERVER + DATASET_ROUTE, mode: 'no-cors'}),
+ getTable: async (table) => {
+ const result = await fetch(SERVER + TABLE_ROUTE + '/' + table, {method: 'GET', headers: {'Access-Control-Allow-Origin': '*'}})
+ return arrow.tableFromIPC(result);
+ },
+ getColumn: async (table, column) => {
+ const table_route = {'nodes': '/graphology/get_column/nodes/'}[table];
+ const column_route = SERVER + table_route + column;
+ const result = await fetch(column_route, {method: 'GET', headers: {'Access-Control-Allow-Origin': '*'}});
+ return arrow.tableFromIPC(result);
+ },
+ getNodesBounds: async () => request(SERVER + NODES_BOUNDS_ROUTE),
+ getNodesBuffer: async () => {
+ const route = SERVER + NODES_BUFFER_ROUTE;
+ const result = await fetch(route, {method: 'GET', headers: {'Access-Control-Allow-Origin': '*'}});
+ return arrow.tableFromIPC(result);
+ },
+ getEdgesBuffer: async () => {
+ const route = SERVER + EDGES_BUFFER_ROUTE;
+ const result = await fetch(route, {method: 'GET', headers: {'Access-Control-Allow-Origin': '*'}});
+ return arrow.tableFromIPC(result);
+ }
+};
+
+export default GpuLoader;
diff --git a/examples/extra-large-graphs/index.html b/examples/extra-large-graphs/index.html
new file mode 100644
index 000000000..3f5bcf723
--- /dev/null
+++ b/examples/extra-large-graphs/index.html
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ Sigma example: Performances showcase
+
+
+
+
+
+
+
+
diff --git a/examples/extra-large-graphs/index.ts b/examples/extra-large-graphs/index.ts
new file mode 100644
index 000000000..56b755d10
--- /dev/null
+++ b/examples/extra-large-graphs/index.ts
@@ -0,0 +1,109 @@
+/**
+ * This example aims at showcasing sigma's performances.
+ */
+
+import {Table} from 'apache-arrow';
+import Graph from 'graphology';
+import clusters from 'graphology-generators/random/clusters';
+import forceAtlas2 from 'graphology-layout-forceatlas2';
+import FA2Layout from 'graphology-layout-forceatlas2/worker';
+import circlepack from 'graphology-layout/circlepack';
+import seedrandom from 'seedrandom';
+import Sigma from 'sigma';
+import Settings from 'sigma';
+import NodeDisplayData from 'sigma';
+import EdgesDefaultProgram from 'sigma/rendering/webgl/programs/edge';
+import EdgesFastProgram from 'sigma/rendering/webgl/programs/edge.fast';
+import {ConsoleLogger} from 'typedoc/dist/lib/utils';
+
+import EdgesGpuProgram from './edge.gpu';
+import gpuLoader from './gpu-loader';
+import NodesGpuProgram from './node.gpu';
+import RapidsGraphologyGraph from './rapids-graph'
+
+const rng = seedrandom('sigma');
+(async function() {
+
+ // 2. Read form values to build a full state:
+ const state = {
+ order: +document.querySelector('#order')?.value,
+ size: +document.querySelector('#size')?.value,
+ clusters: +document.querySelector('#clusters')?.value,
+ edgesRenderer:
+ document.querySelector('[name="edges-renderer"]:checked')?.value,
+ };
+
+ // 3. Load the graph from node-rapids
+ await gpuLoader.init();
+ const bounds = await gpuLoader.getNodesBounds();
+ const nodes = await gpuLoader.getNodesBuffer();
+ const edges = await gpuLoader.getEdgesBuffer();
+ const options = await gpuLoader.getTable('options');
+ const graph = new RapidsGraphologyGraph(nodes, edges, options);
+ graph.setExtent(JSON.parse(bounds.toString()).bounds);
+
+ // 3. Generate a graph:
+ /*
+ const small_graph = clusters(Graph, {...state, rng});
+ circlepack.assign(small_graph, {
+ hierarchyAttributes: ['cluster'],
+ });
+ const colors: Record = {};
+ for (let i = 0; i < +state.clusters; i++) {
+ colors[i] = '#' + Math.floor(rng() * 16777215).toString(16);
+ }
+ let i = 0;
+ small_graph.forEachNode((node, {cluster}) => {small_graph.mergeNodeAttributes(node, {
+ size: small_graph.degree(node) * 4,
+ label: `Node n°${++i}, in cluster n°${cluster}`,
+ color: colors[cluster + ''],
+ })});
+ */
+
+ // create random clusters from random source
+ // set the graph to have cluster attributes
+ // create n random colors
+ // for each node in the cluster
+ // set the size based on its connectedness
+ // give it an increasing label index
+ // set the color based on the cluster
+
+ // 4. Render the graph:
+ const container = document.getElementById('sigma-container') as HTMLElement;
+ const renderer = new Sigma(graph, container, {
+ defaultEdgeColor: '#e6e6e6',
+ defaultEdgeType: state.edgesRenderer,
+ edgeProgramClasses: {
+ 'edges-default': EdgesGpuProgram,
+ 'edges-fast': EdgesGpuProgram,
+ },
+ nodeProgramClasses: {
+ 'circle': NodesGpuProgram,
+ },
+ });
+ // Object.defineProperty(renderer, 'nodeDataCache', {value: graph._gpu_nodes})
+ // Object.defineProperty(renderer, 'process', {value: () => { console.log('no more processing.')
+ // }})
+
+ // 5. Enable FA2 button:
+ const fa2Button = document.getElementById('fa2') as HTMLButtonElement;
+ const sensibleSettings = forceAtlas2.inferSettings(graph);
+ const fa2Layout = new FA2Layout(graph, {
+ settings: sensibleSettings,
+ });
+ function toggleFA2Layout() {
+ if (fa2Layout.isRunning()) {
+ fa2Layout.stop();
+ fa2Button.innerHTML = `Start layout ▶`;
+ } else {
+ fa2Layout.start();
+ fa2Button.innerHTML = `Stop layout ⏸`;
+ }
+ }
+ fa2Button.addEventListener('click', toggleFA2Layout);
+
+ // Cheap trick: tilt the camera a bit to make labels more readable:
+ renderer.getCamera().setState({
+ angle: 0.2,
+ });
+})();
diff --git a/examples/extra-large-graphs/node.fast.frag.glsl b/examples/extra-large-graphs/node.fast.frag.glsl
new file mode 100644
index 000000000..1f1631a43
--- /dev/null
+++ b/examples/extra-large-graphs/node.fast.frag.glsl
@@ -0,0 +1,20 @@
+precision mediump float;
+
+varying vec4 v_color;
+varying float v_border;
+
+const float radius = 0.5;
+const vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);
+
+void main(void) {
+ vec2 m = gl_PointCoord - vec2(0.5, 0.5);
+ float dist = radius - length(m);
+
+ float t = 0.0;
+ if (dist > v_border)
+ t = 1.0;
+ else if (dist > 0.0)
+ t = dist / v_border;
+
+ gl_FragColor = mix(transparent, v_color, t);
+}
diff --git a/examples/extra-large-graphs/node.fast.vert.glsl b/examples/extra-large-graphs/node.fast.vert.glsl
new file mode 100644
index 000000000..b8574125c
--- /dev/null
+++ b/examples/extra-large-graphs/node.fast.vert.glsl
@@ -0,0 +1,31 @@
+attribute vec2 a_position;
+attribute float a_size;
+attribute vec4 a_color;
+
+uniform float u_ratio;
+uniform float u_scale;
+uniform mat3 u_matrix;
+
+varying vec4 v_color;
+varying float v_border;
+
+const float bias = 255.0 / 254.0;
+
+void main() {
+ gl_Position = vec4(
+ (u_matrix * vec3(a_position, 1)).xy,
+ 0,
+ 1
+ );
+
+ // Multiply the point size twice:
+ // - x SCALING_RATIO to correct the canvas scaling
+ // - x 2 to correct the formulae
+ gl_PointSize = a_size * u_ratio * u_scale * 2.0;
+
+ v_border = (1.0 / u_ratio) * (0.5 / a_size);
+
+ // Extract the color:
+ v_color = a_color;
+ v_color.a *= bias;
+}
diff --git a/examples/extra-large-graphs/node.gpu.ts b/examples/extra-large-graphs/node.gpu.ts
new file mode 100644
index 000000000..d2ab67c3b
--- /dev/null
+++ b/examples/extra-large-graphs/node.gpu.ts
@@ -0,0 +1,45 @@
+/**
+ * Sigma.js WebGL Renderer Node Program
+ * =====================================
+ *
+ * Simple program rendering nodes using GL_POINTS. This is faster than the
+ * three triangle option but has some quirks and is not supported equally by
+ * every GPU.
+ * @module
+ */
+import {AbstractNodeProgram} from 'sigma/rendering/webgl/programs/common/node';
+import {RenderParams} from 'sigma/rendering/webgl/programs/common/program';
+
+import fragmentShaderSource from './node.fast.frag.glsl';
+import vertexShaderSource from './node.fast.vert.glsl';
+
+let POINTS = 1;
+const ATTRIBUTES = 4;
+
+export default class NodeGpuProgram extends AbstractNodeProgram {
+ constructor(gl: WebGLRenderingContext) {
+ super(gl, vertexShaderSource, fragmentShaderSource, POINTS, ATTRIBUTES);
+ this.bind();
+ }
+
+ process(data, hidden: boolean, offset: number): void {
+ this.array = data.buffer.getChild('nodes').toArray();
+ POINTS = this.array.length / ATTRIBUTES;
+ this.points = POINTS;
+ }
+
+ render(params: RenderParams): void {
+ if (this.hasNothingToRender()) return;
+
+ const gl = this.gl;
+
+ const program = this.program;
+ gl.useProgram(program);
+
+ gl.uniform1f(this.ratioLocation, 1 / Math.sqrt(params.ratio));
+ gl.uniform1f(this.scaleLocation, params.scalingRatio);
+ gl.uniformMatrix3fv(this.matrixLocation, false, params.matrix);
+
+ gl.drawArrays(gl.POINTS, 0, this.array.length / ATTRIBUTES);
+ }
+}
diff --git a/examples/extra-large-graphs/package.json b/examples/extra-large-graphs/package.json
new file mode 100644
index 000000000..18077b2b6
--- /dev/null
+++ b/examples/extra-large-graphs/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "sigma-example-extra-large-graphs",
+ "version": "1.0.0",
+ "description": "A sigma example to showcase node/rapids performances.",
+ "main": "index.js",
+ "scripts": {
+ "start": "kotatsu --port 3001 serve --typescript index.ts --public / ./public"
+ },
+ "license": "MIT",
+ "dependencies": {
+ "@types/seedrandom": "^3.0.1",
+ "apache-arrow": "8.0.0",
+ "graphology": "^0.23.0",
+ "graphology-generators": "^0.11.2",
+ "graphology-layout": "^0.5.0",
+ "graphology-layout-forceatlas2": "^0.8.1",
+ "graphology-types": "^0.23.0",
+ "seedrandom": "^3.0.5",
+ "sigma": "latest"
+ },
+ "devDependencies": {
+ "kotatsu": "^0.22.3",
+ "typescript": "4.5.5"
+ }
+}
diff --git a/examples/extra-large-graphs/rapids-graph.ts b/examples/extra-large-graphs/rapids-graph.ts
new file mode 100644
index 000000000..2808b706d
--- /dev/null
+++ b/examples/extra-large-graphs/rapids-graph.ts
@@ -0,0 +1,64 @@
+/**
+ * This example aims at showcasing sigma's performances.
+ */
+
+import {Table} from 'apache-arrow';
+import Graph, {InvalidArgumentsGraphError} from 'graphology';
+import assignPolyfill from 'graphology';
+
+let _nodes = null;
+let _edges = null;
+let _options = null;
+
+export default class RapidsGraphologyGraph extends Graph {
+ _gpu_nodes: Table;
+ _gpu_edges: Table;
+ _gpu_options: Table;
+ _the_node: Map;
+ _nodeExtent: Map;
+
+ constructor(nodes: Table, edges: Table, options: Table) {
+ super(new Graph({type: 'undirected'}));
+ this._nodeExtent = new Map();
+ this._gpu_nodes = nodes;
+ this._gpu_edges = edges;
+ this._gpu_options = options;
+ this._the_node = new Map();
+ this._the_node['node'] = null;
+ this._the_node['hidden'] = false;
+ Object.defineProperty(this, 'order', {value: this._gpu_nodes.numRows});
+ Object.defineProperty(this, 'nodeExtent', {value: {x: [0, 5], y: [5, 10]}});
+ Object.defineProperty(this, 'nodes', {value: () => {
+ this._the_node['node'] = this._gpu_nodes;
+ return [this._the_node];
+ }});
+ Object.defineProperty(this, 'edges', {value: () => { return [{'edge': this._gpu_edges}] }});
+ Object.defineProperty(this, 'getNodeAttributes', {
+ value: () => {
+ return { 'buffer': this._gpu_nodes, 'x': -1, 'y': -1 }
+ }
+ });
+ Object.defineProperty(this, 'getEdgeAttributes', {
+ value: () => {
+ return { 'buffer': this._gpu_edges, 'source': -1, 'target': -1, color: '#999', hidden: false }
+ }
+ });
+ Object.defineProperty(this, 'extremities', {
+ value: () => {
+ return [this._the_node, this._the_node]
+ }
+ });
+ Object.defineProperty(this, 'forEachNode', {
+ value: (callback) => {
+ if (typeof callback != 'function')
+ throw new InvalidArgumentsGraphError(
+ 'RapidsGraphologyGraph.forEachNode: expecting a callback');
+ const p1 = {x: this._nodeExtent['xmin'], y: this._nodeExtent['ymin']};
+ const p2 = {x: this._nodeExtent['xmax'], y: this._nodeExtent['ymax']};
+ callback('gpu_nodes_p1', p1);
+ callback('gpu_nodes_p2', p2);
+ }
+ });
+ }
+ setExtent(bounds) { this._nodeExtent = bounds; }
+}
diff --git a/examples/extra-large-graphs/sandbox.config.json b/examples/extra-large-graphs/sandbox.config.json
new file mode 100644
index 000000000..33673fa1c
--- /dev/null
+++ b/examples/extra-large-graphs/sandbox.config.json
@@ -0,0 +1,6 @@
+{
+ "infiniteLoopProtection": true,
+ "hardReloadOnChange": false,
+ "view": "browser",
+ "template": "create-react-app"
+}
diff --git a/examples/package-lock.json b/examples/package-lock.json
index 0045e7afa..eeb0b4864 100644
--- a/examples/package-lock.json
+++ b/examples/package-lock.json
@@ -12,6 +12,7 @@
"@types/file-saver": "^2.0.4",
"@types/papaparse": "^5.3.1",
"@types/seedrandom": "^3.0.1",
+ "apache-arrow": "8.0.0",
"chroma-js": "^2.1.2",
"file-saver": "^2.0.5",
"graphology": "^0.23.2",
@@ -1755,6 +1756,16 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@types/command-line-args": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.0.tgz",
+ "integrity": "sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA=="
+ },
+ "node_modules/@types/command-line-usage": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.2.tgz",
+ "integrity": "sha512-n7RlEEJ+4x4TS7ZQddTmNSxP+zziEG0TNsMfiRIxcIVXt71ENJ9ojeXmGO3wPoTdn7pJcU2xc3CJYMktNT6DPg=="
+ },
"node_modules/@types/eslint": {
"version": "7.28.2",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.2.tgz",
@@ -1786,6 +1797,11 @@
"resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.4.tgz",
"integrity": "sha512-sPZYQEIF/SOnLAvaz9lTuydniP+afBMtElRTdYkeV1QtEgvtJ7qolCPjly6O32QI8CbEmP5O/fztMXEDWfEcrg=="
},
+ "node_modules/@types/flatbuffers": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@types/flatbuffers/-/flatbuffers-1.10.0.tgz",
+ "integrity": "sha512-7btbphLrKvo5yl/5CC2OCxUSMx1wV1wvGT1qDXkSt7yi00/YW7E8k6qzXqJHsp+WU0eoG7r6MTQQXI9lIvd0qA=="
+ },
"node_modules/@types/http-proxy": {
"version": "1.17.7",
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz",
@@ -1802,9 +1818,14 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "16.11.7",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz",
- "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw=="
+ "version": "17.0.45",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
+ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="
+ },
+ "node_modules/@types/pad-left": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@types/pad-left/-/pad-left-2.1.1.tgz",
+ "integrity": "sha512-Xd22WCRBydkGSApl5Bw0PhAOHKSVjNL3E3AwzKaps96IMraPqy5BvZIsBVK6JLwdybUzjHnuWVwpDd0JjTfHXA=="
},
"node_modules/@types/papaparse": {
"version": "5.3.1",
@@ -2085,6 +2106,35 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/apache-arrow": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-8.0.0.tgz",
+ "integrity": "sha512-74wgHL9P+vgylNOhnLGw1meOQ1cbYyi+TXo1eDnQJ9g2Ly+k8novUWQIG5SIp6acnErhGRTsMJajwUh9x/ZbaQ==",
+ "dependencies": {
+ "@types/command-line-args": "5.2.0",
+ "@types/command-line-usage": "5.0.2",
+ "@types/flatbuffers": "*",
+ "@types/node": "^17.0.24",
+ "@types/pad-left": "2.1.1",
+ "command-line-args": "5.2.1",
+ "command-line-usage": "6.1.3",
+ "flatbuffers": "2.0.4",
+ "json-bignum": "^0.0.3",
+ "pad-left": "^2.1.0",
+ "tslib": "^2.3.1"
+ },
+ "bin": {
+ "arrow2csv": "bin/arrow2csv.js"
+ }
+ },
+ "node_modules/array-back": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
+ "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -2470,6 +2520,106 @@
"integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
"dev": true
},
+ "node_modules/command-line-args": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz",
+ "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
+ "dependencies": {
+ "array-back": "^3.1.0",
+ "find-replace": "^3.0.0",
+ "lodash.camelcase": "^4.3.0",
+ "typical": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/command-line-usage": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz",
+ "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==",
+ "dependencies": {
+ "array-back": "^4.0.2",
+ "chalk": "^2.4.2",
+ "table-layout": "^1.0.2",
+ "typical": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/array-back": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
+ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/command-line-usage/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/command-line-usage/node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
@@ -2701,6 +2851,14 @@
}
}
},
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/define-lazy-prop": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
@@ -2811,7 +2969,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true,
"engines": {
"node": ">=0.8.0"
}
@@ -3023,6 +3180,17 @@
"node": ">=6"
}
},
+ "node_modules/find-replace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
+ "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
+ "dependencies": {
+ "array-back": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
@@ -3035,6 +3203,11 @@
"node": ">=6"
}
},
+ "node_modules/flatbuffers": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-2.0.4.tgz",
+ "integrity": "sha512-4rUFVDPjSoP0tOII34oQf+72NKU7E088U5oX7kwICahft0UB2kOQ9wUzzCp+OHxByERIfxRDCgX5mP8Pjkfl0g=="
+ },
"node_modules/follow-redirects": {
"version": "1.14.5",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz",
@@ -3628,6 +3801,14 @@
"node": ">=4"
}
},
+ "node_modules/json-bignum": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz",
+ "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
"node_modules/json-parse-better-errors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
@@ -3777,6 +3958,11 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ },
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -4094,6 +4280,17 @@
"node": ">=6"
}
},
+ "node_modules/pad-left": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz",
+ "integrity": "sha512-HJxs9K9AztdIQIAIa/OIazRAUW/L6B9hbQDxO4X07roW3eo9XqZc2ur9bn1StH9CnbbI9EgvejHQX7CBpCF1QA==",
+ "dependencies": {
+ "repeat-string": "^1.5.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/pandemonium": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/pandemonium/-/pandemonium-1.5.0.tgz",
@@ -4457,6 +4654,14 @@
"url": "https://opencollective.com/webpack"
}
},
+ "node_modules/reduce-flatten": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
+ "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -4534,6 +4739,14 @@
"jsesc": "bin/jsesc"
}
},
+ "node_modules/repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -4870,6 +5083,36 @@
"node": ">=8"
}
},
+ "node_modules/table-layout": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz",
+ "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==",
+ "dependencies": {
+ "array-back": "^4.0.1",
+ "deep-extend": "~0.6.0",
+ "typical": "^5.2.0",
+ "wordwrapjs": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/table-layout/node_modules/array-back": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
+ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/table-layout/node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -5030,6 +5273,11 @@
"node": ">=10"
}
},
+ "node_modules/tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@@ -5056,6 +5304,14 @@
"node": ">=4.2.0"
}
},
+ "node_modules/typical": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
+ "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -5318,6 +5574,26 @@
"node": ">= 8"
}
},
+ "node_modules/wordwrapjs": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz",
+ "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==",
+ "dependencies": {
+ "reduce-flatten": "^2.0.0",
+ "typical": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/wordwrapjs/node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -6589,6 +6865,16 @@
"to-fast-properties": "^2.0.0"
}
},
+ "@types/command-line-args": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.0.tgz",
+ "integrity": "sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA=="
+ },
+ "@types/command-line-usage": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.2.tgz",
+ "integrity": "sha512-n7RlEEJ+4x4TS7ZQddTmNSxP+zziEG0TNsMfiRIxcIVXt71ENJ9ojeXmGO3wPoTdn7pJcU2xc3CJYMktNT6DPg=="
+ },
"@types/eslint": {
"version": "7.28.2",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.2.tgz",
@@ -6620,6 +6906,11 @@
"resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.4.tgz",
"integrity": "sha512-sPZYQEIF/SOnLAvaz9lTuydniP+afBMtElRTdYkeV1QtEgvtJ7qolCPjly6O32QI8CbEmP5O/fztMXEDWfEcrg=="
},
+ "@types/flatbuffers": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@types/flatbuffers/-/flatbuffers-1.10.0.tgz",
+ "integrity": "sha512-7btbphLrKvo5yl/5CC2OCxUSMx1wV1wvGT1qDXkSt7yi00/YW7E8k6qzXqJHsp+WU0eoG7r6MTQQXI9lIvd0qA=="
+ },
"@types/http-proxy": {
"version": "1.17.7",
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz",
@@ -6636,9 +6927,14 @@
"dev": true
},
"@types/node": {
- "version": "16.11.7",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz",
- "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw=="
+ "version": "17.0.45",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
+ "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="
+ },
+ "@types/pad-left": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@types/pad-left/-/pad-left-2.1.1.tgz",
+ "integrity": "sha512-Xd22WCRBydkGSApl5Bw0PhAOHKSVjNL3E3AwzKaps96IMraPqy5BvZIsBVK6JLwdybUzjHnuWVwpDd0JjTfHXA=="
},
"@types/papaparse": {
"version": "5.3.1",
@@ -6884,6 +7180,29 @@
"color-convert": "^2.0.1"
}
},
+ "apache-arrow": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-8.0.0.tgz",
+ "integrity": "sha512-74wgHL9P+vgylNOhnLGw1meOQ1cbYyi+TXo1eDnQJ9g2Ly+k8novUWQIG5SIp6acnErhGRTsMJajwUh9x/ZbaQ==",
+ "requires": {
+ "@types/command-line-args": "5.2.0",
+ "@types/command-line-usage": "5.0.2",
+ "@types/flatbuffers": "*",
+ "@types/node": "^17.0.24",
+ "@types/pad-left": "2.1.1",
+ "command-line-args": "5.2.1",
+ "command-line-usage": "6.1.3",
+ "flatbuffers": "2.0.4",
+ "json-bignum": "^0.0.3",
+ "pad-left": "^2.1.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "array-back": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
+ "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q=="
+ },
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -7186,6 +7505,84 @@
"integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
"dev": true
},
+ "command-line-args": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz",
+ "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==",
+ "requires": {
+ "array-back": "^3.1.0",
+ "find-replace": "^3.0.0",
+ "lodash.camelcase": "^4.3.0",
+ "typical": "^4.0.0"
+ }
+ },
+ "command-line-usage": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz",
+ "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==",
+ "requires": {
+ "array-back": "^4.0.2",
+ "chalk": "^2.4.2",
+ "table-layout": "^1.0.2",
+ "typical": "^5.2.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "array-back": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
+ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="
+ }
+ }
+ },
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
@@ -7352,6 +7749,11 @@
"ms": "2.1.2"
}
},
+ "deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+ },
"define-lazy-prop": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
@@ -7440,8 +7842,7 @@
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"eslint-scope": {
"version": "5.1.1",
@@ -7623,6 +8024,14 @@
"pkg-dir": "^3.0.0"
}
},
+ "find-replace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
+ "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
+ "requires": {
+ "array-back": "^3.0.1"
+ }
+ },
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
@@ -7632,6 +8041,11 @@
"locate-path": "^3.0.0"
}
},
+ "flatbuffers": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-2.0.4.tgz",
+ "integrity": "sha512-4rUFVDPjSoP0tOII34oQf+72NKU7E088U5oX7kwICahft0UB2kOQ9wUzzCp+OHxByERIfxRDCgX5mP8Pjkfl0g=="
+ },
"follow-redirects": {
"version": "1.14.5",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz",
@@ -8065,6 +8479,11 @@
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
+ "json-bignum": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz",
+ "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg=="
+ },
"json-parse-better-errors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
@@ -8187,6 +8606,11 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+ },
"lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -8425,6 +8849,14 @@
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
+ "pad-left": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz",
+ "integrity": "sha512-HJxs9K9AztdIQIAIa/OIazRAUW/L6B9hbQDxO4X07roW3eo9XqZc2ur9bn1StH9CnbbI9EgvejHQX7CBpCF1QA==",
+ "requires": {
+ "repeat-string": "^1.5.4"
+ }
+ },
"pandemonium": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/pandemonium/-/pandemonium-1.5.0.tgz",
@@ -8679,6 +9111,11 @@
}
}
},
+ "reduce-flatten": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
+ "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w=="
+ },
"regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@@ -8746,6 +9183,11 @@
}
}
},
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="
+ },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -8994,6 +9436,29 @@
"has-flag": "^4.0.0"
}
},
+ "table-layout": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz",
+ "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==",
+ "requires": {
+ "array-back": "^4.0.1",
+ "deep-extend": "~0.6.0",
+ "typical": "^5.2.0",
+ "wordwrapjs": "^4.0.0"
+ },
+ "dependencies": {
+ "array-back": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz",
+ "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg=="
+ },
+ "typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="
+ }
+ }
+ },
"tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -9095,6 +9560,11 @@
}
}
},
+ "tslib": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
+ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+ },
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@@ -9111,6 +9581,11 @@
"integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==",
"dev": true
},
+ "typical": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
+ "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw=="
+ },
"unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -9296,6 +9771,22 @@
"isexe": "^2.0.0"
}
},
+ "wordwrapjs": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz",
+ "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==",
+ "requires": {
+ "reduce-flatten": "^2.0.0",
+ "typical": "^5.2.0"
+ },
+ "dependencies": {
+ "typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg=="
+ }
+ }
+ },
"wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
diff --git a/examples/package.json b/examples/package.json
index ed4c88150..f7cb64f52 100644
--- a/examples/package.json
+++ b/examples/package.json
@@ -16,6 +16,7 @@
"@types/file-saver": "^2.0.4",
"@types/papaparse": "^5.3.1",
"@types/seedrandom": "^3.0.1",
+ "apache-arrow": "8.0.0",
"chroma-js": "^2.1.2",
"file-saver": "^2.0.5",
"graphology": "^0.23.2",
diff --git a/examples/webpack.config.js b/examples/webpack.config.js
index b34b7f80f..8404dff6b 100644
--- a/examples/webpack.config.js
+++ b/examples/webpack.config.js
@@ -20,9 +20,14 @@ module.exports = {
__dirname,
"../src/rendering/webgl/programs/common/node.ts",
),
+ "sigma/rendering/webgl/programs/common/edge": path.resolve(
+ __dirname,
+ "../src/rendering/webgl/programs/common/edge.ts",
+ ),
sigma: path.resolve(__dirname, "../src/index.ts"),
- },
- },
+ "apache-arrow": require.resolve("apache-arrow/Arrow.es2015.min")
+ }
+},
module: {
rules: [
{