@birdcc/core 0.0.1-alpha.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 (58) hide show
  1. package/.oxfmtrc.json +16 -0
  2. package/LICENSE +674 -0
  3. package/README.md +343 -0
  4. package/dist/cross-file.d.ts +5 -0
  5. package/dist/cross-file.d.ts.map +1 -0
  6. package/dist/cross-file.js +264 -0
  7. package/dist/cross-file.js.map +1 -0
  8. package/dist/index.d.ts +10 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +12 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/prefix.d.ts +2 -0
  13. package/dist/prefix.d.ts.map +1 -0
  14. package/dist/prefix.js +76 -0
  15. package/dist/prefix.js.map +1 -0
  16. package/dist/range.d.ts +3 -0
  17. package/dist/range.d.ts.map +1 -0
  18. package/dist/range.js +7 -0
  19. package/dist/range.js.map +1 -0
  20. package/dist/semantic-diagnostics.d.ts +4 -0
  21. package/dist/semantic-diagnostics.d.ts.map +1 -0
  22. package/dist/semantic-diagnostics.js +75 -0
  23. package/dist/semantic-diagnostics.js.map +1 -0
  24. package/dist/snapshot.d.ts +7 -0
  25. package/dist/snapshot.d.ts.map +1 -0
  26. package/dist/snapshot.js +22 -0
  27. package/dist/snapshot.js.map +1 -0
  28. package/dist/symbol-table.d.ts +9 -0
  29. package/dist/symbol-table.d.ts.map +1 -0
  30. package/dist/symbol-table.js +118 -0
  31. package/dist/symbol-table.js.map +1 -0
  32. package/dist/template-cycles.d.ts +9 -0
  33. package/dist/template-cycles.d.ts.map +1 -0
  34. package/dist/template-cycles.js +95 -0
  35. package/dist/template-cycles.js.map +1 -0
  36. package/dist/type-checker.d.ts +4 -0
  37. package/dist/type-checker.d.ts.map +1 -0
  38. package/dist/type-checker.js +390 -0
  39. package/dist/type-checker.js.map +1 -0
  40. package/dist/types.d.ts +84 -0
  41. package/dist/types.d.ts.map +1 -0
  42. package/dist/types.js +2 -0
  43. package/dist/types.js.map +1 -0
  44. package/package.json +45 -0
  45. package/scripts/benchmark-node-vs-regex.js +86 -0
  46. package/src/cross-file.ts +412 -0
  47. package/src/index.ts +42 -0
  48. package/src/prefix.ts +94 -0
  49. package/src/range.ts +12 -0
  50. package/src/semantic-diagnostics.ts +93 -0
  51. package/src/snapshot.ts +32 -0
  52. package/src/symbol-table.ts +171 -0
  53. package/src/template-cycles.ts +142 -0
  54. package/src/type-checker.ts +595 -0
  55. package/src/types.ts +101 -0
  56. package/test/core.test.ts +503 -0
  57. package/test/prefix.test.ts +40 -0
  58. package/tsconfig.json +8 -0
