Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
2e66f16
fix: repair broken Jest test suite
shaunpatterson Jun 12, 2026
f7659df
feat: export graph as PNG image or JSON data
shaunpatterson Jun 12, 2026
e56eccb
feat: replace d3 canvas graph renderer with Sigma.js WebGL renderer
shaunpatterson Jun 12, 2026
6486bd2
feat: per-phase query latency breakdown in the frame header
shaunpatterson Jun 12, 2026
eec5bc2
feat: download query results as CSV
shaunpatterson Jun 12, 2026
273ef58
feat: support serving Ratel under a URL prefix (-url-prefix)
shaunpatterson Jun 12, 2026
825cf76
feat: graph style rules, layout switcher and legend filtering
shaunpatterson Jun 12, 2026
b841d20
feat: add DQL format button to the query editor
shaunpatterson Jun 12, 2026
3f22990
feat: generate DQL from natural language (bring-your-own-key AI)
shaunpatterson Jun 12, 2026
da0812d
fix: pass namespace when submitting login form with Enter
shaunpatterson Jun 12, 2026
4888b48
feat: searchable run history panel with status and latency
shaunpatterson Jun 12, 2026
77112a1
feat: inline editing of node values from the properties panel
shaunpatterson Jun 12, 2026
dd0b623
feat: support OpenAI and Gemini in the AI query generator
shaunpatterson Jun 12, 2026
bb90d2d
feat: multi-tab query editor
shaunpatterson Jun 12, 2026
7696834
feat: dark mode (light/dark/system) with persisted preference
shaunpatterson Jun 12, 2026
6b63f6a
fix: unreadable editor tokens in dark mode (cm-invalidchar was black)
shaunpatterson Jun 12, 2026
121fd9b
style: apply trunk formatting
shaunpatterson Jun 12, 2026
b6319eb
style: apply trunk formatting
shaunpatterson Jun 12, 2026
a5a8cb9
style: apply trunk formatting
shaunpatterson Jun 12, 2026
21754bb
style: apply trunk formatting
shaunpatterson Jun 12, 2026
db157be
style: apply trunk formatting
shaunpatterson Jun 12, 2026
15f0396
style: drop unused catch bindings (biome noUnusedVariables)
shaunpatterson Jun 12, 2026
1eaf198
style: drop unused catch bindings (biome noUnusedVariables)
shaunpatterson Jun 12, 2026
94c56ac
Merge branch 'sp/fix-namespace-enter-login' into sp/all-features
shaunpatterson Jun 14, 2026
d7c72cf
Merge branch 'sp/subpath-hosting' into sp/all-features
shaunpatterson Jun 14, 2026
453b2a6
Merge branch 'sp/inline-edit' into sp/all-features
shaunpatterson Jun 14, 2026
8efbb47
Merge branch 'sp/result-export-csv' into sp/all-features
shaunpatterson Jun 14, 2026
11a004d
Merge branch 'sp/latency-breakdown' into sp/all-features
shaunpatterson Jun 14, 2026
d9bf4ce
Merge branch 'sp/run-history' into sp/all-features
shaunpatterson Jun 14, 2026
881dc6c
Merge branch 'sp/multi-tab-editor' into sp/all-features
shaunpatterson Jun 14, 2026
788de34
Merge branch 'sp/nl2dql' into sp/all-features
shaunpatterson Jun 14, 2026
ce76cb1
Merge branch 'sp/dql-formatter' into sp/all-features
shaunpatterson Jun 14, 2026
1fc308b
Merge branch 'sp/sigma-graph-view' into sp/all-features
shaunpatterson Jun 14, 2026
4e3f09c
Merge branch 'sp/graph-export' into sp/all-features
shaunpatterson Jun 14, 2026
a9aa824
Merge branch 'sp/dark-mode' into sp/all-features
shaunpatterson Jun 14, 2026
d5cb905
fix: editor toolbar wrapping and clipped history dropdown
shaunpatterson Jun 15, 2026
c008a97
feat: color graph by community and size by centrality
shaunpatterson Jun 15, 2026
474c0fd
feat: find shortest path between two graph nodes
shaunpatterson Jun 15, 2026
8e69188
feat: faceted attribute filtering of the graph
shaunpatterson Jun 15, 2026
be68a4d
feat: timeline filtering and playback of the graph
shaunpatterson Jun 15, 2026
9d69309
Merge branch 'sp/sigma-graph-view' into sp/all-features
shaunpatterson Jun 15, 2026
52c4389
feat: clickable query latency breakdown modal with node counts
shaunpatterson Jun 16, 2026
94b1407
Merge branch 'sp/latency-breakdown' into sp/all-features
shaunpatterson Jun 16, 2026
2aebc41
fix: dark-mode styling for the multi-tab editor strip
shaunpatterson Jun 16, 2026
8cf4515
Merge branch 'sp/dark-mode' into sp/all-features
shaunpatterson Jun 16, 2026
519b5bd
feat: render latency phases as a timeline waterfall
shaunpatterson Jun 16, 2026
0ad21be
Merge branch 'sp/latency-breakdown' into sp/all-features
shaunpatterson Jun 16, 2026
a52e197
fix: dark-mode styling for the latency breakdown modal
shaunpatterson Jun 16, 2026
ebadb3e
Merge branch 'sp/latency-breakdown' into sp/all-features
shaunpatterson Jun 16, 2026
6bb7525
fix: widen latency modal label column so 'Assign timestamp' fits
shaunpatterson Jun 16, 2026
7f73d3d
Merge branch 'sp/latency-breakdown' into sp/all-features
shaunpatterson Jun 16, 2026
a3cb532
fix: dark-mode text on default-variant buttons in connection modal
shaunpatterson Jun 17, 2026
3f48888
Merge branch 'sp/dark-mode' into sp/all-features
shaunpatterson Jun 17, 2026
4c0d1ec
fix: a11y and lint issues in graph toolbar, editor tabs, sigma renderer
shaunpatterson Jun 20, 2026
3bc9837
feat: graph statistics panel with density, components, reciprocity, d…
shaunpatterson Jun 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions INSTRUCTIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,3 +139,20 @@ HTTPS connection.
```bash
./build/ratel -tls_crt example.crt -tls_key example.key
```

