@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.
- package/README.md +69 -39
- package/dist/__tests__/auto-fixer.test.d.ts +2 -0
- package/dist/__tests__/auto-fixer.test.d.ts.map +1 -0
- package/dist/__tests__/auto-fixer.test.js +285 -0
- package/dist/__tests__/auto-fixer.test.js.map +1 -0
- package/dist/__tests__/chinese-number-parser.test.d.ts +2 -0
- package/dist/__tests__/chinese-number-parser.test.d.ts.map +1 -0
- package/dist/__tests__/chinese-number-parser.test.js +106 -0
- package/dist/__tests__/chinese-number-parser.test.js.map +1 -0
- package/dist/__tests__/context-extractor.test.d.ts +2 -0
- package/dist/__tests__/context-extractor.test.d.ts.map +1 -0
- package/dist/__tests__/context-extractor.test.js +347 -0
- package/dist/__tests__/context-extractor.test.js.map +1 -0
- package/dist/__tests__/coverage-gaps.test.d.ts +2 -0
- package/dist/__tests__/coverage-gaps.test.d.ts.map +1 -0
- package/dist/__tests__/coverage-gaps.test.js +578 -0
- package/dist/__tests__/coverage-gaps.test.js.map +1 -0
- package/dist/__tests__/intent-classifier.test.d.ts +2 -0
- package/dist/__tests__/intent-classifier.test.d.ts.map +1 -0
- package/dist/__tests__/intent-classifier.test.js +384 -0
- package/dist/__tests__/intent-classifier.test.js.map +1 -0
- package/dist/__tests__/nl2spel-engine.test.d.ts +2 -0
- package/dist/__tests__/nl2spel-engine.test.d.ts.map +1 -0
- package/dist/__tests__/nl2spel-engine.test.js +344 -0
- package/dist/__tests__/nl2spel-engine.test.js.map +1 -0
- package/dist/__tests__/pattern-matcher.test.d.ts +2 -0
- package/dist/__tests__/pattern-matcher.test.d.ts.map +1 -0
- package/dist/__tests__/pattern-matcher.test.js +754 -0
- package/dist/__tests__/pattern-matcher.test.js.map +1 -0
- package/dist/__tests__/prompt-builder.test.d.ts +2 -0
- package/dist/__tests__/prompt-builder.test.d.ts.map +1 -0
- package/dist/__tests__/prompt-builder.test.js +99 -0
- package/dist/__tests__/prompt-builder.test.js.map +1 -0
- package/dist/__tests__/provider-registry.test.d.ts +2 -0
- package/dist/__tests__/provider-registry.test.d.ts.map +1 -0
- package/dist/__tests__/provider-registry.test.js +240 -0
- package/dist/__tests__/provider-registry.test.js.map +1 -0
- package/dist/__tests__/schema-formatter.test.d.ts +2 -0
- package/dist/__tests__/schema-formatter.test.d.ts.map +1 -0
- package/dist/__tests__/schema-formatter.test.js +298 -0
- package/dist/__tests__/schema-formatter.test.js.map +1 -0
- package/dist/__tests__/self-correction-loop.test.d.ts +2 -0
- package/dist/__tests__/self-correction-loop.test.d.ts.map +1 -0
- package/dist/__tests__/self-correction-loop.test.js +253 -0
- package/dist/__tests__/self-correction-loop.test.js.map +1 -0
- package/dist/__tests__/strategy-router.test.d.ts +2 -0
- package/dist/__tests__/strategy-router.test.d.ts.map +1 -0
- package/dist/__tests__/strategy-router.test.js +493 -0
- package/dist/__tests__/strategy-router.test.js.map +1 -0
- package/dist/__tests__/template-engine.test.d.ts +2 -0
- package/dist/__tests__/template-engine.test.d.ts.map +1 -0
- package/dist/__tests__/template-engine.test.js +367 -0
- package/dist/__tests__/template-engine.test.js.map +1 -0
- package/dist/__tests__/validation-pipeline.test.d.ts +2 -0
- package/dist/__tests__/validation-pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/validation-pipeline.test.js +262 -0
- package/dist/__tests__/validation-pipeline.test.js.map +1 -0
- package/dist/context/context-extractor.d.ts +82 -0
- package/dist/context/context-extractor.d.ts.map +1 -0
- package/dist/context/context-extractor.js +166 -0
- package/dist/context/context-extractor.js.map +1 -0
- package/dist/context/schema-formatter.d.ts +20 -0
- package/dist/context/schema-formatter.d.ts.map +1 -0
- package/dist/context/schema-formatter.js +104 -0
- package/dist/context/schema-formatter.js.map +1 -0
- package/dist/engine/nl2spel-engine.d.ts +145 -0
- package/dist/engine/nl2spel-engine.d.ts.map +1 -0
- package/dist/engine/nl2spel-engine.js +132 -0
- package/dist/engine/nl2spel-engine.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/pattern/builtin-patterns.d.ts +12 -0
- package/dist/pattern/builtin-patterns.d.ts.map +1 -0
- package/dist/pattern/builtin-patterns.js +812 -0
- package/dist/pattern/builtin-patterns.js.map +1 -0
- package/dist/pattern/pattern-definition.d.ts +49 -0
- package/dist/pattern/pattern-definition.d.ts.map +1 -0
- package/dist/pattern/pattern-definition.js +2 -0
- package/dist/pattern/pattern-definition.js.map +1 -0
- package/dist/pattern/pattern-matcher.d.ts +55 -0
- package/dist/pattern/pattern-matcher.d.ts.map +1 -0
- package/dist/pattern/pattern-matcher.js +216 -0
- package/dist/pattern/pattern-matcher.js.map +1 -0
- package/dist/provider/llm-provider.d.ts +146 -0
- package/dist/provider/llm-provider.d.ts.map +1 -0
- package/dist/provider/llm-provider.js +2 -0
- package/dist/provider/llm-provider.js.map +1 -0
- package/dist/provider/provider-registry.d.ts +28 -0
- package/dist/provider/provider-registry.d.ts.map +1 -0
- package/dist/provider/provider-registry.js +65 -0
- package/dist/provider/provider-registry.js.map +1 -0
- package/dist/strategy/strategy-router.d.ts +79 -0
- package/dist/strategy/strategy-router.d.ts.map +1 -0
- package/dist/strategy/strategy-router.js +182 -0
- package/dist/strategy/strategy-router.js.map +1 -0
- package/dist/template/intent-classifier.d.ts +56 -0
- package/dist/template/intent-classifier.d.ts.map +1 -0
- package/dist/template/intent-classifier.js +251 -0
- package/dist/template/intent-classifier.js.map +1 -0
- package/dist/template/nl-intent.d.ts +38 -0
- package/dist/template/nl-intent.d.ts.map +1 -0
- package/dist/template/nl-intent.js +39 -0
- package/dist/template/nl-intent.js.map +1 -0
- package/dist/template/prompts/prompt-builder.d.ts +20 -0
- package/dist/template/prompts/prompt-builder.d.ts.map +1 -0
- package/dist/template/prompts/prompt-builder.js +243 -0
- package/dist/template/prompts/prompt-builder.js.map +1 -0
- package/dist/template/template-engine.d.ts +27 -0
- package/dist/template/template-engine.d.ts.map +1 -0
- package/dist/template/template-engine.js +378 -0
- package/dist/template/template-engine.js.map +1 -0
- package/dist/utils/chinese-number-parser.d.ts +30 -0
- package/dist/utils/chinese-number-parser.d.ts.map +1 -0
- package/dist/utils/chinese-number-parser.js +92 -0
- package/dist/utils/chinese-number-parser.js.map +1 -0
- package/dist/validation/auto-fixer.d.ts +14 -0
- package/dist/validation/auto-fixer.d.ts.map +1 -0
- package/dist/validation/auto-fixer.js +111 -0
- package/dist/validation/auto-fixer.js.map +1 -0
- package/dist/validation/self-correction-loop.d.ts +46 -0
- package/dist/validation/self-correction-loop.d.ts.map +1 -0
- package/dist/validation/self-correction-loop.js +141 -0
- package/dist/validation/self-correction-loop.js.map +1 -0
- package/dist/validation/validation-pipeline.d.ts +81 -0
- package/dist/validation/validation-pipeline.d.ts.map +1 -0
- package/dist/validation/validation-pipeline.js +306 -0
- package/dist/validation/validation-pipeline.js.map +1 -0
- package/package.json +45 -7
package/README.md
CHANGED
|
@@ -1,45 +1,75 @@
|
|
|
1
1
|
# @agentix-e/nl2spel
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> Natural Language → SpEL Core Engine
|
|
4
|
+
>
|
|
5
|
+
> Zero external deps · Four-layer hybrid architecture · 502 tests · Chinese & English
|
|
4
6
|
|
|
5
|
-
|
|
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
|
+
[](https://www.npmjs.com/package/@agentix-e/nl2spel)
|
|
8
|
+
[](../../LICENSE)
|
|
42
9
|
|
|
43
10
|
---
|
|
44
11
|
|
|
45
|
-
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"context-extractor.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/context-extractor.test.ts"],"names":[],"mappings":""}
|