@fazelstudio/floe 1.0.0 → 1.0.1

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 (123) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +199 -0
  3. package/dist/src/cli/check.d.ts.map +1 -1
  4. package/dist/src/cli/check.js +1 -1
  5. package/dist/src/cli/check.js.map +1 -1
  6. package/dist/src/cli/format.d.ts.map +1 -1
  7. package/dist/src/cli/format.js +4 -35
  8. package/dist/src/cli/format.js.map +1 -1
  9. package/dist/src/cli/main.d.ts +0 -16
  10. package/dist/src/cli/main.d.ts.map +1 -1
  11. package/dist/src/cli/main.js +0 -7
  12. package/dist/src/cli/main.js.map +1 -1
  13. package/dist/src/cli/render.d.ts.map +1 -1
  14. package/dist/src/cli/render.js +0 -15
  15. package/dist/src/cli/render.js.map +1 -1
  16. package/dist/src/diagnostics.d.ts +4 -18
  17. package/dist/src/diagnostics.d.ts.map +1 -1
  18. package/dist/src/diagnostics.js.map +1 -1
  19. package/dist/src/index.d.ts +7 -9
  20. package/dist/src/index.d.ts.map +1 -1
  21. package/dist/src/index.js.map +1 -1
  22. package/dist/src/language/completion.d.ts +1 -2
  23. package/dist/src/language/completion.d.ts.map +1 -1
  24. package/dist/src/language/completion.js.map +1 -1
  25. package/dist/src/language/definitions.d.ts +6 -3
  26. package/dist/src/language/definitions.d.ts.map +1 -1
  27. package/dist/src/language/definitions.js.map +1 -1
  28. package/dist/src/language/diagnosticsService.d.ts +4 -5
  29. package/dist/src/language/diagnosticsService.d.ts.map +1 -1
  30. package/dist/src/language/diagnosticsService.js.map +1 -1
  31. package/dist/src/language/folding.d.ts +2 -3
  32. package/dist/src/language/folding.d.ts.map +1 -1
  33. package/dist/src/language/folding.js.map +1 -1
  34. package/dist/src/language/formatting.d.ts +2 -3
  35. package/dist/src/language/formatting.d.ts.map +1 -1
  36. package/dist/src/language/formatting.js.map +1 -1
  37. package/dist/src/language/highlighting.d.ts +2 -3
  38. package/dist/src/language/highlighting.d.ts.map +1 -1
  39. package/dist/src/language/highlighting.js.map +1 -1
  40. package/dist/src/language/hover.d.ts +4 -2
  41. package/dist/src/language/hover.d.ts.map +1 -1
  42. package/dist/src/language/hover.js.map +1 -1
  43. package/dist/src/language/indentation.d.ts +4 -7
  44. package/dist/src/language/indentation.d.ts.map +1 -1
  45. package/dist/src/language/indentation.js.map +1 -1
  46. package/dist/src/language/index.d.ts +45 -17
  47. package/dist/src/language/index.d.ts.map +1 -1
  48. package/dist/src/language/index.js.map +1 -1
  49. package/dist/src/language/references.d.ts +3 -4
  50. package/dist/src/language/references.d.ts.map +1 -1
  51. package/dist/src/language/references.js.map +1 -1
  52. package/dist/src/language/rename.d.ts +43 -15
  53. package/dist/src/language/rename.d.ts.map +1 -1
  54. package/dist/src/language/rename.js.map +1 -1
  55. package/dist/src/language/semanticModel.d.ts +14 -19
  56. package/dist/src/language/semanticModel.d.ts.map +1 -1
  57. package/dist/src/language/semanticModel.js.map +1 -1
  58. package/dist/src/language/symbols.d.ts +2 -3
  59. package/dist/src/language/symbols.d.ts.map +1 -1
  60. package/dist/src/language/symbols.js.map +1 -1
  61. package/dist/src/language/types.d.ts +0 -44
  62. package/dist/src/language/types.d.ts.map +1 -1
  63. package/dist/src/language/utils.d.ts +20 -18
  64. package/dist/src/language/utils.d.ts.map +1 -1
  65. package/dist/src/language/utils.js.map +1 -1
  66. package/dist/src/layout/dagre.d.ts +2 -2
  67. package/dist/src/layout/dagre.d.ts.map +1 -1
  68. package/dist/src/layout/dagre.js +14 -55
  69. package/dist/src/layout/dagre.js.map +1 -1
  70. package/dist/src/layout/index.d.ts +1 -9
  71. package/dist/src/layout/index.d.ts.map +1 -1
  72. package/dist/src/layout/index.js +1 -10
  73. package/dist/src/layout/index.js.map +1 -1
  74. package/dist/src/layout/simple.d.ts +1 -1
  75. package/dist/src/layout/simple.d.ts.map +1 -1
  76. package/dist/src/layout/simple.js +20 -166
  77. package/dist/src/layout/simple.js.map +1 -1
  78. package/dist/src/layout/types.d.ts +0 -1
  79. package/dist/src/layout/types.d.ts.map +1 -1
  80. package/dist/src/lexer.d.ts +0 -3
  81. package/dist/src/lexer.d.ts.map +1 -1
  82. package/dist/src/lexer.js +13 -54
  83. package/dist/src/lexer.js.map +1 -1
  84. package/dist/src/lsp/documents.d.ts +8 -17
  85. package/dist/src/lsp/documents.d.ts.map +1 -1
  86. package/dist/src/lsp/documents.js.map +1 -1
  87. package/dist/src/lsp/server.d.ts +138 -63
  88. package/dist/src/lsp/server.d.ts.map +1 -1
  89. package/dist/src/lsp/server.js.map +1 -1
  90. package/dist/src/lsp/utils.d.ts +13 -20
  91. package/dist/src/lsp/utils.d.ts.map +1 -1
  92. package/dist/src/lsp/utils.js.map +1 -1
  93. package/dist/src/parser.d.ts +94 -68
  94. package/dist/src/parser.d.ts.map +1 -1
  95. package/dist/src/parser.js.map +1 -1
  96. package/dist/src/pipeline.d.ts +0 -20
  97. package/dist/src/pipeline.d.ts.map +1 -1
  98. package/dist/src/pipeline.js +2 -28
  99. package/dist/src/pipeline.js.map +1 -1
  100. package/dist/src/range.d.ts +2 -5
  101. package/dist/src/range.d.ts.map +1 -1
  102. package/dist/src/range.js +0 -7
  103. package/dist/src/range.js.map +1 -1
  104. package/dist/src/render/shapes.d.ts +0 -8
  105. package/dist/src/render/shapes.d.ts.map +1 -1
  106. package/dist/src/render/shapes.js +13 -60
  107. package/dist/src/render/shapes.js.map +1 -1
  108. package/dist/src/render/svg.d.ts +0 -9
  109. package/dist/src/render/svg.d.ts.map +1 -1
  110. package/dist/src/render/svg.js +18 -83
  111. package/dist/src/render/svg.js.map +1 -1
  112. package/dist/src/security/url.d.ts +2 -2
  113. package/dist/src/security/url.d.ts.map +1 -1
  114. package/dist/src/security/url.js.map +1 -1
  115. package/dist/src/types.d.ts +3 -45
  116. package/dist/src/types.d.ts.map +1 -1
  117. package/dist/src/types.js +0 -5
  118. package/dist/src/types.js.map +1 -1
  119. package/dist/src/validator.d.ts +4 -33
  120. package/dist/src/validator.d.ts.map +1 -1
  121. package/dist/src/validator.js +4 -2
  122. package/dist/src/validator.js.map +1 -1
  123. package/package.json +1 -1
