@agentix-e/nl2spel 0.0.0 → 1.1.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 (130) hide show
  1. package/README.md +69 -39
  2. package/dist/__tests__/auto-fixer.test.d.ts +2 -0
  3. package/dist/__tests__/auto-fixer.test.d.ts.map +1 -0
  4. package/dist/__tests__/auto-fixer.test.js +285 -0
  5. package/dist/__tests__/auto-fixer.test.js.map +1 -0
  6. package/dist/__tests__/chinese-number-parser.test.d.ts +2 -0
  7. package/dist/__tests__/chinese-number-parser.test.d.ts.map +1 -0
  8. package/dist/__tests__/chinese-number-parser.test.js +106 -0
  9. package/dist/__tests__/chinese-number-parser.test.js.map +1 -0
  10. package/dist/__tests__/context-extractor.test.d.ts +2 -0
  11. package/dist/__tests__/context-extractor.test.d.ts.map +1 -0
  12. package/dist/__tests__/context-extractor.test.js +347 -0
  13. package/dist/__tests__/context-extractor.test.js.map +1 -0
  14. package/dist/__tests__/coverage-gaps.test.d.ts +2 -0
  15. package/dist/__tests__/coverage-gaps.test.d.ts.map +1 -0
  16. package/dist/__tests__/coverage-gaps.test.js +578 -0
  17. package/dist/__tests__/coverage-gaps.test.js.map +1 -0
  18. package/dist/__tests__/intent-classifier.test.d.ts +2 -0
  19. package/dist/__tests__/intent-classifier.test.d.ts.map +1 -0
  20. package/dist/__tests__/intent-classifier.test.js +384 -0
  21. package/dist/__tests__/intent-classifier.test.js.map +1 -0
  22. package/dist/__tests__/nl2spel-engine.test.d.ts +2 -0
  23. package/dist/__tests__/nl2spel-engine.test.d.ts.map +1 -0
  24. package/dist/__tests__/nl2spel-engine.test.js +344 -0
  25. package/dist/__tests__/nl2spel-engine.test.js.map +1 -0
  26. package/dist/__tests__/pattern-matcher.test.d.ts +2 -0
  27. package/dist/__tests__/pattern-matcher.test.d.ts.map +1 -0
  28. package/dist/__tests__/pattern-matcher.test.js +754 -0
  29. package/dist/__tests__/pattern-matcher.test.js.map +1 -0
  30. package/dist/__tests__/prompt-builder.test.d.ts +2 -0
  31. package/dist/__tests__/prompt-builder.test.d.ts.map +1 -0
  32. package/dist/__tests__/prompt-builder.test.js +99 -0
  33. package/dist/__tests__/prompt-builder.test.js.map +1 -0
  34. package/dist/__tests__/provider-registry.test.d.ts +2 -0
  35. package/dist/__tests__/provider-registry.test.d.ts.map +1 -0
  36. package/dist/__tests__/provider-registry.test.js +240 -0
  37. package/dist/__tests__/provider-registry.test.js.map +1 -0
  38. package/dist/__tests__/schema-formatter.test.d.ts +2 -0
  39. package/dist/__tests__/schema-formatter.test.d.ts.map +1 -0
  40. package/dist/__tests__/schema-formatter.test.js +298 -0
  41. package/dist/__tests__/schema-formatter.test.js.map +1 -0
  42. package/dist/__tests__/self-correction-loop.test.d.ts +2 -0
  43. package/dist/__tests__/self-correction-loop.test.d.ts.map +1 -0
  44. package/dist/__tests__/self-correction-loop.test.js +253 -0
  45. package/dist/__tests__/self-correction-loop.test.js.map +1 -0
  46. package/dist/__tests__/strategy-router.test.d.ts +2 -0
  47. package/dist/__tests__/strategy-router.test.d.ts.map +1 -0
  48. package/dist/__tests__/strategy-router.test.js +493 -0
  49. package/dist/__tests__/strategy-router.test.js.map +1 -0
  50. package/dist/__tests__/template-engine.test.d.ts +2 -0
  51. package/dist/__tests__/template-engine.test.d.ts.map +1 -0
  52. package/dist/__tests__/template-engine.test.js +367 -0
  53. package/dist/__tests__/template-engine.test.js.map +1 -0
  54. package/dist/__tests__/validation-pipeline.test.d.ts +2 -0
  55. package/dist/__tests__/validation-pipeline.test.d.ts.map +1 -0
  56. package/dist/__tests__/validation-pipeline.test.js +262 -0
  57. package/dist/__tests__/validation-pipeline.test.js.map +1 -0
  58. package/dist/context/context-extractor.d.ts +82 -0
  59. package/dist/context/context-extractor.d.ts.map +1 -0
  60. package/dist/context/context-extractor.js +166 -0
  61. package/dist/context/context-extractor.js.map +1 -0
  62. package/dist/context/schema-formatter.d.ts +20 -0
  63. package/dist/context/schema-formatter.d.ts.map +1 -0
  64. package/dist/context/schema-formatter.js +104 -0
  65. package/dist/context/schema-formatter.js.map +1 -0
  66. package/dist/engine/nl2spel-engine.d.ts +145 -0
  67. package/dist/engine/nl2spel-engine.d.ts.map +1 -0
  68. package/dist/engine/nl2spel-engine.js +132 -0
  69. package/dist/engine/nl2spel-engine.js.map +1 -0
  70. package/dist/index.d.ts +28 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +24 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/pattern/builtin-patterns.d.ts +12 -0
  75. package/dist/pattern/builtin-patterns.d.ts.map +1 -0
  76. package/dist/pattern/builtin-patterns.js +812 -0
  77. package/dist/pattern/builtin-patterns.js.map +1 -0
  78. package/dist/pattern/pattern-definition.d.ts +49 -0
  79. package/dist/pattern/pattern-definition.d.ts.map +1 -0
  80. package/dist/pattern/pattern-definition.js +2 -0
  81. package/dist/pattern/pattern-definition.js.map +1 -0
  82. package/dist/pattern/pattern-matcher.d.ts +55 -0
  83. package/dist/pattern/pattern-matcher.d.ts.map +1 -0
  84. package/dist/pattern/pattern-matcher.js +216 -0
  85. package/dist/pattern/pattern-matcher.js.map +1 -0
  86. package/dist/provider/llm-provider.d.ts +146 -0
  87. package/dist/provider/llm-provider.d.ts.map +1 -0
  88. package/dist/provider/llm-provider.js +2 -0
  89. package/dist/provider/llm-provider.js.map +1 -0
  90. package/dist/provider/provider-registry.d.ts +28 -0
  91. package/dist/provider/provider-registry.d.ts.map +1 -0
  92. package/dist/provider/provider-registry.js +65 -0
  93. package/dist/provider/provider-registry.js.map +1 -0
  94. package/dist/strategy/strategy-router.d.ts +79 -0
  95. package/dist/strategy/strategy-router.d.ts.map +1 -0
  96. package/dist/strategy/strategy-router.js +182 -0
  97. package/dist/strategy/strategy-router.js.map +1 -0
  98. package/dist/template/intent-classifier.d.ts +56 -0
  99. package/dist/template/intent-classifier.d.ts.map +1 -0
  100. package/dist/template/intent-classifier.js +251 -0
  101. package/dist/template/intent-classifier.js.map +1 -0
  102. package/dist/template/nl-intent.d.ts +38 -0
  103. package/dist/template/nl-intent.d.ts.map +1 -0
  104. package/dist/template/nl-intent.js +39 -0
  105. package/dist/template/nl-intent.js.map +1 -0
  106. package/dist/template/prompts/prompt-builder.d.ts +20 -0
  107. package/dist/template/prompts/prompt-builder.d.ts.map +1 -0
  108. package/dist/template/prompts/prompt-builder.js +243 -0
  109. package/dist/template/prompts/prompt-builder.js.map +1 -0
  110. package/dist/template/template-engine.d.ts +27 -0
  111. package/dist/template/template-engine.d.ts.map +1 -0
  112. package/dist/template/template-engine.js +378 -0
  113. package/dist/template/template-engine.js.map +1 -0
  114. package/dist/utils/chinese-number-parser.d.ts +30 -0
  115. package/dist/utils/chinese-number-parser.d.ts.map +1 -0
  116. package/dist/utils/chinese-number-parser.js +92 -0
  117. package/dist/utils/chinese-number-parser.js.map +1 -0
  118. package/dist/validation/auto-fixer.d.ts +14 -0
  119. package/dist/validation/auto-fixer.d.ts.map +1 -0
  120. package/dist/validation/auto-fixer.js +111 -0
  121. package/dist/validation/auto-fixer.js.map +1 -0
  122. package/dist/validation/self-correction-loop.d.ts +46 -0
  123. package/dist/validation/self-correction-loop.d.ts.map +1 -0
  124. package/dist/validation/self-correction-loop.js +141 -0
  125. package/dist/validation/self-correction-loop.js.map +1 -0
  126. package/dist/validation/validation-pipeline.d.ts +81 -0
  127. package/dist/validation/validation-pipeline.d.ts.map +1 -0
  128. package/dist/validation/validation-pipeline.js +306 -0
  129. package/dist/validation/validation-pipeline.js.map +1 -0
  130. package/package.json +45 -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,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":""}
