@agentix-e/nl2spel 0.0.0 → 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 (134) hide show
  1. package/README.md +69 -39
  2. package/dist/SpelEvaluator.d.ts +124 -0
  3. package/dist/SpelEvaluator.d.ts.map +1 -0
  4. package/dist/SpelEvaluator.js +2 -0
  5. package/dist/SpelEvaluator.js.map +1 -0
  6. package/dist/__tests__/auto-fixer.test.d.ts +2 -0
  7. package/dist/__tests__/auto-fixer.test.d.ts.map +1 -0
  8. package/dist/__tests__/auto-fixer.test.js +285 -0
  9. package/dist/__tests__/auto-fixer.test.js.map +1 -0
  10. package/dist/__tests__/chinese-number-parser.test.d.ts +2 -0
  11. package/dist/__tests__/chinese-number-parser.test.d.ts.map +1 -0
  12. package/dist/__tests__/chinese-number-parser.test.js +106 -0
  13. package/dist/__tests__/chinese-number-parser.test.js.map +1 -0
  14. package/dist/__tests__/context-extractor.test.d.ts +2 -0
  15. package/dist/__tests__/context-extractor.test.d.ts.map +1 -0
  16. package/dist/__tests__/context-extractor.test.js +347 -0
  17. package/dist/__tests__/context-extractor.test.js.map +1 -0
  18. package/dist/__tests__/coverage-gaps.test.d.ts +2 -0
  19. package/dist/__tests__/coverage-gaps.test.d.ts.map +1 -0
  20. package/dist/__tests__/coverage-gaps.test.js +578 -0
  21. package/dist/__tests__/coverage-gaps.test.js.map +1 -0
  22. package/dist/__tests__/intent-classifier.test.d.ts +2 -0
  23. package/dist/__tests__/intent-classifier.test.d.ts.map +1 -0
  24. package/dist/__tests__/intent-classifier.test.js +384 -0
  25. package/dist/__tests__/intent-classifier.test.js.map +1 -0
  26. package/dist/__tests__/nl2spel-engine.test.d.ts +2 -0
  27. package/dist/__tests__/nl2spel-engine.test.d.ts.map +1 -0
  28. package/dist/__tests__/nl2spel-engine.test.js +344 -0
  29. package/dist/__tests__/nl2spel-engine.test.js.map +1 -0
  30. package/dist/__tests__/pattern-matcher.test.d.ts +2 -0
  31. package/dist/__tests__/pattern-matcher.test.d.ts.map +1 -0
  32. package/dist/__tests__/pattern-matcher.test.js +754 -0
  33. package/dist/__tests__/pattern-matcher.test.js.map +1 -0
  34. package/dist/__tests__/prompt-builder.test.d.ts +2 -0
  35. package/dist/__tests__/prompt-builder.test.d.ts.map +1 -0
  36. package/dist/__tests__/prompt-builder.test.js +99 -0
  37. package/dist/__tests__/prompt-builder.test.js.map +1 -0
  38. package/dist/__tests__/provider-registry.test.d.ts +2 -0
  39. package/dist/__tests__/provider-registry.test.d.ts.map +1 -0
  40. package/dist/__tests__/provider-registry.test.js +240 -0
  41. package/dist/__tests__/provider-registry.test.js.map +1 -0
  42. package/dist/__tests__/schema-formatter.test.d.ts +2 -0
  43. package/dist/__tests__/schema-formatter.test.d.ts.map +1 -0
  44. package/dist/__tests__/schema-formatter.test.js +298 -0
  45. package/dist/__tests__/schema-formatter.test.js.map +1 -0
  46. package/dist/__tests__/self-correction-loop.test.d.ts +2 -0
  47. package/dist/__tests__/self-correction-loop.test.d.ts.map +1 -0
  48. package/dist/__tests__/self-correction-loop.test.js +253 -0
  49. package/dist/__tests__/self-correction-loop.test.js.map +1 -0
  50. package/dist/__tests__/strategy-router.test.d.ts +2 -0
  51. package/dist/__tests__/strategy-router.test.d.ts.map +1 -0
  52. package/dist/__tests__/strategy-router.test.js +493 -0
  53. package/dist/__tests__/strategy-router.test.js.map +1 -0
  54. package/dist/__tests__/template-engine.test.d.ts +2 -0
  55. package/dist/__tests__/template-engine.test.d.ts.map +1 -0
  56. package/dist/__tests__/template-engine.test.js +367 -0
  57. package/dist/__tests__/template-engine.test.js.map +1 -0
  58. package/dist/__tests__/validation-pipeline.test.d.ts +2 -0
  59. package/dist/__tests__/validation-pipeline.test.d.ts.map +1 -0
  60. package/dist/__tests__/validation-pipeline.test.js +262 -0
  61. package/dist/__tests__/validation-pipeline.test.js.map +1 -0
  62. package/dist/context/context-extractor.d.ts +82 -0
  63. package/dist/context/context-extractor.d.ts.map +1 -0
  64. package/dist/context/context-extractor.js +166 -0
  65. package/dist/context/context-extractor.js.map +1 -0
  66. package/dist/context/schema-formatter.d.ts +20 -0
  67. package/dist/context/schema-formatter.d.ts.map +1 -0
  68. package/dist/context/schema-formatter.js +104 -0
  69. package/dist/context/schema-formatter.js.map +1 -0
  70. package/dist/engine/nl2spel-engine.d.ts +144 -0
  71. package/dist/engine/nl2spel-engine.d.ts.map +1 -0
  72. package/dist/engine/nl2spel-engine.js +125 -0
  73. package/dist/engine/nl2spel-engine.js.map +1 -0
  74. package/dist/index.d.ts +28 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +24 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/pattern/builtin-patterns.d.ts +12 -0
  79. package/dist/pattern/builtin-patterns.d.ts.map +1 -0
  80. package/dist/pattern/builtin-patterns.js +812 -0
  81. package/dist/pattern/builtin-patterns.js.map +1 -0
  82. package/dist/pattern/pattern-definition.d.ts +49 -0
  83. package/dist/pattern/pattern-definition.d.ts.map +1 -0
  84. package/dist/pattern/pattern-definition.js +2 -0
  85. package/dist/pattern/pattern-definition.js.map +1 -0
  86. package/dist/pattern/pattern-matcher.d.ts +55 -0
  87. package/dist/pattern/pattern-matcher.d.ts.map +1 -0
  88. package/dist/pattern/pattern-matcher.js +216 -0
  89. package/dist/pattern/pattern-matcher.js.map +1 -0
  90. package/dist/provider/llm-provider.d.ts +146 -0
  91. package/dist/provider/llm-provider.d.ts.map +1 -0
  92. package/dist/provider/llm-provider.js +2 -0
  93. package/dist/provider/llm-provider.js.map +1 -0
  94. package/dist/provider/provider-registry.d.ts +28 -0
  95. package/dist/provider/provider-registry.d.ts.map +1 -0
  96. package/dist/provider/provider-registry.js +65 -0
  97. package/dist/provider/provider-registry.js.map +1 -0
  98. package/dist/strategy/strategy-router.d.ts +79 -0
  99. package/dist/strategy/strategy-router.d.ts.map +1 -0
  100. package/dist/strategy/strategy-router.js +182 -0
  101. package/dist/strategy/strategy-router.js.map +1 -0
  102. package/dist/template/intent-classifier.d.ts +56 -0
  103. package/dist/template/intent-classifier.d.ts.map +1 -0
  104. package/dist/template/intent-classifier.js +251 -0
  105. package/dist/template/intent-classifier.js.map +1 -0
  106. package/dist/template/nl-intent.d.ts +38 -0
  107. package/dist/template/nl-intent.d.ts.map +1 -0
  108. package/dist/template/nl-intent.js +39 -0
  109. package/dist/template/nl-intent.js.map +1 -0
  110. package/dist/template/prompts/prompt-builder.d.ts +20 -0
  111. package/dist/template/prompts/prompt-builder.d.ts.map +1 -0
  112. package/dist/template/prompts/prompt-builder.js +243 -0
  113. package/dist/template/prompts/prompt-builder.js.map +1 -0
  114. package/dist/template/template-engine.d.ts +27 -0
  115. package/dist/template/template-engine.d.ts.map +1 -0
  116. package/dist/template/template-engine.js +378 -0
  117. package/dist/template/template-engine.js.map +1 -0
  118. package/dist/utils/chinese-number-parser.d.ts +30 -0
  119. package/dist/utils/chinese-number-parser.d.ts.map +1 -0
  120. package/dist/utils/chinese-number-parser.js +92 -0
  121. package/dist/utils/chinese-number-parser.js.map +1 -0
  122. package/dist/validation/auto-fixer.d.ts +14 -0
  123. package/dist/validation/auto-fixer.d.ts.map +1 -0
  124. package/dist/validation/auto-fixer.js +111 -0
  125. package/dist/validation/auto-fixer.js.map +1 -0
  126. package/dist/validation/self-correction-loop.d.ts +46 -0
  127. package/dist/validation/self-correction-loop.d.ts.map +1 -0
  128. package/dist/validation/self-correction-loop.js +141 -0
  129. package/dist/validation/self-correction-loop.js.map +1 -0
  130. package/dist/validation/validation-pipeline.d.ts +81 -0
  131. package/dist/validation/validation-pipeline.d.ts.map +1 -0
  132. package/dist/validation/validation-pipeline.js +306 -0
  133. package/dist/validation/validation-pipeline.js.map +1 -0
  134. package/package.json +36 -7