package/dist/src/range.js CHANGED
@@ -1,7 +1,3 @@
1
- /**
2
- * Source position and range utilities
3
- * Line and column are 1-indexed, offset is 0-indexed.
4
- */
5
1
  export function pos(line, column, offset) {
6
2
  return { line, column, offset };
7
3
  }
@@ -11,9 +7,6 @@ export function range(start, end) {
11
7
  export function emptyRangeAt(p) {
12
8
  return { start: p, end: p };
13
9
  }
14
- /**
15
- * Compare ranges for debugging / tests
16
- */
17
10
  export function rangeToString(r) {
18
11
  return `${r.start.line}:${r.start.column}-${r.end.line}:${r.end.column}`;
19
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"range.js","sourceRoot":"","sources":["../../src/range.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,MAAc;IAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,KAAe,EAAE,GAAa;IAClD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAW;IACtC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,CAAQ;IACpC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;AAC3E,CAAC"}
1
+ {"version":3,"file":"range.js","sourceRoot":"","sources":["../../src/range.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,MAAc;IAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC;AACD,MAAM,UAAU,KAAK,CAAC,KAAe,EAAE,GAAa;IAClD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,CAAW;IACtC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAC9B,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,CAAQ;IACpC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;AAC3E,CAAC"}
@@ -1,8 +1,4 @@
1
1
  import type { LayoutNode } from "../layout/types.js";
2
- /**
3
- * Shape types — small initial set.
4
- * Unknown types fallback to default rect.
5
- */
6
2
  export type NodeShapeKind = "default" | "person" | "service" | "database" | "client";
7
3
  export declare function getShapeKind(type?: string): NodeShapeKind;
8
4
  export interface ShapeStyle {
@@ -12,9 +8,5 @@ export interface ShapeStyle {
12
8
  rx?: number;
13
9
  }
14
10
  export declare function shapeStyle(kind: NodeShapeKind): ShapeStyle;
15
- /**
16
- * Render a node shape as SVG string (without label).
17
- * x,y is center; w,h is size.
18
- */
19
11
  export declare function renderNodeShape(node: LayoutNode): string;
20
12
  //# sourceMappingURL=shapes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shapes.d.ts","sourceRoot":"","sources":["../../../src/render/shapes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAErF,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAQzD;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,UAAU,CAa1D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CA4BxD"}
1
+ {"version":3,"file":"shapes.d.ts","sourceRoot":"","sources":["../../../src/render/shapes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAErF,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAQzD;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,UAAU,CAQ1D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAoBxD"}
@@ -14,22 +14,13 @@ export function getShapeKind(type) {
14
14
  }
15
15
  export function shapeStyle(kind) {
16
16
  switch (kind) {
17
- case "person":
18
- return { fill: "#fef3c7", stroke: "#d97706", strokeWidth: 1.5, rx: 24 };
19
- case "service":
20
- return { fill: "#dbeafe", stroke: "#2563eb", strokeWidth: 1.5, rx: 6 };
21
- case "database":
22
- return { fill: "#dcfce7", stroke: "#16a34a", strokeWidth: 1.5 };
23
- case "client":
24
- return { fill: "#f3e8ff", stroke: "#9333ea", strokeWidth: 1.5, rx: 6 };
25
- default:
26
- return { fill: "#f1f5f9", stroke: "#334155", strokeWidth: 1.5, rx: 6 };
17
+ case "person": return { fill: "#fef3c7", stroke: "#d97706", strokeWidth: 1.5, rx: 24 };
18
+ case "service": return { fill: "#dbeafe", stroke: "#2563eb", strokeWidth: 1.5, rx: 6 };
19
+ case "database": return { fill: "#dcfce7", stroke: "#16a34a", strokeWidth: 1.5 };
20
+ case "client": return { fill: "#f3e8ff", stroke: "#9333ea", strokeWidth: 1.5, rx: 6 };
21
+ default: return { fill: "#f1f5f9", stroke: "#334155", strokeWidth: 1.5, rx: 6 };
27
22
  }
28
23
  }
29
- /**
30
- * Render a node shape as SVG string (without label).
31
- * x,y is center; w,h is size.
32
- */
33
24
  export function renderNodeShape(node) {
34
25
  const kind = getShapeKind(node.type);
35
26
  const style = shapeStyle(kind);
@@ -37,72 +28,34 @@ export function renderNodeShape(node) {
37
28
  const y = fmt(node.y - node.height / 2);
38
29
  const w = fmt(node.width);
39
30
  const h = fmt(node.height);
40
- const fill = style.fill;
41
- const stroke = style.stroke;
42
- const sw = style.strokeWidth;
43
- if (kind === "database") {
31
+ const fill = style.fill, stroke = style.stroke, sw = style.strokeWidth;
32
+ if (kind === "database")
44
33
  return renderDatabaseShape(node, fill, stroke, sw);
45
- }
46
34
  if (kind === "person") {
47
- // capsule shape: rx = h/2
48
35
  const rx = fmt(node.height / 2);
49
36
  return `<rect x="${x}" y="${y}" width="${w}" height="${h}" rx="${rx}" ry="${rx}" fill="${fill}" stroke="${stroke}" stroke-width="${sw}" />`;
50
37
  }
51
- // default / service / client : rounded rect
52
38
  const rx = fmt(style.rx ?? 6);
53
39
  const ry = rx;
54
- // client gets double stroke effect via extra rect? keep simple variant with dashed?
55
40
  if (kind === "client") {
56
- // client: slightly different — add stroke-dasharray to distinguish? Keep solid but we add shadow via second rect? For determinism, just use same rect with different fill.
57
41
  return `<rect x="${x}" y="${y}" width="${w}" height="${h}" rx="${rx}" ry="${ry}" fill="${fill}" stroke="${stroke}" stroke-width="${sw}" />`;
58
42
  }
59
43
  return `<rect x="${x}" y="${y}" width="${w}" height="${h}" rx="${rx}" ry="${ry}" fill="${fill}" stroke="${stroke}" stroke-width="${sw}" />`;
60
44
  }
61
45
  function renderDatabaseShape(node, fill, stroke, sw) {
62
- // Cylinder: rect with top/bottom ellipses
63
- // We'll draw as path: database shape
64
- const cx = node.x;
65
- const cy = node.y;
66
- const w = node.width;
67
- const h = node.height;
68
- const left = cx - w / 2;
69
- const right = cx + w / 2;
70
- const top = cy - h / 2;
71
- const bottom = cy + h / 2;
72
- const ellipseH = Math.min(10, h * 0.22); // height of ellipse at top/bottom
73
- // Path for cylinder body
74
- // M left, top+ellipseH L left, bottom-ellipseH A ... etc.
75
- // Simpler: draw as combination of rect + two ellipses, but for single shape use path
76
- const rx = w / 2;
77
- const ry = ellipseH;
78
- // Points
79
- const x1 = fmt(left);
80
- const x2 = fmt(right);
81
- const yTop = fmt(top + ry);
82
- const yBottom = fmt(bottom - ry);
83
- const yTopCap = fmt(top + ry);
84
- const yBottomCap = fmt(bottom - ry);
85
- // Use path:
86
- // M left, yTop -> line to left, yBottom -> arc to right, yBottom -> line to right, yTop -> arc to left, yTop
87
- const d = [
88
- `M ${x1} ${yTop}`,
89
- `L ${x1} ${yBottom}`,
90
- `A ${fmt(rx)} ${fmt(ry)} 0 0 0 ${x2} ${yBottom}`,
91
- `L ${x2} ${yTop}`,
92
- `A ${fmt(rx)} ${fmt(ry)} 0 0 0 ${x1} ${yTop}`,
93
- ].join(" ");
94
- // Top ellipse as separate path for fill distinction? We'll include top ellipse as filled
46
+ const cx = node.x, cy = node.y, w = node.width, h = node.height;
47
+ const left = cx - w / 2, right = cx + w / 2, top = cy - h / 2, bottom = cy + h / 2;
48
+ const ellipseH = Math.min(10, h * 0.22);
49
+ const rx = w / 2, ry = ellipseH;
50
+ const x1 = fmt(left), x2 = fmt(right), yTop = fmt(top + ry), yBottom = fmt(bottom - ry);
51
+ const d = [`M ${x1} ${yTop}`, `L ${x1} ${yBottom}`, `A ${fmt(rx)} ${fmt(ry)} 0 0 0 ${x2} ${yBottom}`, `L ${x2} ${yTop}`, `A ${fmt(rx)} ${fmt(ry)} 0 0 0 ${x1} ${yTop}`].join(" ");
95
52
  const topEllipse = `<ellipse cx="${fmt(cx)}" cy="${fmt(top + ry)}" rx="${fmt(rx)}" ry="${fmt(ry)}" fill="${fill}" stroke="${stroke}" stroke-width="${sw}" />`;
96
53
  const body = `<path d="${d}" fill="${fill}" stroke="${stroke}" stroke-width="${sw}" />`;
97
- // Bottom ellipse stroke
98
54
  const bottomEllipse = `<ellipse cx="${fmt(cx)}" cy="${fmt(bottom - ry)}" rx="${fmt(rx)}" ry="${fmt(ry)}" fill="${fill}" stroke="${stroke}" stroke-width="${sw}" />`;
99
- // Return group of shapes
100
55
  return `${body}\n${topEllipse}\n${bottomEllipse}`;
101
56
  }
102
57
  function fmt(n) {
103
- // Round to 2 decimals, remove trailing zeros for determinism and smaller output
104
58
  const r = Math.round(n * 100) / 100;
105
- // Use toString to avoid unnecessary decimals, but ensure deterministic
106
59
  if (Number.isInteger(r))
107
60
  return String(r);
108
61
  return r.toFixed(2).replace(/\.?0+$/, "");
@@ -1 +1 @@
1
- {"version":3,"file":"shapes.js","sourceRoot":"","sources":["../../../src/render/shapes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shapes.js","sourceRoot":"","sources":["../../../src/render/shapes.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,10 @@
1
1
  import type { LayoutResult } from "../layout/types.js";
2
2
  export interface SvgRenderOptions {
3
- /** Extra padding around diagram (default handled by layout margin) */
4
3
  padding?: number;
5
- /** Background color */
6
4
  background?: string;
7
- /** Font family for labels */
8
5
  fontFamily?: string;
9
- /** Show debug bounding boxes */
10
6
  debug?: boolean;
11
- /** Custom CSS to inject */
12
7
  css?: string;
13
8
  }
14
- /**
15
- * Deterministic SVG renderer.
16
- * Consumes LayoutResult (semantic + layout), not raw Floe text.
17
- */
18
9
  export declare function renderSvg(layout: LayoutResult, opts?: SvgRenderOptions): string;
19
10
  //# sourceMappingURL=svg.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../../src/render/svg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2BAA2B;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,CA+H/E"}
1
+ {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../../src/render/svg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,CA0F/E"}
@@ -1,18 +1,12 @@
1
1
  import { renderNodeShape } from "./shapes.js";
2
2
  const DEFAULT_FONT = "ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif";
3
- /**
4
- * Deterministic SVG renderer.
5
- * Consumes LayoutResult (semantic + layout), not raw Floe text.
6
- */
7
3
  export function renderSvg(layout, opts) {
8
4
  const padding = opts?.padding ?? 0;
9
5
  const background = opts?.background ?? "#ffffff";
10
6
  const fontFamily = opts?.fontFamily ?? DEFAULT_FONT;
11
- // Deterministic dimensions: layout width/height plus padding
12
7
  const width = Math.ceil(layout.width + padding * 2);
13
8
  const height = Math.ceil(layout.height + padding * 2);
14
9
  const viewBox = `0 0 ${width} ${height}`;
15
- // Sort for determinism
16
10
  const nodesSorted = [...layout.nodes].sort((a, b) => a.id.localeCompare(b.id));
17
11
  const edgesSorted = [...layout.edges].sort((a, b) => {
18
12
  if (a.source !== b.source)
@@ -22,66 +16,45 @@ export function renderSvg(layout, opts) {
22
16
  return (a.label ?? "").localeCompare(b.label ?? "");
23
17
  });
24
18
  const parts = [];
25
- // Header
26
19
  parts.push(`<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="${viewBox}" role="img" font-family="${escapeAttr(fontFamily)}">`);
27
- // Background
28
- if (background && background !== "transparent") {
20
+ if (background && background !== "transparent")
29
21
  parts.push(`<rect width="${width}" height="${height}" fill="${escapeAttr(background)}" />`);
30
- }
31
- // Styles
32
22
  const css = opts?.css ?? defaultCss();
33
23
  parts.push(`<style>${css}</style>`);
34
- // Defs: arrowhead marker (deterministic id)
35
24
  parts.push(`<defs>`);
36
25
  parts.push(`<marker id="arrowhead" viewBox="0 0 10 7" refX="9" refY="3.5" markerWidth="10" markerHeight="7" orient="auto" markerUnits="strokeWidth">`);
37
26
  parts.push(`<path d="M 0 0 L 10 3.5 L 0 7 z" fill="#334155" />`);
38
27
  parts.push(`</marker>`);
39
28
  parts.push(`</defs>`);
40
- // Group for offset padding
41
29
  const offset = padding;
42
30
  if (offset !== 0)
43
31
  parts.push(`<g transform="translate(${offset} ${offset})">`);
44
- // Groups containers — draw behind nodes/edges but above background
45
32
  const groups = layout.groups ?? [];
46
33
  if (groups.length > 0) {
47
34
  parts.push(`<g class="groups">`);
48
- // flatten and sort deterministically already done by layout, but re-sort for rendering stability
49
35
  const flatGroups = flattenGroups(groups);
50
- // Draw outer groups first (sorted by area descending so outer wraps inner? For determinism, sort by id depth)
51
- // Already deterministic, just render each via helper
52
- for (const g of flatGroups) {
53
- // For nested rendering, we render all groups individually; outer will be drawn before inner due to flat order (parent before child)
36
+ for (const g of flatGroups)
54
37
  parts.push(renderGroupSvg(g, fontFamily));
55
- }
56
38
  parts.push(`</g>`);
57
39
  }
58
- // Edges group (draw first, under nodes)
59
40
  parts.push(`<g class="edges" stroke-linecap="round" stroke-linejoin="round">`);
60
41
  for (const e of edgesSorted) {
61
42
  const d = pointsToPath(e.points);
62
43
  const edgeId = `edge-${escapeId(e.source)}-${escapeId(e.target)}${e.label ? "-" + hashLabel(e.label) : ""}`;
63
- // Edge semantics: directed has arrow, undirected is dashed without arrow
64
44
  const isUndirected = e.data?.kind === "undirected";
65
45
  const dash = isUndirected ? ` stroke-dasharray="6 3"` : "";
66
46
  const marker = isUndirected ? "" : ` marker-end="url(#arrowhead)"`;
67
47
  parts.push(`<path id="${edgeId}" d="${d}" fill="none" stroke="#334155" stroke-width="1.6"${dash}${marker} />`);
68
48
  }
69
49
  parts.push(`</g>`);
70
- // Edge labels group (above edges, below nodes)
71
50
  if (edgesSorted.some((e) => e.label)) {
72
51
  parts.push(`<g class="edge-labels">`);
73
52
  for (const e of edgesSorted) {
74
53
  if (!e.label)
75
54
  continue;
76
55
  const pos = e.labelPos ?? midpoint(e.points);
77
- const x = fmt(pos.x);
78
- const y = fmt(pos.y);
79
- const label = escapeXml(e.label);
80
- // Estimate text width for background rect
81
- const estW = estimateTextWidth(e.label) + 8;
82
- const estH = 16;
83
- const rx = 4;
84
- // Background rect for readability
56
+ const x = fmt(pos.x), y = fmt(pos.y), label = escapeXml(e.label);
57
+ const estW = estimateTextWidth(e.label) + 8, estH = 16, rx = 4;
85
58
  parts.push(`<g class="edge-label" transform="translate(${x} ${y})">`);
86
59
  parts.push(`<rect x="${fmt(-estW / 2)}" y="${fmt(-estH / 2 + 1)}" width="${fmt(estW)}" height="${fmt(estH)}" rx="${rx}" ry="${rx}" fill="white" stroke="#e2e8f0" stroke-width="0.8" />`);
87
60
  parts.push(`<text text-anchor="middle" dominant-baseline="middle" font-size="11" fill="#334155" font-family="${escapeAttr(fontFamily)}">${label}</text>`);
@@ -89,31 +62,24 @@ export function renderSvg(layout, opts) {
89
62
  }
90
63
  parts.push(`</g>`);
91
64
  }
92
- // Nodes group
93
65
  parts.push(`<g class="nodes">`);
94
66
  for (const n of nodesSorted) {
95
67
  const shapeSvg = renderNodeShape(n);
96
68
  const label = escapeXml(n.label);
97
- const tx = fmt(n.x);
98
- const ty = fmt(n.y);
99
- // Node group with deterministic id and class per type
69
+ const tx = fmt(n.x), ty = fmt(n.y);
100
70
  const kindClass = n.type ? `node-${escapeId(n.type)}` : `node-default`;
101
71
  parts.push(`<g id="node-${escapeId(n.id)}" class="node ${kindClass}" data-node-id="${escapeAttr(n.id)}"${n.type ? ` data-node-type="${escapeAttr(n.type)}"` : ""}>`);
102
72
  parts.push(shapeSvg);
103
- // Label centered
104
- // For database shape, label y is slightly lower due to cylinder top? Keep centered for now
105
73
  parts.push(`<text x="${tx}" y="${ty}" text-anchor="middle" dominant-baseline="middle" font-size="12" font-weight="500" fill="#0f172a" font-family="${escapeAttr(fontFamily)}">${label}</text>`);
106
74
  parts.push(`</g>`);
107
75
  }
108
76
  parts.push(`</g>`);
109
77
  if (offset !== 0)
110
78
  parts.push(`</g>`);
111
- // Optional debug: bounding boxes
112
79
  if (opts?.debug) {
113
80
  parts.push(`<g class="debug">`);
114
81
  for (const n of nodesSorted) {
115
- const x = fmt(n.x - n.width / 2);
116
- const y = fmt(n.y - n.height / 2);
82
+ const x = fmt(n.x - n.width / 2), y = fmt(n.y - n.height / 2);
117
83
  parts.push(`<rect x="${x}" y="${y}" width="${fmt(n.width)}" height="${fmt(n.height)}" fill="none" stroke="red" stroke-dasharray="3 3" stroke-width="0.5" />`);
118
84
  }
119
85
  parts.push(`</g>`);
@@ -134,10 +100,8 @@ function pointsToPath(points) {
134
100
  return `M ${fmt(points[0].x)} ${fmt(points[0].y)}`;
135
101
  const start = points[0];
136
102
  let d = `M ${fmt(start.x)} ${fmt(start.y)}`;
137
- for (let i = 1; i < points.length; i++) {
138
- const p = points[i];
139
- d += ` L ${fmt(p.x)} ${fmt(p.y)}`;
140
- }
103
+ for (let i = 1; i < points.length; i++)
104
+ d += ` L ${fmt(points[i].x)} ${fmt(points[i].y)}`;
141
105
  return d;
142
106
  }
143
107
  function midpoint(points) {
@@ -145,18 +109,12 @@ function midpoint(points) {
145
109
  return { x: 0, y: 0 };
146
110
  if (points.length === 1)
147
111
  return points[0];
148
- if (points.length === 2) {
149
- const a = points[0], b = points[1];
150
- return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };
151
- }
112
+ if (points.length === 2)
113
+ return { x: (points[0].x + points[1].x) / 2, y: (points[0].y + points[1].y) / 2 };
152
114
  const mid = Math.floor(points.length / 2);
153
- const a = points[mid - 1], b = points[mid];
154
- return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };
155
- }
156
- function estimateTextWidth(text) {
157
- // Deterministic char width approximation: 6.5 per char at 11px
158
- return text.length * 6.5;
115
+ return { x: (points[mid - 1].x + points[mid].x) / 2, y: (points[mid].y + points[mid].y) / 2 };
159
116
  }
117
+ function estimateTextWidth(text) { return text.length * 6.5; }
160
118
  function fmt(n) {
161
119
  const r = Math.round(n * 100) / 100;
162
120
  if (Number.isInteger(r))
@@ -164,48 +122,26 @@ function fmt(n) {
164
122
  return r.toFixed(2).replace(/\.?0+$/, "");
165
123
  }
166
124
  function escapeXml(s) {
167
- return s
168
- .replace(/&/g, "&amp;")
169
- .replace(/</g, "&lt;")
170
- .replace(/>/g, "&gt;")
171
- .replace(/"/g, "&quot;")
172
- .replace(/'/g, "&apos;");
173
- }
174
- function escapeAttr(s) {
175
- return escapeXml(s);
176
- }
177
- function escapeId(s) {
178
- // For SVG id attribute, replace invalid chars deterministically
179
- return s.replace(/[^A-Za-z0-9_-]/g, "_");
125
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
180
126
  }
127
+ function escapeAttr(s) { return escapeXml(s); }
128
+ function escapeId(s) { return s.replace(/[^A-Za-z0-9_-]/g, "_"); }
181
129
  function hashLabel(s) {
182
130
  let h = 0;
183
- for (let i = 0; i < s.length; i++) {
131
+ for (let i = 0; i < s.length; i++)
184
132
  h = (h * 31 + s.charCodeAt(i)) | 0;
185
- }
186
133
  return Math.abs(h).toString(36).slice(0, 6);
187
134
  }
188
135
  function renderGroupSvg(g, fontFamily) {
189
- const x = fmt(g.x - g.width / 2);
190
- const y = fmt(g.y - g.height / 2);
191
- const w = fmt(g.width);
192
- const h = fmt(g.height);
193
- const label = escapeXml(g.label);
194
- const gid = escapeId(g.id);
136
+ const x = fmt(g.x - g.width / 2), y = fmt(g.y - g.height / 2), w = fmt(g.width), h = fmt(g.height);
137
+ const label = escapeXml(g.label), gid = escapeId(g.id);
195
138
  const typeAttr = g.type ? ` data-group-type="${escapeAttr(g.type)}"` : "";
196
- // Group container rect with subtle fill and header bar for label
197
139
  const headerH = 22;
198
- // Main group rect
199
140
  const parts = [];
200
141
  parts.push(`<g id="group-${gid}" class="group group-${gid}" data-group-id="${escapeAttr(g.id)}"${typeAttr}>`);
201
- // Background
202
142
  parts.push(`<rect x="${x}" y="${y}" width="${w}" height="${h}" rx="8" ry="8" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.2" stroke-dasharray="8 4" />`);
203
- // Header bar
204
143
  parts.push(`<rect x="${x}" y="${y}" width="${w}" height="${fmt(headerH)}" rx="8" ry="8" fill="#e2e8f0" stroke="none" />`);
205
- // To keep header rounded only top, overlay bottom rect of header? Simplify as above.
206
- // Clip bottom of header: draw rect covering lower part of header's rounded bottom to make sharp bottom
207
144
  parts.push(`<rect x="${x}" y="${fmt(g.y - g.height / 2 + headerH / 2)}" width="${w}" height="${fmt(headerH / 2)}" fill="#e2e8f0" stroke="none" />`);
208
- // Header label
209
145
  parts.push(`<text x="${fmt(g.x)}" y="${fmt(g.y - g.height / 2 + headerH / 2 + 1)}" text-anchor="middle" dominant-baseline="middle" font-size="11" font-weight="600" fill="#334155" font-family="${escapeAttr(fontFamily)}">${label}</text>`);
210
146
  parts.push(`</g>`);
211
147
  return parts.join("\n");
@@ -213,7 +149,6 @@ function renderGroupSvg(g, fontFamily) {
213
149
  function flattenGroups(groups) {
214
150
  const out = [];
215
151
  function dfs(arr) {
216
- // Deterministic order: sort by id at each level (layout already sorted, but enforce)
217
152
  const sorted = [...arr].sort((a, b) => a.id.localeCompare(b.id));
218
153
  for (const g of sorted) {
219
154
  out.push(g);
@@ -1 +1 @@
1
- {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../../src/render/svg.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../../../src/render/svg.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,6 @@
2
2
  * URL sanitization for Floe links — prevents execution vectors.
3
3
  * Only allow safe schemes; block javascript:, data:, vbscript:
4
4
  */
5
- export declare function sanitizeUrl(url: string): string | null;
6
- export declare function isSafeUrl(url: string): boolean;
5
+ export declare function sanitizeUrl(url: any): any;
6
+ export declare function isSafeUrl(url: any): boolean;
7
7
  //# sourceMappingURL=url.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/security/url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYtD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C"}
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/security/url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,KAAA,OAkB9B;AACD,wBAAgB,SAAS,CAAC,GAAG,KAAA,WAE5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/security/url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,iFAAiF;IACjF,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACtC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACvD,kEAAkE;IAClE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/B,0BAA0B;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../src/security/url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAG;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,CAAC;QACF,OAAO,IAAI,CAAC;IAChB,IAAI,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IAChB,iFAAiF;IACjF,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QACvB,OAAO,CAAC,CAAC;IACb,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QACnB,OAAO,CAAC,CAAC;IACb,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QACxC,OAAO,CAAC,CAAC;IACb,kEAAkE;IAClE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAChB,OAAO,CAAC,CAAC;IACb,0BAA0B;IAC1B,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,SAAS,CAAC,GAAG;IACzB,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AACrC,CAAC"}
@@ -1,50 +1,30 @@
1
1
  import type { Range } from "./range.js";
2
- /**
3
- * Supported diagram directions
4
- */
5
2
  export type Direction = "TB" | "BT" | "LR" | "RL";
6
3
  export declare const DIRECTIONS: readonly Direction[];
7
4
  export declare const DEFAULT_DIRECTION: Direction;
8
5
  /**
9
6
  * Identifier rules:
10
7
  * - Must match: [A-Za-z_][A-Za-z0-9_-]*
11
- * - Must start with letter or underscore
12
- * - May contain letters, digits, underscore, hyphen
13
- * - No spaces, no Unicode beyond ASCII, no leading digit, no punctuation other than _ and -
14
- * - Case-sensitive
15
- * - Display labels are separate concept; IDs are internal keys
16
8
  */
17
9
  export declare const IDENTIFIER_RE: RegExp;
18
10
  export declare function isValidIdentifier(id: string): boolean;
19
- /**
20
- * Semantic edge kind — directed or undirected association
21
- */
11
+ /** Semantic edge kind — v0.3 adds undirected */
22
12
  export type EdgeKind = "directed" | "undirected";
23
- /**
24
- * Renderer-independent semantic model
25
- * No visual coordinates, SVG, or layout information.
26
- */
13
+ /** Renderer-independent semantic model — no visual coordinates */
27
14
  export interface FloeNode {
28
15
  id: string;
29
- /** Display label — conceptually separate from `id`; quoted string after id/type, defaults to id if not set */
16
+ /** Display label — quoted string after id/type, defaults to id if not set */
30
17
  label?: string;
31
18
  /** Explicit node type, e.g. "person", "service", "database" — semantic style reference */
32
19
  type?: string;
33
- /** Source range covering the identifier (and type brackets if present, and label if present) */
34
20
  range: Range;
35
21
  }
36
- /**
37
- * Annotation — semantic note attached to a node/group or diagram-level if target undefined.
38
- */
39
22
  export interface FloeAnnotation {
40
23
  /** Target node or group id; undefined => diagram-level */
41
24
  target?: string;
42
25
  text: string;
43
26
  range: Range;
44
27
  }
45
- /**
46
- * Link — semantic external link attached to a node/group.
47
- */
48
28
  export interface FloeLink {
49
29
  target: string;
50
30
  url: string;
@@ -54,56 +34,34 @@ export interface FloeEdge {
54
34
  source: string;
55
35
  target: string;
56
36
  label?: string;
57
- /** Edge semantics: directed ( -> ) or undirected ( -- ) */
58
37
  kind: EdgeKind;
59
- /** Range covering entire edge statement */
60
38
  range: Range;
61
- /** Ranges for sub-components for diagnostics / tooling */
62
39
  sourceRange: Range;
63
40
  targetRange: Range;
64
41
  labelRange?: Range;
65
42
  }
66
- /**
67
- * Group — semantic container; may be nested. Renderer-independent.
68
- */
69
43
  export interface FloeGroup {
70
44
  id: string;
71
- /** Display label for group (quoted string), defaults to id */
72
45
  label?: string;
73
- /** Semantic type e.g. "subsystem" */
74
46
  type?: string;
75
47
  range: Range;
76
- /** Direct member node ids defined inside this group (not counting nested subgroup members) */
77
48
  nodeIds: string[];
78
- /** Nested groups */
79
49
  groups: FloeGroup[];
80
- /** Semantic metadata scoped to this group */
81
50
  metadata: Record<string, string>;
82
- /** Annotations scoped to this group */
83
51
  annotations: FloeAnnotation[];
84
- /** External link for group */
85
52
  link?: string;
86
- /** Parent group id if nested */
87
53
  parentId?: string;
88
54
  }
89
55
  export interface FloeDiagram {
90
56
  direction: Direction;
91
- /** Direction declaration range if explicitly provided */
92
57
  directionRange?: Range;
93
58
  nodes: FloeNode[];
94
59
  edges: FloeEdge[];
95
- /** Top-level groups (nested via groups[].groups) */
96
60
  groups: FloeGroup[];
97
- /** Semantic metadata at diagram level */
98
61
  metadata: Record<string, string>;
99
- /** Diagram-level and targeted annotations */
100
62
  annotations: FloeAnnotation[];
101
- /** Semantic external links (target -> url) */
102
63
  links: FloeLink[];
103
64
  }
104
- /**
105
- * Full parse result including diagnostics
106
- */
107
65
  export interface ParseResult {
108
66
  diagram: FloeDiagram;
109
67
  diagnostics: import("./diagnostics.js").Diagnostic[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAElD,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,EAAsC,CAAC;AAClF,eAAO,MAAM,iBAAiB,EAAE,SAAgB,CAAC;AAEjD;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,QAA8B,CAAC;AAEzD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;AAEjD;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,8GAA8G;IAC9G,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,KAAK,EAAE,KAAK,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,IAAI,EAAE,QAAQ,CAAC;IACf,2CAA2C;IAC3C,KAAK,EAAE,KAAK,CAAC;IACb,0DAA0D;IAC1D,WAAW,EAAE,KAAK,CAAC;IACnB,WAAW,EAAE,KAAK,CAAC;IACnB,UAAU,CAAC,EAAE,KAAK,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,8FAA8F;IAC9F,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oBAAoB;IACpB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,uCAAuC;IACvC,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,yDAAyD;IACzD,cAAc,CAAC,EAAE,KAAK,CAAC;IACvB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,oDAAoD;IACpD,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,6CAA6C;IAC7C,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,8CAA8C;IAC9C,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,OAAO,kBAAkB,EAAE,UAAU,EAAE,CAAC;CACtD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAClD,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,EAAsC,CAAC;AAClF,eAAO,MAAM,iBAAiB,EAAE,SAAgB,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,aAAa,QAA8B,CAAC;AACzD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,gDAAgD;AAChD,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC;AAEjD,kEAAkE;AAClE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,KAAK,CAAC;IACnB,WAAW,EAAE,KAAK,CAAC;IACnB,UAAU,CAAC,EAAE,KAAK,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,CAAC;IACvB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,OAAO,kBAAkB,EAAE,UAAU,EAAE,CAAC;CACtD"}