@fazelstudio/floe 1.0.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 (154) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/cli/check.d.ts +14 -0
  3. package/dist/src/cli/check.d.ts.map +1 -0
  4. package/dist/src/cli/check.js +88 -0
  5. package/dist/src/cli/check.js.map +1 -0
  6. package/dist/src/cli/format.d.ts +9 -0
  7. package/dist/src/cli/format.d.ts.map +1 -0
  8. package/dist/src/cli/format.js +114 -0
  9. package/dist/src/cli/format.js.map +1 -0
  10. package/dist/src/cli/main.d.ts +19 -0
  11. package/dist/src/cli/main.d.ts.map +1 -0
  12. package/dist/src/cli/main.js +207 -0
  13. package/dist/src/cli/main.js.map +1 -0
  14. package/dist/src/cli/render.d.ts +7 -0
  15. package/dist/src/cli/render.d.ts.map +1 -0
  16. package/dist/src/cli/render.js +90 -0
  17. package/dist/src/cli/render.js.map +1 -0
  18. package/dist/src/diagnostics.d.ts +32 -0
  19. package/dist/src/diagnostics.d.ts.map +1 -0
  20. package/dist/src/diagnostics.js +4 -0
  21. package/dist/src/diagnostics.js.map +1 -0
  22. package/dist/src/index.d.ts +40 -0
  23. package/dist/src/index.d.ts.map +1 -0
  24. package/dist/src/index.js +64 -0
  25. package/dist/src/index.js.map +1 -0
  26. package/dist/src/language/completion.d.ts +6 -0
  27. package/dist/src/language/completion.d.ts.map +1 -0
  28. package/dist/src/language/completion.js +363 -0
  29. package/dist/src/language/completion.js.map +1 -0
  30. package/dist/src/language/definitions.d.ts +9 -0
  31. package/dist/src/language/definitions.d.ts.map +1 -0
  32. package/dist/src/language/definitions.js +70 -0
  33. package/dist/src/language/definitions.js.map +1 -0
  34. package/dist/src/language/diagnosticsService.d.ts +14 -0
  35. package/dist/src/language/diagnosticsService.d.ts.map +1 -0
  36. package/dist/src/language/diagnosticsService.js +37 -0
  37. package/dist/src/language/diagnosticsService.js.map +1 -0
  38. package/dist/src/language/folding.d.ts +8 -0
  39. package/dist/src/language/folding.d.ts.map +1 -0
  40. package/dist/src/language/folding.js +58 -0
  41. package/dist/src/language/folding.js.map +1 -0
  42. package/dist/src/language/formatting.d.ts +5 -0
  43. package/dist/src/language/formatting.d.ts.map +1 -0
  44. package/dist/src/language/formatting.js +274 -0
  45. package/dist/src/language/formatting.js.map +1 -0
  46. package/dist/src/language/highlighting.d.ts +9 -0
  47. package/dist/src/language/highlighting.d.ts.map +1 -0
  48. package/dist/src/language/highlighting.js +74 -0
  49. package/dist/src/language/highlighting.js.map +1 -0
  50. package/dist/src/language/hover.d.ts +6 -0
  51. package/dist/src/language/hover.d.ts.map +1 -0
  52. package/dist/src/language/hover.js +197 -0
  53. package/dist/src/language/hover.js.map +1 -0
  54. package/dist/src/language/indentation.d.ts +15 -0
  55. package/dist/src/language/indentation.d.ts.map +1 -0
  56. package/dist/src/language/indentation.js +97 -0
  57. package/dist/src/language/indentation.js.map +1 -0
  58. package/dist/src/language/index.d.ts +54 -0
  59. package/dist/src/language/index.d.ts.map +1 -0
  60. package/dist/src/language/index.js +85 -0
  61. package/dist/src/language/index.js.map +1 -0
  62. package/dist/src/language/references.d.ts +12 -0
  63. package/dist/src/language/references.d.ts.map +1 -0
  64. package/dist/src/language/references.js +35 -0
  65. package/dist/src/language/references.js.map +1 -0
  66. package/dist/src/language/rename.d.ts +18 -0
  67. package/dist/src/language/rename.d.ts.map +1 -0
  68. package/dist/src/language/rename.js +53 -0
  69. package/dist/src/language/rename.js.map +1 -0
  70. package/dist/src/language/semanticModel.d.ts +21 -0
  71. package/dist/src/language/semanticModel.d.ts.map +1 -0
  72. package/dist/src/language/semanticModel.js +43 -0
  73. package/dist/src/language/semanticModel.js.map +1 -0
  74. package/dist/src/language/symbols.d.ts +9 -0
  75. package/dist/src/language/symbols.d.ts.map +1 -0
  76. package/dist/src/language/symbols.js +160 -0
  77. package/dist/src/language/symbols.js.map +1 -0
  78. package/dist/src/language/types.d.ts +49 -0
  79. package/dist/src/language/types.d.ts.map +1 -0
  80. package/dist/src/language/types.js +2 -0
  81. package/dist/src/language/types.js.map +1 -0
  82. package/dist/src/language/utils.d.ts +24 -0
  83. package/dist/src/language/utils.d.ts.map +1 -0
  84. package/dist/src/language/utils.js +154 -0
  85. package/dist/src/language/utils.js.map +1 -0
  86. package/dist/src/layout/dagre.d.ts +13 -0
  87. package/dist/src/layout/dagre.d.ts.map +1 -0
  88. package/dist/src/layout/dagre.js +229 -0
  89. package/dist/src/layout/dagre.js.map +1 -0
  90. package/dist/src/layout/index.d.ts +15 -0
  91. package/dist/src/layout/index.d.ts.map +1 -0
  92. package/dist/src/layout/index.js +22 -0
  93. package/dist/src/layout/index.js.map +1 -0
  94. package/dist/src/layout/simple.d.ts +20 -0
  95. package/dist/src/layout/simple.d.ts.map +1 -0
  96. package/dist/src/layout/simple.js +674 -0
  97. package/dist/src/layout/simple.js.map +1 -0
  98. package/dist/src/layout/types.d.ts +65 -0
  99. package/dist/src/layout/types.d.ts.map +1 -0
  100. package/dist/src/layout/types.js +2 -0
  101. package/dist/src/layout/types.js.map +1 -0
  102. package/dist/src/lexer.d.ts +25 -0
  103. package/dist/src/lexer.d.ts.map +1 -0
  104. package/dist/src/lexer.js +280 -0
  105. package/dist/src/lexer.js.map +1 -0
  106. package/dist/src/lsp/documents.d.ts +24 -0
  107. package/dist/src/lsp/documents.d.ts.map +1 -0
  108. package/dist/src/lsp/documents.js +97 -0
  109. package/dist/src/lsp/documents.js.map +1 -0
  110. package/dist/src/lsp/server.d.ts +70 -0
  111. package/dist/src/lsp/server.d.ts.map +1 -0
  112. package/dist/src/lsp/server.js +623 -0
  113. package/dist/src/lsp/server.js.map +1 -0
  114. package/dist/src/lsp/utils.d.ts +47 -0
  115. package/dist/src/lsp/utils.d.ts.map +1 -0
  116. package/dist/src/lsp/utils.js +142 -0
  117. package/dist/src/lsp/utils.js.map +1 -0
  118. package/dist/src/parser.d.ts +106 -0
  119. package/dist/src/parser.d.ts.map +1 -0
  120. package/dist/src/parser.js +1018 -0
  121. package/dist/src/parser.js.map +1 -0
  122. package/dist/src/pipeline.d.ts +51 -0
  123. package/dist/src/pipeline.d.ts.map +1 -0
  124. package/dist/src/pipeline.js +65 -0
  125. package/dist/src/pipeline.js.map +1 -0
  126. package/dist/src/range.d.ts +24 -0
  127. package/dist/src/range.d.ts.map +1 -0
  128. package/dist/src/range.js +20 -0
  129. package/dist/src/range.js.map +1 -0
  130. package/dist/src/render/index.d.ts +3 -0
  131. package/dist/src/render/index.d.ts.map +1 -0
  132. package/dist/src/render/index.js +3 -0
  133. package/dist/src/render/index.js.map +1 -0
  134. package/dist/src/render/shapes.d.ts +20 -0
  135. package/dist/src/render/shapes.d.ts.map +1 -0
  136. package/dist/src/render/shapes.js +110 -0
  137. package/dist/src/render/shapes.js.map +1 -0
  138. package/dist/src/render/svg.d.ts +19 -0
  139. package/dist/src/render/svg.d.ts.map +1 -0
  140. package/dist/src/render/svg.js +227 -0
  141. package/dist/src/render/svg.js.map +1 -0
  142. package/dist/src/security/url.d.ts +7 -0
  143. package/dist/src/security/url.d.ts.map +1 -0
  144. package/dist/src/security/url.js +27 -0
  145. package/dist/src/security/url.js.map +1 -0
  146. package/dist/src/types.d.ts +111 -0
  147. package/dist/src/types.d.ts.map +1 -0
  148. package/dist/src/types.js +16 -0
  149. package/dist/src/types.js.map +1 -0
  150. package/dist/src/validator.d.ts +47 -0
  151. package/dist/src/validator.d.ts.map +1 -0
  152. package/dist/src/validator.js +235 -0
  153. package/dist/src/validator.js.map +1 -0
  154. package/package.json +90 -0
