Skip to content

Commit ae4ba2e

Browse files
feat(typed-json-model): add getOriginalProperty declarations and tests to TypedJSONModel (#534)
1 parent ea8b0cc commit ae4ba2e

15 files changed

+312
-0
lines changed

packages/dts-generator/src/resources/typed-json-model.d.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ declare module "sap/ui/model/json/TypedJSONModel" {
2929
sPath: Path,
3030
oContext: TypedJSONContext<Data, Root>,
3131
): PropertyByRelativeBindingPath<Data, Root, Path>;
32+
getOriginalProperty<Path extends AbsoluteBindingPath<Data>>(
33+
sPath: Path,
34+
): PropertyByAbsoluteBindingPath<Data, Path>;
35+
getOriginalProperty<
36+
Path extends RelativeBindingPath<Data, Root>,
37+
Root extends AbsoluteBindingPath<Data>,
38+
>(
39+
sPath: Path,
40+
oContext: TypedJSONContext<Data, Root>,
41+
): PropertyByRelativeBindingPath<Data, Root, Path>;
3242

3343
setData(oData: Data, bMerge?: boolean): void;
3444

test-packages/typed-json-model/webapp/model/model.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,23 @@ export class TypedJSONModel<Data extends object> extends JSONModel {
5757
| PropertyByRelativeBindingPath<Data, Root, Path>;
5858
}
5959

60+
getOriginalProperty<Path extends AbsoluteBindingPath<Data>>(sPath: Path): PropertyByAbsoluteBindingPath<Data, Path>;
61+
getOriginalProperty<Path extends RelativeBindingPath<Data, Root>, Root extends AbsoluteBindingPath<Data>>(
62+
sPath: Path,
63+
oContext: TypedJSONContext<Data, Root>,
64+
): PropertyByRelativeBindingPath<Data, Root, Path>;
65+
getOriginalProperty<
66+
Path extends AbsoluteBindingPath<Data> | RelativeBindingPath<Data, Root>,
67+
Root extends AbsoluteBindingPath<Data>,
68+
>(
69+
sPath: Path,
70+
oContext?: TypedJSONContext<Data, Root>,
71+
): PropertyByAbsoluteBindingPath<Data, Path> | PropertyByRelativeBindingPath<Data, Root, Path> {
72+
return super.getOriginalProperty(sPath, oContext) as
73+
| PropertyByAbsoluteBindingPath<Data, Path>
74+
| PropertyByRelativeBindingPath<Data, Root, Path>;
75+
}
76+
6077
setData(oData: Data, bMerge?: boolean): void {
6178
super.setData(oData, bMerge);
6279
}

test-packages/typed-json-model/webapp/model/test/cases/absolute-complex-inference.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,32 @@ import { TypedJSONModel } from "../../model";
6767
/** @expect ts2322 */ anElementInATuple = model.getProperty("/aTuple");
6868
/** @expect ts2322 */ anObject = model.getProperty("/aTuple/0");
6969

70+
/***********************************************************************************************************************
71+
* Check model.getOriginalProperty
72+
**********************************************************************************************************************/
73+
74+
/** @expect ok */ anObject = model.getOriginalProperty("/anObject");
75+
/** @expect ok */ anArray = model.getOriginalProperty("/anArray");
76+
/** @expect ok */ aJsonSafeArray = model.getOriginalProperty("/aJsonSafeArray");
77+
/** @expect ok */ aJsonSafe = model.getOriginalProperty("/aJsonSafeArray/0");
78+
/** @expect ok */ aPlaceholder = model.getOriginalProperty("/aPlaceholder");
79+
/** @expect ok */ anArrayOfPlaceholders = model.getOriginalProperty("/anArrayOfPlaceholders");
80+
/** @expect ok */ anotherPlaceholder = model.getOriginalProperty("/anArrayOfPlaceholders/0");
81+
/** @expect ok */ aTuple = model.getOriginalProperty("/aTuple");
82+
/** @expect ok */ anElementInATuple = model.getOriginalProperty("/aTuple/0");
83+
84+
/** @expect ts2345 */ anything = model.getOriginalProperty("/anObject/0");
85+
/** @expect ts2345 */ anything = model.getOriginalProperty("/doesNotExist");
86+
/** @expect ts2345 */ anything = model.getOriginalProperty("/anArray/0/doesNotExist");
87+
88+
/** @expect ts2739 */ aPlaceholder = model.getOriginalProperty("/anObject");
89+
/** @expect ts2322 */ anArrayOfPlaceholders = model.getOriginalProperty("/aJsonSafeArray");
90+
/** @expect ts2322 */ anObject = model.getOriginalProperty("/aJsonSafeArray/0");
91+
/** @expect ts2322 */ aJsonSafe = model.getOriginalProperty("/aPlaceholder");
92+
/** @expect ts2322 */ aJsonSafe = model.getOriginalProperty("/anArrayOfPlaceholders/0");
93+
/** @expect ts2322 */ anElementInATuple = model.getOriginalProperty("/aTuple");
94+
/** @expect ts2322 */ anObject = model.getOriginalProperty("/aTuple/0");
95+
7096
/***********************************************************************************************************************
7197
* Check model.getData / model.setData
7298
**********************************************************************************************************************/

test-packages/typed-json-model/webapp/model/test/cases/absolute-complex-interface.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,32 @@ import { TypedJSONModel } from "../../model";
7171
/** @expect ts2322 */ anElementInATuple = model.getProperty("/aTuple");
7272
/** @expect ts2322 */ anObject = model.getProperty("/aTuple/0");
7373

74+
/***********************************************************************************************************************
75+
* Check model.getOriginalProperty
76+
**********************************************************************************************************************/
77+
78+
/** @expect ok */ anObject = model.getOriginalProperty("/anObject");
79+
/** @expect ok */ anArray = model.getOriginalProperty("/anArray");
80+
/** @expect ok */ aJsonSafeArray = model.getOriginalProperty("/aJsonSafeArray");
81+
/** @expect ok */ aJsonSafe = model.getOriginalProperty("/aJsonSafeArray/0");
82+
/** @expect ok */ aPlaceholder = model.getOriginalProperty("/aPlaceholder");
83+
/** @expect ok */ anArrayOfPlaceholders = model.getOriginalProperty("/anArrayOfPlaceholders");
84+
/** @expect ok */ anotherPlaceholder = model.getOriginalProperty("/anArrayOfPlaceholders/0");
85+
/** @expect ok */ aTuple = model.getOriginalProperty("/aTuple");
86+
/** @expect ok */ anElementInATuple = model.getOriginalProperty("/aTuple/0");
87+
88+
/** @expect ts2345 */ anything = model.getOriginalProperty("/anObject/0");
89+
/** @expect ts2345 */ anything = model.getOriginalProperty("/doesNotExist");
90+
/** @expect ts2345 */ anything = model.getOriginalProperty("/anArray/0/doesNotExist");
91+
92+
/** @expect ts2739 */ aPlaceholder = model.getOriginalProperty("/anObject");
93+
/** @expect ts2322 */ anArrayOfPlaceholders = model.getOriginalProperty("/aJsonSafeArray");
94+
/** @expect ts2322 */ anObject = model.getOriginalProperty("/aJsonSafeArray/0");
95+
/** @expect ts2322 */ aJsonSafe = model.getOriginalProperty("/aPlaceholder");
96+
/** @expect ts2322 */ aJsonSafe = model.getOriginalProperty("/anArrayOfPlaceholders/0");
97+
/** @expect ts2322 */ anElementInATuple = model.getOriginalProperty("/aTuple");
98+
/** @expect ts2322 */ anObject = model.getOriginalProperty("/aTuple/0");
99+
74100
/***********************************************************************************************************************
75101
* Check model.getData / model.setData
76102
**********************************************************************************************************************/

test-packages/typed-json-model/webapp/model/test/cases/absolute-complex-typeAlias.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,32 @@ import { TypedJSONModel } from "../../model";
7171
/** @expect ts2322 */ anElementInATuple = model.getProperty("/aTuple");
7272
/** @expect ts2322 */ anObject = model.getProperty("/aTuple/0");
7373

74+
/***********************************************************************************************************************
75+
* Check model.getOriginalProperty
76+
**********************************************************************************************************************/
77+
78+
/** @expect ok */ anObject = model.getOriginalProperty("/anObject");
79+
/** @expect ok */ anArray = model.getOriginalProperty("/anArray");
80+
/** @expect ok */ aJsonSafeArray = model.getOriginalProperty("/aJsonSafeArray");
81+
/** @expect ok */ aJsonSafe = model.getOriginalProperty("/aJsonSafeArray/0");
82+
/** @expect ok */ aPlaceholder = model.getOriginalProperty("/aPlaceholder");
83+
/** @expect ok */ anArrayOfPlaceholders = model.getOriginalProperty("/anArrayOfPlaceholders");
84+
/** @expect ok */ anotherPlaceholder = model.getOriginalProperty("/anArrayOfPlaceholders/0");
85+
/** @expect ok */ aTuple = model.getOriginalProperty("/aTuple");
86+
/** @expect ok */ anElementInATuple = model.getOriginalProperty("/aTuple/0");
87+
88+
/** @expect ts2345 */ anything = model.getOriginalProperty("/anObject/0");
89+
/** @expect ts2345 */ anything = model.getOriginalProperty("/doesNotExist");
90+
/** @expect ts2345 */ anything = model.getOriginalProperty("/anArray/0/doesNotExist");
91+
92+
/** @expect ts2739 */ aPlaceholder = model.getOriginalProperty("/anObject");
93+
/** @expect ts2322 */ anArrayOfPlaceholders = model.getOriginalProperty("/aJsonSafeArray");
94+
/** @expect ts2322 */ anObject = model.getOriginalProperty("/aJsonSafeArray/0");
95+
/** @expect ts2322 */ aJsonSafe = model.getOriginalProperty("/aPlaceholder");
96+
/** @expect ts2322 */ aJsonSafe = model.getOriginalProperty("/anArrayOfPlaceholders/0");
97+
/** @expect ts2322 */ anElementInATuple = model.getOriginalProperty("/aTuple");
98+
/** @expect ts2322 */ anObject = model.getOriginalProperty("/aTuple/0");
99+
74100
/***********************************************************************************************************************
75101
* Check model.getData / model.setData
76102
**********************************************************************************************************************/

test-packages/typed-json-model/webapp/model/test/cases/absolute-primitive-inference.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,24 @@ let aSymbol: symbol = Symbol("test");
5454

5555
// value is a symbol -> not JSON serializable!
5656
/** @expect ts2322 */ aSymbol = model.getProperty("/aSymbol");
57+
58+
/***********************************************************************************************************************
59+
* Check model.getOriginalProperty
60+
**********************************************************************************************************************/
61+
62+
/** @expect ok */ aString = model.getOriginalProperty("/aString");
63+
/** @expect ok */ aNumber = model.getOriginalProperty("/aNumber");
64+
/** @expect ok */ aBoolean = model.getOriginalProperty("/aBoolean");
65+
/** @expect ok */ aNull = model.getOriginalProperty("/aNull");
66+
/** @expect ok */ anUndefined = model.getOriginalProperty("/anUndefined");
67+
68+
/** @expect ts2345 */ const test1 = model.getOriginalProperty("/doesNotExist");
69+
70+
/** @expect ts2322 */ aNumber = model.getOriginalProperty("/aString");
71+
/** @expect ts2322 */ aString = model.getOriginalProperty("/aNumber");
72+
/** @expect ts2322 */ anUndefined = model.getOriginalProperty("/aNull");
73+
/** @expect ts2322 */ aNull = model.getOriginalProperty("/anUndefined");
74+
/** @expect ts2322 */ aBoolean = model.getOriginalProperty("/aDate");
75+
76+
// value is a symbol -> not JSON serializable!
77+
/** @expect ts2322 */ aSymbol = model.getOriginalProperty("/aSymbol");

test-packages/typed-json-model/webapp/model/test/cases/absolute-primitive-interface.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,24 @@ let aSymbol: symbol = Symbol("test");
5454

5555
// value is a symbol -> not JSON serializable!
5656
/** @expect ts2322 */ aSymbol = model.getProperty("/aSymbol");
57+
58+
/***********************************************************************************************************************
59+
* Check model.getOriginalProperty
60+
**********************************************************************************************************************/
61+
62+
/** @expect ok */ aString = model.getOriginalProperty("/aString");
63+
/** @expect ok */ aNumber = model.getOriginalProperty("/aNumber");
64+
/** @expect ok */ aBoolean = model.getOriginalProperty("/aBoolean");
65+
/** @expect ok */ aNull = model.getOriginalProperty("/aNull");
66+
/** @expect ok */ anUndefined = model.getOriginalProperty("/anUndefined");
67+
68+
/** @expect ts2345 */ const test1 = model.getOriginalProperty("/doesNotExist");
69+
70+
/** @expect ts2322 */ aNumber = model.getOriginalProperty("/aString");
71+
/** @expect ts2322 */ aString = model.getOriginalProperty("/aNumber");
72+
/** @expect ts2322 */ anUndefined = model.getOriginalProperty("/aNull");
73+
/** @expect ts2322 */ aNull = model.getOriginalProperty("/anUndefined");
74+
/** @expect ts2322 */ aBoolean = model.getOriginalProperty("/aDate");
75+
76+
// value is a symbol -> not JSON serializable!
77+
/** @expect ts2322 */ aSymbol = model.getOriginalProperty("/aSymbol");

test-packages/typed-json-model/webapp/model/test/cases/absolute-primitive-typeAilas.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,24 @@ let aSymbol: symbol = Symbol("test");
5454

5555
// value is a symbol -> not JSON serializable!
5656
/** @expect ts2322 */ aSymbol = model.getProperty("/aSymbol");
57+
58+
/***********************************************************************************************************************
59+
* Check model.getOriginalProperty
60+
**********************************************************************************************************************/
61+
62+
/** @expect ok */ aString = model.getOriginalProperty("/aString");
63+
/** @expect ok */ aNumber = model.getOriginalProperty("/aNumber");
64+
/** @expect ok */ aBoolean = model.getOriginalProperty("/aBoolean");
65+
/** @expect ok */ aNull = model.getOriginalProperty("/aNull");
66+
/** @expect ok */ anUndefined = model.getOriginalProperty("/anUndefined");
67+
68+
/** @expect ts2345 */ const test1 = model.getOriginalProperty("/doesNotExist");
69+
70+
/** @expect ts2322 */ aNumber = model.getOriginalProperty("/aString");
71+
/** @expect ts2322 */ aString = model.getOriginalProperty("/aNumber");
72+
/** @expect ts2322 */ anUndefined = model.getOriginalProperty("/aNull");
73+
/** @expect ts2322 */ aNull = model.getOriginalProperty("/anUndefined");
74+
/** @expect ts2322 */ aBoolean = model.getOriginalProperty("/aDate");
75+
76+
// value is a symbol -> not JSON serializable!
77+
/** @expect ts2322 */ aSymbol = model.getOriginalProperty("/aSymbol");

test-packages/typed-json-model/webapp/model/test/cases/edgeCases.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const array = [1, 2, 3];
1212

1313
/** @expect ok */ const model1 = new TypedJSONModel(array);
1414
/** @expect ok */ let someNumber: number = model1.getProperty("/0");
15+
/** @expect ok */ let anOriginalNumber: number = model1.getOriginalProperty("/0");
1516
/** @expect ok */ model1.setProperty("/0", 42);
1617
/** @expect ts2345 */ model1.setProperty("/0", "42");
1718

@@ -22,7 +23,9 @@ const model2 = new TypedJSONModel([] as TestArray);
2223

2324
/** @expect ok */ const someObject: { aNumber: number } = model2.getProperty("/0");
2425
/** @expect ok */ someNumber = model2.getProperty("/0/aNumber");
26+
/** @expect ok */ anOriginalNumber = model2.getOriginalProperty("/0/aNumber");
2527
/** @expect ts2322 */ const someString: string = model2.getProperty("/0");
28+
/** @expect ts2322 */ const anOriginalString: string = model2.getOriginalProperty("/0");
2629
/** @expect ok */ model2.setProperty("/0", { aNumber: 42 });
2730
/** @expect ts2345 */ model2.setProperty("/0", {});
2831

test-packages/typed-json-model/webapp/model/test/cases/relative-complex-inference.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,29 @@ import { TypedJSONModel } from "../../model";
6767
/** @expect ts2322 */ aJsonSafe = model.getProperty("anArrayOfPlaceholders/0", context);
6868
/** @expect ts2322 */ anElementInATuple = model.getProperty("aTuple", context);
6969
/** @expect ts2322 */ anObject = model.getProperty("aTuple/0", context);
70+
71+
/***********************************************************************************************************************
72+
* Check model.getOriginalProperty
73+
**********************************************************************************************************************/
74+
75+
/** @expect ok */ anObject = model.getOriginalProperty("anObject", context);
76+
/** @expect ok */ anArray = model.getOriginalProperty("anArray", context);
77+
/** @expect ok */ aJsonSafeArray = model.getOriginalProperty("aJsonSafeArray", context);
78+
/** @expect ok */ aJsonSafe = model.getOriginalProperty("aJsonSafeArray/0", context);
79+
/** @expect ok */ aPlaceholder = model.getOriginalProperty("aPlaceholder", context);
80+
/** @expect ok */ anArrayOfPlaceholders = model.getOriginalProperty("anArrayOfPlaceholders", context);
81+
/** @expect ok */ anotherPlaceholder = model.getOriginalProperty("anArrayOfPlaceholders/0", context);
82+
/** @expect ok */ aTuple = model.getOriginalProperty("aTuple", context);
83+
/** @expect ok */ anElementInATuple = model.getOriginalProperty("aTuple/0", context);
84+
85+
/** @expect ts2345 */ anything = model.getOriginalProperty("anObject/0", context);
86+
/** @expect ts2345 */ anything = model.getOriginalProperty("doesNotExist", context);
87+
/** @expect ts2345 */ anything = model.getOriginalProperty("anArray/0/doesNotExist", context);
88+
89+
/** @expect ts2739 */ aPlaceholder = model.getOriginalProperty("anObject", context);
90+
/** @expect ts2322 */ anArrayOfPlaceholders = model.getOriginalProperty("aJsonSafeArray", context);
91+
/** @expect ts2322 */ anObject = model.getOriginalProperty("aJsonSafeArray/0", context);
92+
/** @expect ts2322 */ aJsonSafe = model.getOriginalProperty("aPlaceholder", context);
93+
/** @expect ts2322 */ aJsonSafe = model.getOriginalProperty("anArrayOfPlaceholders/0", context);
94+
/** @expect ts2322 */ anElementInATuple = model.getOriginalProperty("aTuple", context);
95+
/** @expect ts2322 */ anObject = model.getOriginalProperty("aTuple/0", context);

0 commit comments

Comments
 (0)