@fincity/kirun-js 3.2.0 → 3.2.2
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/.claude/settings.local.json +8 -0
- package/__tests__/engine/runtime/expression/ExpressionEvaluationTest.ts +52 -0
- package/__tests__/engine/runtime/expression/ExpressionParsingTest.ts +3 -3
- package/__tests__/engine/runtime/expression/tokenextractor/ObjectValueSetterExtractorTest.ts +28 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/module.js +1 -1
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/engine/runtime/expression/ExpressionEvaluator.ts +1 -29
- package/src/engine/runtime/expression/tokenextractor/ObjectValueSetterExtractor.ts +5 -5
|
@@ -596,6 +596,58 @@ test('ternary expression with displayValue equality check', () => {
|
|
|
596
596
|
expect(ev.evaluate(MapUtil.of(ttv.getPrefix(), ttv))).toBe('11');
|
|
597
597
|
});
|
|
598
598
|
|
|
599
|
+
class StoreTokenValueExtractor extends TokenValueExtractor {
|
|
600
|
+
private store: any;
|
|
601
|
+
|
|
602
|
+
constructor(store: any) {
|
|
603
|
+
super();
|
|
604
|
+
this.store = store;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
protected getValueInternal(token: string): any {
|
|
608
|
+
return this.retrieveElementFrom(token, token.split('.'), 1, this.store);
|
|
609
|
+
}
|
|
610
|
+
public getPrefix(): string {
|
|
611
|
+
return 'Store.';
|
|
612
|
+
}
|
|
613
|
+
public getStore(): any {
|
|
614
|
+
return this.store;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
test('String vs Number equality with nested expression substitution', () => {
|
|
619
|
+
// Setup store with string "413" and number 413
|
|
620
|
+
let stv = new StoreTokenValueExtractor({ strNumber: '413', number: 413 });
|
|
621
|
+
let valuesMap: Map<string, TokenValueExtractor> = MapUtil.of(stv.getPrefix(), stv);
|
|
622
|
+
|
|
623
|
+
// Direct comparison: Store.strNumber = Store.number should return false
|
|
624
|
+
// because "413" (string) != 413 (number) - different types
|
|
625
|
+
let ev = new ExpressionEvaluator('Store.strNumber = Store.number');
|
|
626
|
+
expect(ev.evaluate(valuesMap)).toBe(false);
|
|
627
|
+
|
|
628
|
+
// Nested expression substitution: {{Store.strNumber}} = Store.number should return true
|
|
629
|
+
// because {{Store.strNumber}} is replaced with "413" making the expression "413 = Store.number"
|
|
630
|
+
// which evaluates to 413 = 413 (both numbers) and returns true
|
|
631
|
+
ev = new ExpressionEvaluator('{{Store.strNumber}} = Store.number');
|
|
632
|
+
expect(ev.evaluate(valuesMap)).toBe(true);
|
|
633
|
+
|
|
634
|
+
// Additional test: verify the string value directly
|
|
635
|
+
ev = new ExpressionEvaluator('Store.strNumber');
|
|
636
|
+
expect(ev.evaluate(valuesMap)).toBe('413');
|
|
637
|
+
|
|
638
|
+
// Additional test: verify the number value directly
|
|
639
|
+
ev = new ExpressionEvaluator('Store.number');
|
|
640
|
+
expect(ev.evaluate(valuesMap)).toBe(413);
|
|
641
|
+
|
|
642
|
+
// Additional test: string to string comparison should return true
|
|
643
|
+
ev = new ExpressionEvaluator("Store.strNumber = '413'");
|
|
644
|
+
expect(ev.evaluate(valuesMap)).toBe(true);
|
|
645
|
+
|
|
646
|
+
// Additional test: number to number comparison should return true
|
|
647
|
+
ev = new ExpressionEvaluator('Store.number = 413');
|
|
648
|
+
expect(ev.evaluate(valuesMap)).toBe(true);
|
|
649
|
+
});
|
|
650
|
+
|
|
599
651
|
test('unary minus operator', () => {
|
|
600
652
|
// Simple negative number
|
|
601
653
|
let ev = new ExpressionEvaluator('-5');
|
|
@@ -602,7 +602,7 @@ describe('Original Expression Parsing Tests', () => {
|
|
|
602
602
|
expect(ev.evaluate(valuesMapWithValue)).toBe('Application : My Application Title');
|
|
603
603
|
|
|
604
604
|
// Store with value null - should return location.expression
|
|
605
|
-
|
|
605
|
+
// Note: expression value includes quotes so it becomes a valid string literal when substituted
|
|
606
606
|
const storeValueNull = new TestTokenValueExtractor('Store.', {
|
|
607
607
|
urlDetails: { pageName: 'home' },
|
|
608
608
|
pageDefinition: {
|
|
@@ -611,7 +611,7 @@ describe('Original Expression Parsing Tests', () => {
|
|
|
611
611
|
title: {
|
|
612
612
|
name: {
|
|
613
613
|
value: null,
|
|
614
|
-
location: { expression: 'Expression Fallback Title' },
|
|
614
|
+
location: { expression: "'Expression Fallback Title'" },
|
|
615
615
|
},
|
|
616
616
|
},
|
|
617
617
|
},
|
|
@@ -632,7 +632,7 @@ describe('Original Expression Parsing Tests', () => {
|
|
|
632
632
|
properties: {
|
|
633
633
|
title: {
|
|
634
634
|
name: {
|
|
635
|
-
location: { expression: 'Expression Fallback Title' },
|
|
635
|
+
location: { expression: "'Expression Fallback Title'" },
|
|
636
636
|
},
|
|
637
637
|
},
|
|
638
638
|
},
|
package/__tests__/engine/runtime/expression/tokenextractor/ObjectValueSetterExtractorTest.ts
CHANGED
|
@@ -55,3 +55,31 @@ test('ObjectValueSetterExtractor Test', async () => {
|
|
|
55
55
|
extractor.setValue('Store.plain', 'plainString', false, false);
|
|
56
56
|
expect(extractor.getValue('Store.plain')).toStrictEqual('plainString');
|
|
57
57
|
});
|
|
58
|
+
|
|
59
|
+
test('ObjectValueSetterExtractor - set empty object then set nested property with numeric key', async () => {
|
|
60
|
+
let store = {};
|
|
61
|
+
|
|
62
|
+
let extractor: ObjectValueSetterExtractor = new ObjectValueSetterExtractor(store, 'Store');
|
|
63
|
+
|
|
64
|
+
extractor.setValue('Store.x', {});
|
|
65
|
+
expect(extractor.getValue('Store.x')).toMatchObject({});
|
|
66
|
+
|
|
67
|
+
extractor.setValue('Store.x.1', 'kiran');
|
|
68
|
+
expect(extractor.getValue('Store.x.1')).toBe('kiran');
|
|
69
|
+
expect(extractor.getValue('Store.x')).toMatchObject({ '1': 'kiran' });
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('ObjectValueSetterExtractor - set empty array then set element with numeric index', async () => {
|
|
73
|
+
let store = {};
|
|
74
|
+
|
|
75
|
+
let extractor: ObjectValueSetterExtractor = new ObjectValueSetterExtractor(store, 'Store');
|
|
76
|
+
|
|
77
|
+
extractor.setValue('Store.arr', []);
|
|
78
|
+
expect(extractor.getValue('Store.arr')).toMatchObject([]);
|
|
79
|
+
|
|
80
|
+
extractor.setValue('Store.arr.1', 'value');
|
|
81
|
+
expect(extractor.getValue('Store.arr.1')).toBe('value');
|
|
82
|
+
const arr = extractor.getValue('Store.arr');
|
|
83
|
+
expect(arr.length).toBe(2);
|
|
84
|
+
expect(arr[1]).toBe('value');
|
|
85
|
+
});
|