@@ -0,0 +1,106 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ChineseNumberParser } from '../utils/chinese-number-parser.js';
3
+ describe('ChineseNumberParser', () => {
4
+ describe('isChineseNumber', () => {
5
+ it('should return true for "一千二百三十四"', () => {
6
+ expect(ChineseNumberParser.isChineseNumber('一千二百三十四')).toBe(true);
7
+ });
8
+ it('should return true for "十"', () => {
9
+ expect(ChineseNumberParser.isChineseNumber('十')).toBe(true);
10
+ });
11
+ it('should return false for "123"', () => {
12
+ expect(ChineseNumberParser.isChineseNumber('123')).toBe(false);
13
+ });
14
+ it('should return false for mixed text', () => {
15
+ expect(ChineseNumberParser.isChineseNumber('abc一二三')).toBe(false);
16
+ });
17
+ });
18
+ describe('parse', () => {
19
+ it('零 → 0', () => {
20
+ expect(ChineseNumberParser.parse('零')).toBe(0);
21
+ });
22
+ it('一 → 1', () => {
23
+ expect(ChineseNumberParser.parse('一')).toBe(1);
24
+ });
25
+ it('十 → 10', () => {
26
+ expect(ChineseNumberParser.parse('十')).toBe(10);
27
+ });
28
+ it('十五 → 15', () => {
29
+ expect(ChineseNumberParser.parse('十五')).toBe(15);
30
+ });
31
+ it('二十 → 20', () => {
32
+ expect(ChineseNumberParser.parse('二十')).toBe(20);
33
+ });
34
+ it('一百 → 100', () => {
35
+ expect(ChineseNumberParser.parse('一百')).toBe(100);
36
+ });
37
+ it('一百二十三 → 123', () => {
38
+ expect(ChineseNumberParser.parse('一百二十三')).toBe(123);
39
+ });
40
+ it('一千 → 1000', () => {
41
+ expect(ChineseNumberParser.parse('一千')).toBe(1000);
42
+ });
43
+ it('一千二百三十四 → 1234', () => {
44
+ expect(ChineseNumberParser.parse('一千二百三十四')).toBe(1234);
45
+ });
46
+ it('一万 → 10000', () => {
47
+ expect(ChineseNumberParser.parse('一万')).toBe(10000);
48
+ });
49
+ it('十万 → 100000', () => {
50
+ expect(ChineseNumberParser.parse('十万')).toBe(100000);
51
+ });
52
+ it('一万二千三百四十五 → 12345', () => {
53
+ expect(ChineseNumberParser.parse('一万二千三百四十五')).toBe(12345);
54
+ });
55
+ it('一千零一 → 1001', () => {
56
+ expect(ChineseNumberParser.parse('一千零一')).toBe(1001);
57
+ });
58
+ it('一亿 → 100000000', () => {
59
+ expect(ChineseNumberParser.parse('一亿')).toBe(100000000);
60
+ });
61
+ it('returns NaN for non-Chinese input', () => {
62
+ expect(Number.isNaN(ChineseNumberParser.parse('abc'))).toBe(true);
63
+ expect(Number.isNaN(ChineseNumberParser.parse('123'))).toBe(true);
64
+ });
65
+ });
66
+ describe('parseSafe', () => {
67
+ it('should return number for valid input', () => {
68
+ expect(ChineseNumberParser.parseSafe('一百')).toBe(100);
69
+ });
70
+ it('should return null for invalid input', () => {
71
+ expect(ChineseNumberParser.parseSafe('abc')).toBeNull();
72
+ expect(ChineseNumberParser.parseSafe('123')).toBeNull();
73
+ });
74
+ });
75
+ // Additional edge cases
76
+ describe('edge cases', () => {
77
+ it('两 → 2', () => {
78
+ expect(ChineseNumberParser.parse('两')).toBe(2);
79
+ });
80
+ it('两百 → 200', () => {
81
+ expect(ChineseNumberParser.parse('两百')).toBe(200);
82
+ });
83
+ it('两千 → 2000', () => {
84
+ expect(ChineseNumberParser.parse('两千')).toBe(2000);
85
+ });
86
+ it('两万 → 20000', () => {
87
+ expect(ChineseNumberParser.parse('两万')).toBe(20000);
88
+ });
89
+ });
90
+ // Tests for unit-only inputs (current=0 at <10000 units, section+current=0 at >=10000 units)
91
+ describe('unit-only start (covers || 1 fallback branches)', () => {
92
+ it('百 → 100 (current is 0, kLine 82 || 1)', () => {
93
+ expect(ChineseNumberParser.parse('百')).toBe(100);
94
+ });
95
+ it('千 → 1000 (current is 0, kLine 82 || 1)', () => {
96
+ expect(ChineseNumberParser.parse('千')).toBe(1000);
97
+ });
98
+ it('万 → 10000 (section+current is 0, kLine 77 || 1)', () => {
99
+ expect(ChineseNumberParser.parse('万')).toBe(10000);
100
+ });
101
+ it('亿 → 100000000 (section+current is 0, kLine 77 || 1)', () => {
102
+ expect(ChineseNumberParser.parse('亿')).toBe(100000000);
103
+ });
104
+ });
105
+ });
106
+ //# sourceMappingURL=chinese-number-parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chinese-number-parser.test.js","sourceRoot":"","sources":["../../src/__tests__/chinese-number-parser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context-extractor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-extractor.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/context-extractor.test.ts"],"names":[],"mappings":""}