fix(core): Expression extension failing with optional chaining (#5370)

* wip

* fix: working optional chaining polyfill

* fix: polyfill optional chaining on extended functions

* test: add optional chaining tests
This commit is contained in:
Valya
2023-02-09 13:57:45 +00:00
committed by GitHub
parent 40f4ec75fa
commit c7b58e0ed1
6 changed files with 364 additions and 19 deletions

View File

@@ -95,7 +95,7 @@ describe('tmpl Expression Parser', () => {
);
});
test('Escaped closinging bracket', () => {
test('Escaped closing bracket', () => {
expect(joinExpression(splitExpression('test {{ code.test("\\}}") }}'))).toEqual(
'test {{ code.test("\\}}") }}',
);
@@ -112,6 +112,62 @@ describe('tmpl Expression Parser', () => {
});
});
describe('Test newer ES syntax', () => {
test('Optional chaining transforms', () => {
expect(extendTransform('$json.something?.test.funcCall()')?.code).toBe(
'window.chainCancelToken1 = ((window.chainValue1 = $json.something) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainValue1.test.funcCall();',
);
expect(extendTransform('$json.something?.test.funcCall()?.somethingElse')?.code).toBe(
'window.chainCancelToken1 = ((window.chainValue1 = $json.something) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainCancelToken1 = ((window.chainValue1 = window.chainValue1.test.funcCall()) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainValue1.somethingElse;',
);
expect(extendTransform('$json.something?.test.funcCall().somethingElse')?.code).toBe(
'window.chainCancelToken1 = ((window.chainValue1 = $json.something) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainValue1.test.funcCall().somethingElse;',
);
expect(
extendTransform('$json.something?.test.funcCall()?.somethingElse.otherCall()')?.code,
).toBe(
'window.chainCancelToken1 = ((window.chainValue1 = $json.something) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainCancelToken1 = ((window.chainValue1 = window.chainValue1.test.funcCall()) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainValue1.somethingElse.otherCall();',
);
expect(evaluate('={{ [1, 2, 3, 4]?.sum() }}')).toBe(10);
});
test('Optional chaining transforms on calls', () => {
expect(extendTransform('Math.min?.(1)')?.code).toBe(
'window.chainCancelToken1 = ((window.chainValue1 = extendOptional(Math, "min")) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainValue1(1);',
);
expect(extendTransform('Math?.min?.(1)')?.code).toBe(
'window.chainCancelToken1 = ((window.chainValue1 = Math) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainCancelToken1 = ((window.chainValue1 = extendOptional(window.chainValue1, "min")) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainValue1(1);',
);
expect(extendTransform('$json.test.test2?.sum()')?.code).toBe(
'window.chainCancelToken1 = ((window.chainValue1 = $json.test.test2) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : extend(window.chainValue1, "sum", []);',
);
expect(extendTransform('$json.test.test2?.sum?.()')?.code).toBe(
'window.chainCancelToken1 = ((window.chainValue1 = $json.test.test2) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainCancelToken1 = ((window.chainValue1 = extendOptional(window.chainValue1, "sum")) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainValue1();',
);
expect(evaluate('={{ [1, 2, 3, 4].sum?.() }}')).toBe(10);
});
test('Multiple optional chains in an expression', () => {
expect(extendTransform('$json.test?.test2($json.test?.test2)')?.code)
.toBe(`window.chainCancelToken2 = ((window.chainValue2 = $json.test) ?? undefined) === undefined, window.chainCancelToken2 === true ? undefined : window.chainValue2.test2(
(window.chainCancelToken1 = ((window.chainValue1 = $json.test) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainValue1.test2)
);`);
expect(extendTransform('$json.test?.test2($json.test.sum?.())')?.code)
.toBe(`window.chainCancelToken2 = ((window.chainValue2 = $json.test) ?? undefined) === undefined, window.chainCancelToken2 === true ? undefined : window.chainValue2.test2(
(window.chainCancelToken1 = ((window.chainValue1 = extendOptional($json.test, "sum")) ?? undefined) === undefined, window.chainCancelToken1 === true ? undefined : window.chainValue1())
);`);
});
expect(evaluate('={{ [1, 2, 3, 4]?.sum((undefined)?.test) }}')).toBe(10);
});
describe('Non dot extensions', () => {
test('min', () => {
expect(evaluate('={{ min(1, 2, 3, 4, 5, 6) }}')).toEqual(1);