package/README.md ADDED
@@ -0,0 +1,343 @@
1
+ <div align="center">
2
+
3
+ # 🦅 BIRD Config Core (@birdcc/core)
4
+
5
+ </div>
6
+
7
+ [![npm version](https://img.shields.io/badge/version-0.1.0--alpha-blue)](https://www.npmjs.com/package/@birdcc/core) [![License: GPL-3.0](https://img.shields.io/badge/License-GPL--3.0--only-green.svg)](https://www.gnu.org/licenses/gpl-3.0) [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178c6?logo=typescript)](https://www.typescriptlang.org/)
8
+
9
+ > [Overview](#overview) · [Features](#features) · [Installation](#installation) · [Usage](#usage) · [API Reference](#api-reference) · [Architecture](#architecture)
10
+
11
+ ## Overview
12
+
13
+ **@birdcc/core** is the semantic analysis engine for BIRD2 configuration files, providing symbol table construction, type checking, and cross-file resolution capabilities.
14
+
15
+ ### Core Highlights
16
+
17
+ | Feature | Description |
18
+ | ------- | ----------- |
19
+ | 🔍 Symbol Table | Automatic collection of protocol/template/filter/function definitions |
20
+ | ⚠️ Semantic Checks | Detect duplicate definitions and undefined references |
21
+ | 📋 Diagnostics | Standardized diagnostic format with error/warning/info levels |
22
+ | 🔗 Cross-file | Support for `include` statements and cross-file symbol resolution |
23
+
24
+ ---
25
+
26
+ ## Features
27
+
28
+ ### Symbol Table Construction
29
+
30
+ Automatically extracts and indexes:
31
+
32
+ - **`protocol`** — Protocol definitions (BGP/OSPF/Static/Direct/etc.)
33
+ - **`template`** — Protocol templates with inheritance support
34
+ - **`filter`** — Filter function definitions
35
+ - **`function`** — Custom function definitions
36
+ - **`table`** — Routing table declarations
37
+
38
+ ### Semantic Validation
39
+
40
+ - **Duplicate Detection** — Identifies redefined symbols
41
+ - **Undefined References** — Detects references to non-existent templates
42
+ - **Type Checking** — Validates type compatibility in expressions
43
+ - **Scope Analysis** — Tracks variable scope within filters/functions
44
+
45
+ ### Cross-file Resolution
46
+
47
+ - **`include` Support** — Parse and merge included configuration files
48
+ - **Circular Detection** — Detect circular include dependencies
49
+ - **Symbol Merging** — Combine symbol tables from multiple files
50
+
51
+ ---
52
+
53
+ ## Installation
54
+
55
+ ```bash
56
+ # Using pnpm (recommended)
57
+ pnpm add @birdcc/core
58
+
59
+ # Using npm
60
+ npm install @birdcc/core
61
+
62
+ # Using yarn
63
+ yarn add @birdcc/core
64
+ ```
65
+
66
+ ### Prerequisites
67
+
68
+ - Node.js >= 18
69
+ - TypeScript >= 5.0 (if using TypeScript)
70
+
71
+ ---
72
+
73
+ ## Usage
74
+
75
+ ### Basic Semantic Analysis
76
+
77
+ ```typescript
78
+ import { buildCoreSnapshot } from "@birdcc/core";
79
+
80
+ const config = `
81
+ protocol bgp upstream {
82
+ local as 65001;
83
+ neighbor 192.168.1.1 as 65002;
84
+ }
85
+
86
+ protocol bgp upstream { // ← Duplicate definition!
87
+ local as 65001;
88
+ }
89
+ `;
90
+
91
+ const snapshot = buildCoreSnapshot(config);
92
+
93
+ console.log(snapshot.symbols);
94
+ // [
95
+ // { kind: "protocol", name: "upstream", line: 2, column: 12 },
96
+ // { kind: "protocol", name: "upstream", line: 7, column: 12 }
97
+ // ]
98
+
99
+ console.log(snapshot.diagnostics);
100
+ // [
101
+ // {
102
+ // code: "semantic/duplicate-definition",
103
+ // message: "protocol 'upstream' is defined multiple times",
104
+ // severity: "error",
105
+ // ...
106
+ // }
107
+ // ]
108
+ ```
109
+
110
+ ### Using with Parser
111
+
112
+ ```typescript
113
+ import { parseBirdConfig } from "@birdcc/parser";
114
+ import { buildCoreSnapshotFromParsed } from "@birdcc/core";
115
+
116
+ const parsed = await parseBirdConfig(source);
117
+ const snapshot = buildCoreSnapshotFromParsed(parsed);
118
+
119
+ // Access symbols and diagnostics
120
+ console.log(`Found ${snapshot.symbols.length} symbols`);
121
+ console.log(`Found ${snapshot.diagnostics.length} issues`);
122
+ ```
123
+
124
+ ### Cross-file Analysis
125
+
126
+ ```typescript
127
+ import { resolveCrossFileReferences } from "@birdcc/core";
128
+
129
+ const result = await resolveCrossFileReferences(mainFile, {
130
+ includePaths: ["./config", "./templates"],
131
+ maxDepth: 10,
132
+ });
133
+
134
+ console.log(result.mergedSymbols);
135
+ console.log(result.diagnostics);
136
+ ```
137
+
138
+ ---
139
+
140
+ ## API Reference
141
+
142
+ ### Main Functions
143
+
144
+ #### `buildCoreSnapshot(text: string): CoreSnapshot`
145
+
146
+ Build a semantic analysis snapshot from raw text.
147
+
148
+ ```typescript
149
+ import { buildCoreSnapshot } from "@birdcc/core";
150
+
151
+ const snapshot = buildCoreSnapshot(birdConfigText);
152
+ // snapshot.symbols → List of symbol definitions
153
+ // snapshot.diagnostics → List of diagnostic messages
154
+ ```
155
+
156
+ #### `buildCoreSnapshotFromParsed(parsed: ParsedBirdDocument): CoreSnapshot`
157
+
158
+ Build a semantic analysis snapshot from an already parsed AST.
159
+
160
+ ```typescript
161
+ import { parseBirdConfig } from "@birdcc/parser";
162
+ import { buildCoreSnapshotFromParsed } from "@birdcc/core";
163
+
164
+ const parsed = await parseBirdConfig(text);
165
+ const snapshot = buildCoreSnapshotFromParsed(parsed);
166
+ ```
167
+
168
+ ### Core Types
169
+
170
+ #### `CoreSnapshot`
171
+
172
+ ```typescript
173
+ interface CoreSnapshot {
174
+ /** All symbol definitions */
175
+ symbols: SymbolDefinition[];
176
+ /** Template reference information */
177
+ references: SymbolReference[];
178
+ /** Semantic check diagnostics */
179
+ diagnostics: BirdDiagnostic[];
180
+ }
181
+ ```
182
+
183
+ #### `SymbolDefinition`
184
+
185
+ ```typescript
186
+ interface SymbolDefinition {
187
+ kind: "protocol" | "template" | "filter" | "function" | "table";
188
+ name: string;
189
+ line: number;
190
+ column: number;
191
+ endLine: number;
192
+ endColumn: number;
193
+ }
194
+ ```
195
+
196
+ #### `BirdDiagnostic`
197
+
198
+ ```typescript
199
+ interface BirdDiagnostic {
200
+ code: string;
201
+ message: string;
202
+ severity: "error" | "warning" | "info";
203
+ source: string;
204
+ range: {
205
+ line: number;
206
+ column: number;
207
+ endLine: number;
208
+ endColumn: number;
209
+ };
210
+ }
211
+ ```
212
+
213
+ ### Diagnostic Codes
214
+
215
+ | Code | Description | Level |
216
+ | ---- | ----------- | ----- |
217
+ | `semantic/duplicate-definition` | Duplicate symbol definition | error |
218
+ | `semantic/undefined-reference` | Reference to undefined template | error |
219
+ | `semantic/type-mismatch` | Type compatibility error | error |
220
+ | `semantic/invalid-scope` | Variable scope violation | warning |
221
+
222
+ ---
223
+
224
+ ## Architecture
225
+
226
+ ### Layer Position
227
+
228
+ ```mermaid
229
+ flowchart TB
230
+ subgraph "Rule Engine"
231
+ A[@birdcc/linter]
232
+ end
233
+
234
+ subgraph "Semantic Analysis"
235
+ B[@birdcc/core]
236
+ end
237
+
238
+ subgraph "Syntax Parsing"
239
+ C[@birdcc/parser]
240
+ end
241
+
242
+ A -->|uses| B
243
+ B -->|uses| C
244
+
245
+ style A fill:#e1f5fe
246
+ style B fill:#fff3e0
247
+ style C fill:#e8f5e9
248
+ ```
249
+
250
+ ### Internal Components
251
+
252
+ ```mermaid
253
+ flowchart TB
254
+ subgraph "Input"
255
+ SRC[BIRD Config Source]
256
+ end
257
+
258
+ subgraph "Parser Layer"
259
+ P[@birdcc/parser<br/>Tree-sitter]
260
+ AST[AST<br/>Abstract Syntax Tree]
261
+ end
262
+
263
+ subgraph "Core Layer"
264
+ SC[Symbol Collector]
265
+ ST[(Symbol Table)]
266
+ SEM[Semantic Checker]
267
+ DIAG[Diagnostics]
268
+ end
269
+
270
+ SRC --> P
271
+ P --> AST
272
+ AST --> SC
273
+ SC --> ST
274
+ ST --> SEM
275
+ SEM --> DIAG
276
+
277
+ style ST fill:#fff3e0
278
+ style DIAG fill:#ffebee
279
+ ```
280
+
281
+ ### Symbol Resolution Flow
282
+
283
+ ```mermaid
284
+ sequenceDiagram
285
+ participant User as User Code
286
+ participant Core as @birdcc/core
287
+ participant Collector as SymbolCollector
288
+ participant Checker as SemanticChecker
289
+ participant Table as SymbolTable
290
+
291
+ User->>Core: buildCoreSnapshot(text)
292
+ Core->>Collector: collectSymbols(ast)
293
+ Collector->>Table: addSymbol(protocol)
294
+ Collector->>Table: addSymbol(template)
295
+ Collector->>Table: addSymbol(filter)
296
+ Collector->>Table: addSymbol(function)
297
+ Table-->>Collector: symbols[]
298
+ Collector-->>Core: symbols, references
299
+ Core->>Checker: validate(symbols, references)
300
+ Checker->>Table: checkDuplicates()
301
+ Checker->>Table: checkUndefinedRefs()
302
+ Table-->>Checker: validation results
303
+ Checker-->>Core: diagnostics[]
304
+ Core-->>User: CoreSnapshot
305
+ ```
306
+
307
+ ---
308
+
309
+ ## Related Packages
310
+
311
+ | Package | Description |
312
+ | ------- | ----------- |
313
+ | [@birdcc/parser](../parser/) | Tree-sitter grammar and parser |
314
+ | [@birdcc/linter](../linter/) | 32+ lint rules and diagnostics |
315
+ | [@birdcc/formatter](../formatter/) | Code formatting engine |
316
+ | [@birdcc/lsp](../lsp/) | LSP server implementation |
317
+ | [@birdcc/cli](../cli/) | Command-line interface |
318
+
319
+ ---
320
+
321
+ ### 📖 Documentation
322
+
323
+ - [BIRD Official Documentation](https://bird.network.cz/)
324
+ - [BIRD2 User Manual](https://bird.network.cz/doc/bird.html)
325
+ - [GitHub Project](https://github.com/bird-chinese-community/BIRD-LSP)
326
+
327
+ ---
328
+
329
+ ## 📝 License
330
+
331
+ This project is licensed under the [GPL-3.0 License](https://github.com/bird-chinese-community/BIRD-LSP/blob/main/LICENSE).
332
+
333
+ ---
334
+
335
+ <p align="center">
336
+ <sub>Built with ❤️ by the BIRD Chinese Community (BIRDCC)</sub>
337
+ </p>
338
+
339
+ <p align="center">
340
+ <a href="https://github.com/bird-chinese-community/BIRD-LSP">🕊 GitHub</a> ·
341
+ <a href="https://marketplace.visualstudio.com/items?itemName=birdcc.bird2-lsp">🛒 Marketplace</a> ·
342
+ <a href="https://github.com/bird-chinese-community/BIRD-LSP/issues">🐛 Report Issues</a>
343
+ </p>
@@ -0,0 +1,5 @@
1
+ import type { CrossFileResolveOptions, CrossFileResolutionResult } from "./types.js";
2
+ export declare const DEFAULT_CROSS_FILE_MAX_DEPTH = 16;
3
+ export declare const DEFAULT_CROSS_FILE_MAX_FILES = 256;
4
+ export declare const resolveCrossFileReferences: (options: CrossFileResolveOptions) => Promise<CrossFileResolutionResult>;
5
+ //# sourceMappingURL=cross-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-file.d.ts","sourceRoot":"","sources":["../src/cross-file.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAGV,uBAAuB,EACvB,yBAAyB,EAG1B,MAAM,YAAY,CAAC;AAQpB,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAC/C,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAwKhD,eAAO,MAAM,0BAA0B,GACrC,SAAS,uBAAuB,KAC/B,OAAO,CAAC,yBAAyB,CA4NnC,CAAC"}
@@ -0,0 +1,264 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { dirname, isAbsolute, normalize, relative, resolve } from "node:path";
3
+ import { fileURLToPath, pathToFileURL } from "node:url";
4
+ import { parseBirdConfig } from "@birdcc/parser";
5
+ import { buildCoreSnapshotFromParsed } from "./snapshot.js";
6
+ import { mergeSymbolTables, pushSymbolTableDiagnostics, } from "./symbol-table.js";
7
+ import { collectCircularTemplateDiagnostics } from "./template-cycles.js";
8
+ export const DEFAULT_CROSS_FILE_MAX_DEPTH = 16;
9
+ export const DEFAULT_CROSS_FILE_MAX_FILES = 256;
10
+ const PARSED_DOCUMENT_CACHE_LIMIT = 512;
11
+ const parsedDocumentCache = new Map();
12
+ const DEFAULT_RANGE = {
13
+ line: 1,
14
+ column: 1,
15
+ endLine: 1,
16
+ endColumn: 1,
17
+ };
18
+ const isFileUri = (uri) => uri.startsWith("file://");
19
+ const toFilePath = (uri) => {
20
+ if (isFileUri(uri)) {
21
+ return fileURLToPath(uri);
22
+ }
23
+ if (uri.startsWith("/")) {
24
+ return uri;
25
+ }
26
+ return null;
27
+ };
28
+ const normalizeUriForPrefixMatch = (uri) => uri.replace(/\/+$/, "");
29
+ const toDefaultWorkspaceRootUri = (entryUri) => {
30
+ const entryPath = toFilePath(entryUri);
31
+ if (entryPath) {
32
+ return pathToFileURL(dirname(entryPath)).toString();
33
+ }
34
+ return normalize(dirname(entryUri));
35
+ };
36
+ const isWithinWorkspaceRoot = (candidateUri, workspaceRootUri) => {
37
+ const candidatePath = toFilePath(candidateUri);
38
+ const workspaceRootPath = toFilePath(workspaceRootUri);
39
+ if (candidatePath && workspaceRootPath) {
40
+ const resolvedRoot = normalize(workspaceRootPath);
41
+ const resolvedCandidate = normalize(candidatePath);
42
+ const relPath = relative(resolvedRoot, resolvedCandidate);
43
+ return (relPath.length === 0 ||
44
+ (!relPath.startsWith("..") && !isAbsolute(relPath)));
45
+ }
46
+ const normalizedRoot = normalizeUriForPrefixMatch(normalize(workspaceRootUri));
47
+ const normalizedCandidate = normalizeUriForPrefixMatch(normalize(candidateUri));
48
+ return (normalizedCandidate === normalizedRoot ||
49
+ normalizedCandidate.startsWith(`${normalizedRoot}/`));
50
+ };
51
+ const defaultReadFileText = async (uri) => {
52
+ const filePath = toFilePath(uri);
53
+ if (!filePath) {
54
+ throw new Error(`Unsupported non-file URI '${uri}'`);
55
+ }
56
+ return readFile(filePath, "utf8");
57
+ };
58
+ const resolveIncludeUri = (baseUri, includePath) => {
59
+ if (includePath.startsWith("file://")) {
60
+ return pathToFileURL(normalize(fileURLToPath(includePath))).toString();
61
+ }
62
+ if (isFileUri(baseUri)) {
63
+ const basePath = fileURLToPath(baseUri);
64
+ const resolvedPath = resolve(dirname(basePath), includePath);
65
+ return pathToFileURL(resolvedPath).toString();
66
+ }
67
+ return normalize(resolve(dirname(baseUri), includePath));
68
+ };
69
+ const includeDiagnostic = (uri, message, range = DEFAULT_RANGE) => ({
70
+ code: "semantic/missing-include",
71
+ message,
72
+ severity: "warning",
73
+ source: "core",
74
+ uri,
75
+ range: {
76
+ line: range.line,
77
+ column: range.column,
78
+ endLine: range.endLine,
79
+ endColumn: range.endColumn,
80
+ },
81
+ });
82
+ const dedupeDiagnostics = (diagnostics) => {
83
+ const seen = new Set();
84
+ const output = [];
85
+ for (const diagnostic of diagnostics) {
86
+ const key = [
87
+ diagnostic.code,
88
+ diagnostic.message,
89
+ diagnostic.uri ?? "",
90
+ diagnostic.range.line,
91
+ diagnostic.range.column,
92
+ diagnostic.range.endLine,
93
+ diagnostic.range.endColumn,
94
+ ].join(":");
95
+ if (seen.has(key)) {
96
+ continue;
97
+ }
98
+ seen.add(key);
99
+ output.push(diagnostic);
100
+ }
101
+ return output;
102
+ };
103
+ const parseDocumentWithCache = async (uri, text, stats) => {
104
+ const cached = parsedDocumentCache.get(uri);
105
+ if (cached && cached.text === text) {
106
+ stats.parsedCacheHits += 1;
107
+ return cached.parsed;
108
+ }
109
+ stats.parsedCacheMisses += 1;
110
+ const parsed = await parseBirdConfig(text);
111
+ if (parsedDocumentCache.size >= PARSED_DOCUMENT_CACHE_LIMIT) {
112
+ const oldestKey = parsedDocumentCache.keys().next().value;
113
+ if (oldestKey) {
114
+ parsedDocumentCache.delete(oldestKey);
115
+ }
116
+ }
117
+ parsedDocumentCache.set(uri, { text, parsed });
118
+ return parsed;
119
+ };
120
+ export const resolveCrossFileReferences = async (options) => {
121
+ const maxDepth = options.maxDepth ?? DEFAULT_CROSS_FILE_MAX_DEPTH;
122
+ const maxFiles = options.maxFiles ?? DEFAULT_CROSS_FILE_MAX_FILES;
123
+ const loadFromFileSystem = options.loadFromFileSystem ?? true;
124
+ const readFileText = options.readFileText ?? defaultReadFileText;
125
+ const workspaceRootUri = options.workspaceRootUri ?? toDefaultWorkspaceRootUri(options.entryUri);
126
+ const allowIncludeOutsideWorkspace = options.allowIncludeOutsideWorkspace ?? false;
127
+ const stats = {
128
+ loadedFromMemory: options.documents?.length ?? 0,
129
+ loadedFromFileSystem: 0,
130
+ skippedByDepth: 0,
131
+ skippedByFileLimit: 0,
132
+ missingIncludes: 0,
133
+ parsedCacheHits: 0,
134
+ parsedCacheMisses: 0,
135
+ };
136
+ const documentMap = new Map((options.documents ?? []).map((document) => [
137
+ document.uri,
138
+ { uri: document.uri, text: document.text },
139
+ ]));
140
+ const parsedDocuments = new Map();
141
+ const snapshots = {};
142
+ const queue = [{ uri: options.entryUri, depth: 0 }];
143
+ const queued = new Set([options.entryUri]);
144
+ const visited = new Set();
145
+ const diagnostics = [];
146
+ const ensureDocument = async (uri) => {
147
+ if (documentMap.has(uri)) {
148
+ return true;
149
+ }
150
+ if (!loadFromFileSystem) {
151
+ return false;
152
+ }
153
+ try {
154
+ const text = await readFileText(uri);
155
+ documentMap.set(uri, { uri, text });
156
+ stats.loadedFromFileSystem += 1;
157
+ return true;
158
+ }
159
+ catch {
160
+ return false;
161
+ }
162
+ };
163
+ if (!(await ensureDocument(options.entryUri))) {
164
+ return {
165
+ entryUri: options.entryUri,
166
+ visitedUris: [],
167
+ symbolTable: { definitions: [], references: [] },
168
+ snapshots: {},
169
+ documents: {},
170
+ diagnostics: [
171
+ includeDiagnostic(options.entryUri, `Entry file not found or not readable: '${options.entryUri}'`),
172
+ ],
173
+ stats,
174
+ };
175
+ }
176
+ while (queue.length > 0) {
177
+ const current = queue.shift();
178
+ if (!current) {
179
+ break;
180
+ }
181
+ if (visited.has(current.uri)) {
182
+ continue;
183
+ }
184
+ if (current.depth > maxDepth) {
185
+ stats.skippedByDepth += 1;
186
+ continue;
187
+ }
188
+ if (visited.size >= maxFiles) {
189
+ stats.skippedByFileLimit += 1;
190
+ diagnostics.push(includeDiagnostic(current.uri, `Cross-file analysis stopped after reaching max files limit (${maxFiles})`));
191
+ break;
192
+ }
193
+ visited.add(current.uri);
194
+ const document = documentMap.get(current.uri);
195
+ if (!document) {
196
+ continue;
197
+ }
198
+ const parsed = await parseDocumentWithCache(current.uri, document.text, stats);
199
+ parsedDocuments.set(current.uri, parsed);
200
+ snapshots[current.uri] = buildCoreSnapshotFromParsed(parsed, {
201
+ uri: current.uri,
202
+ typeCheck: options.typeCheck,
203
+ });
204
+ for (const declaration of parsed.program.declarations) {
205
+ if (declaration.kind !== "include" || declaration.path.length === 0) {
206
+ continue;
207
+ }
208
+ const includeUri = resolveIncludeUri(current.uri, declaration.path);
209
+ const includeRange = declaration.pathRange;
210
+ if (!allowIncludeOutsideWorkspace &&
211
+ !isWithinWorkspaceRoot(includeUri, workspaceRootUri)) {
212
+ diagnostics.push(includeDiagnostic(current.uri, `Include skipped outside workspace root '${workspaceRootUri}': '${declaration.path}'`, includeRange));
213
+ continue;
214
+ }
215
+ if (visited.has(includeUri) || queued.has(includeUri)) {
216
+ continue;
217
+ }
218
+ if (current.depth + 1 > maxDepth) {
219
+ stats.skippedByDepth += 1;
220
+ diagnostics.push(includeDiagnostic(current.uri, `Include skipped due to max depth (${maxDepth}): '${declaration.path}'`, includeRange));
221
+ continue;
222
+ }
223
+ if (visited.size + queue.length >= maxFiles) {
224
+ stats.skippedByFileLimit += 1;
225
+ diagnostics.push(includeDiagnostic(current.uri, `Include skipped due to max files limit (${maxFiles}): '${declaration.path}'`, includeRange));
226
+ continue;
227
+ }
228
+ const loaded = await ensureDocument(includeUri);
229
+ if (!loaded) {
230
+ stats.missingIncludes += 1;
231
+ diagnostics.push(includeDiagnostic(current.uri, `Included file not found in workspace: '${declaration.path}'`, includeRange));
232
+ continue;
233
+ }
234
+ queue.push({ uri: includeUri, depth: current.depth + 1 });
235
+ queued.add(includeUri);
236
+ }
237
+ }
238
+ const mergedSymbolTable = mergeSymbolTables(Object.values(snapshots).map((snapshot) => snapshot.symbolTable));
239
+ pushSymbolTableDiagnostics(mergedSymbolTable, diagnostics);
240
+ for (const [uri, snapshot] of Object.entries(snapshots)) {
241
+ for (const diagnostic of snapshot.diagnostics) {
242
+ if (diagnostic.code === "semantic/duplicate-definition" ||
243
+ diagnostic.code === "semantic/undefined-reference" ||
244
+ diagnostic.code === "semantic/circular-template") {
245
+ continue;
246
+ }
247
+ diagnostics.push({
248
+ ...diagnostic,
249
+ uri,
250
+ });
251
+ }
252
+ }
253
+ diagnostics.push(...collectCircularTemplateDiagnostics([...parsedDocuments.entries()].map(([uri, parsed]) => ({ uri, parsed }))));
254
+ return {
255
+ entryUri: options.entryUri,
256
+ visitedUris: [...visited],
257
+ symbolTable: mergedSymbolTable,
258
+ snapshots,
259
+ documents: Object.fromEntries([...documentMap.entries()].map(([uri, document]) => [uri, document.text])),
260
+ diagnostics: dedupeDiagnostics(diagnostics),
261
+ stats,
262
+ };
263
+ };
264
+ //# sourceMappingURL=cross-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-file.js","sourceRoot":"","sources":["../src/cross-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { resolveCrossFileReferences } from "./cross-file.js";
2
+ export type { BirdDiagnostic, BirdDiagnosticSeverity, BirdRange, BirdSymbolKind, CoreSnapshot, CrossFileDocumentInput, CrossFileResolveOptions, CrossFileResolutionResult, CrossFileResolutionStats, SymbolDefinition, SymbolReference, SymbolTable, TypeCheckOptions, TypeValue, } from "./types.js";
3
+ export { checkTypes } from "./type-checker.js";
4
+ export { DEFAULT_DOCUMENT_URI, buildSymbolTableFromParsed, mergeSymbolTables, pushSymbolTableDiagnostics, } from "./symbol-table.js";
5
+ export { buildCoreSnapshotFromParsed } from "./snapshot.js";
6
+ export { DEFAULT_CROSS_FILE_MAX_DEPTH, DEFAULT_CROSS_FILE_MAX_FILES, resolveCrossFileReferences, } from "./cross-file.js";
7
+ /** Parses and builds semantic snapshot in one async call. */
8
+ export declare const buildCoreSnapshot: (text: string) => Promise<import("./types.js").CoreSnapshot>;
9
+ export type ResolveCrossFileReferences = typeof resolveCrossFileReferences;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAG7D,YAAY,EACV,cAAc,EACd,sBAAsB,EACtB,SAAS,EACT,cAAc,EACd,YAAY,EACZ,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAEzB,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,GAAU,MAAM,MAAM,+CAGnD,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,OAAO,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ import { parseBirdConfig } from "@birdcc/parser";
2
+ import { buildCoreSnapshotFromParsed } from "./snapshot.js";
3
+ export { checkTypes } from "./type-checker.js";
4
+ export { DEFAULT_DOCUMENT_URI, buildSymbolTableFromParsed, mergeSymbolTables, pushSymbolTableDiagnostics, } from "./symbol-table.js";
5
+ export { buildCoreSnapshotFromParsed } from "./snapshot.js";
6
+ export { DEFAULT_CROSS_FILE_MAX_DEPTH, DEFAULT_CROSS_FILE_MAX_FILES, resolveCrossFileReferences, } from "./cross-file.js";
7
+ /** Parses and builds semantic snapshot in one async call. */
8
+ export const buildCoreSnapshot = async (text) => {
9
+ const parsed = await parseBirdConfig(text);
10
+ return buildCoreSnapshotFromParsed(parsed);
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAmB5D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AAEzB,6DAA6D;AAC7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;IACtD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,2BAA2B,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const isValidPrefixLiteral: (literal: string) => boolean;
2
+ //# sourceMappingURL=prefix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefix.d.ts","sourceRoot":"","sources":["../src/prefix.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,oBAAoB,GAAI,SAAS,MAAM,KAAG,OAmEtD,CAAC"}