@statelyai/layout 0.1.2 → 0.2.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 (61) hide show
  1. package/NOTICE.md +43 -0
  2. package/README.md +82 -4
  3. package/dist/elkjs/index.cjs +8 -0
  4. package/dist/elkjs/index.d.cts +146 -0
  5. package/dist/elkjs/index.d.mts +42 -39
  6. package/dist/elkjs/index.mjs +2 -1483
  7. package/dist/elkjs/main.cjs +17 -0
  8. package/dist/elkjs/main.d.cts +10 -0
  9. package/dist/elkjs/main.d.mts +11 -0
  10. package/dist/elkjs/main.mjs +17 -0
  11. package/dist/elkjs/worker-api.cjs +3 -0
  12. package/dist/elkjs/worker-api.d.cts +3 -0
  13. package/dist/elkjs/worker-api.d.mts +3 -0
  14. package/dist/elkjs/worker-api.mjs +3 -0
  15. package/dist/elkjs/worker.cjs +86 -0
  16. package/dist/elkjs/worker.d.cts +17 -0
  17. package/dist/elkjs/worker.d.mts +17 -0
  18. package/dist/elkjs/worker.mjs +86 -0
  19. package/dist/elkjs-BVnDwnBQ.cjs +1551 -0
  20. package/dist/elkjs-CFlfkEBz.mjs +1528 -0
  21. package/dist/{index-8xYkohbz.d.mts → index-BSH2bloA.d.mts} +77 -3
  22. package/dist/index-CG712jzV.d.cts +1286 -0
  23. package/dist/index.cjs +188 -0
  24. package/dist/index.d.cts +77 -0
  25. package/dist/index.d.mts +2 -2
  26. package/dist/index.mjs +24 -25
  27. package/dist/layered/index.cjs +38 -0
  28. package/dist/layered/index.d.cts +2 -0
  29. package/dist/layered/index.d.mts +1 -1
  30. package/dist/layered/index.mjs +1 -1
  31. package/dist/{layered-COIyXvwb.mjs → layered-Bz2nWmVp.mjs} +2298 -45
  32. package/dist/layered-Cf9Rn8l7.cjs +12061 -0
  33. package/dist/layout-engine-BNex9jxg.cjs +712 -0
  34. package/dist/{spore-BeKUA1Mb.mjs → layout-engine-WbC0YjjT.mjs} +159 -5
  35. package/dist/public-types-B8rAALJq.d.mts +109 -0
  36. package/dist/public-types-CVB0hXGk.d.cts +109 -0
  37. package/dist/worker-client-D3HMK33r.cjs +98 -0
  38. package/dist/worker-client-DAT_z2OR.d.mts +19 -0
  39. package/dist/worker-client-DVhklF6A.d.cts +19 -0
  40. package/dist/worker-client-DkwS4sHx.mjs +92 -0
  41. package/package.json +39 -9
  42. package/src/authoring/coordinates.ts +106 -0
  43. package/src/authoring/partial.ts +584 -0
  44. package/src/authoring/routing.ts +211 -0
  45. package/src/box.ts +22 -0
  46. package/src/constraints.ts +222 -0
  47. package/src/elkjs/index.ts +100 -37
  48. package/src/elkjs/main.ts +19 -0
  49. package/src/elkjs/public-types.ts +125 -0
  50. package/src/elkjs/worker-api.ts +29 -0
  51. package/src/elkjs/worker-client.ts +138 -0
  52. package/src/elkjs/worker.ts +117 -0
  53. package/src/index.ts +13 -0
  54. package/src/internal/elkjs-compatibility.ts +17 -0
  55. package/src/internal/layout-engine.ts +126 -0
  56. package/src/layered/index.ts +31 -3
  57. package/src/layered/strategies.ts +68 -3
  58. package/src/layout.ts +35 -28
  59. package/src/packing.ts +22 -0
  60. package/src/random.ts +75 -3
  61. package/src/types.ts +17 -2