## Serving under a URL prefix

When hosting Ratel behind a reverse proxy under a subpath (e.g. `https://example.com/ratel/`), set
the `-url-prefix` flag (or the `RATEL_URL_PREFIX` environment variable) so the UI and its static
assets are served under that prefix:

```bash
./build/ratel -url-prefix /ratel
# or
RATEL_URL_PREFIX=/ratel ./build/ratel
```

With a prefix set, all routes move under the prefix (`/ratel/`, `/ratel/static/...`), requests to
the bare prefix (`/ratel`) redirect to `/ratel/`, asset URLs in the served `index.html` are
rewritten to include the prefix, and any path outside the prefix returns a 404 pointing at the
prefix. The flag value is normalized to have a leading slash and no trailing slash.
28 changes: 28 additions & 0 deletions client/config/jest/babelTransform.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Custom babel-jest transformer with an explicit config.
//
// The babel config in package.json ("babel" key) is file-relative, so it is
// never applied to files inside node_modules. ESM-only packages allowed
// through transformIgnorePatterns (e.g. react-leaflet) therefore reached the
// test runtime untransformed. This transformer applies the presets to every
// file Jest transforms, regardless of location.
const babelJest = require('babel-jest')

module.exports = babelJest.createTransformer({
presets: [
[require.resolve('@babel/preset-env'), { targets: { node: 'current' } }],
require.resolve('@babel/preset-react'),
],
plugins: [
[
require.resolve('@babel/plugin-proposal-class-properties'),
{ loose: true },
],
],
babelrc: false,
configFile: false,
})
13 changes: 9 additions & 4 deletions client/config/jest/fileTransform.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,14 @@
*/

const path = require('path')
const camelcase = require('camelcase')

// camelcase >= 7 is ESM-only and can no longer be require()d here.
const pascalCase = (str) =>
str
.split(/[^a-zA-Z0-9]+/)
.filter(Boolean)
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
.join('')

// This is a custom Jest transformer turning file imports into filenames.
// http://facebook.github.io/jest/docs/en/webpack.html
Expand All @@ -16,9 +23,7 @@ module.exports = {
if (filename.match(/\.svg$/)) {
// Based on how SVGR generates a component name:
// https://github.com/smooth-code/svgr/blob/01b194cf967347d43d4cbe6b434404731b87cf27/packages/core/src/state.js#L6
const pascalCaseFilename = camelcase(path.parse(filename).name, {
pascalCase: true,
})
const pascalCaseFilename = pascalCase(path.parse(filename).name)
const componentName = `Svg${pascalCaseFilename}`
return `const React = require('react');
module.exports = {
Expand Down
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/assert.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('assert')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/async_hooks.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('async_hooks')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/buffer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('buffer')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/console.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('console')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/crypto.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('crypto')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/diagnostics_channel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('diagnostics_channel')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/dns.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('dns')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/events.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('events')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/fs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('fs')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/fs/promises.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('fs/promises')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/http.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('http')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/http2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('http2')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/https.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('https')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/net.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('net')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/os.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('os')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/path.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('path')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/perf_hooks.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('perf_hooks')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/process.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('process')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/querystring.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('querystring')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/stream.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('stream')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/stream/web.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('stream/web')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/string_decoder.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('string_decoder')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/timers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('timers')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/timers/promises.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('timers/promises')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/tls.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('tls')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/tty.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('tty')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/url.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('url')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/util.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('util')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/util/types.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('util/types')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/worker_threads.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('worker_threads')
8 changes: 8 additions & 0 deletions client/config/jest/nodeShims/zlib.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Jest 26 can't resolve `node:`-prefixed core modules (used by newer
// dependencies such as cheerio); moduleNameMapper points them here.
module.exports = require('zlib')
38 changes: 38 additions & 0 deletions client/config/jest/sigmaMock.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* SPDX-FileCopyrightText: © 2017-2026 Istari Digital, Inc.
* SPDX-License-Identifier: Apache-2.0
*/

// Stand-in for `sigma`, `sigma/rendering` and `@sigma/edge-curve` under
// Jest: sigma's CJS bundle references WebGL2RenderingContext at module
// load, which doesn't exist in jsdom.
class MockSigma {
on() {
return this
}
refresh() {}
kill() {}
getNodeAttribute() {}
getEdgeAttribute() {}
getCustomBBox() {
return null
}
setCustomBBox() {}
getBBox() {
return { x: [0, 1], y: [0, 1] }
}
viewportToGraph() {
return { x: 0, y: 0 }
}
}

class MockProgram {}

module.exports = {
__esModule: true,
default: MockSigma,
Sigma: MockSigma,
EdgeArrowProgram: MockProgram,
EdgeCurveProgram: MockProgram,
EdgeCurvedArrowProgram: MockProgram,
}
Loading
Loading