@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.
- package/CHANGELOG.md +21 -0
- package/README.md +199 -0
- package/dist/src/cli/check.d.ts.map +1 -1
- package/dist/src/cli/check.js +1 -1
- package/dist/src/cli/check.js.map +1 -1
- package/dist/src/cli/format.d.ts.map +1 -1
- package/dist/src/cli/format.js +4 -35
- package/dist/src/cli/format.js.map +1 -1
- package/dist/src/cli/main.d.ts +0 -16
- package/dist/src/cli/main.d.ts.map +1 -1
- package/dist/src/cli/main.js +0 -7
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/cli/render.d.ts.map +1 -1
- package/dist/src/cli/render.js +0 -15
- package/dist/src/cli/render.js.map +1 -1
- package/dist/src/diagnostics.d.ts +4 -18
- package/dist/src/diagnostics.d.ts.map +1 -1
- package/dist/src/diagnostics.js.map +1 -1
- package/dist/src/index.d.ts +7 -9
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/language/completion.d.ts +1 -2
- package/dist/src/language/completion.d.ts.map +1 -1
- package/dist/src/language/completion.js.map +1 -1
- package/dist/src/language/definitions.d.ts +6 -3
- package/dist/src/language/definitions.d.ts.map +1 -1
- package/dist/src/language/definitions.js.map +1 -1
- package/dist/src/language/diagnosticsService.d.ts +4 -5
- package/dist/src/language/diagnosticsService.d.ts.map +1 -1
- package/dist/src/language/diagnosticsService.js.map +1 -1
- package/dist/src/language/folding.d.ts +2 -3
- package/dist/src/language/folding.d.ts.map +1 -1
- package/dist/src/language/folding.js.map +1 -1
- package/dist/src/language/formatting.d.ts +2 -3
- package/dist/src/language/formatting.d.ts.map +1 -1
- package/dist/src/language/formatting.js.map +1 -1
- package/dist/src/language/highlighting.d.ts +2 -3
- package/dist/src/language/highlighting.d.ts.map +1 -1
- package/dist/src/language/highlighting.js.map +1 -1
- package/dist/src/language/hover.d.ts +4 -2
- package/dist/src/language/hover.d.ts.map +1 -1
- package/dist/src/language/hover.js.map +1 -1
- package/dist/src/language/indentation.d.ts +4 -7
- package/dist/src/language/indentation.d.ts.map +1 -1
- package/dist/src/language/indentation.js.map +1 -1
- package/dist/src/language/index.d.ts +45 -17
- package/dist/src/language/index.d.ts.map +1 -1
- package/dist/src/language/index.js.map +1 -1
- package/dist/src/language/references.d.ts +3 -4
- package/dist/src/language/references.d.ts.map +1 -1
- package/dist/src/language/references.js.map +1 -1
- package/dist/src/language/rename.d.ts +43 -15
- package/dist/src/language/rename.d.ts.map +1 -1
- package/dist/src/language/rename.js.map +1 -1
- package/dist/src/language/semanticModel.d.ts +14 -19
- package/dist/src/language/semanticModel.d.ts.map +1 -1
- package/dist/src/language/semanticModel.js.map +1 -1
- package/dist/src/language/symbols.d.ts +2 -3
- package/dist/src/language/symbols.d.ts.map +1 -1
- package/dist/src/language/symbols.js.map +1 -1
- package/dist/src/language/types.d.ts +0 -44
- package/dist/src/language/types.d.ts.map +1 -1
- package/dist/src/language/utils.d.ts +20 -18
- package/dist/src/language/utils.d.ts.map +1 -1
- package/dist/src/language/utils.js.map +1 -1
- package/dist/src/layout/dagre.d.ts +2 -2
- package/dist/src/layout/dagre.d.ts.map +1 -1
- package/dist/src/layout/dagre.js +14 -55
- package/dist/src/layout/dagre.js.map +1 -1
- package/dist/src/layout/index.d.ts +1 -9
- package/dist/src/layout/index.d.ts.map +1 -1
- package/dist/src/layout/index.js +1 -10
- package/dist/src/layout/index.js.map +1 -1
- package/dist/src/layout/simple.d.ts +1 -1
- package/dist/src/layout/simple.d.ts.map +1 -1
- package/dist/src/layout/simple.js +20 -166
- package/dist/src/layout/simple.js.map +1 -1
- package/dist/src/layout/types.d.ts +0 -1
- package/dist/src/layout/types.d.ts.map +1 -1
- package/dist/src/lexer.d.ts +0 -3
- package/dist/src/lexer.d.ts.map +1 -1
- package/dist/src/lexer.js +13 -54
- package/dist/src/lexer.js.map +1 -1
- package/dist/src/lsp/documents.d.ts +8 -17
- package/dist/src/lsp/documents.d.ts.map +1 -1
- package/dist/src/lsp/documents.js.map +1 -1
- package/dist/src/lsp/server.d.ts +138 -63
- package/dist/src/lsp/server.d.ts.map +1 -1
- package/dist/src/lsp/server.js.map +1 -1
- package/dist/src/lsp/utils.d.ts +13 -20
- package/dist/src/lsp/utils.d.ts.map +1 -1
- package/dist/src/lsp/utils.js.map +1 -1
- package/dist/src/parser.d.ts +94 -68
- package/dist/src/parser.d.ts.map +1 -1
- package/dist/src/parser.js.map +1 -1
- package/dist/src/pipeline.d.ts +0 -20
- package/dist/src/pipeline.d.ts.map +1 -1
- package/dist/src/pipeline.js +2 -28
- package/dist/src/pipeline.js.map +1 -1
- package/dist/src/range.d.ts +2 -5
- package/dist/src/range.d.ts.map +1 -1
- package/dist/src/range.js +0 -7
- package/dist/src/range.js.map +1 -1
- package/dist/src/render/shapes.d.ts +0 -8
- package/dist/src/render/shapes.d.ts.map +1 -1
- package/dist/src/render/shapes.js +13 -60
- package/dist/src/render/shapes.js.map +1 -1
- package/dist/src/render/svg.d.ts +0 -9
- package/dist/src/render/svg.d.ts.map +1 -1
- package/dist/src/render/svg.js +18 -83
- package/dist/src/render/svg.js.map +1 -1
- package/dist/src/security/url.d.ts +2 -2
- package/dist/src/security/url.d.ts.map +1 -1
- package/dist/src/security/url.js.map +1 -1
- package/dist/src/types.d.ts +3 -45
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +0 -5
- package/dist/src/types.js.map +1 -1
- package/dist/src/validator.d.ts +4 -33
- package/dist/src/validator.d.ts.map +1 -1
- package/dist/src/validator.js +4 -2
- package/dist/src/validator.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Floe follow [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
|
+
|
|
5
|
+
## [1.0.0] - 2026-09-05
|
|
6
|
+
|
|
7
|
+
Initial stable open source release.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- Stable language `v1.0` — frozen grammar documented in `docs/00-language-freeze.md` and `SPEC.md`; `direction`, `node [type] "label"`, `edge -> / -- : label`, `group { }` (nested), `meta`, `note`, `link`
|
|
11
|
+
- Renderer-independent IR — `FloeDiagram`, `FloeNode`, `FloeEdge` (`kind: directed | undirected`), `FloeGroup`, `FloeAnnotation`, `FloeLink`, `Range` with stable diagnostics `E001`–`E014`
|
|
12
|
+
- Deterministic layout `SimpleLayoutEngine` (zero-deps) and SVG renderer `renderSvg` / `renderFloe` with `escapeXml` / `escapeId` and URL sanitization `src/security/url.ts`
|
|
13
|
+
- Editor-independent language services — `diagnostics`, `completion`, `hover`, `symbols`, `definition`, `references`, `rename`, `formatting`, `highlighting`, `indentation`, `folding`
|
|
14
|
+
- CLI `floe check | format | render | lsp` (exit codes 0/1/2, `--json`, `--write`, `-o`) and LSP server (`src/lsp/server.ts`) reusing language services
|
|
15
|
+
- Comprehensive corpus `corpus/basic`, `labels`, `nodes`, `groups`, `direction`, `metadata`, `invalid`, `edge-cases`, `large` plus examples `examples/*.floe`
|
|
16
|
+
- Tests — `bun run test` 387 tests (parser, validator, language, layout, render, CLI, LSP, security, fuzz, corpus)
|
|
17
|
+
- Benchmarks `benchmarks/run.ts` → `benchmarks/results.json` and bundle sizes `scripts/measure-bundle.ts` → `benchmarks/bundle-size.json`
|
|
18
|
+
- Documentation `docs/` — Introduction, Syntax, Language Specification, Semantic Model, Rendering, Layout, Validation, Formatting, AI Generation, Editor Integration, CLI, LSP, API, Examples, Security, Versioning, Package Strategy
|
|
19
|
+
|
|
20
|
+
### Security
|
|
21
|
+
- Untrusted `.floe` input never executed; SVG output sanitized, `javascript:`/`data:` URLs flagged as `E014`.
|
package/README.md
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/floe.svg" width="128" height="128" alt="Floe" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# Floe — Diagram DSL
|
|
6
|
+
|
|
7
|
+
Lightweight, human-readable, AI-friendly diagram language. Files are `.floe`.
|
|
8
|
+
|
|
9
|
+
> **v1.0 Stable** — language frozen, see `docs/00-language-freeze.md` and `SPEC.md` for source of truth. All v1.0 checklist items are complete.
|
|
10
|
+
|
|
11
|
+
## Scope v1.0 — Stable
|
|
12
|
+
|
|
13
|
+
Implemented (v0.1–v1.0):
|
|
14
|
+
|
|
15
|
+
- `.floe` source format and frozen language specification (`SPEC.md`, `docs/00-language-freeze.md`)
|
|
16
|
+
- Lexer + grammar-based parser with source ranges and error recovery (never crashes) — fuzz tested
|
|
17
|
+
- Renderer-independent semantic model / IR (nodes, edges, groups, metadata, annotations, links) — reviewed
|
|
18
|
+
- Diagnostics with stable codes (`E001`–`E014`) + `E014` for unsafe URLs
|
|
19
|
+
- Deterministic layout (`SimpleLayoutEngine` — zero-dep) and SVG renderer (`renderSvg`, `renderFloe`) — escaped, sanitized
|
|
20
|
+
- Language services (editor-independent): diagnostics, completion, hover, go-to-definition, references, rename, formatting, symbols, highlighting, folding, indentation, folding ranges
|
|
21
|
+
- CLI: `floe check`, `floe format`, `floe render` (scriptable, correct exit codes 0/1/2)
|
|
22
|
+
- LSP: editor-independent Language Server (diagnostics, completion, hover, definition, references, rename, formatting, symbols, folding) reusing core services
|
|
23
|
+
- Comprehensive corpus: `basic/`, `labels/`, `nodes/`, `groups/`, `direction/`, `metadata/`, `invalid/`, `edge-cases/`, `large/` + legacy
|
|
24
|
+
- Performance benchmarks (`benchmarks/run.ts`) + bundle sizes (`scripts/measure-bundle.ts`) — actual measurements only
|
|
25
|
+
- Security review (`docs/security.md`) — SVG escaping, URL sanitization, no `eval`
|
|
26
|
+
- Documentation suite (`docs/`) — Introduction, Syntax, Semantic Model, Rendering, Layout, Validation, Formatting, AI Generation, Editor, CLI, LSP, API, Examples + AI reference
|
|
27
|
+
- Package strategy (`docs/package-strategy.md`) — only `@fazelstudio/floe` + `@fazelstudio/codemirror-lang-floe` for v1.0
|
|
28
|
+
- Versioning policy (`docs/versioning.md`) — SemVer after 1.0, breaking changes require major + migration
|
|
29
|
+
|
|
30
|
+
Not in v1.0: VS Code extension (architecture ready, separate repo).
|
|
31
|
+
|
|
32
|
+
## Install & Build (Bun — recommended, faster)
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
bun install
|
|
36
|
+
bun run build
|
|
37
|
+
bun run test
|
|
38
|
+
bun run typecheck
|
|
39
|
+
# npm still works: npm install / npm run build / npm test
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## CLI (v1.0)
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Validate
|
|
46
|
+
floe check diagram.floe # exit 0 OK, 1 errors, 2 usage
|
|
47
|
+
floe check diagram.floe --json # JSON for CI
|
|
48
|
+
|
|
49
|
+
# Format (canonical)
|
|
50
|
+
floe format diagram.floe # print to stdout
|
|
51
|
+
floe format diagram.floe --write # overwrite in place
|
|
52
|
+
floe format diagram.floe --check # CI: exit 1 if not formatted
|
|
53
|
+
|
|
54
|
+
# Render to SVG (deterministic, safe)
|
|
55
|
+
floe render diagram.floe # SVG to stdout
|
|
56
|
+
floe render diagram.floe -o out.svg # write file
|
|
57
|
+
|
|
58
|
+
# LSP (stdio) for editors
|
|
59
|
+
floe lsp --stdio
|
|
60
|
+
# Architecture: Editor → LSP → Floe Language Services → Parser/Semantic Model
|
|
61
|
+
# Works with VS Code, Neovim, Zed, Helix, any LSP client (no editor-specific semantics)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## LSP (v1.0)
|
|
65
|
+
|
|
66
|
+
Editor-independent Language Server reusing `src/language/*`:
|
|
67
|
+
|
|
68
|
+
- diagnostics (publishDiagnostics)
|
|
69
|
+
- completion
|
|
70
|
+
- hover
|
|
71
|
+
- go-to-definition
|
|
72
|
+
- references
|
|
73
|
+
- rename
|
|
74
|
+
- formatting
|
|
75
|
+
- symbols (documentSymbol)
|
|
76
|
+
|
|
77
|
+
Run: `bun ./dist/src/cli/main.js lsp` or `floe lsp` (also `node ./dist/src/cli/main.js`)
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
bun run build
|
|
81
|
+
bun ./dist/src/lsp/server.js # or via CLI / node
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Usage
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
import { parseFloe } from "@fazelstudio/floe";
|
|
88
|
+
import { renderFloe } from "@fazelstudio/floe/pipeline";
|
|
89
|
+
|
|
90
|
+
const { diagram, diagnostics } = parseFloe(`
|
|
91
|
+
direction LR
|
|
92
|
+
// auth flow
|
|
93
|
+
User -> Login
|
|
94
|
+
Login -> Dashboard : success
|
|
95
|
+
Login -> Error : invalid
|
|
96
|
+
User [person]
|
|
97
|
+
`);
|
|
98
|
+
|
|
99
|
+
if (diagnostics.some(d => d.severity === "error")) {
|
|
100
|
+
console.log(diagnostics);
|
|
101
|
+
} else {
|
|
102
|
+
console.log(diagram.direction); // "LR"
|
|
103
|
+
console.log(diagram.nodes); // [{ id: "User", type: "person", ... }, ...]
|
|
104
|
+
console.log(diagram.edges); // [{ source: "Login", target: "Dashboard", label: "success", ... }]
|
|
105
|
+
const { svg } = renderFloe(`
|
|
106
|
+
direction LR
|
|
107
|
+
User -> Login
|
|
108
|
+
Login -> Dashboard : success
|
|
109
|
+
`);
|
|
110
|
+
console.log(svg); // deterministic SVG
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Raw parse without validation (if needed)
|
|
114
|
+
import { parseRaw } from "@fazelstudio/floe";
|
|
115
|
+
const raw = parseRaw(source);
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Identifier Rules
|
|
119
|
+
|
|
120
|
+
See `SPEC.md §4`. TL;DR: `^[A-Za-z_][A-Za-z0-9_-]*$`, no spaces, no Unicode, no leading digit.
|
|
121
|
+
|
|
122
|
+
## Diagnostics Codes
|
|
123
|
+
|
|
124
|
+
`E001` invalid direction, `E002` invalid identifier, `E003` duplicate node, `E004` duplicate direction, `E005` malformed/unexpected, `E006` incomplete, `E007` invalid character, `E008` invalid node type, `E009` missing edge target, `E010` empty label.
|
|
125
|
+
|
|
126
|
+
All diagnostics carry `range { start: { line, column, offset }, end: ... }`.
|
|
127
|
+
|
|
128
|
+
## Project Structure
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
src/
|
|
132
|
+
range.ts # Position/Range
|
|
133
|
+
diagnostics.ts # Diagnostic + codes (E001–E014)
|
|
134
|
+
types.ts # IR (FloeDiagram, FloeNode, FloeEdge, etc.)
|
|
135
|
+
lexer.ts # lexical grammar
|
|
136
|
+
parser.ts # recursive-descent parser with recovery
|
|
137
|
+
validator.ts # semantic validation (separate phase)
|
|
138
|
+
index.ts # public stable API (parseFloe, parseRaw, isValid)
|
|
139
|
+
language/ # editor-independent services (completion, hover, etc.)
|
|
140
|
+
layout/ # deterministic layout engines (Simple + Dagre)
|
|
141
|
+
render/ # SVG renderer (escaped, safe)
|
|
142
|
+
cli/ # CLI: check, format, render
|
|
143
|
+
lsp/ # LSP server (reuses language services)
|
|
144
|
+
security/ # URL sanitization
|
|
145
|
+
SPEC.md # language spec (source of truth)
|
|
146
|
+
docs/ # v1.0 docs: Introduction, Syntax, Semantic Model, Rendering, Layout, Validation, Formatting, AI Gen, Editor, CLI, LSP, API, Examples, Freeze, Versioning, Security, Package
|
|
147
|
+
corpus/
|
|
148
|
+
basic/ labels/ nodes/ groups/ direction/ metadata/ invalid/ edge-cases/ large/ # comprehensive (v1.0)
|
|
149
|
+
valid/ invalid/ # legacy flat (kept for compat)
|
|
150
|
+
examples/ # runnable .floe examples
|
|
151
|
+
benchmarks/ # performance & bundle-size results
|
|
152
|
+
tests/ # parser, validator, language, render, lsp, cli, security, fuzz, corpus-comprehensive
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Runtime Compatibility
|
|
156
|
+
|
|
157
|
+
| Runtime | Status | Notes |
|
|
158
|
+
|---------|--------|-------|
|
|
159
|
+
| Node.js | ✅ Tested | v18+; `npm test` 194 passed, `node ./dist/src/cli/main.js check/format/render/lsp` OK |
|
|
160
|
+
| Browser | ✅ Core only | `src/index.ts:1` pure TS, no `fs`/`eval`; no bundler test but no Node imports |
|
|
161
|
+
| Bun | ✅ Tested | v1.3.11; `bun -e` core ok, `bun ./dist/src/cli/main.js check/format/render` OK |
|
|
162
|
+
| Deno | ✅ Tested | v2.9.6; `deno run --allow-read src/index.ts` core PASS, `deno run --allow-read --allow-write --allow-env dist/src/cli/main.js check/format/render/lsp` OK (2026-09-05 Win32) |
|
|
163
|
+
|
|
164
|
+
All except browser bundle are tested and claimed. Core is universal pure JS.
|
|
165
|
+
|
|
166
|
+
## Tests
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
bun run test # or npm test
|
|
170
|
+
# 387 tests, includes fuzz (1000+ random), corpus-comprehensive (basic/labels/nodes/groups/direction/metadata/invalid/edge-cases/large), security, CLI, LSP, codemirror
|
|
171
|
+
bun run benchmark # actual performance numbers → benchmarks/results.json
|
|
172
|
+
bun run bundle:measure # actual bundle sizes per package → benchmarks/bundle-size.json
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Covers: basic edges, multiple edges, edge labels, explicit node types, comments, directions, whitespace, empty files, duplicate declarations, invalid syntax, incomplete syntax, invalid identifiers, source ranges, never-crash, fuzz (no crash/hang/memory), large diagrams (500–2000 nodes), security, CLI/LSP/CodeMirror.
|
|
176
|
+
|
|
177
|
+
## Architecture Rules
|
|
178
|
+
|
|
179
|
+
Core (`src/` without `cli/` and `lsp/`) has zero dependencies on CodeMirror, React, Vue, DOM, SVG, Canvas, Dagre, ELK, LSP. Pure language only. CLI and LSP are separate entry points that reuse core.
|
|
180
|
+
|
|
181
|
+
## Security
|
|
182
|
+
|
|
183
|
+
- `.floe` files are treated as **untrusted**. Never uses `eval`/`new Function` or equivalent.
|
|
184
|
+
- Generated SVG escapes `& < > " '` and sanitizes `id` attributes; no `<script>`, event handlers, or `javascript:` vectors from user content.
|
|
185
|
+
- See `tests/security.test.ts` for untrusted-input coverage.
|
|
186
|
+
|
|
187
|
+
## Editor Compatibility
|
|
188
|
+
|
|
189
|
+
Architecture is editor-agnostic:
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
Editor (VS Code / Neovim / Zed / Helix)
|
|
193
|
+
↓ LSP (stdio, JSON-RPC)
|
|
194
|
+
Floe Language Services (src/language/*)
|
|
195
|
+
↓
|
|
196
|
+
Parser / Semantic Model
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
No editor-specific semantic implementation exists; all intelligence is in `src/language/*` and reused by LSP.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/check.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,CAGpE;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,WAAW,CAWhF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/check.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,CAGpE;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,WAAW,CAWhF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,MAAM,CAyDzE"}
|
package/dist/src/cli/check.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAcxC,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,CAAa;IAC1D,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IACvC,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAqB,EAAE;IACjE,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,MAAM,GAAG,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAClE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAe,EAAE,OAAqB,EAAE;IAC/D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/cli/format.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/cli/format.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,CAmE3E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAExD"}
|
package/dist/src/cli/format.js
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
-
import { format
|
|
4
|
-
import { parseFloe } from "../index.js";
|
|
3
|
+
import { format } from "../language/formatting.js";
|
|
5
4
|
export function runFormat(files, opts = {}) {
|
|
6
5
|
if (files.length === 0) {
|
|
7
6
|
console.error("floe format: no input files");
|
|
8
7
|
console.error("Usage: floe format <file.floe> [--write] [--check]");
|
|
9
8
|
return 2;
|
|
10
9
|
}
|
|
11
|
-
// Mutually exclusive: --write and --check should not both be set? Allow but prioritize check?
|
|
12
10
|
if (opts.write && opts.check) {
|
|
13
11
|
console.error("floe format: --write and --check are mutually exclusive");
|
|
14
12
|
return 2;
|
|
15
13
|
}
|
|
16
14
|
let hasUnformatted = false;
|
|
17
|
-
let hasErrors = false;
|
|
18
15
|
for (const f of files) {
|
|
19
16
|
const resolved = path.resolve(f);
|
|
20
17
|
if (!fs.existsSync(resolved)) {
|
|
@@ -30,7 +27,6 @@ export function runFormat(files, opts = {}) {
|
|
|
30
27
|
console.error(`Cannot read file '${f}': ${msg}`);
|
|
31
28
|
return 2;
|
|
32
29
|
}
|
|
33
|
-
// Validate that format never throws on malformed input (security: no crash)
|
|
34
30
|
let formatted;
|
|
35
31
|
try {
|
|
36
32
|
formatted = format(source);
|
|
@@ -45,19 +41,8 @@ export function runFormat(files, opts = {}) {
|
|
|
45
41
|
if (needsFormat) {
|
|
46
42
|
hasUnformatted = true;
|
|
47
43
|
const rel = path.relative(process.cwd(), resolved);
|
|
48
|
-
if (opts.json)
|
|
49
|
-
// json output for check mode
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
44
|
+
if (!opts.json)
|
|
52
45
|
console.error(`✖ ${rel}: not formatted`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
if (!opts.json) {
|
|
57
|
-
const rel = path.relative(process.cwd(), resolved);
|
|
58
|
-
// quiet on success? Only print if not json?
|
|
59
|
-
// For CI, we want quiet success. So no output unless not formatted.
|
|
60
|
-
}
|
|
61
46
|
}
|
|
62
47
|
continue;
|
|
63
48
|
}
|
|
@@ -75,40 +60,24 @@ export function runFormat(files, opts = {}) {
|
|
|
75
60
|
return 2;
|
|
76
61
|
}
|
|
77
62
|
}
|
|
78
|
-
else {
|
|
79
|
-
// Already formatted, no write
|
|
80
|
-
if (!opts.json) {
|
|
81
|
-
// no output? Could be verbose
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
63
|
continue;
|
|
85
64
|
}
|
|
86
|
-
// Default: stdout (scriptable). If multiple files, separate with header?
|
|
87
65
|
if (files.length === 1) {
|
|
88
|
-
// Single file -> raw formatted to stdout
|
|
89
66
|
process.stdout.write(formatted);
|
|
90
67
|
}
|
|
91
68
|
else {
|
|
92
69
|
const rel = path.relative(process.cwd(), resolved);
|
|
93
|
-
// For multiple files to stdout, add filename header for scriptability? But spec says scriptable, so we should output each?
|
|
94
|
-
// We'll output with header comment per file for clarity, but that would break piping.
|
|
95
|
-
// Instead, if multiple files and stdout mode, we print each file's formatted content separated by newline and header to stderr
|
|
96
70
|
console.error(`== ${rel} ==`);
|
|
97
71
|
process.stdout.write(formatted);
|
|
98
72
|
if (!formatted.endsWith("\n"))
|
|
99
73
|
process.stdout.write("\n");
|
|
100
74
|
}
|
|
101
75
|
}
|
|
102
|
-
if (opts.check)
|
|
76
|
+
if (opts.check)
|
|
103
77
|
return hasUnformatted ? 1 : 0;
|
|
104
|
-
}
|
|
105
|
-
// For write/stdout, exit 0 unless there were read errors (already returned)
|
|
106
|
-
// Should we exit 1 if original file had parse errors? Formatting should still succeed but maybe warn.
|
|
107
|
-
// We keep exit 0 for formatting success, to allow CI to use --check for validation.
|
|
108
78
|
return 0;
|
|
109
79
|
}
|
|
110
|
-
// For testing: check if file is formatted
|
|
111
80
|
export function checkIsFormatted(source) {
|
|
112
|
-
return
|
|
81
|
+
return format(source) === source;
|
|
113
82
|
}
|
|
114
83
|
//# sourceMappingURL=format.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/cli/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/cli/format.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/main.d.ts
CHANGED
|
@@ -1,19 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Floe CLI
|
|
4
|
-
* Commands:
|
|
5
|
-
* floe check <file.floe> [--json] [--quiet]
|
|
6
|
-
* floe format <file.floe> [--write] [--check]
|
|
7
|
-
* floe render <file.floe> [-o output.svg]
|
|
8
|
-
* floe lsp [--stdio] (starts LSP server)
|
|
9
|
-
*
|
|
10
|
-
* Keep CLI behavior scriptable for CI with appropriate exit codes:
|
|
11
|
-
* 0 success
|
|
12
|
-
* 1 validation / check failure
|
|
13
|
-
* 2 usage / file not found error
|
|
14
|
-
*
|
|
15
|
-
* Treat .floe files as untrusted: never eval, ensure SVG cannot execute code.
|
|
16
|
-
* This CLI never uses eval and delegates to safe core.
|
|
17
|
-
*/
|
|
18
2
|
export {};
|
|
19
3
|
//# sourceMappingURL=main.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/cli/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/cli/main.ts"],"names":[],"mappings":""}
|
package/dist/src/cli/main.js
CHANGED
|
@@ -78,7 +78,6 @@ function parseArgs(argv) {
|
|
|
78
78
|
const args = argv.slice(2);
|
|
79
79
|
if (args.length === 0)
|
|
80
80
|
return { files: [], opts: {} };
|
|
81
|
-
// Handle global flags
|
|
82
81
|
if (args[0] === "--help" || args[0] === "-h" || args[0] === "help") {
|
|
83
82
|
return { command: "help", files: [], opts: {} };
|
|
84
83
|
}
|
|
@@ -155,7 +154,6 @@ async function main() {
|
|
|
155
154
|
printVersion();
|
|
156
155
|
process.exit(0);
|
|
157
156
|
}
|
|
158
|
-
// Allow help per command
|
|
159
157
|
if (opts.help) {
|
|
160
158
|
printHelp();
|
|
161
159
|
process.exit(0);
|
|
@@ -180,11 +178,8 @@ async function main() {
|
|
|
180
178
|
}
|
|
181
179
|
case "lsp":
|
|
182
180
|
case "lsp-server": {
|
|
183
|
-
// Start LSP server
|
|
184
|
-
// Dynamic import to avoid loading LSP code unless needed (keeps core Node/browser separation)
|
|
185
181
|
const { startLspServer } = await import("../lsp/server.js");
|
|
186
182
|
await startLspServer({ stdio: true });
|
|
187
|
-
// startLspServer runs indefinitely until shutdown
|
|
188
183
|
return;
|
|
189
184
|
}
|
|
190
185
|
default: {
|
|
@@ -195,11 +190,9 @@ async function main() {
|
|
|
195
190
|
}
|
|
196
191
|
process.exit(exitCode);
|
|
197
192
|
}
|
|
198
|
-
// Ensure unhandled errors are reported with exit 1 (no crash with empty exit)
|
|
199
193
|
main().catch((e) => {
|
|
200
194
|
const msg = e instanceof Error ? e.message : String(e);
|
|
201
195
|
console.error(`floe: internal error: ${msg}`);
|
|
202
|
-
// Do not print stack for user-facing errors unless debug? Keep simple
|
|
203
196
|
if (process.env.FLOE_DEBUG)
|
|
204
197
|
console.error(e instanceof Error ? e.stack : "");
|
|
205
198
|
process.exit(1);
|
package/dist/src/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/cli/main.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/cli/render.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/cli/render.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,CA6D3E"}
|
package/dist/src/cli/render.js
CHANGED
|
@@ -28,7 +28,6 @@ export function runRender(files, opts = {}) {
|
|
|
28
28
|
console.error(`Cannot read file '${f}': ${msg}`);
|
|
29
29
|
return 2;
|
|
30
30
|
}
|
|
31
|
-
// Parse to check diagnostics but still render best-effort (per spec: never crash)
|
|
32
31
|
let svg;
|
|
33
32
|
let hasParseErrors = false;
|
|
34
33
|
try {
|
|
@@ -36,7 +35,6 @@ export function runRender(files, opts = {}) {
|
|
|
36
35
|
hasParseErrors = parseResult.diagnostics.some((d) => d.severity === "error");
|
|
37
36
|
if (hasParseErrors)
|
|
38
37
|
hadErrors = true;
|
|
39
|
-
// Render via pipeline (deterministic, never throws on malformed input)
|
|
40
38
|
const result = renderFloe(source);
|
|
41
39
|
svg = result.svg;
|
|
42
40
|
}
|
|
@@ -45,12 +43,9 @@ export function runRender(files, opts = {}) {
|
|
|
45
43
|
console.error(`floe render: failed to render '${f}': ${msg}`);
|
|
46
44
|
return 1;
|
|
47
45
|
}
|
|
48
|
-
// Security: ensure svg is properly escaped (render already does) and not containing executable vectors
|
|
49
|
-
// We do not inject any untrusted content as raw; svg is derived via escaped paths.
|
|
50
46
|
if (opts.output) {
|
|
51
47
|
const outPath = path.resolve(opts.output);
|
|
52
48
|
try {
|
|
53
|
-
// Ensure directory exists
|
|
54
49
|
const dir = path.dirname(outPath);
|
|
55
50
|
if (!fs.existsSync(dir))
|
|
56
51
|
fs.mkdirSync(dir, { recursive: true });
|
|
@@ -66,9 +61,6 @@ export function runRender(files, opts = {}) {
|
|
|
66
61
|
}
|
|
67
62
|
}
|
|
68
63
|
else {
|
|
69
|
-
// stdout (scriptable)
|
|
70
|
-
// If json mode? Not needed but we support emitting svg via stdout only.
|
|
71
|
-
// Print svg to stdout; warnings to stderr
|
|
72
64
|
if (hasParseErrors && !opts.json) {
|
|
73
65
|
const rel = path.relative(process.cwd(), resolved);
|
|
74
66
|
console.error(`warning: ${rel} has parse errors, rendered best-effort SVG`);
|
|
@@ -78,13 +70,6 @@ export function runRender(files, opts = {}) {
|
|
|
78
70
|
process.stdout.write("\n");
|
|
79
71
|
}
|
|
80
72
|
}
|
|
81
|
-
// For CI: exit 1 if any file had parse errors? Or 0 still? Spec says appropriate exit codes and scriptable.
|
|
82
|
-
// We will exit 1 if any input had errors, to allow CI to fail on invalid diagrams, but still produce SVG.
|
|
83
|
-
// This is useful: `floe render` can be used in CI to validate rendering.
|
|
84
|
-
// If caller wants to ignore errors, they can check SVG existence anyway.
|
|
85
|
-
// We make decision: if any file had errors, exit 1, else 0. But produce SVG regardless.
|
|
86
|
-
// For scriptable use, they can do `floe render good.floe || echo failed`
|
|
87
|
-
// Document this behavior.
|
|
88
73
|
return hadErrors ? 1 : 0;
|
|
89
74
|
}
|
|
90
75
|
//# sourceMappingURL=render.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/cli/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAQ5C,MAAM,UAAU,SAAS,CAAC,KAAe,EAAE,OAAsB,EAAE;IACjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO,CAAC,CAAC;IACX,CAAC;
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/cli/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,11 @@
|
|
|
1
1
|
import type { Range } from "./range.js";
|
|
2
|
-
/**
|
|
3
|
-
* Diagnostic severity
|
|
4
|
-
*/
|
|
5
2
|
export type Severity = "error" | "warning" | "info";
|
|
6
3
|
/**
|
|
7
4
|
* Stable diagnostic codes
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* E004 - duplicate direction declaration
|
|
13
|
-
* E005 - malformed statement / unexpected token
|
|
14
|
-
* E006 - missing / incomplete statement
|
|
15
|
-
* E007 - invalid character
|
|
16
|
-
* E008 - invalid node type
|
|
17
|
-
* E009 - missing edge target
|
|
18
|
-
* E010 - empty label
|
|
19
|
-
* E011 - duplicate group declaration
|
|
20
|
-
* E012 - unclosed group / missing brace
|
|
21
|
-
* E013 - invalid metadata declaration
|
|
22
|
-
* E014 - invalid annotation or link (unknown target, empty text)
|
|
5
|
+
* v0.1: E001-E010
|
|
6
|
+
* v1 additions preserved as optional for layout/render comparison (surviving dist has E001-E014):
|
|
7
|
+
* E011 duplicate group, E012 unclosed group, E013 invalid metadata, E014 invalid annotation/link
|
|
8
|
+
* v0.2 checkpoint retains v0.1 set as primary, superset allowed for compatibility with surviving artifacts.
|
|
23
9
|
*/
|
|
24
10
|
export type DiagnosticCode = "E001" | "E002" | "E003" | "E004" | "E005" | "E006" | "E007" | "E008" | "E009" | "E010" | "E011" | "E012" | "E013" | "E014";
|
|
25
11
|
export interface Diagnostic {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AACpD;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,CAAC;AACX,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;CACd;AACD,wBAAgB,IAAI,CAClB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,GACX,UAAU,CAEZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/diagnostics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/diagnostics.ts"],"names":[],"mappings":"AA8BA,MAAM,UAAU,IAAI,CAClB,QAAkB,EAClB,IAAoB,EACpB,OAAe,EACf,KAAY;IAEZ,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5C,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -8,15 +8,11 @@
|
|
|
8
8
|
* Stability: exports listed under "Stable Public API" in docs/api.md are semver-stable.
|
|
9
9
|
* Exports marked @internal are deprecated and may be hidden in 2.0 — prefer stable wrappers.
|
|
10
10
|
*/
|
|
11
|
-
export type { Position, Range } from "./range.js";
|
|
12
11
|
export { rangeToString } from "./range.js";
|
|
13
|
-
export type { Diagnostic, DiagnosticCode, Severity } from "./diagnostics.js";
|
|
14
|
-
export type { Direction, FloeDiagram, FloeNode, FloeEdge, FloeGroup, FloeAnnotation, FloeLink, EdgeKind, ParseResult, } from "./types.js";
|
|
15
12
|
export { DEFAULT_DIRECTION, DIRECTIONS, IDENTIFIER_RE, isValidIdentifier, } from "./types.js";
|
|
16
|
-
export { Lexer, tokenize
|
|
13
|
+
export { Lexer, tokenize } from "./lexer.js";
|
|
17
14
|
export { Parser, parse as parseRaw, parseRaw as parseRawFloe } from "./parser.js";
|
|
18
|
-
export { validate
|
|
19
|
-
import type { ParseResult } from "./types.js";
|
|
15
|
+
export { validate } from "./validator.js";
|
|
20
16
|
/**
|
|
21
17
|
* @stable
|
|
22
18
|
* Parse Floe source with full pipeline:
|
|
@@ -27,14 +23,16 @@ import type { ParseResult } from "./types.js";
|
|
|
27
23
|
* Never throws on malformed input — returns diagnostics instead.
|
|
28
24
|
* This is the recommended entry point (stable).
|
|
29
25
|
*/
|
|
30
|
-
export declare function parseFloe(source:
|
|
26
|
+
export declare function parseFloe(source: any): {
|
|
27
|
+
diagram: any;
|
|
28
|
+
diagnostics: any[];
|
|
29
|
+
};
|
|
31
30
|
/**
|
|
32
31
|
* Alias: `parse` is the validated entry as well for ergonomics.
|
|
33
32
|
* For raw (without validation) use `parseRaw` / `parseRawFloe`.
|
|
34
33
|
*/
|
|
35
34
|
export declare const parse: typeof parseFloe;
|
|
36
|
-
export declare function isValid(source:
|
|
35
|
+
export declare function isValid(source: any): boolean;
|
|
37
36
|
export { getHighlightTokens, getHighlightingInfo, getCompletions, getDiagnostics, getDiagnosticsWithSource, lint, getHover, getSymbols, getFlatSymbols, getDefinition, getDefinitionForWord, getReferences, getReferencesForWord, rename, renameWord, applyEdits, format, isFormatted, getIndentForLine, getIndentationInfo, getIndentationColumn, DEFAULT_INDENT, getFoldingRanges, getFoldingInfo, buildSemanticModel, getSemanticModel, } from "./language/index.js";
|
|
38
|
-
export type { CompletionItem, HoverInfo, SymbolKind, SymbolInformation, Location, TextEdit, FoldingRange, HighlightToken, FormattingOptions, SemanticModel, } from "./language/index.js";
|
|
39
37
|
export { FloeLanguageService, floeLanguageService } from "./language/index.js";
|
|
40
38
|
//# sourceMappingURL=index.d.ts.map
|