package/README.md CHANGED
@@ -1,45 +1,75 @@
1
1
  # @agentix-e/nl2spel
2
2
 
3
- ## ⚠️ IMPORTANT NOTICE ⚠️
3
+ > Natural Language SpEL Core Engine
4
+ >
5
+ > Zero external deps · Four-layer hybrid architecture · 502 tests · Chinese & English
4
6
 
5
- **This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
6
-
7
- This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
8
-
9
- ## Purpose
10
-
11
- This package exists to:
12
- 1. Configure OIDC trusted publishing for the package name `@agentix-e/nl2spel`
13
- 2. Enable secure, token-less publishing from CI/CD workflows
14
- 3. Establish provenance for packages published under this name
15
-
16
- ## What is OIDC Trusted Publishing?
17
-
18
- OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
19
-
20
- ## Setup Instructions
21
-
22
- To properly configure OIDC trusted publishing for this package:
23
-
24
- 1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
25
- 2. Configure the trusted publisher (e.g., GitHub Actions)
26
- 3. Specify the repository and workflow that should be allowed to publish
27
- 4. Use the configured workflow to publish your actual package
28
-
29
- ## DO NOT USE THIS PACKAGE
30
-
31
- This package is a placeholder for OIDC configuration only. It:
32
- - Contains no executable code
33
- - Provides no functionality
34
- - Should not be installed as a dependency
35
- - Exists only for administrative purposes
36
-
37
- ## More Information
38
-
39
- For more details about npm's trusted publishing feature, see:
40
- - [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
41
- - [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
7
+ [![npm](https://img.shields.io/npm/v/@agentix-e/nl2spel)](https://www.npmjs.com/package/@agentix-e/nl2spel)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](../../LICENSE)
42
9
 
43
10
  ---
44
11
 
45
- **Maintained for OIDC setup purposes only**
12
+ ## API Documentation
13
+
14
+ Full API documentation → [nl2spel API](https://agentix-e.github.io/nl2spel/api/modules.html)
15
+
16
+ ## Core Modules
17
+
18
+ ```typescript
19
+ import {
20
+ NL2SpelEngine, // Main engine
21
+ PatternMatcher, // Layer 0: Pattern matching (35+ built-in patterns)
22
+ IntentClassifier, // Layer 1: Intent classification (15 NLIntent types)
23
+ TemplateEngine, // Layer 1: Template filling (15 template categories)
24
+ PromptBuilder, // Layer 2: LLM Prompt construction
25
+ ValidationPipeline, // Validation pipeline (4 stages)
26
+ AutoFixer, // Auto-fixer (10 error types)
27
+ SelfCorrectionLoop, // Self-correction loop (max 3 iterations)
28
+ StrategyRouter, // Strategy router (Pattern → Template → LLM)
29
+ ContextExtractor, // Context extraction
30
+ SchemaFormatter, // Schema formatting
31
+ ChineseNumberParser, // Chinese number parsing
32
+ ProviderRegistry, // Provider registration management
33
+ } from '@agentix-e/nl2spel';
34
+ ```
35
+
36
+ ## Architecture
37
+
38
+ ```
39
+ NL2SpelEngine
40
+ ├── StrategyRouter (Three-layer strategy routing)
41
+ │ ├── Layer 0: PatternMatcher (35+ built-in patterns, P99 < 1ms)
42
+ │ ├── Layer 1: TemplateEngine (15 intents, 15 template categories)
43
+ │ └── Layer 2: LLMProvider (Pluggable, via ProviderRegistry)
44
+ ├── ValidationPipeline (Parse → Type → Semantic → Context)
45
+ ├── AutoFixer (=== → ==, && → and, paren fixes...)
46
+ ├── SelfCorrectionLoop (Max 3 correction iterations)
47
+ ├── ContextExtractor (Auto-extract ContextSchema)
48
+ └── PromptBuilder (Chinese/English System Prompt + EBNF + Few-Shot)
49
+ ```
50
+
51
+ ## Quick Start
52
+
53
+ ```typescript
54
+ import { NL2SpelEngine } from '@agentix-e/nl2spel';
55
+
56
+ const engine = new NL2SpelEngine();
57
+
58
+ // Offline mode (no LLM dependency)
59
+ const result = await engine.generate('Order amount greater than 1000', { offlineOnly: true });
60
+ console.log(result.expression); // #order.amount > 1000
61
+ console.log(result.strategy); // pattern
62
+ ```
63
+
64
+ ## Performance
65
+
66
+ | Metric | Value |
67
+ |------|------|
68
+ | Pattern match P99 | < 0.5ms |
69
+ | Template generation | < 5ms |
70
+ | Intent classification | < 2ms |
71
+ | Validation pipeline | < 5ms |
72
+
73
+ ## License
74
+
75
+ MIT © 2025 Agentix-E
@@ -0,0 +1,124 @@
1
+ /**
2
+ * SpEL evaluator abstract interface
3
+ *
4
+ * The nl2spel core package uses this interface for:
5
+ * 1. Syntax validation (Parse Check)
6
+ * 2. Type validation (Type Check)
7
+ * 3. Context validation (Context Check)
8
+ * 4. Expression evaluation (for semantic validation)
9
+ *
10
+ * nl2spel does not implement this interface, nor does it depend on any concrete implementation.
11
+ * Users inject a spel-ts Adapter, remote API Adapter, or mock.
12
+ */
13
+ export interface SpelEvaluator {
14
+ /**
15
+ * Parse a SpEL expression and return syntax validation results.
16
+ * For syntactically invalid expressions, the errors array is non-empty.
17
+ */
18
+ parse(expression: string): ParseResult | Promise<ParseResult>;
19
+ /**
20
+ * Get the available context schema.
21
+ * Returns null if no context information is available (syntax-only validation, no type/context check).
22
+ */
23
+ getContextSchema(): ContextSchema | null | Promise<ContextSchema | null>;
24
+ /**
25
+ * Evaluate an expression (optional).
26
+ * Used for semantic validation: verify the generated expression produces expected results with test inputs.
27
+ * Can be left unimplemented if semantic validation is not needed.
28
+ */
29
+ evaluate?(expression: string, context: Record<string, unknown>): unknown | Promise<unknown>;
30
+ }
31
+ /** Parse result */
32
+ export interface ParseResult {
33
+ valid: boolean;
34
+ errors: ParseError[];
35
+ /** AST representation on successful parse (optional) */
36
+ ast?: unknown;
37
+ }
38
+ export interface ParseError {
39
+ message: string;
40
+ position: number;
41
+ /** Error type (optional, for classification) */
42
+ code?: string;
43
+ }
44
+ /**
45
+ * Context Schema — describes metadata of the SpEL evaluation context.
46
+ *
47
+ * Used for:
48
+ * 1. PromptBuilder: constructing context information in LLM prompts
49
+ * 2. ValidationPipeline: verifying expression references are valid
50
+ * 3. TemplateEngine: matching correct field names during slot filling
51
+ * 4. GBNFGenerator: generating GBNF grammar containing all valid identifiers
52
+ */
53
+ export interface ContextSchema {
54
+ /** Root object metadata */
55
+ root: RootObjectSchema | null;
56
+ /** Variable declarations */
57
+ variables: Record<string, VariableSchema>;
58
+ /** Bean declarations */
59
+ beans: Record<string, BeanSchema>;
60
+ /** Type declarations */
61
+ types: Record<string, TypeSchema>;
62
+ /** Function declarations */
63
+ functions: Record<string, FunctionSchema>;
64
+ }
65
+ export interface RootObjectSchema {
66
+ /** Root object name (referenced as #rootName in SpEL) */
67
+ name: string;
68
+ /** Root object type */
69
+ type: string;
70
+ /** Root object fields */
71
+ fields: Record<string, FieldSchema>;
72
+ /** Root object methods */
73
+ methods: Record<string, MethodSchema>;
74
+ }
75
+ export interface FieldSchema {
76
+ /** SpEL type */
77
+ type: 'string' | 'number' | 'boolean' | 'date' | 'object' | 'array' | 'map';
78
+ /** Field description (for semantic matching) */
79
+ description?: string;
80
+ /** Child fields (if type is object) */
81
+ fields?: Record<string, FieldSchema>;
82
+ /** Whether it is a collection */
83
+ isCollection?: boolean;
84
+ /** Collection element type */
85
+ elementType?: string;
86
+ /** Whether nullable */
87
+ nullable?: boolean;
88
+ /** Example value */
89
+ example?: unknown;
90
+ }
91
+ export interface VariableSchema {
92
+ type: string;
93
+ description?: string;
94
+ nullable?: boolean;
95
+ value?: unknown;
96
+ }
97
+ export interface BeanSchema {
98
+ type: string;
99
+ description?: string;
100
+ singleton?: boolean;
101
+ }
102
+ export interface TypeSchema {
103
+ className?: string;
104
+ description?: string;
105
+ methods?: Record<string, MethodSchema>;
106
+ staticMethods?: Record<string, MethodSchema>;
107
+ }
108
+ export interface MethodSchema {
109
+ returnType: string;
110
+ params?: Array<{
111
+ name: string;
112
+ type: string;
113
+ }>;
114
+ description?: string;
115
+ }
116
+ export interface FunctionSchema {
117
+ returnType: string;
118
+ params: Array<{
119
+ name: string;
120
+ type: string;
121
+ }>;
122
+ description?: string;
123
+ }
124
+ //# sourceMappingURL=SpelEvaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpelEvaluator.d.ts","sourceRoot":"","sources":["../src/SpelEvaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SpelEvaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpelEvaluator.js","sourceRoot":"","sources":["../src/SpelEvaluator.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auto-fixer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fixer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/auto-fixer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,285 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { AutoFixer } from '../validation/auto-fixer.js';
3
+ describe('AutoFixer', () => {
4
+ const fixer = new AutoFixer();
5
+ function hasBalancedParens(expr) {
6
+ let count = 0;
7
+ for (const ch of expr) {
8
+ if (ch === '(')
9
+ count++;
10
+ if (ch === ')')
11
+ count--;
12
+ if (count < 0)
13
+ return false;
14
+ }
15
+ return count === 0;
16
+ }
17
+ // ===== VL-G01: JS Operators → SpEL Operators =====
18
+ describe('VL-G01: JS → SpEL Operators', () => {
19
+ it('=== → ==', () => {
20
+ const result = fixer.fix('#order.amount === 1000');
21
+ expect(result.wasFixed).toBe(true);
22
+ expect(result.expression).toContain('==');
23
+ expect(result.expression).not.toContain('===');
24
+ expect(result.changes.length).toBeGreaterThan(0);
25
+ });
26
+ it('!== → !=', () => {
27
+ const result = fixer.fix("#order.status !== 'cancelled'");
28
+ expect(result.wasFixed).toBe(true);
29
+ expect(result.expression).toContain('!=');
30
+ expect(result.expression).not.toContain('!==');
31
+ });
32
+ it('&& → and', () => {
33
+ const result = fixer.fix('#order.amount > 100 && #order.paid == true');
34
+ expect(result.wasFixed).toBe(true);
35
+ expect(result.expression).toContain('and');
36
+ expect(result.expression).not.toContain('&&');
37
+ });
38
+ it('|| → or', () => {
39
+ const result = fixer.fix('#order.status == done || #order.vip');
40
+ expect(result.wasFixed).toBe(true);
41
+ expect(result.expression).toContain('or');
42
+ expect(result.expression).not.toContain('||');
43
+ });
44
+ it('=== undefined → == null', () => {
45
+ const result = fixer.fix('#order.remark === undefined');
46
+ expect(result.wasFixed).toBe(true);
47
+ expect(result.expression).toContain('== null');
48
+ });
49
+ });
50
+ // ===== VL-G02: Quote Fixes =====
51
+ describe('VL-G02: Quote Fixes', () => {
52
+ it('should fix unmatched single quote by appending at end', () => {
53
+ const result = fixer.fix("#order.status == 'pending");
54
+ expect(result.wasFixed).toBe(true);
55
+ expect(result.expression).toContain("'pending'");
56
+ });
57
+ it('should not modify valid single-quoted expressions', () => {
58
+ const result = fixer.fix("#order.status == 'pending'");
59
+ expect(result.wasFixed).toBe(false);
60
+ expect(result.expression).toBe("#order.status == 'pending'");
61
+ });
62
+ });
63
+ // ===== VL-G03: Parentheses Fixes =====
64
+ describe('VL-G03: Parentheses Fixes', () => {
65
+ it('should fix missing closing parenthesis', () => {
66
+ const result = fixer.fix('(#order.amount > 100');
67
+ expect(result.wasFixed).toBe(true);
68
+ expect(hasBalancedParens(result.expression)).toBe(true);
69
+ });
70
+ it('should fix double missing parentheses', () => {
71
+ const result = fixer.fix('(#order.amount > 100 and (#user.vip == true');
72
+ expect(result.wasFixed).toBe(true);
73
+ expect(hasBalancedParens(result.expression)).toBe(true);
74
+ });
75
+ it('should fix missing right bracket', () => {
76
+ const result = fixer.fix('#order.items.?[#this.amount > 100');
77
+ expect(result.wasFixed).toBe(true);
78
+ // After fix, the missing ] should be appended
79
+ expect(result.expression.includes(']')).toBe(true);
80
+ });
81
+ it('should not modify valid parenthesized expressions', () => {
82
+ const result = fixer.fix('(#order.amount > 100) and (#user.vip == true)');
83
+ expect(result.wasFixed).toBe(false);
84
+ });
85
+ });
86
+ // ===== VL-G04: Multi-Error Fixes =====
87
+ describe('VL-G04: Multi-Error Fixes', () => {
88
+ it('should fix multiple errors in one pass', () => {
89
+ const result = fixer.fix("#order.amount === 1000 && #order.status == 'done");
90
+ expect(result.wasFixed).toBe(true);
91
+ expect(result.expression).not.toContain('===');
92
+ expect(result.expression).not.toContain('&&');
93
+ expect(result.changes.length).toBeGreaterThanOrEqual(2);
94
+ });
95
+ it('should report all changes', () => {
96
+ const result = fixer.fix('#x === 1 || #y === 2 && #z === 3');
97
+ expect(result.changes.length).toBeGreaterThanOrEqual(3);
98
+ });
99
+ it('>= vs > ==', () => {
100
+ const result = fixer.fix('#order.amount > == 100');
101
+ if (result.wasFixed) {
102
+ expect(result.expression).toContain('>=');
103
+ expect(result.expression).not.toContain('> ==');
104
+ }
105
+ });
106
+ it('<= vs < ==', () => {
107
+ const result = fixer.fix('#order.amount < == 100');
108
+ if (result.wasFixed) {
109
+ expect(result.expression).toContain('<=');
110
+ expect(result.expression).not.toContain('< ==');
111
+ }
112
+ });
113
+ });
114
+ // ===== VL-G05: Elvis Operator =====
115
+ describe('VL-G05: Elvis Operator', () => {
116
+ it('should fix Elvis operator spacing', () => {
117
+ // "? :" with space between ? and : should be "?:"
118
+ const result = fixer.fix("#user.name ? : 'Anonymous'");
119
+ if (result.wasFixed) {
120
+ expect(result.expression).toContain('?:');
121
+ }
122
+ });
123
+ it('should not break correct Elvis', () => {
124
+ const result = fixer.fix("#user.name ?: 'Anonymous'");
125
+ expect(result.expression).toContain('?:');
126
+ });
127
+ });
128
+ // ===== VL-G06: Valid Expressions (No Fix Needed) =====
129
+ describe('VL-G06: Valid Expressions', () => {
130
+ it('simple comparison', () => {
131
+ const result = fixer.fix('#order.amount > 1000');
132
+ expect(result.wasFixed).toBe(false);
133
+ expect(result.changes).toHaveLength(0);
134
+ });
135
+ it('string comparison', () => {
136
+ const result = fixer.fix("#order.status == '已发货'");
137
+ expect(result.wasFixed).toBe(false);
138
+ });
139
+ it('null check', () => {
140
+ const result = fixer.fix('#order.remark == null');
141
+ expect(result.wasFixed).toBe(false);
142
+ });
143
+ it('logical and', () => {
144
+ const result = fixer.fix('#order.amount > 100 and #order.paid == true');
145
+ expect(result.wasFixed).toBe(false);
146
+ });
147
+ it('collection contains', () => {
148
+ const result = fixer.fix("#order.tags.contains('VIP')");
149
+ expect(result.wasFixed).toBe(false);
150
+ });
151
+ it('between', () => {
152
+ const result = fixer.fix('#user.age between {18, 60}');
153
+ expect(result.wasFixed).toBe(false);
154
+ });
155
+ });
156
+ // ===== Additional Coverage Tests =====
157
+ describe('Additional Coverage', () => {
158
+ it('!== undefined → != null (without === undefined)', () => {
159
+ const result = fixer.fix('#x !== undefined or #y != null');
160
+ expect(result.wasFixed).toBe(true);
161
+ expect(result.expression).toContain('!= null');
162
+ expect(result.expression).not.toContain('!==');
163
+ expect(result.expression).not.toContain('!== undefined');
164
+ });
165
+ it('should fix odd number of double quotes', () => {
166
+ const result = fixer.fix('#order.status == "pending');
167
+ expect(result.wasFixed).toBe(true);
168
+ expect(result.expression).toBe('#order.status == "pending"');
169
+ expect(result.changes).toContain('Added missing closing double quote');
170
+ });
171
+ it('> == → >= edge case (assertive)', () => {
172
+ const result = fixer.fix('#x > == 5');
173
+ expect(result.wasFixed).toBe(true);
174
+ expect(result.expression).toContain('>=');
175
+ expect(result.expression).not.toContain('> ==');
176
+ expect(result.changes).toContain('Replaced > == with >=');
177
+ });
178
+ it('< == → <= edge case (assertive)', () => {
179
+ const result = fixer.fix('#x < == 5');
180
+ expect(result.wasFixed).toBe(true);
181
+ expect(result.expression).toContain('<=');
182
+ expect(result.expression).not.toContain('< ==');
183
+ expect(result.changes).toContain('Replaced < == with <=');
184
+ });
185
+ it('Elvis operator spacing fix ? : → ?:', () => {
186
+ const result = fixer.fix("#x ? : 'default'");
187
+ expect(result.wasFixed).toBe(true);
188
+ expect(result.expression).toContain('?:');
189
+ expect(result.changes).toContain('Fixed Elvis operator spacing');
190
+ });
191
+ it('should fix curly brace imbalance', () => {
192
+ const result = fixer.fix('{a: {b: 1}');
193
+ expect(result.wasFixed).toBe(true);
194
+ // The fixer adds closing braces at the end
195
+ expect(result.expression).toBe('{a: {b: 1}}');
196
+ });
197
+ it('empty string input (no-op)', () => {
198
+ const result = fixer.fix('');
199
+ expect(result.wasFixed).toBe(false);
200
+ expect(result.changes).toHaveLength(0);
201
+ expect(result.expression).toBe('');
202
+ });
203
+ it('expression with NO changes needed but wasFixed returns false', () => {
204
+ const result = fixer.fix('#x > 0');
205
+ expect(result.wasFixed).toBe(false);
206
+ expect(result.changes).toHaveLength(0);
207
+ expect(result.expression).toBe('#x > 0');
208
+ });
209
+ it('all fixes combined in one expression', () => {
210
+ const result = fixer.fix('#x === undefined && #y !== undefined || #z > == 5');
211
+ expect(result.wasFixed).toBe(true);
212
+ expect(result.expression).not.toContain('===');
213
+ expect(result.expression).not.toContain('!==');
214
+ expect(result.expression).toContain('== null');
215
+ expect(result.expression).toContain('!= null');
216
+ expect(result.expression).toContain('and');
217
+ expect(result.expression).toContain('or');
218
+ expect(result.expression).toContain('>=');
219
+ expect(result.changes.length).toBeGreaterThanOrEqual(4);
220
+ });
221
+ it('fixAllBrackets with curly braces specific case', () => {
222
+ const result = fixer.fix('{#a, #b');
223
+ expect(result.wasFixed).toBe(true);
224
+ // The expression starts with { but has no closing }
225
+ expect(result.expression).toContain('}');
226
+ expect(result.changes).toContain('Fixed unbalanced brackets');
227
+ });
228
+ });
229
+ // ===== Branch coverage: lines 23, 30, 37, 44 =====
230
+ describe('Branch coverage', () => {
231
+ // Line 23: !== undefined but NOT === undefined, with other !== surviving
232
+ // Step 1b converts !== undefined → != null, then step 2 finds remaining !==
233
+ it('!== undefined with other !== surviving the undefined check (line 23)', () => {
234
+ const result = fixer.fix('#x !== undefined && #y !== 5');
235
+ expect(result.wasFixed).toBe(true);
236
+ // Step 1b: !== undefined → != null
237
+ // Step 2: !== 5 → != 5 (line 23 body)
238
+ expect(result.expression).toContain('!= null');
239
+ expect(result.expression).toContain('!= 5');
240
+ expect(result.expression).not.toContain('!==');
241
+ expect(result.expression).not.toContain('!== undefined');
242
+ expect(result.changes).toContain('Replaced !== undefined with != null');
243
+ expect(result.changes).toContain('Replaced 1x !== with !=');
244
+ });
245
+ // Lines 23 + 30: !== AND === past the undefined checks
246
+ // Step 2 fires for !==, then step 3 fires for ===
247
+ it('!== and === past undefined checks (lines 23 + 30)', () => {
248
+ const result = fixer.fix('#x !== 5 && #y === 0');
249
+ expect(result.wasFixed).toBe(true);
250
+ expect(result.expression).toContain('!= 5');
251
+ expect(result.expression).toContain('== 0');
252
+ expect(result.expression).not.toContain('!==');
253
+ expect(result.expression).not.toContain('===');
254
+ expect(result.changes).toContain('Replaced 1x !== with !=');
255
+ expect(result.changes).toContain('Replaced 1x === with ==');
256
+ });
257
+ // Line 37: no && in expression → skip the && → and replacement
258
+ it('no && in expression (line 37 false branch)', () => {
259
+ const result = fixer.fix('#x === 5 || #y > 0');
260
+ expect(result.wasFixed).toBe(true);
261
+ // Step 3: === → ==
262
+ // Step 4: includes('&&') → false → skip line 37
263
+ // Step 5: includes('||') → true → line 44 body
264
+ expect(result.expression).not.toContain('===');
265
+ expect(result.expression).not.toContain('&&');
266
+ expect(result.expression).toContain('or');
267
+ expect(result.changes).toContain('Replaced 1x === with ==');
268
+ expect(result.changes).toContain('Replaced 1x || with or');
269
+ });
270
+ // Line 44: no || in expression → skip the || → or replacement
271
+ it('no || in expression (line 44 false branch)', () => {
272
+ const result = fixer.fix('#x === 5 && #y > 0');
273
+ expect(result.wasFixed).toBe(true);
274
+ // Step 3: === → ==
275
+ // Step 4: includes('&&') → true → line 37 body
276
+ // Step 5: includes('||') → false → skip line 44
277
+ expect(result.expression).not.toContain('===');
278
+ expect(result.expression).toContain('and');
279
+ expect(result.expression).not.toContain('||');
280
+ expect(result.changes).toContain('Replaced 1x === with ==');
281
+ expect(result.changes).toContain('Replaced 1x && with and');
282
+ });
283
+ });
284
+ });
285
+ //# sourceMappingURL=auto-fixer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-fixer.test.js","sourceRoot":"","sources":["../../src/__tests__/auto-fixer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chinese-number-parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chinese-number-parser.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/chinese-number-parser.test.ts"],"names":[],"mappings":""}