@@ -0,0 +1,17 @@
1
+ require('../layered-Cf9Rn8l7.cjs');
2
+ const require_elkjs_worker = require('./worker.cjs');
3
+ const require_worker_client = require('../worker-client-D3HMK33r.cjs');
4
+
5
+ //#region src/elkjs/main.ts
6
+ /** Node-compatible elkjs entry point with an in-process worker fallback. */
7
+ var ELK = class extends require_worker_client.WorkerELK {
8
+ constructor(options = {}) {
9
+ super({
10
+ ...options,
11
+ workerFactory: options.workerFactory ?? ((url) => new require_elkjs_worker.Worker(url))
12
+ });
13
+ }
14
+ };
15
+
16
+ //#endregion
17
+ module.exports = ELK;
@@ -0,0 +1,10 @@
1
+ import { n as ELKConstructorArguments } from "../public-types-CVB0hXGk.cjs";
2
+ import { t as WorkerELK } from "../worker-client-DVhklF6A.cjs";
3
+
4
+ //#region src/elkjs/main.d.ts
5
+
6
+ /** Node-compatible elkjs entry point with an in-process worker fallback. */
7
+ declare class ELK extends WorkerELK {
8
+ constructor(options?: ELKConstructorArguments);
9
+ }
10
+ export = ELK;
@@ -0,0 +1,11 @@
1
+ import { n as ELKConstructorArguments } from "../public-types-B8rAALJq.mjs";
2
+ import { t as WorkerELK } from "../worker-client-DAT_z2OR.mjs";
3
+
4
+ //#region src/elkjs/main.d.ts
5
+
6
+ /** Node-compatible elkjs entry point with an in-process worker fallback. */
7
+ declare class ELK extends WorkerELK {
8
+ constructor(options?: ELKConstructorArguments);
9
+ }
10
+ //#endregion
11
+ export { ELK as default };
@@ -0,0 +1,17 @@
1
+ import "../layered-Bz2nWmVp.mjs";
2
+ import { Worker } from "./worker.mjs";
3
+ import { t as WorkerELK } from "../worker-client-DkwS4sHx.mjs";
4
+
5
+ //#region src/elkjs/main.ts
6
+ /** Node-compatible elkjs entry point with an in-process worker fallback. */
7
+ var ELK = class extends WorkerELK {
8
+ constructor(options = {}) {
9
+ super({
10
+ ...options,
11
+ workerFactory: options.workerFactory ?? ((url) => new Worker(url))
12
+ });
13
+ }
14
+ };
15
+
16
+ //#endregion
17
+ export { ELK as default };
@@ -0,0 +1,3 @@
1
+ const require_worker_client = require('../worker-client-D3HMK33r.cjs');
2
+
3
+ module.exports = require_worker_client.WorkerELK;
@@ -0,0 +1,3 @@
1
+ import { _ as ElkShape, a as ElkEdgeSection, c as ElkLabel, d as ElkLayoutCategoryDescription, f as ElkLayoutOptionDescription, g as ElkPrimitiveEdge, h as ElkPort, i as ElkEdge, l as ElkLayoutAlgorithmDescription, m as ElkPoint, n as ELKConstructorArguments, o as ElkExtendedEdge, p as ElkNode, r as ElkCommonDescription, s as ElkGraphElement, t as ELK, u as ElkLayoutArguments, v as LaidOutElkNode, y as LayoutOptions } from "../public-types-CVB0hXGk.cjs";
2
+ import { t as WorkerELK } from "../worker-client-DVhklF6A.cjs";
3
+ export { type ELK, type ELKConstructorArguments, type ElkCommonDescription, type ElkEdge, type ElkEdgeSection, type ElkExtendedEdge, type ElkGraphElement, type ElkLabel, type ElkLayoutAlgorithmDescription, type ElkLayoutArguments, type ElkLayoutCategoryDescription, type ElkLayoutOptionDescription, type ElkNode, type ElkPoint, type ElkPort, type ElkPrimitiveEdge, type ElkShape, type LaidOutElkNode, type LayoutOptions, WorkerELK as default };
@@ -0,0 +1,3 @@
1
+ import { _ as ElkShape, a as ElkEdgeSection, c as ElkLabel, d as ElkLayoutCategoryDescription, f as ElkLayoutOptionDescription, g as ElkPrimitiveEdge, h as ElkPort, i as ElkEdge, l as ElkLayoutAlgorithmDescription, m as ElkPoint, n as ELKConstructorArguments, o as ElkExtendedEdge, p as ElkNode, r as ElkCommonDescription, s as ElkGraphElement, t as ELK, u as ElkLayoutArguments, v as LaidOutElkNode, y as LayoutOptions } from "../public-types-B8rAALJq.mjs";
2
+ import { t as WorkerELK } from "../worker-client-DAT_z2OR.mjs";
3
+ export { type ELK, type ELKConstructorArguments, type ElkCommonDescription, type ElkEdge, type ElkEdgeSection, type ElkExtendedEdge, type ElkGraphElement, type ElkLabel, type ElkLayoutAlgorithmDescription, type ElkLayoutArguments, type ElkLayoutCategoryDescription, type ElkLayoutOptionDescription, type ElkNode, type ElkPoint, type ElkPort, type ElkPrimitiveEdge, type ElkShape, type LaidOutElkNode, type LayoutOptions, WorkerELK as default };
@@ -0,0 +1,3 @@
1
+ import { t as WorkerELK } from "../worker-client-DkwS4sHx.mjs";
2
+
3
+ export { WorkerELK as default };
@@ -0,0 +1,86 @@
1
+ require('../layered-Cf9Rn8l7.cjs');
2
+ const require_elkjs = require('../elkjs-BVnDwnBQ.cjs');
3
+
4
+ //#region src/elkjs/worker.ts
5
+ /*******************************************************************************
6
+ * Copyright (c) 2019 Kiel University and others.
7
+ *
8
+ * Adapted from elkjs 0.11.1 lib/elk-worker.js.
9
+ * SPDX-License-Identifier: EPL-2.0
10
+ *******************************************************************************/
11
+ /** In-process implementation of the message interface shipped by elkjs workers. */
12
+ var Worker = class {
13
+ onerror = null;
14
+ onmessage = null;
15
+ onmessageerror = null;
16
+ #listeners = /* @__PURE__ */ new Map();
17
+ #elk = new require_elkjs.ELK();
18
+ #terminated = false;
19
+ constructor(_url) {}
20
+ postMessage(message) {
21
+ if (this.#terminated) return;
22
+ queueMicrotask(() => void this.#handle(message));
23
+ }
24
+ terminate() {
25
+ this.#terminated = true;
26
+ }
27
+ addEventListener(type, listener, _options) {
28
+ const listeners = this.#listeners.get(type) ?? /* @__PURE__ */ new Set();
29
+ listeners.add(listener);
30
+ this.#listeners.set(type, listeners);
31
+ }
32
+ removeEventListener(type, listener, _options) {
33
+ this.#listeners.get(type)?.delete(listener);
34
+ }
35
+ dispatchEvent(event) {
36
+ for (const listener of this.#listeners.get(event.type) ?? []) if (typeof listener === "function") listener.call(this, event);
37
+ else listener.handleEvent(event);
38
+ return !event.defaultPrevented;
39
+ }
40
+ async #handle(message) {
41
+ try {
42
+ let data;
43
+ switch (message.cmd) {
44
+ case "register":
45
+ this.#elk = new require_elkjs.ELK({ algorithms: message.algorithms });
46
+ break;
47
+ case "layout":
48
+ data = await this.#elk.layout(message.graph, {
49
+ ...message.options,
50
+ layoutOptions: message.layoutOptions
51
+ });
52
+ break;
53
+ case "algorithms":
54
+ data = await this.#elk.knownLayoutAlgorithms();
55
+ break;
56
+ case "options":
57
+ data = await this.#elk.knownLayoutOptions();
58
+ break;
59
+ case "categories":
60
+ data = await this.#elk.knownLayoutCategories();
61
+ break;
62
+ }
63
+ this.#answer({
64
+ id: message.id,
65
+ data
66
+ });
67
+ } catch (error) {
68
+ this.#answer({
69
+ id: message.id,
70
+ error
71
+ });
72
+ }
73
+ }
74
+ #answer(answer) {
75
+ if (this.#terminated) return;
76
+ const event = {
77
+ data: answer,
78
+ type: "message"
79
+ };
80
+ this.onmessage?.call(this, event);
81
+ this.dispatchEvent(event);
82
+ }
83
+ };
84
+
85
+ //#endregion
86
+ exports.Worker = Worker;
@@ -0,0 +1,17 @@
1
+ //#region src/elkjs/worker.d.ts
2
+ /** In-process implementation of the message interface shipped by elkjs workers. */
3
+ declare class Worker implements globalThis.Worker {
4
+ #private;
5
+ onerror: ((this: AbstractWorker, event: ErrorEvent) => unknown) | null;
6
+ onmessage: ((this: globalThis.Worker, event: MessageEvent) => unknown) | null;
7
+ onmessageerror: ((this: globalThis.Worker, event: MessageEvent) => unknown) | null;
8
+ constructor(_url?: string);
9
+ postMessage(message: unknown, _transfer: Transferable[]): void;
10
+ postMessage(message: unknown, _options?: StructuredSerializeOptions): void;
11
+ terminate(): void;
12
+ addEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: globalThis.Worker, event: WorkerEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
13
+ removeEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: globalThis.Worker, event: WorkerEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
14
+ dispatchEvent(event: Event): boolean;
15
+ }
16
+ //#endregion
17
+ export { Worker };
@@ -0,0 +1,17 @@
1
+ //#region src/elkjs/worker.d.ts
2
+ /** In-process implementation of the message interface shipped by elkjs workers. */
3
+ declare class Worker implements globalThis.Worker {
4
+ #private;
5
+ onerror: ((this: AbstractWorker, event: ErrorEvent) => unknown) | null;
6
+ onmessage: ((this: globalThis.Worker, event: MessageEvent) => unknown) | null;
7
+ onmessageerror: ((this: globalThis.Worker, event: MessageEvent) => unknown) | null;
8
+ constructor(_url?: string);
9
+ postMessage(message: unknown, _transfer: Transferable[]): void;
10
+ postMessage(message: unknown, _options?: StructuredSerializeOptions): void;
11
+ terminate(): void;
12
+ addEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: globalThis.Worker, event: WorkerEventMap[K]) => unknown, options?: boolean | AddEventListenerOptions): void;
13
+ removeEventListener<K extends keyof WorkerEventMap>(type: K, listener: (this: globalThis.Worker, event: WorkerEventMap[K]) => unknown, options?: boolean | EventListenerOptions): void;
14
+ dispatchEvent(event: Event): boolean;
15
+ }
16
+ //#endregion
17
+ export { Worker };
@@ -0,0 +1,86 @@
1
+ import "../layered-Bz2nWmVp.mjs";
2
+ import { t as ELK } from "../elkjs-CFlfkEBz.mjs";
3
+
4
+ //#region src/elkjs/worker.ts
5
+ /*******************************************************************************
6
+ * Copyright (c) 2019 Kiel University and others.
7
+ *
8
+ * Adapted from elkjs 0.11.1 lib/elk-worker.js.
9
+ * SPDX-License-Identifier: EPL-2.0
10
+ *******************************************************************************/
11
+ /** In-process implementation of the message interface shipped by elkjs workers. */
12
+ var Worker = class {
13
+ onerror = null;
14
+ onmessage = null;
15
+ onmessageerror = null;
16
+ #listeners = /* @__PURE__ */ new Map();
17
+ #elk = new ELK();
18
+ #terminated = false;
19
+ constructor(_url) {}
20
+ postMessage(message) {
21
+ if (this.#terminated) return;
22
+ queueMicrotask(() => void this.#handle(message));
23
+ }
24
+ terminate() {
25
+ this.#terminated = true;
26
+ }
27
+ addEventListener(type, listener, _options) {
28
+ const listeners = this.#listeners.get(type) ?? /* @__PURE__ */ new Set();
29
+ listeners.add(listener);
30
+ this.#listeners.set(type, listeners);
31
+ }
32
+ removeEventListener(type, listener, _options) {
33
+ this.#listeners.get(type)?.delete(listener);
34
+ }
35
+ dispatchEvent(event) {
36
+ for (const listener of this.#listeners.get(event.type) ?? []) if (typeof listener === "function") listener.call(this, event);
37
+ else listener.handleEvent(event);
38
+ return !event.defaultPrevented;
39
+ }
40
+ async #handle(message) {
41
+ try {
42
+ let data;
43
+ switch (message.cmd) {
44
+ case "register":
45
+ this.#elk = new ELK({ algorithms: message.algorithms });
46
+ break;
47
+ case "layout":
48
+ data = await this.#elk.layout(message.graph, {
49
+ ...message.options,
50
+ layoutOptions: message.layoutOptions
51
+ });
52
+ break;
53
+ case "algorithms":
54
+ data = await this.#elk.knownLayoutAlgorithms();
55
+ break;
56
+ case "options":
57
+ data = await this.#elk.knownLayoutOptions();
58
+ break;
59
+ case "categories":
60
+ data = await this.#elk.knownLayoutCategories();
61
+ break;
62
+ }
63
+ this.#answer({
64
+ id: message.id,
65
+ data
66
+ });
67
+ } catch (error) {
68
+ this.#answer({
69
+ id: message.id,
70
+ error
71
+ });
72
+ }
73
+ }
74
+ #answer(answer) {
75
+ if (this.#terminated) return;
76
+ const event = {
77
+ data: answer,
78
+ type: "message"
79
+ };
80
+ this.onmessage?.call(this, event);
81
+ this.dispatchEvent(event);
82
+ }
83
+ };
84
+
85
+ //#endregion
86
+ export { Worker };