@@ -0,0 +1,21 @@
1
+ import type { FloeDiagram } from "../types.js";
2
+ import type { Diagnostic } from "../diagnostics.js";
3
+ import { type Token } from "../lexer.js";
4
+ /**
5
+ * Semantic Model — enriched view of parsed Floe source.
6
+ * Language tooling must operate on this model, not directly on strings or editor internals.
7
+ */
8
+ export interface SemanticModel {
9
+ source: string;
10
+ diagram: FloeDiagram;
11
+ diagnostics: Diagnostic[];
12
+ tokens: Token[];
13
+ /** Version for incremental sync (optional) */
14
+ version?: number;
15
+ }
16
+ export declare function buildSemanticModel(source: string): SemanticModel;
17
+ export declare function getSemanticModel(source: string): SemanticModel;
18
+ /** Utility: find node by id in semantic model */
19
+ export declare function findNode(model: SemanticModel, id: string): import("./index.js").FloeNode | undefined;
20
+ export declare function findGroup(model: SemanticModel, id: string): import("./index.js").FloeGroup | undefined;
21
+ //# sourceMappingURL=semanticModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semanticModel.d.ts","sourceRoot":"","sources":["../../../src/language/semanticModel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAY,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAmBnD;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAIhE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAE9D;AAED,iDAAiD;AACjD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,6CAExD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,8CAUzD"}
@@ -0,0 +1,43 @@
1
+ import { tokenize } from "../lexer.js";
2
+ import { Parser } from "../parser.js";
3
+ import { validate } from "../validator.js";
4
+ function parseFloe(source) {
5
+ const raw = new Parser(source).parse();
6
+ const validated = validate({
7
+ diagram: raw.diagram,
8
+ diagnostics: raw.diagnostics,
9
+ explicitNodes: raw.explicitNodes,
10
+ edges: raw.edges,
11
+ directionDeclarations: raw.directionDeclarations,
12
+ groups: raw.groups,
13
+ annotations: raw.annotations,
14
+ links: raw.links,
15
+ });
16
+ return { diagram: validated.diagram, diagnostics: validated.diagnostics };
17
+ }
18
+ export function buildSemanticModel(source) {
19
+ const { diagram, diagnostics } = parseFloe(source);
20
+ const tokens = tokenize(source);
21
+ return { source, diagram, diagnostics, tokens };
22
+ }
23
+ export function getSemanticModel(source) {
24
+ return buildSemanticModel(source);
25
+ }
26
+ /** Utility: find node by id in semantic model */
27
+ export function findNode(model, id) {
28
+ return model.diagram.nodes.find((n) => n.id === id);
29
+ }
30
+ export function findGroup(model, id) {
31
+ function search(groups) {
32
+ for (const g of groups) {
33
+ if (g.id === id)
34
+ return g;
35
+ const found = search(g.groups);
36
+ if (found)
37
+ return found;
38
+ }
39
+ return undefined;
40
+ }
41
+ return search(model.diagram.groups);
42
+ }
43
+ //# sourceMappingURL=semanticModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semanticModel.js","sourceRoot":"","sources":["../../../src/language/semanticModel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,SAAS,SAAS,CAAC,MAAc;IAC/B,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,QAAQ,CAAC;QACzB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;QAChD,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC;AAC5E,CAAC;AAgBD,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,QAAQ,CAAC,KAAoB,EAAE,EAAU;IACvD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAoB,EAAE,EAAU;IACxD,SAAS,MAAM,CAAC,MAA6B;QAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE;gBAAE,OAAO,CAAC,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SymbolInformation } from "./types.js";
2
+ /**
3
+ * Symbols — discoverable symbols in document.
4
+ * Provides hierarchical outline: groups, nodes, edges.
5
+ */
6
+ export declare function getSymbols(source: string): SymbolInformation[];
7
+ /** Provides flat list (non-hierarchical) for simpler testing */
8
+ export declare function getFlatSymbols(source: string): SymbolInformation[];
9
+ //# sourceMappingURL=symbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../../src/language/symbols.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAmBpD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA+E9D;AAsDD,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAWlE"}
@@ -0,0 +1,160 @@
1
+ import { Parser } from "../parser.js";
2
+ import { validate } from "../validator.js";
3
+ function parseFloe(source) {
4
+ const raw = new Parser(source).parse();
5
+ const validated = validate({
6
+ diagram: raw.diagram,
7
+ diagnostics: raw.diagnostics,
8
+ explicitNodes: raw.explicitNodes,
9
+ edges: raw.edges,
10
+ directionDeclarations: raw.directionDeclarations,
11
+ groups: raw.groups,
12
+ annotations: raw.annotations,
13
+ links: raw.links,
14
+ });
15
+ return { diagram: validated.diagram, diagnostics: validated.diagnostics };
16
+ }
17
+ /**
18
+ * Symbols — discoverable symbols in document.
19
+ * Provides hierarchical outline: groups, nodes, edges.
20
+ */
21
+ export function getSymbols(source) {
22
+ const { diagram } = parseFloe(source);
23
+ const symbols = [];
24
+ if (diagram.directionRange) {
25
+ symbols.push({
26
+ name: `direction ${diagram.direction}`,
27
+ kind: "direction",
28
+ range: diagram.directionRange,
29
+ detail: diagram.direction,
30
+ });
31
+ }
32
+ // Top-level groups hierarchical
33
+ for (const grp of diagram.groups) {
34
+ symbols.push(groupToSymbol(grp));
35
+ }
36
+ // Nodes (flattened). Provide as top-level symbols if not already contained in group's symbol children.
37
+ // For outline, we already embed node symbols inside group symbols via children.
38
+ // But also provide flat list for nodes not in groups.
39
+ const groupedNodeIds = new Set();
40
+ function collectGroupedIds(groups) {
41
+ for (const g of groups) {
42
+ for (const nid of g.nodeIds)
43
+ groupedNodeIds.add(nid);
44
+ collectGroupedIds(g.groups);
45
+ }
46
+ }
47
+ collectGroupedIds(diagram.groups);
48
+ for (const node of diagram.nodes) {
49
+ // Skip if node is already represented inside group children (avoid duplicate)
50
+ // We'll still add but mark as nested? For symbol provider, flat is okay.
51
+ // Decide: only add nodes NOT in any group as top-level; grouped nodes appear inside group children.
52
+ if (groupedNodeIds.has(node.id))
53
+ continue;
54
+ symbols.push({
55
+ name: node.id,
56
+ kind: "node",
57
+ range: node.range,
58
+ detail: node.type ? `[${node.type}]${node.label ? ` "${node.label}"` : ""}` : node.label ? `"${node.label}"` : undefined,
59
+ });
60
+ }
61
+ // Edges as symbols
62
+ for (const edge of diagram.edges) {
63
+ symbols.push({
64
+ name: `${edge.source} ${edge.kind === "directed" ? "->" : "--"} ${edge.target}`,
65
+ kind: "edge",
66
+ range: edge.range,
67
+ detail: edge.label ? `: ${edge.label}` : undefined,
68
+ });
69
+ }
70
+ // Metadata
71
+ for (const [k, v] of Object.entries(diagram.metadata)) {
72
+ // No range stored precisely, omit or use directionRange? Skip range for metadata top-level? Use dummy.
73
+ // For now not add symbols for metadata at top level unless we have range.
74
+ // We have no per-meta range except global, so skip symbol for metadata to keep ranges accurate.
75
+ }
76
+ for (const ann of diagram.annotations) {
77
+ if (!ann.target) {
78
+ symbols.push({
79
+ name: `note "${ann.text.slice(0, 20)}"`,
80
+ kind: "annotation",
81
+ range: ann.range,
82
+ detail: ann.text,
83
+ });
84
+ }
85
+ }
86
+ for (const link of diagram.links) {
87
+ symbols.push({
88
+ name: `link ${link.target}`,
89
+ kind: "link",
90
+ range: link.range,
91
+ detail: link.url,
92
+ });
93
+ }
94
+ return symbols;
95
+ }
96
+ function groupToSymbol(g) {
97
+ const children = [];
98
+ // Add nested groups
99
+ for (const child of g.groups) {
100
+ children.push(groupToSymbol(child));
101
+ }
102
+ // Add member nodes as children (need node objects; but we have only ids. We'll lookup not needed; we can create placeholder symbols)
103
+ for (const nid of g.nodeIds) {
104
+ // Need to find node range - but we don't have here; we could create symbol with range same as group? Better fetch from diagram? For now use group range subset.
105
+ children.push({
106
+ name: nid,
107
+ kind: "node",
108
+ range: g.range, // approximate; ideal would be node range but we don't have.
109
+ detail: "member",
110
+ });
111
+ }
112
+ if (g.metadata) {
113
+ for (const [k, v] of Object.entries(g.metadata)) {
114
+ children.push({
115
+ name: `meta ${k}`,
116
+ kind: "meta",
117
+ range: g.range,
118
+ detail: `"${v}"`,
119
+ });
120
+ }
121
+ }
122
+ for (const ann of g.annotations) {
123
+ children.push({
124
+ name: ann.target ? `note ${ann.target}` : `note`,
125
+ kind: "annotation",
126
+ range: ann.range,
127
+ detail: ann.text,
128
+ });
129
+ }
130
+ if (g.link) {
131
+ children.push({
132
+ name: `link ${g.id}`,
133
+ kind: "link",
134
+ range: g.range,
135
+ detail: g.link,
136
+ });
137
+ }
138
+ return {
139
+ name: g.id,
140
+ kind: "group",
141
+ range: g.range,
142
+ detail: g.type ? `[${g.type}]${g.label ? ` "${g.label}"` : ""}` : g.label ? `"${g.label}"` : undefined,
143
+ children: children.length > 0 ? children : undefined,
144
+ };
145
+ }
146
+ /** Provides flat list (non-hierarchical) for simpler testing */
147
+ export function getFlatSymbols(source) {
148
+ const hierarchical = getSymbols(source);
149
+ const flat = [];
150
+ function walk(arr) {
151
+ for (const s of arr) {
152
+ flat.push(s);
153
+ if (s.children)
154
+ walk(s.children);
155
+ }
156
+ }
157
+ walk(hierarchical);
158
+ return flat;
159
+ }
160
+ //# sourceMappingURL=symbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.js","sourceRoot":"","sources":["../../../src/language/symbols.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { Range } from "../range.js";
2
+ export type CompletionKind = "keyword" | "type" | "variable" | "constant" | "property" | "value" | "snippet";
3
+ export interface CompletionItem {
4
+ label: string;
5
+ kind?: CompletionKind;
6
+ detail?: string;
7
+ insertText?: string;
8
+ sortText?: string;
9
+ }
10
+ export interface HoverInfo {
11
+ contents: string[];
12
+ range?: Range;
13
+ }
14
+ export type SymbolKind = "node" | "group" | "edge" | "direction" | "meta" | "annotation" | "link" | "unknown";
15
+ export interface SymbolInformation {
16
+ name: string;
17
+ kind: SymbolKind;
18
+ range: Range;
19
+ selectionRange?: Range;
20
+ detail?: string;
21
+ children?: SymbolInformation[];
22
+ }
23
+ export interface Location {
24
+ range: Range;
25
+ uri?: string;
26
+ }
27
+ export interface TextEdit {
28
+ range: Range;
29
+ newText: string;
30
+ }
31
+ export interface FoldingRange {
32
+ startLine: number;
33
+ endLine: number;
34
+ startColumn?: number;
35
+ endColumn?: number;
36
+ kind?: "region" | "group";
37
+ collapsedText?: string;
38
+ }
39
+ export interface HighlightToken {
40
+ type: string;
41
+ lexeme: string;
42
+ range: Range;
43
+ scope: string;
44
+ }
45
+ export interface FormattingOptions {
46
+ indentString?: string;
47
+ insertFinalNewline?: boolean;
48
+ }
49
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/language/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAE7G,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,OAAO,GACP,MAAM,GACN,WAAW,GACX,MAAM,GACN,YAAY,GACZ,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,CAAC,EAAE,KAAK,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/language/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import type { Position, Range } from "../range.js";
2
+ import { type Token } from "../lexer.js";
3
+ /** Convert offset (0-indexed) to Position (1-indexed line/col) */
4
+ export declare function positionAt(source: string, offset: number): Position;
5
+ export declare function offsetAt(source: string, pos: Position): number;
6
+ export declare function getLineText(source: string, lineNumber: number): string;
7
+ export declare function getLineCount(source: string): number;
8
+ /** Return token that contains offset, or nearest before offset */
9
+ export declare function getTokenAtOffset(tokens: Token[], offset: number): Token | undefined;
10
+ /** Find token immediately before offset (skipping whitespace which not in tokens) */
11
+ export declare function getTokenBeforeOffset(tokens: Token[], offset: number): Token | undefined;
12
+ export declare function isOffsetInRange(range: Range, offset: number): boolean;
13
+ export declare function rangeContains(range: Range, offset: number): boolean;
14
+ export declare function getWordAtOffset(source: string, offset: number): {
15
+ word: string;
16
+ start: number;
17
+ end: number;
18
+ } | null;
19
+ export declare function tokenizeSource(source: string): Token[];
20
+ /** Helpers to get lines with offsets */
21
+ export declare function getLineStartOffset(source: string, lineNumber: number): number;
22
+ /** Check if identifier at offset is inside string or comment – useful for rename guard */
23
+ export declare function isOffsetInStringOrComment(tokens: Token[], offset: number): boolean;
24
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/language/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAY,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAEnD,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,CA4BnE;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,MAAM,CAuB9D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAGtE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAMnF;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAQvF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAErE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUnH;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAEtD;AAED,wCAAwC;AACxC,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CA0B7E;AAED,0FAA0F;AAC1F,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAIlF"}
@@ -0,0 +1,154 @@
1
+ import { tokenize } from "../lexer.js";
2
+ /** Convert offset (0-indexed) to Position (1-indexed line/col) */
3
+ export function positionAt(source, offset) {
4
+ let line = 1;
5
+ let column = 1;
6
+ let cur = 0;
7
+ const len = source.length;
8
+ const off = Math.max(0, Math.min(offset, len));
9
+ while (cur < off) {
10
+ const ch = source[cur];
11
+ if (ch === "\n") {
12
+ line++;
13
+ column = 1;
14
+ cur++;
15
+ }
16
+ else if (ch === "\r") {
17
+ if (source[cur + 1] === "\n") {
18
+ line++;
19
+ column = 1;
20
+ cur += 2;
21
+ }
22
+ else {
23
+ line++;
24
+ column = 1;
25
+ cur++;
26
+ }
27
+ }
28
+ else {
29
+ column++;
30
+ cur++;
31
+ }
32
+ }
33
+ return { line, column, offset: off };
34
+ }
35
+ export function offsetAt(source, pos) {
36
+ // If offset is already provided trust it
37
+ if (typeof pos.offset === "number")
38
+ return pos.offset;
39
+ // else compute via line/col
40
+ let line = 1;
41
+ let column = 1;
42
+ let offset = 0;
43
+ while (offset < source.length) {
44
+ if (line === pos.line && column === pos.column)
45
+ return offset;
46
+ const ch = source[offset];
47
+ if (ch === "\n") {
48
+ line++;
49
+ column = 1;
50
+ }
51
+ else if (ch === "\r") {
52
+ if (source[offset + 1] === "\n")
53
+ offset++; // will increment below
54
+ line++;
55
+ column = 1;
56
+ }
57
+ else {
58
+ column++;
59
+ }
60
+ offset++;
61
+ }
62
+ return source.length;
63
+ }
64
+ export function getLineText(source, lineNumber) {
65
+ const lines = source.split(/\r?\n/);
66
+ return lines[lineNumber - 1] ?? "";
67
+ }
68
+ export function getLineCount(source) {
69
+ if (source === "")
70
+ return 1;
71
+ return source.split(/\r?\n/).length;
72
+ }
73
+ /** Return token that contains offset, or nearest before offset */
74
+ export function getTokenAtOffset(tokens, offset) {
75
+ for (const t of tokens) {
76
+ if (t.range.start.offset <= offset && offset < t.range.end.offset)
77
+ return t;
78
+ // Also handle cursor exactly at end (between tokens) -> return previous token? but not inside
79
+ }
80
+ return undefined;
81
+ }
82
+ /** Find token immediately before offset (skipping whitespace which not in tokens) */
83
+ export function getTokenBeforeOffset(tokens, offset) {
84
+ let best;
85
+ for (const t of tokens) {
86
+ if (t.range.end.offset <= offset) {
87
+ if (!best || t.range.end.offset > best.range.end.offset)
88
+ best = t;
89
+ }
90
+ }
91
+ return best;
92
+ }
93
+ export function isOffsetInRange(range, offset) {
94
+ return range.start.offset <= offset && offset < range.end.offset;
95
+ }
96
+ export function rangeContains(range, offset) {
97
+ return isOffsetInRange(range, offset);
98
+ }
99
+ export function getWordAtOffset(source, offset) {
100
+ if (offset < 0 || offset > source.length)
101
+ return null;
102
+ const isWordChar = (ch) => /[A-Za-z0-9_-]/.test(ch);
103
+ // expand left
104
+ let start = offset;
105
+ while (start > 0 && isWordChar(source[start - 1]))
106
+ start--;
107
+ let end = offset;
108
+ while (end < source.length && isWordChar(source[end]))
109
+ end++;
110
+ if (start === end)
111
+ return null;
112
+ return { word: source.slice(start, end), start, end };
113
+ }
114
+ export function tokenizeSource(source) {
115
+ return tokenize(source);
116
+ }
117
+ /** Helpers to get lines with offsets */
118
+ export function getLineStartOffset(source, lineNumber) {
119
+ const lines = source.split(/\r?\n/);
120
+ let offset = 0;
121
+ for (let i = 1; i < lineNumber; i++) {
122
+ const line = lines[i - 1] ?? "";
123
+ offset += line.length;
124
+ // add newline length (detect original). Our split lost delimiter, approximate as 1 for \n, 2 for \r\n? But we can compute by searching.
125
+ // Instead compute by iterating source to find nth newline.
126
+ // Simpler: use positionAt inverse? We'll compute via scanning source.
127
+ }
128
+ // fallback scan
129
+ let curLine = 1;
130
+ let curOffset = 0;
131
+ while (curOffset < source.length && curLine < lineNumber) {
132
+ const ch = source[curOffset];
133
+ if (ch === "\r" && source[curOffset + 1] === "\n") {
134
+ curLine++;
135
+ curOffset += 2;
136
+ }
137
+ else if (ch === "\n" || ch === "\r") {
138
+ curLine++;
139
+ curOffset++;
140
+ }
141
+ else {
142
+ curOffset++;
143
+ }
144
+ }
145
+ return curOffset;
146
+ }
147
+ /** Check if identifier at offset is inside string or comment – useful for rename guard */
148
+ export function isOffsetInStringOrComment(tokens, offset) {
149
+ const tok = getTokenAtOffset(tokens, offset);
150
+ if (!tok)
151
+ return false;
152
+ return tok.type === "STRING" || tok.type === "COMMENT";
153
+ }
154
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/language/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { FloeDiagram } from "../types.js";
2
+ import type { LayoutEngine, LayoutResult, LayoutOptions } from "./types.js";
3
+ /**
4
+ * Dagre-based layout engine — optional, replaceable.
5
+ * If `dagre` is not installed, layout() will throw with helpful message.
6
+ * This keeps core independent: dagre is only loaded when this engine is used.
7
+ */
8
+ export declare class DagreLayoutEngine implements LayoutEngine {
9
+ private opts;
10
+ constructor(opts?: LayoutOptions);
11
+ layout(diagram: FloeDiagram): LayoutResult;
12
+ }
13
+ //# sourceMappingURL=dagre.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dagre.d.ts","sourceRoot":"","sources":["../../../src/layout/dagre.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAA0B,aAAa,EAAE,MAAM,YAAY,CAAC;AAEpG;;;;GAIG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,IAAI,CAA0B;gBAE1B,IAAI,CAAC,EAAE,aAAa;IAahC,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,YAAY;CA2K3C"}