@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
@@ -0,0 +1,390 @@
1
+ import { isIP } from "node:net";
2
+ import { isValidPrefixLiteral } from "./prefix.js";
3
+ const VARIABLE_DECLARE_PATTERN = /^\s*(?:var\s+)?(int|bool|string|ip|prefix)\s+([A-Za-z_][A-Za-z0-9_]*)(?:\s*=\s*(.+?))?\s*;?\s*$/i;
4
+ const VARIABLE_ASSIGN_PATTERN = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.+?)\s*;?\s*$/;
5
+ const MAX_TYPE_INFER_DEPTH = 64;
6
+ const MAX_TYPE_EXPRESSION_LENGTH = 4096;
7
+ const SET_LITERAL_MAX_ITEMS = 256;
8
+ const trimSingleEnclosingParentheses = (value) => {
9
+ const current = value.trim();
10
+ if (!current.startsWith("(") || !current.endsWith(")")) {
11
+ return current;
12
+ }
13
+ let depth = 0;
14
+ for (let index = 0; index < current.length; index += 1) {
15
+ const char = current[index];
16
+ if (char === "(") {
17
+ depth += 1;
18
+ }
19
+ else if (char === ")") {
20
+ depth -= 1;
21
+ if (depth < 0) {
22
+ return current;
23
+ }
24
+ if (depth === 0 && index < current.length - 1) {
25
+ return current;
26
+ }
27
+ }
28
+ }
29
+ return depth === 0 ? current.slice(1, -1).trim() : current;
30
+ };
31
+ const isQuotedLiteral = (value, quote) => {
32
+ if (!value.startsWith(quote) || !value.endsWith(quote) || value.length < 2) {
33
+ return false;
34
+ }
35
+ let escaping = false;
36
+ for (let index = 1; index < value.length - 1; index += 1) {
37
+ const char = value[index];
38
+ if (escaping) {
39
+ escaping = false;
40
+ continue;
41
+ }
42
+ if (char === "\\") {
43
+ escaping = true;
44
+ continue;
45
+ }
46
+ if (char === quote) {
47
+ return false;
48
+ }
49
+ }
50
+ return true;
51
+ };
52
+ const splitTopLevelBinary = (value, operators) => {
53
+ let depth = 0;
54
+ let inSingleQuote = false;
55
+ let inDoubleQuote = false;
56
+ let escaping = false;
57
+ let lastMatch = null;
58
+ for (let index = 0; index < value.length; index += 1) {
59
+ const char = value[index];
60
+ if (escaping) {
61
+ escaping = false;
62
+ continue;
63
+ }
64
+ if (char === "\\") {
65
+ escaping = true;
66
+ continue;
67
+ }
68
+ if (!inDoubleQuote && char === "'") {
69
+ inSingleQuote = !inSingleQuote;
70
+ continue;
71
+ }
72
+ if (!inSingleQuote && char === '"') {
73
+ inDoubleQuote = !inDoubleQuote;
74
+ continue;
75
+ }
76
+ if (inSingleQuote || inDoubleQuote) {
77
+ continue;
78
+ }
79
+ if (char === "(") {
80
+ depth += 1;
81
+ continue;
82
+ }
83
+ if (char === ")") {
84
+ if (depth > 0) {
85
+ depth -= 1;
86
+ }
87
+ continue;
88
+ }
89
+ if (depth !== 0) {
90
+ continue;
91
+ }
92
+ for (const operator of operators) {
93
+ if (!value.startsWith(operator, index)) {
94
+ continue;
95
+ }
96
+ const left = value.slice(0, index).trim();
97
+ const right = value.slice(index + operator.length).trim();
98
+ if (left.length === 0 || right.length === 0) {
99
+ continue;
100
+ }
101
+ lastMatch = { left, operator, right };
102
+ }
103
+ }
104
+ return lastMatch;
105
+ };
106
+ const splitTopLevelList = (value) => {
107
+ const items = [];
108
+ let depthParen = 0;
109
+ let depthBracket = 0;
110
+ let depthBrace = 0;
111
+ let inSingleQuote = false;
112
+ let inDoubleQuote = false;
113
+ let escaping = false;
114
+ let segmentStart = 0;
115
+ for (let index = 0; index < value.length; index += 1) {
116
+ const char = value[index];
117
+ if (escaping) {
118
+ escaping = false;
119
+ continue;
120
+ }
121
+ if (char === "\\") {
122
+ escaping = true;
123
+ continue;
124
+ }
125
+ if (!inDoubleQuote && char === "'") {
126
+ inSingleQuote = !inSingleQuote;
127
+ continue;
128
+ }
129
+ if (!inSingleQuote && char === '"') {
130
+ inDoubleQuote = !inDoubleQuote;
131
+ continue;
132
+ }
133
+ if (inSingleQuote || inDoubleQuote) {
134
+ continue;
135
+ }
136
+ switch (char) {
137
+ case "(":
138
+ depthParen += 1;
139
+ continue;
140
+ case ")":
141
+ if (depthParen > 0) {
142
+ depthParen -= 1;
143
+ }
144
+ continue;
145
+ case "[":
146
+ depthBracket += 1;
147
+ continue;
148
+ case "]":
149
+ if (depthBracket > 0) {
150
+ depthBracket -= 1;
151
+ }
152
+ continue;
153
+ case "{":
154
+ depthBrace += 1;
155
+ continue;
156
+ case "}":
157
+ if (depthBrace > 0) {
158
+ depthBrace -= 1;
159
+ }
160
+ continue;
161
+ case ",":
162
+ if (depthParen === 0 && depthBracket === 0 && depthBrace === 0) {
163
+ items.push(value.slice(segmentStart, index).trim());
164
+ segmentStart = index + 1;
165
+ }
166
+ continue;
167
+ default:
168
+ break;
169
+ }
170
+ }
171
+ items.push(value.slice(segmentStart).trim());
172
+ return items;
173
+ };
174
+ const inferSetLiteralElementType = (rawValue, variableTypes, depth) => {
175
+ if (!rawValue.startsWith("[") || !rawValue.endsWith("]")) {
176
+ return "unknown";
177
+ }
178
+ const inner = rawValue.slice(1, -1).trim();
179
+ if (inner.length === 0) {
180
+ return "unknown";
181
+ }
182
+ const items = splitTopLevelList(inner);
183
+ if (items.length > SET_LITERAL_MAX_ITEMS) {
184
+ return "unknown";
185
+ }
186
+ let elementType = null;
187
+ for (const item of items) {
188
+ if (item.length === 0) {
189
+ return "unknown";
190
+ }
191
+ const inferredItemType = inferValueType(item, variableTypes, depth + 1);
192
+ if (inferredItemType === "unknown" || inferredItemType === "bool") {
193
+ return "unknown";
194
+ }
195
+ if (elementType && inferredItemType !== elementType) {
196
+ return "unknown";
197
+ }
198
+ elementType = inferredItemType;
199
+ }
200
+ return elementType ?? "unknown";
201
+ };
202
+ const inferValueType = (rawValue, variableTypes, depth = 0) => {
203
+ if (depth > MAX_TYPE_INFER_DEPTH ||
204
+ rawValue.length > MAX_TYPE_EXPRESSION_LENGTH) {
205
+ return "unknown";
206
+ }
207
+ const value = rawValue.trim();
208
+ if (value.length === 0) {
209
+ return "unknown";
210
+ }
211
+ const stripped = trimSingleEnclosingParentheses(value);
212
+ if (stripped !== value) {
213
+ return inferValueType(stripped, variableTypes, depth + 1);
214
+ }
215
+ if (value.startsWith("!")) {
216
+ const operandType = inferValueType(value.slice(1), variableTypes, depth + 1);
217
+ return operandType === "bool" ? "bool" : "unknown";
218
+ }
219
+ if (value.startsWith("-") || value.startsWith("+")) {
220
+ const operandType = inferValueType(value.slice(1), variableTypes, depth + 1);
221
+ if (operandType === "int") {
222
+ return "int";
223
+ }
224
+ }
225
+ const lowered = value.toLowerCase();
226
+ if (lowered === "true" || lowered === "false") {
227
+ return "bool";
228
+ }
229
+ if (/^\d+$/.test(value)) {
230
+ return "int";
231
+ }
232
+ if (isQuotedLiteral(value, '"') || isQuotedLiteral(value, "'")) {
233
+ return "string";
234
+ }
235
+ if (isIP(value) !== 0) {
236
+ return "ip";
237
+ }
238
+ if (isValidPrefixLiteral(value)) {
239
+ return "prefix";
240
+ }
241
+ if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(value)) {
242
+ return variableTypes.get(value) ?? "unknown";
243
+ }
244
+ const logicalOrExpression = splitTopLevelBinary(value, ["||"]);
245
+ if (logicalOrExpression) {
246
+ const leftType = inferValueType(logicalOrExpression.left, variableTypes, depth + 1);
247
+ const rightType = inferValueType(logicalOrExpression.right, variableTypes, depth + 1);
248
+ return leftType === "bool" && rightType === "bool" ? "bool" : "unknown";
249
+ }
250
+ const logicalAndExpression = splitTopLevelBinary(value, ["&&"]);
251
+ if (logicalAndExpression) {
252
+ const leftType = inferValueType(logicalAndExpression.left, variableTypes, depth + 1);
253
+ const rightType = inferValueType(logicalAndExpression.right, variableTypes, depth + 1);
254
+ return leftType === "bool" && rightType === "bool" ? "bool" : "unknown";
255
+ }
256
+ const equalityExpression = splitTopLevelBinary(value, ["==", "!="]);
257
+ if (equalityExpression) {
258
+ const leftType = inferValueType(equalityExpression.left, variableTypes, depth + 1);
259
+ const rightType = inferValueType(equalityExpression.right, variableTypes, depth + 1);
260
+ return leftType !== "unknown" &&
261
+ rightType !== "unknown" &&
262
+ leftType === rightType
263
+ ? "bool"
264
+ : "unknown";
265
+ }
266
+ const relationalExpression = splitTopLevelBinary(value, [
267
+ "<=",
268
+ ">=",
269
+ "<",
270
+ ">",
271
+ ]);
272
+ if (relationalExpression) {
273
+ const leftType = inferValueType(relationalExpression.left, variableTypes, depth + 1);
274
+ const rightType = inferValueType(relationalExpression.right, variableTypes, depth + 1);
275
+ return leftType === "int" && rightType === "int" ? "bool" : "unknown";
276
+ }
277
+ const matchExpression = splitTopLevelBinary(value, ["!~", "~"]);
278
+ if (matchExpression) {
279
+ const leftType = inferValueType(matchExpression.left, variableTypes, depth + 1);
280
+ if (leftType === "unknown") {
281
+ return "unknown";
282
+ }
283
+ const rightSetElementType = inferSetLiteralElementType(matchExpression.right, variableTypes, depth + 1);
284
+ if (rightSetElementType !== "unknown") {
285
+ return leftType === rightSetElementType ? "bool" : "unknown";
286
+ }
287
+ return "unknown";
288
+ }
289
+ const additiveExpression = splitTopLevelBinary(value, ["+", "-"]);
290
+ if (additiveExpression) {
291
+ const leftType = inferValueType(additiveExpression.left, variableTypes, depth + 1);
292
+ const rightType = inferValueType(additiveExpression.right, variableTypes, depth + 1);
293
+ return leftType === "int" && rightType === "int" ? "int" : "unknown";
294
+ }
295
+ const multiplicativeExpression = splitTopLevelBinary(value, ["*", "/"]);
296
+ if (multiplicativeExpression) {
297
+ const leftType = inferValueType(multiplicativeExpression.left, variableTypes, depth + 1);
298
+ const rightType = inferValueType(multiplicativeExpression.right, variableTypes, depth + 1);
299
+ return leftType === "int" && rightType === "int" ? "int" : "unknown";
300
+ }
301
+ return "unknown";
302
+ };
303
+ const createTypeMismatchDiagnostic = (expectedType, actualType, line, column, endLine, endColumn, variableName) => ({
304
+ code: "type/mismatch",
305
+ message: `Type mismatch for '${variableName}': expected ${expectedType}, got ${actualType}`,
306
+ severity: "error",
307
+ source: "core",
308
+ range: { line, column, endLine, endColumn },
309
+ });
310
+ export const checkTypes = (program,
311
+ // Reserved for upcoming phases (cross-declaration and cross-file type rules).
312
+ _symbolTable, options = {}) => {
313
+ const diagnostics = [];
314
+ const strictUnknownExpression = options.strictUnknownExpression ?? false;
315
+ for (const declaration of program.declarations) {
316
+ if (declaration.kind !== "filter" && declaration.kind !== "function") {
317
+ continue;
318
+ }
319
+ const variableTypes = new Map();
320
+ for (const statement of declaration.statements) {
321
+ if (statement.kind !== "expression") {
322
+ if (strictUnknownExpression &&
323
+ statement.kind === "return" &&
324
+ statement.valueText) {
325
+ const inferredType = inferValueType(statement.valueText, variableTypes);
326
+ if (inferredType === "unknown") {
327
+ diagnostics.push({
328
+ code: "type/unknown-expression",
329
+ message: `Cannot infer type for return expression '${statement.valueText}'`,
330
+ severity: "warning",
331
+ source: "core",
332
+ range: {
333
+ line: statement.line,
334
+ column: statement.column,
335
+ endLine: statement.endLine,
336
+ endColumn: statement.endColumn,
337
+ },
338
+ });
339
+ }
340
+ }
341
+ continue;
342
+ }
343
+ const expression = statement.expressionText.trim();
344
+ const declarationMatch = expression.match(VARIABLE_DECLARE_PATTERN);
345
+ if (declarationMatch) {
346
+ const declaredType = (declarationMatch[1] ?? "unknown").toLowerCase();
347
+ const variableName = declarationMatch[2] ?? "";
348
+ const initializer = declarationMatch[3]?.trim();
349
+ if (variableName.length > 0) {
350
+ variableTypes.set(variableName, declaredType);
351
+ }
352
+ if (initializer) {
353
+ const inferredType = inferValueType(initializer, variableTypes);
354
+ if (inferredType !== "unknown" && inferredType !== declaredType) {
355
+ diagnostics.push(createTypeMismatchDiagnostic(declaredType, inferredType, statement.line, statement.column, statement.endLine, statement.endColumn, variableName));
356
+ }
357
+ }
358
+ continue;
359
+ }
360
+ const assignMatch = expression.match(VARIABLE_ASSIGN_PATTERN);
361
+ if (!assignMatch) {
362
+ continue;
363
+ }
364
+ const variableName = assignMatch[1] ?? "";
365
+ const assignedValue = assignMatch[2] ?? "";
366
+ const expectedType = variableTypes.get(variableName);
367
+ if (!expectedType) {
368
+ diagnostics.push({
369
+ code: "type/undefined-variable",
370
+ message: `Assignment to undefined variable '${variableName}'`,
371
+ severity: "error",
372
+ source: "core",
373
+ range: {
374
+ line: statement.line,
375
+ column: statement.column,
376
+ endLine: statement.endLine,
377
+ endColumn: statement.endColumn,
378
+ },
379
+ });
380
+ continue;
381
+ }
382
+ const inferredType = inferValueType(assignedValue, variableTypes);
383
+ if (inferredType !== "unknown" && inferredType !== expectedType) {
384
+ diagnostics.push(createTypeMismatchDiagnostic(expectedType, inferredType, statement.line, statement.column, statement.endLine, statement.endColumn, variableName));
385
+ }
386
+ }
387
+ }
388
+ return diagnostics;
389
+ };
390
+ //# sourceMappingURL=type-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-checker.js","sourceRoot":"","sources":["../src/type-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ export type BirdDiagnosticSeverity = "error" | "warning" | "info";
2
+ export interface BirdRange {
3
+ line: number;
4
+ column: number;
5
+ endLine: number;
6
+ endColumn: number;
7
+ }
8
+ export interface BirdDiagnostic {
9
+ code: string;
10
+ message: string;
11
+ severity: BirdDiagnosticSeverity;
12
+ source: "parser" | "core" | "linter" | "bird";
13
+ range: BirdRange;
14
+ uri?: string;
15
+ }
16
+ export type BirdSymbolKind = "protocol" | "template" | "filter" | "function" | "table";
17
+ export interface SymbolDefinition {
18
+ kind: BirdSymbolKind;
19
+ name: string;
20
+ line: number;
21
+ column: number;
22
+ endLine: number;
23
+ endColumn: number;
24
+ uri: string;
25
+ }
26
+ export interface SymbolReference {
27
+ kind: "template";
28
+ name: string;
29
+ line: number;
30
+ column: number;
31
+ endLine: number;
32
+ endColumn: number;
33
+ uri: string;
34
+ }
35
+ export interface SymbolTable {
36
+ definitions: SymbolDefinition[];
37
+ references: SymbolReference[];
38
+ }
39
+ export type TypeValue = "int" | "bool" | "string" | "ip" | "prefix" | "unknown";
40
+ export interface TypeCheckOptions {
41
+ uri?: string;
42
+ strictUnknownExpression?: boolean;
43
+ }
44
+ export interface CoreSnapshot {
45
+ symbols: SymbolDefinition[];
46
+ references: SymbolReference[];
47
+ symbolTable: SymbolTable;
48
+ typeDiagnostics: BirdDiagnostic[];
49
+ diagnostics: BirdDiagnostic[];
50
+ }
51
+ export interface CrossFileDocumentInput {
52
+ uri: string;
53
+ text: string;
54
+ }
55
+ export interface CrossFileResolutionStats {
56
+ loadedFromMemory: number;
57
+ loadedFromFileSystem: number;
58
+ skippedByDepth: number;
59
+ skippedByFileLimit: number;
60
+ missingIncludes: number;
61
+ parsedCacheHits: number;
62
+ parsedCacheMisses: number;
63
+ }
64
+ export interface CrossFileResolveOptions {
65
+ entryUri: string;
66
+ documents?: CrossFileDocumentInput[];
67
+ maxDepth?: number;
68
+ maxFiles?: number;
69
+ loadFromFileSystem?: boolean;
70
+ workspaceRootUri?: string;
71
+ allowIncludeOutsideWorkspace?: boolean;
72
+ typeCheck?: TypeCheckOptions;
73
+ readFileText?: (uri: string) => Promise<string>;
74
+ }
75
+ export interface CrossFileResolutionResult {
76
+ entryUri: string;
77
+ visitedUris: string[];
78
+ symbolTable: SymbolTable;
79
+ snapshots: Record<string, CoreSnapshot>;
80
+ documents: Record<string, string>;
81
+ diagnostics: BirdDiagnostic[];
82
+ stats: CrossFileResolutionStats;
83
+ }
84
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@birdcc/core",
3
+ "version": "0.0.1-alpha.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "license": "GPL-3.0-only",
7
+ "author": {
8
+ "name": "BIRD Chinese Community",
9
+ "email": "npm-dev@birdcc.link",
10
+ "url": "https://github.com/bird-chinese-community/"
11
+ },
12
+ "main": "./dist/index.js",
13
+ "types": "./src/index.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./src/index.ts",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "dependencies": {
21
+ "fast-cidr-tools": "^0.3.4",
22
+ "@birdcc/parser": "0.0.1-alpha.0"
23
+ },
24
+ "devDependencies": {
25
+ "mitata": "^1.0.34"
26
+ },
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/bird-chinese-community/BIRD-LSP",
30
+ "directory": "packages/@birdcc/core"
31
+ },
32
+ "homepage": "https://github.com/bird-chinese-community/BIRD-LSP/blob/main/packages/%40birdcc/core/README.md",
33
+ "bugs": {
34
+ "url": "https://github.com/bird-chinese-community/BIRD-LSP/issues"
35
+ },
36
+ "scripts": {
37
+ "build": "tsc -p tsconfig.json",
38
+ "bench:ip-check": "node scripts/benchmark-node-vs-regex.js",
39
+ "typecheck": "tsc -p tsconfig.json --noEmit",
40
+ "lint": "oxlint --deny-warnings src test",
41
+ "test": "vitest run",
42
+ "format": "oxfmt .",
43
+ "coverage": "vitest run --coverage --coverage.provider=v8 --coverage.reporter=text-summary --coverage.reporter=json-summary"
44
+ }
45
+ }
@@ -0,0 +1,86 @@
1
+ // Run: pnpm --filter @birdcc/core bench:ip-check
2
+
3
+ import { bench, run, summary, barplot } from "mitata";
4
+ import { isIP } from "node:net";
5
+
6
+ // --- regex implementations ---
7
+ // Validates each octet: 0-255, no leading zeros
8
+ const IPv4_RE =
9
+ /^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)(\.(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)){3}$/;
10
+
11
+ // Covers all RFC 4291 compressed forms (::, ::1, 1::, fe80::1, etc.)
12
+ // Zone ID (fe80::1%eth0) intentionally excluded — match node:net behavior = include it
13
+ const IPv6_RE =
14
+ /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?\d)?\d)\.){3}(25[0-5]|(2[0-4]|1?\d)?\d)|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?\d)?\d)\.){3}(25[0-5]|(2[0-4]|1?\d)?\d))$/;
15
+
16
+ /** Returns 4 | 6 | 0 — same contract as node:net isIP */
17
+ const isIP_regex = (input) => {
18
+ if (IPv4_RE.test(input)) return 4;
19
+ if (IPv6_RE.test(input)) return 6;
20
+ return 0;
21
+ };
22
+
23
+ // --- test fixtures: mix of ipv4 / ipv6 / invalid ---
24
+ const samples = [
25
+ "127.0.0.1", // valid ipv4
26
+ "192.168.1.255", // valid ipv4
27
+ "0.0.0.0", // valid ipv4
28
+ "255.255.255.255", // valid ipv4
29
+ "::1", // valid ipv6 loopback
30
+ "2001:db8::1", // valid ipv6
31
+ "fe80::1%eth0", // ipv6 with zone id (isIP → 0, regex → 0)
32
+ "not-an-ip", // invalid
33
+ "127.000.000.001", // invalid (leading zeros)
34
+ "999.999.999.999", // invalid (out of range)
35
+ ];
36
+
37
+ const parseSampleSize = (value) => {
38
+ const parsed = Number.parseInt(value ?? "", 10);
39
+ if (!Number.isFinite(parsed) || parsed <= 0) {
40
+ return 100000;
41
+ }
42
+ return parsed;
43
+ };
44
+
45
+ const sampleSize = parseSampleSize(process.env.BENCH_SAMPLE_SIZE);
46
+ const samplePool = Array.from({ length: sampleSize }, (_, index) => {
47
+ return samples[index % samples.length];
48
+ });
49
+
50
+ // Sanity-check: both implementations must agree on every sample
51
+ for (const s of samples) {
52
+ const r = isIP_regex(s);
53
+ const n = isIP(s);
54
+ if (r !== n) {
55
+ throw new Error(`[mismatch] "${s}" regex=${r} node=${n}`);
56
+ }
57
+ }
58
+
59
+ // --- benchmarks ---
60
+ summary(() => {
61
+ barplot(() => {
62
+ bench("regex · single sample (127.0.0.1)", () => isIP_regex("127.0.0.1"));
63
+ bench("node · single sample (127.0.0.1)", () => isIP("127.0.0.1"));
64
+
65
+ bench("regex · single sample (::1)", () => isIP_regex("::1"));
66
+ bench("node · single sample (::1)", () => isIP("::1"));
67
+
68
+ bench("regex · single sample (invalid)", () => isIP_regex("not-an-ip"));
69
+ bench("node · single sample (invalid)", () => isIP("not-an-ip"));
70
+
71
+ bench("regex · 10-sample mixed loop", () => {
72
+ for (const s of samples) isIP_regex(s);
73
+ });
74
+ bench("node · 10-sample mixed loop", () => {
75
+ for (const s of samples) isIP(s);
76
+ });
77
+ bench(`regex · ${sampleSize}-sample deterministic loop`, () => {
78
+ for (const s of samplePool) isIP_regex(s);
79
+ });
80
+ bench(`node · ${sampleSize}-sample deterministic loop`, () => {
81
+ for (const s of samplePool) isIP(s);
82
+ });
83
+ });
84
+ });
85
+
86
+ await run();