@osdk/client 2.1.0-rc.32 → 2.2.0-beta.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/CHANGELOG.md +9 -6
- package/build/browser/Client.js +1 -1
- package/build/browser/Client.js.map +1 -1
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js +106 -0
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js.map +1 -0
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.test.js +100 -0
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.test.js.map +1 -0
- package/build/browser/object/convertWireToOsdkObjects.js +1 -1
- package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/browser/objectSet/ObjectSet.test.js +228 -0
- package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js +16 -0
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/util/UserAgent.js +1 -1
- package/build/browser/util/UserAgent.js.map +1 -1
- package/build/cjs/{chunk-65QQ6SME.cjs → chunk-T5UE6BI7.cjs} +130 -28
- package/build/cjs/chunk-T5UE6BI7.cjs.map +1 -0
- package/build/cjs/{chunk-FEUFIE6T.cjs → chunk-X7WGNFZ4.cjs} +2 -2
- package/build/cjs/{chunk-FEUFIE6T.cjs.map → chunk-X7WGNFZ4.cjs.map} +1 -1
- package/build/cjs/index.cjs +44 -44
- package/build/cjs/index.cjs.map +1 -1
- package/build/cjs/public/internal.cjs +6 -6
- package/build/cjs/public/unstable-do-not-use.cjs +3 -3
- package/build/esm/Client.js +1 -1
- package/build/esm/Client.js.map +1 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js +106 -0
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js.map +1 -0
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.test.js +100 -0
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.test.js.map +1 -0
- package/build/esm/object/convertWireToOsdkObjects.js +1 -1
- package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/esm/objectSet/ObjectSet.test.js +228 -0
- package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js +16 -0
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/util/UserAgent.js +1 -1
- package/build/esm/util/UserAgent.js.map +1 -1
- package/build/types/Client.d.ts +1 -1
- package/build/types/derivedProperties/createWithPropertiesObjectSet.d.ts +1 -0
- package/build/types/derivedProperties/createWithPropertiesObjectSet.d.ts.map +1 -0
- package/build/types/derivedProperties/createWithPropertiesObjectSet.test.d.ts +1 -0
- package/build/types/derivedProperties/createWithPropertiesObjectSet.test.d.ts.map +1 -0
- package/package.json +11 -11
- package/build/cjs/chunk-65QQ6SME.cjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
# @osdk/client
|
|
2
2
|
|
|
3
|
-
## 2.
|
|
3
|
+
## 2.2.0-beta.2
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- fccd9ac: "Allow selecting derived properties"
|
|
4
8
|
|
|
5
9
|
### Patch Changes
|
|
6
10
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
- @osdk/
|
|
10
|
-
- @osdk/
|
|
11
|
-
- @osdk/client.unstable@2.1.0-rc.32
|
|
11
|
+
- Updated dependencies [fccd9ac]
|
|
12
|
+
- @osdk/api@2.2.0-beta.2
|
|
13
|
+
- @osdk/generator-converters@2.2.0-beta.2
|
|
14
|
+
- @osdk/client.unstable@2.2.0-beta.2
|
|
12
15
|
|
|
13
16
|
## 2.1.0-beta.31
|
|
14
17
|
|
package/build/browser/Client.js
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
export const additionalContext = Symbol("additionalContext");
|
|
22
22
|
|
|
23
23
|
// BEGIN: THIS IS GENERATED CODE. DO NOT EDIT.
|
|
24
|
-
const MaxOsdkVersion = "2.
|
|
24
|
+
const MaxOsdkVersion = "2.2.0";
|
|
25
25
|
// END: THIS IS GENERATED CODE. DO NOT EDIT.
|
|
26
26
|
|
|
27
27
|
const ErrorMessage = Symbol("ErrorMessage");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.js","names":["additionalContext","Symbol","MaxOsdkVersion","ErrorMessage"],"sources":["Client.ts"],"sourcesContent":["/*\n * Copyright 2023 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionMetadata,\n CompileTimeMetadata,\n InterfaceDefinition,\n InterfaceMetadata,\n ObjectMetadata,\n ObjectSet,\n ObjectTypeDefinition,\n QueryDefinition,\n QueryMetadata,\n VersionBound,\n} from \"@osdk/api\";\nimport type {\n Experiment,\n ExperimentFns,\n MinimalObjectSet,\n} from \"@osdk/api/unstable\";\nimport type { SharedClient } from \"@osdk/shared.client2\";\nimport type { ActionSignatureFromDef } from \"./actions/applyAction.js\";\nimport type { MinimalClient } from \"./MinimalClientContext.js\";\nimport type { QuerySignatureFromDef } from \"./queries/types.js\";\nimport type { SatisfiesSemver } from \"./SatisfiesSemver.js\";\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\ntype OldSharedClient = import(\"@osdk/shared.client\").SharedClient;\n\nexport type CheckVersionBound<Q> = Q extends VersionBound<infer V> ? (\n SatisfiesSemver<V, MaxOsdkVersion> extends true ? Q\n : Q & {\n [ErrorMessage]:\n `Your SDK requires a semver compatible version with ${V}. You have ${MaxOsdkVersion}. Update your package.json`;\n }\n )\n : Q;\n\nexport interface Client extends SharedClient, OldSharedClient {\n <Q extends ObjectTypeDefinition>(\n o: Q,\n ): unknown extends CompileTimeMetadata<Q>[\"objectSet\"] ? ObjectSet<Q>\n : CompileTimeMetadata<Q>[\"objectSet\"];\n\n <Q extends (InterfaceDefinition)>(\n o: Q,\n ): unknown extends CompileTimeMetadata<Q>[\"objectSet\"] ? MinimalObjectSet<Q>\n : CompileTimeMetadata<Q>[\"objectSet\"];\n\n <Q extends ActionDefinition<any>>(\n o: Q,\n ): ActionSignatureFromDef<Q>;\n\n <Q extends QueryDefinition<any>>(\n o: Q,\n ): QuerySignatureFromDef<Q>;\n\n <Q extends Experiment<\"2.0.8\"> | Experiment<\"2.1.0\">>(\n experiment: Q,\n ): ExperimentFns<Q>;\n\n fetchMetadata<\n Q extends (\n | ObjectTypeDefinition\n | InterfaceDefinition\n | ActionDefinition<any>\n | QueryDefinition<any>\n ),\n >(o: Q): Promise<\n Q extends ObjectTypeDefinition ? ObjectMetadata\n : Q extends InterfaceDefinition ? InterfaceMetadata\n : Q extends ActionDefinition<any> ? ActionMetadata\n : Q extends QueryDefinition<any> ? QueryMetadata\n : never\n >;\n\n /** @internal */\n [additionalContext]: MinimalClient;\n}\n\n// DO NOT EXPORT FROM PACKAGE\n/** @internal */\nexport const additionalContext: unique symbol = Symbol(\"additionalContext\");\n\n// BEGIN: THIS IS GENERATED CODE. DO NOT EDIT.\nconst MaxOsdkVersion = \"2.
|
|
1
|
+
{"version":3,"file":"Client.js","names":["additionalContext","Symbol","MaxOsdkVersion","ErrorMessage"],"sources":["Client.ts"],"sourcesContent":["/*\n * Copyright 2023 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionMetadata,\n CompileTimeMetadata,\n InterfaceDefinition,\n InterfaceMetadata,\n ObjectMetadata,\n ObjectSet,\n ObjectTypeDefinition,\n QueryDefinition,\n QueryMetadata,\n VersionBound,\n} from \"@osdk/api\";\nimport type {\n Experiment,\n ExperimentFns,\n MinimalObjectSet,\n} from \"@osdk/api/unstable\";\nimport type { SharedClient } from \"@osdk/shared.client2\";\nimport type { ActionSignatureFromDef } from \"./actions/applyAction.js\";\nimport type { MinimalClient } from \"./MinimalClientContext.js\";\nimport type { QuerySignatureFromDef } from \"./queries/types.js\";\nimport type { SatisfiesSemver } from \"./SatisfiesSemver.js\";\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\ntype OldSharedClient = import(\"@osdk/shared.client\").SharedClient;\n\nexport type CheckVersionBound<Q> = Q extends VersionBound<infer V> ? (\n SatisfiesSemver<V, MaxOsdkVersion> extends true ? Q\n : Q & {\n [ErrorMessage]:\n `Your SDK requires a semver compatible version with ${V}. You have ${MaxOsdkVersion}. Update your package.json`;\n }\n )\n : Q;\n\nexport interface Client extends SharedClient, OldSharedClient {\n <Q extends ObjectTypeDefinition>(\n o: Q,\n ): unknown extends CompileTimeMetadata<Q>[\"objectSet\"] ? ObjectSet<Q>\n : CompileTimeMetadata<Q>[\"objectSet\"];\n\n <Q extends (InterfaceDefinition)>(\n o: Q,\n ): unknown extends CompileTimeMetadata<Q>[\"objectSet\"] ? MinimalObjectSet<Q>\n : CompileTimeMetadata<Q>[\"objectSet\"];\n\n <Q extends ActionDefinition<any>>(\n o: Q,\n ): ActionSignatureFromDef<Q>;\n\n <Q extends QueryDefinition<any>>(\n o: Q,\n ): QuerySignatureFromDef<Q>;\n\n <Q extends Experiment<\"2.0.8\"> | Experiment<\"2.1.0\">>(\n experiment: Q,\n ): ExperimentFns<Q>;\n\n fetchMetadata<\n Q extends (\n | ObjectTypeDefinition\n | InterfaceDefinition\n | ActionDefinition<any>\n | QueryDefinition<any>\n ),\n >(o: Q): Promise<\n Q extends ObjectTypeDefinition ? ObjectMetadata\n : Q extends InterfaceDefinition ? InterfaceMetadata\n : Q extends ActionDefinition<any> ? ActionMetadata\n : Q extends QueryDefinition<any> ? QueryMetadata\n : never\n >;\n\n /** @internal */\n [additionalContext]: MinimalClient;\n}\n\n// DO NOT EXPORT FROM PACKAGE\n/** @internal */\nexport const additionalContext: unique symbol = Symbol(\"additionalContext\");\n\n// BEGIN: THIS IS GENERATED CODE. DO NOT EDIT.\nconst MaxOsdkVersion = \"2.2.0\";\n// END: THIS IS GENERATED CODE. DO NOT EDIT.\nexport type MaxOsdkVersion = typeof MaxOsdkVersion;\nconst ErrorMessage: unique symbol = Symbol(\"ErrorMessage\");\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA0BA;;AAsDA;AACA;AACA,OAAO,MAAMA,iBAAgC,GAAGC,MAAM,CAAC,mBAAmB,CAAC;;AAE3E;AACA,MAAMC,cAAc,GAAG,OAAO;AAC9B;;AAEA,MAAMC,YAA2B,GAAGF,MAAM,CAAC,cAAc,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2024 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import invariant from "tiny-invariant";
|
|
18
|
+
import { modernToLegacyWhereClause } from "../internal/conversions/modernToLegacyWhereClause.js";
|
|
19
|
+
const idCounter = 0;
|
|
20
|
+
|
|
21
|
+
/** @internal */
|
|
22
|
+
export function createWithPropertiesObjectSet(objectType, objectSet, definitionMap) {
|
|
23
|
+
return {
|
|
24
|
+
pivotTo: link => {
|
|
25
|
+
return createWithPropertiesObjectSet(objectType, {
|
|
26
|
+
type: "searchAround",
|
|
27
|
+
objectSet,
|
|
28
|
+
link
|
|
29
|
+
}, definitionMap);
|
|
30
|
+
},
|
|
31
|
+
where: clause => {
|
|
32
|
+
return createWithPropertiesObjectSet(objectType, {
|
|
33
|
+
type: "filter",
|
|
34
|
+
objectSet: objectSet,
|
|
35
|
+
where: modernToLegacyWhereClause(clause, objectType)
|
|
36
|
+
}, definitionMap);
|
|
37
|
+
},
|
|
38
|
+
aggregate: (aggregation, opt) => {
|
|
39
|
+
const splitAggregation = aggregation.split(":");
|
|
40
|
+
!(splitAggregation.length === 2 || splitAggregation[0] === "$count") ? process.env.NODE_ENV !== "production" ? invariant(false, "Invalid aggregation format") : invariant(false) : void 0;
|
|
41
|
+
const [aggregationPropertyName, aggregationOperation] = splitAggregation;
|
|
42
|
+
let aggregationOperationDefinition;
|
|
43
|
+
switch (aggregationOperation) {
|
|
44
|
+
case "sum":
|
|
45
|
+
case "avg":
|
|
46
|
+
case "min":
|
|
47
|
+
case "max":
|
|
48
|
+
case "exactDistinct":
|
|
49
|
+
case "approximateDistinct":
|
|
50
|
+
aggregationOperationDefinition = {
|
|
51
|
+
type: aggregationOperation,
|
|
52
|
+
selectedPropertyApiName: aggregationPropertyName
|
|
53
|
+
};
|
|
54
|
+
break;
|
|
55
|
+
case "approximatePercentile":
|
|
56
|
+
aggregationOperationDefinition = {
|
|
57
|
+
type: "approximatePercentile",
|
|
58
|
+
selectedPropertyApiName: aggregationPropertyName,
|
|
59
|
+
approximatePercentile: opt?.percentile ?? .5
|
|
60
|
+
};
|
|
61
|
+
break;
|
|
62
|
+
case "collectSet":
|
|
63
|
+
case "collectList":
|
|
64
|
+
aggregationOperationDefinition = {
|
|
65
|
+
type: aggregationOperation,
|
|
66
|
+
selectedPropertyApiName: aggregationPropertyName,
|
|
67
|
+
limit: opt?.limit ?? 100
|
|
68
|
+
};
|
|
69
|
+
break;
|
|
70
|
+
case undefined:
|
|
71
|
+
if (aggregationPropertyName === "$count") {
|
|
72
|
+
aggregationOperationDefinition = {
|
|
73
|
+
type: "count"
|
|
74
|
+
};
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
default:
|
|
78
|
+
process.env.NODE_ENV !== "production" ? invariant(false, "Invalid aggregation operation " + aggregationOperation) : invariant(false);
|
|
79
|
+
}
|
|
80
|
+
const selectorResult = {
|
|
81
|
+
type: {}
|
|
82
|
+
};
|
|
83
|
+
definitionMap.set(selectorResult, {
|
|
84
|
+
type: "selection",
|
|
85
|
+
objectSet: objectSet,
|
|
86
|
+
operation: aggregationOperationDefinition
|
|
87
|
+
});
|
|
88
|
+
return selectorResult;
|
|
89
|
+
},
|
|
90
|
+
selectProperty: name => {
|
|
91
|
+
const selectorResult = {
|
|
92
|
+
type: {}
|
|
93
|
+
};
|
|
94
|
+
definitionMap.set(selectorResult, {
|
|
95
|
+
type: "selection",
|
|
96
|
+
objectSet: objectSet,
|
|
97
|
+
operation: {
|
|
98
|
+
type: "get",
|
|
99
|
+
selectedPropertyApiName: name
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
return selectorResult;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=createWithPropertiesObjectSet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createWithPropertiesObjectSet.js","names":["invariant","modernToLegacyWhereClause","idCounter","createWithPropertiesObjectSet","objectType","objectSet","definitionMap","pivotTo","link","type","where","clause","aggregate","aggregation","opt","splitAggregation","split","length","process","env","NODE_ENV","aggregationPropertyName","aggregationOperation","aggregationOperationDefinition","selectedPropertyApiName","approximatePercentile","percentile","limit","undefined","selectorResult","set","operation","selectProperty","name"],"sources":["createWithPropertiesObjectSet.ts"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { DerivedProperty, ObjectOrInterfaceDefinition } from \"@osdk/api\";\nimport type {\n DerivedPropertyDefinition,\n ObjectSet as WireObjectSet,\n SelectedPropertyOperation,\n} from \"@osdk/foundry.ontologies\";\nimport invariant from \"tiny-invariant\";\nimport { modernToLegacyWhereClause } from \"../internal/conversions/modernToLegacyWhereClause.js\";\n\nconst idCounter = 0;\n\n/** @internal */\nexport function createWithPropertiesObjectSet<\n Q extends ObjectOrInterfaceDefinition,\n>(\n objectType: Q,\n objectSet: WireObjectSet,\n definitionMap: Map<any, DerivedPropertyDefinition>,\n): DerivedProperty.SelectPropertyBuilder<Q, false> {\n const base: DerivedProperty.SelectPropertyBuilder<Q, false> = {\n pivotTo: (link) => {\n return createWithPropertiesObjectSet(objectType, {\n type: \"searchAround\",\n objectSet,\n link,\n }, definitionMap);\n },\n where: (clause) => {\n return createWithPropertiesObjectSet(objectType, {\n type: \"filter\",\n objectSet: objectSet,\n where: modernToLegacyWhereClause(clause, objectType),\n }, definitionMap);\n },\n aggregate: (aggregation: string, opt: any) => {\n const splitAggregation = aggregation.split(\":\");\n invariant(\n splitAggregation.length === 2 || splitAggregation[0] === \"$count\",\n \"Invalid aggregation format\",\n );\n const [aggregationPropertyName, aggregationOperation] = splitAggregation;\n let aggregationOperationDefinition: SelectedPropertyOperation;\n switch (aggregationOperation) {\n case \"sum\":\n case \"avg\":\n case \"min\":\n case \"max\":\n case \"exactDistinct\":\n case \"approximateDistinct\":\n aggregationOperationDefinition = {\n type: aggregationOperation,\n selectedPropertyApiName: aggregationPropertyName,\n };\n break;\n case \"approximatePercentile\":\n aggregationOperationDefinition = {\n type: \"approximatePercentile\",\n selectedPropertyApiName: aggregationPropertyName,\n approximatePercentile: opt?.percentile ?? .5,\n };\n break;\n case \"collectSet\":\n case \"collectList\":\n aggregationOperationDefinition = {\n type: aggregationOperation,\n selectedPropertyApiName: aggregationPropertyName,\n limit: opt?.limit ?? 100,\n };\n break;\n case undefined:\n if (aggregationPropertyName === \"$count\") {\n aggregationOperationDefinition = {\n type: \"count\",\n };\n break;\n }\n default:\n invariant(\n false,\n \"Invalid aggregation operation \" + aggregationOperation,\n );\n }\n const selectorResult: DerivedProperty.SelectorResult<any> = { type: {} };\n definitionMap.set(selectorResult, {\n type: \"selection\",\n objectSet: objectSet,\n operation: aggregationOperationDefinition,\n });\n return selectorResult;\n },\n selectProperty: (name) => {\n const selectorResult: DerivedProperty.SelectorResult<any> = { type: {} };\n definitionMap.set(selectorResult, {\n type: \"selection\",\n objectSet: objectSet,\n operation: {\n type: \"get\",\n selectedPropertyApiName: name,\n },\n });\n return selectorResult;\n },\n };\n\n return base;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { Employee } from "@osdk/client.test.ontology";
|
|
18
|
+
import { describe, expect, it } from "vitest";
|
|
19
|
+
import { createWithPropertiesObjectSet } from "./createWithPropertiesObjectSet.js";
|
|
20
|
+
describe(createWithPropertiesObjectSet, () => {
|
|
21
|
+
it("correctly creates basic object set with derived properties", () => {
|
|
22
|
+
const map = new Map();
|
|
23
|
+
const deriveObjectSet = createWithPropertiesObjectSet(Employee, {
|
|
24
|
+
type: "methodInput"
|
|
25
|
+
}, map);
|
|
26
|
+
const result = {
|
|
27
|
+
"derivedPropertyName": base => base.pivotTo("lead").selectProperty("employeeId")
|
|
28
|
+
}["derivedPropertyName"](deriveObjectSet);
|
|
29
|
+
const definition = map.get(result);
|
|
30
|
+
expect(definition).toMatchInlineSnapshot(`
|
|
31
|
+
{
|
|
32
|
+
"objectSet": {
|
|
33
|
+
"link": "lead",
|
|
34
|
+
"objectSet": {
|
|
35
|
+
"type": "methodInput",
|
|
36
|
+
},
|
|
37
|
+
"type": "searchAround",
|
|
38
|
+
},
|
|
39
|
+
"operation": {
|
|
40
|
+
"selectedPropertyApiName": "employeeId",
|
|
41
|
+
"type": "get",
|
|
42
|
+
},
|
|
43
|
+
"type": "selection",
|
|
44
|
+
}
|
|
45
|
+
`);
|
|
46
|
+
});
|
|
47
|
+
it("correctly handles multiple definitions in one clause", () => {
|
|
48
|
+
const map = new Map();
|
|
49
|
+
const deriveObjectSet = createWithPropertiesObjectSet(Employee, {
|
|
50
|
+
type: "methodInput"
|
|
51
|
+
}, map);
|
|
52
|
+
const clause = {
|
|
53
|
+
"derivedPropertyName": base => base.pivotTo("lead").aggregate("employeeId:approximatePercentile", {
|
|
54
|
+
percentile: 0.5
|
|
55
|
+
}),
|
|
56
|
+
"secondaryDerivedPropertyName": base => base.pivotTo("lead").aggregate("fullName:collectSet", {
|
|
57
|
+
limit: 10
|
|
58
|
+
})
|
|
59
|
+
};
|
|
60
|
+
const result = clause["derivedPropertyName"](deriveObjectSet);
|
|
61
|
+
const definition = map.get(result);
|
|
62
|
+
const secondResult = clause["secondaryDerivedPropertyName"](deriveObjectSet);
|
|
63
|
+
const secondDefinition = map.get(secondResult);
|
|
64
|
+
expect(definition).toMatchInlineSnapshot(`
|
|
65
|
+
{
|
|
66
|
+
"objectSet": {
|
|
67
|
+
"link": "lead",
|
|
68
|
+
"objectSet": {
|
|
69
|
+
"type": "methodInput",
|
|
70
|
+
},
|
|
71
|
+
"type": "searchAround",
|
|
72
|
+
},
|
|
73
|
+
"operation": {
|
|
74
|
+
"approximatePercentile": 0.5,
|
|
75
|
+
"selectedPropertyApiName": "employeeId",
|
|
76
|
+
"type": "approximatePercentile",
|
|
77
|
+
},
|
|
78
|
+
"type": "selection",
|
|
79
|
+
}
|
|
80
|
+
`);
|
|
81
|
+
expect(secondDefinition).toMatchInlineSnapshot(`
|
|
82
|
+
{
|
|
83
|
+
"objectSet": {
|
|
84
|
+
"link": "lead",
|
|
85
|
+
"objectSet": {
|
|
86
|
+
"type": "methodInput",
|
|
87
|
+
},
|
|
88
|
+
"type": "searchAround",
|
|
89
|
+
},
|
|
90
|
+
"operation": {
|
|
91
|
+
"limit": 10,
|
|
92
|
+
"selectedPropertyApiName": "fullName",
|
|
93
|
+
"type": "collectSet",
|
|
94
|
+
},
|
|
95
|
+
"type": "selection",
|
|
96
|
+
}
|
|
97
|
+
`);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=createWithPropertiesObjectSet.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createWithPropertiesObjectSet.test.js","names":["Employee","describe","expect","it","createWithPropertiesObjectSet","map","Map","deriveObjectSet","type","result","base","pivotTo","selectProperty","definition","get","toMatchInlineSnapshot","clause","aggregate","percentile","limit","secondResult","secondDefinition"],"sources":["createWithPropertiesObjectSet.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { DerivedProperty } from \"@osdk/api\";\nimport { Employee } from \"@osdk/client.test.ontology\";\nimport type { DerivedPropertyDefinition } from \"@osdk/foundry.ontologies\";\nimport { describe, expect, it } from \"vitest\";\nimport { createWithPropertiesObjectSet } from \"./createWithPropertiesObjectSet.js\";\n\ndescribe(createWithPropertiesObjectSet, () => {\n it(\"correctly creates basic object set with derived properties\", () => {\n const map = new Map<any, DerivedPropertyDefinition>();\n const deriveObjectSet = createWithPropertiesObjectSet(Employee, {\n type: \"methodInput\",\n }, map);\n\n const clause = {\n \"derivedPropertyName\": (base) =>\n base.pivotTo(\"lead\").selectProperty(\"employeeId\"),\n } satisfies DerivedProperty.Clause<Employee>;\n\n const result = clause[\"derivedPropertyName\"](deriveObjectSet);\n const definition = map.get(result);\n expect(definition).toMatchInlineSnapshot(`\n {\n \"objectSet\": {\n \"link\": \"lead\",\n \"objectSet\": {\n \"type\": \"methodInput\",\n },\n \"type\": \"searchAround\",\n },\n \"operation\": {\n \"selectedPropertyApiName\": \"employeeId\",\n \"type\": \"get\",\n },\n \"type\": \"selection\",\n }\n `);\n });\n\n it(\"correctly handles multiple definitions in one clause\", () => {\n const map = new Map<any, DerivedPropertyDefinition>();\n const deriveObjectSet = createWithPropertiesObjectSet(Employee, {\n type: \"methodInput\",\n }, map);\n\n const clause: DerivedProperty.Clause<Employee> = {\n \"derivedPropertyName\": (base) =>\n base.pivotTo(\"lead\").aggregate(\"employeeId:approximatePercentile\", {\n percentile: 0.5,\n }),\n\n \"secondaryDerivedPropertyName\": (base) =>\n base.pivotTo(\"lead\").aggregate(\"fullName:collectSet\", {\n limit: 10,\n }),\n };\n\n const result = clause[\"derivedPropertyName\"](deriveObjectSet);\n const definition = map.get(result);\n\n const secondResult = clause[\"secondaryDerivedPropertyName\"](\n deriveObjectSet,\n );\n const secondDefinition = map.get(secondResult);\n\n expect(definition).toMatchInlineSnapshot(`\n {\n \"objectSet\": {\n \"link\": \"lead\",\n \"objectSet\": {\n \"type\": \"methodInput\",\n },\n \"type\": \"searchAround\",\n },\n \"operation\": {\n \"approximatePercentile\": 0.5,\n \"selectedPropertyApiName\": \"employeeId\",\n \"type\": \"approximatePercentile\",\n },\n \"type\": \"selection\",\n }\n `);\n\n expect(secondDefinition).toMatchInlineSnapshot(`\n {\n \"objectSet\": {\n \"link\": \"lead\",\n \"objectSet\": {\n \"type\": \"methodInput\",\n },\n \"type\": \"searchAround\",\n },\n \"operation\": {\n \"limit\": 10,\n \"selectedPropertyApiName\": \"fullName\",\n \"type\": \"collectSet\",\n },\n \"type\": \"selection\",\n }\n `);\n });\n});\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,QAAQ,QAAQ,4BAA4B;AAErD,SAASC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,6BAA6B,QAAQ,oCAAoC;AAElFH,QAAQ,CAACG,6BAA6B,EAAE,MAAM;EAC5CD,EAAE,CAAC,4DAA4D,EAAE,MAAM;IACrE,MAAME,GAAG,GAAG,IAAIC,GAAG,CAAiC,CAAC;IACrD,MAAMC,eAAe,GAAGH,6BAA6B,CAACJ,QAAQ,EAAE;MAC9DQ,IAAI,EAAE;IACR,CAAC,EAAEH,GAAG,CAAC;IAOP,MAAMI,MAAM,GALG;MACb,qBAAqB,EAAGC,IAAI,IAC1BA,IAAI,CAACC,OAAO,CAAC,MAAM,CAAC,CAACC,cAAc,CAAC,YAAY;IACpD,CAAC,CAEqB,qBAAqB,CAAC,CAACL,eAAe,CAAC;IAC7D,MAAMM,UAAU,GAAGR,GAAG,CAACS,GAAG,CAACL,MAAM,CAAC;IAClCP,MAAM,CAACW,UAAU,CAAC,CAACE,qBAAqB,CAAC;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC;EACN,CAAC,CAAC;EAEFZ,EAAE,CAAC,sDAAsD,EAAE,MAAM;IAC/D,MAAME,GAAG,GAAG,IAAIC,GAAG,CAAiC,CAAC;IACrD,MAAMC,eAAe,GAAGH,6BAA6B,CAACJ,QAAQ,EAAE;MAC9DQ,IAAI,EAAE;IACR,CAAC,EAAEH,GAAG,CAAC;IAEP,MAAMW,MAAwC,GAAG;MAC/C,qBAAqB,EAAGN,IAAI,IAC1BA,IAAI,CAACC,OAAO,CAAC,MAAM,CAAC,CAACM,SAAS,CAAC,kCAAkC,EAAE;QACjEC,UAAU,EAAE;MACd,CAAC,CAAC;MAEJ,8BAA8B,EAAGR,IAAI,IACnCA,IAAI,CAACC,OAAO,CAAC,MAAM,CAAC,CAACM,SAAS,CAAC,qBAAqB,EAAE;QACpDE,KAAK,EAAE;MACT,CAAC;IACL,CAAC;IAED,MAAMV,MAAM,GAAGO,MAAM,CAAC,qBAAqB,CAAC,CAACT,eAAe,CAAC;IAC7D,MAAMM,UAAU,GAAGR,GAAG,CAACS,GAAG,CAACL,MAAM,CAAC;IAElC,MAAMW,YAAY,GAAGJ,MAAM,CAAC,8BAA8B,CAAC,CACzDT,eACF,CAAC;IACD,MAAMc,gBAAgB,GAAGhB,GAAG,CAACS,GAAG,CAACM,YAAY,CAAC;IAE9ClB,MAAM,CAACW,UAAU,CAAC,CAACE,qBAAqB,CAAC;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC;IAEJb,MAAM,CAACmB,gBAAgB,CAAC,CAACN,qBAAqB,CAAC;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,CAAC;EACN,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -141,7 +141,7 @@ function reframeAsObjectInPlace(objectDef, interfaceApiName, rawObj) {
|
|
|
141
141
|
}
|
|
142
142
|
function isConforming(client, def, obj, propsToCheck) {
|
|
143
143
|
for (const propName of propsToCheck) {
|
|
144
|
-
if (def.properties[propName].nullable === false && obj[propName] == null) {
|
|
144
|
+
if (propName in def.properties && def.properties[propName].nullable === false && obj[propName] == null) {
|
|
145
145
|
if (process.env.NODE_ENV !== "production") {
|
|
146
146
|
client.logger?.debug({
|
|
147
147
|
obj: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertWireToOsdkObjects.js","names":["invariant","createOsdkObject","convertWireToOsdkObjects","client","objects","interfaceApiName","forceRemoveRid","selectedProps","strictNonNull","logger","debug","fixObjectPropertiesInPlace","ifaceDef","ontologyProvider","getInterfaceDefinition","undefined","ifaceSelected","Object","keys","properties","ret","rawObj","objectDef","getObjectDefinition","$apiName","process","env","NODE_ENV","objProps","conforming","invariantInterfacesAsViews","apiName","isConforming","reframeAsObjectInPlace","convertInterfacePropNamesToObjectPropNames","Error","osdkObject","$as","push","convertWireToOsdkObjects2","interfaceToObjectTypeMappings","interfaceToObjMapping","filter","val","includes","values","primaryKeyApiName","ifacePropsToMap","map","ifaceProp","interfaceMap","newProps","sptProp","regularProp","entries","value","assign","$primaryKey","def","obj","propsToCheck","propName","nullable","$objectType","warning","warn","console","error","objs","__rid","$rid","__apiName","__primaryKey","$title","__title"],"sources":["convertWireToOsdkObjects.ts"],"sourcesContent":["/*\n * Copyright 2023 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n InterfaceMetadata,\n NullabilityAdherence,\n ObjectMetadata,\n ObjectOrInterfaceDefinition,\n Osdk,\n} from \"@osdk/api\";\nimport type {\n InterfaceToObjectTypeMappings,\n InterfaceTypeApiName,\n OntologyObjectV2,\n} from \"@osdk/foundry.ontologies\";\nimport invariant from \"tiny-invariant\";\nimport type { MinimalClient } from \"../MinimalClientContext.js\";\nimport {\n type FetchedObjectTypeDefinition,\n} from \"../ontology/OntologyProvider.js\";\nimport { createOsdkObject } from \"./convertWireToOsdkObjects/createOsdkObject.js\";\n\n/**\n * If interfaceApiName is not undefined, converts the instances of the\n * interface into their respective\n * underlying concrete types and then returns the $as() representation\n * for the consumers.\n *\n * Otherwise just does the conversion\n *\n * May mutate in place for performance reasons. If you need a clean copy,\n * keep it first.\n *\n * However, you must use the returned value, which will be whatever is correct.\n *\n * @internal\n * @param interfaceApiName - if undefined\n */\nexport async function convertWireToOsdkObjects(\n client: MinimalClient,\n objects: OntologyObjectV2[],\n interfaceApiName: string | undefined,\n forceRemoveRid: boolean = false,\n selectedProps?: ReadonlyArray<string>,\n strictNonNull: NullabilityAdherence = false,\n): Promise<Osdk.Instance<ObjectOrInterfaceDefinition>[]> {\n client.logger?.debug(`START convertWireToOsdkObjects()`);\n\n fixObjectPropertiesInPlace(objects, forceRemoveRid);\n\n const ifaceDef = interfaceApiName\n ? await client.ontologyProvider.getInterfaceDefinition(interfaceApiName)\n : undefined;\n const ifaceSelected = ifaceDef\n ? (selectedProps ?? Object.keys(ifaceDef.properties))\n : undefined;\n\n const ret = [];\n for (const rawObj of objects) {\n const objectDef = await client.ontologyProvider.getObjectDefinition(\n rawObj.$apiName,\n );\n invariant(objectDef, `Missing definition for '${rawObj.$apiName}'`);\n\n // default value for when we are checking an object\n let objProps;\n\n let conforming = true;\n if (ifaceDef && ifaceSelected) {\n // API returns interface spt names but we cache by real values\n invariantInterfacesAsViews(objectDef, ifaceDef.apiName, client);\n\n conforming &&= isConforming(client, ifaceDef, rawObj, ifaceSelected);\n\n reframeAsObjectInPlace(objectDef, ifaceDef.apiName, rawObj);\n\n objProps = convertInterfacePropNamesToObjectPropNames(\n objectDef,\n ifaceDef.apiName,\n ifaceSelected,\n );\n } else {\n objProps = selectedProps ?? Object.keys(objectDef.properties);\n }\n\n conforming &&= isConforming(client, objectDef, rawObj, objProps);\n\n if (strictNonNull === \"throw\" && !conforming) {\n throw new Error(\n \"Unable to safely convert objects as some non nullable properties are null\",\n );\n } else if (strictNonNull === \"drop\" && !conforming) {\n continue;\n }\n\n let osdkObject = createOsdkObject(client, objectDef, rawObj);\n if (interfaceApiName) osdkObject = osdkObject.$as(interfaceApiName);\n\n ret.push(osdkObject);\n }\n\n client.logger?.debug(`END convertWireToOsdkObjects()`);\n return ret;\n}\n\n/**\n * @internal\n */\nexport async function convertWireToOsdkObjects2(\n client: MinimalClient,\n objects: OntologyObjectV2[],\n interfaceApiName: string | undefined,\n forceRemoveRid: boolean = false,\n selectedProps?: ReadonlyArray<string>,\n strictNonNull: NullabilityAdherence = false,\n interfaceToObjectTypeMappings: Record<\n InterfaceTypeApiName,\n InterfaceToObjectTypeMappings\n > = {},\n): Promise<Osdk.Instance<ObjectOrInterfaceDefinition>[]> {\n client.logger?.debug(`START convertWireToOsdkObjects2()`);\n\n fixObjectPropertiesInPlace(objects, forceRemoveRid);\n\n const ret = [];\n for (const rawObj of objects) {\n const objectDef = await client.ontologyProvider.getObjectDefinition(\n rawObj.$apiName,\n );\n invariant(objectDef, `Missing definition for '${rawObj.$apiName}'`);\n\n const interfaceToObjMapping = interfaceApiName\n ? interfaceToObjectTypeMappings[interfaceApiName as InterfaceTypeApiName][\n rawObj.$apiName\n ]\n : undefined;\n\n const ifaceSelected = interfaceApiName && interfaceToObjMapping\n ? (selectedProps\n ? Object.keys(interfaceToObjMapping).filter(\n val => {\n selectedProps?.includes(interfaceToObjMapping[val]);\n },\n )\n : [\n ...Object.values(interfaceToObjMapping),\n objectDef.primaryKeyApiName,\n ])\n : undefined;\n\n // default value for when we are checking an object\n let objProps;\n\n let conforming = true;\n if (interfaceApiName && ifaceSelected) {\n invariantInterfacesAsViews(objectDef, interfaceApiName, client);\n\n objProps = ifaceSelected;\n } else {\n objProps = selectedProps ?? Object.keys(objectDef.properties);\n }\n\n conforming &&= isConforming(client, objectDef, rawObj, objProps);\n\n if (strictNonNull === \"throw\" && !conforming) {\n throw new Error(\n \"Unable to safely convert objects as some non nullable properties are null\",\n );\n } else if (strictNonNull === \"drop\" && !conforming) {\n continue;\n }\n\n let osdkObject = createOsdkObject(client, objectDef, rawObj);\n if (interfaceApiName) osdkObject = osdkObject.$as(interfaceApiName);\n\n ret.push(osdkObject);\n }\n\n client.logger?.debug(`END convertWireToOsdkObjects2()`);\n return ret;\n}\n\n/**\n * Utility function that lets us take down selected property names from an interface\n * and convert them to an array of property names on an object.\n */\nfunction convertInterfacePropNamesToObjectPropNames(\n objectDef: FetchedObjectTypeDefinition & { interfaceMap: {} },\n interfaceApiName: string,\n ifacePropsToMap: readonly string[],\n) {\n return ifacePropsToMap.map((ifaceProp) =>\n objectDef.interfaceMap[interfaceApiName][ifaceProp]\n );\n}\n\n/**\n * Takes a raw object from the wire (contextually as an interface) and\n * updates the fields to reflect the underlying objectDef instead\n * @param objectDef\n * @param interfaceApiName\n * @param client\n * @param rawObj\n */\nfunction reframeAsObjectInPlace(\n objectDef: FetchedObjectTypeDefinition & { interfaceMap: {} },\n interfaceApiName: string,\n rawObj: OntologyObjectV2,\n) {\n const newProps: Record<string, any> = {};\n for (\n const [sptProp, regularProp] of Object.entries(\n objectDef.interfaceMap[interfaceApiName],\n )\n ) {\n if (sptProp in rawObj) {\n const value = rawObj[sptProp];\n delete rawObj[sptProp];\n if (value !== undefined) {\n newProps[regularProp] = value;\n }\n }\n }\n Object.assign(rawObj, newProps);\n\n if (!(objectDef.primaryKeyApiName in rawObj)) {\n rawObj[objectDef.primaryKeyApiName] = rawObj.$primaryKey;\n }\n}\n\nfunction isConforming(\n client: MinimalClient,\n def:\n | InterfaceMetadata\n | ObjectMetadata,\n obj: OntologyObjectV2,\n propsToCheck: readonly string[],\n) {\n for (const propName of propsToCheck) {\n if (def.properties[propName].nullable === false && obj[propName] == null) {\n if (process.env.NODE_ENV !== \"production\") {\n client.logger?.debug(\n {\n obj: {\n $objectType: obj[\"$objectType\"],\n $primaryKey: obj[\"$primaryKey\"],\n },\n },\n `Found object that does not conform to its definition. Expected ${def.apiName}'s ${propName} to not be null.`,\n );\n }\n return false;\n }\n }\n return true;\n}\n\nfunction invariantInterfacesAsViews(\n objectDef: FetchedObjectTypeDefinition,\n interfaceApiName: string,\n client: MinimalClient,\n): asserts objectDef is typeof objectDef & { interfaceMap: {} } {\n if (objectDef.interfaceMap?.[interfaceApiName] == null) {\n const warning =\n \"Interfaces are only supported 'as views' but your metadata object is missing the correct information. This suggests your interfaces have not been migrated to the newer version yet and you cannot use this version of the SDK.\";\n if (client.logger) {\n client.logger.warn(warning);\n } else {\n // eslint-disable-next-line no-console\n console.error(`WARNING! ${warning}`);\n }\n throw new Error(warning);\n }\n}\n\nfunction fixObjectPropertiesInPlace(\n objs: OntologyObjectV2[],\n forceRemoveRid: boolean,\n) {\n for (const obj of objs) {\n if (forceRemoveRid) {\n delete obj.__rid;\n }\n\n if (obj.__rid) {\n obj.$rid = obj.__rid;\n delete obj.__rid;\n }\n\n // Backend returns as __apiName but we want to stick to $ structure\n obj.$apiName ??= obj.__apiName;\n\n // for now these are the same but when we start doing interface projections the $objectType will always be underlying and\n // the $apiName will be for the current view (in current designs)\n obj.$objectType = obj.$apiName;\n\n // copying over for now as its always returned. In the future, this should just be inferred from underlying\n obj.$primaryKey ??= obj.__primaryKey;\n obj.$title ??= obj.__title;\n\n // we don't want people to use these\n delete obj.__apiName;\n delete obj.__primaryKey;\n delete obj.__title;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"convertWireToOsdkObjects.js","names":["invariant","createOsdkObject","convertWireToOsdkObjects","client","objects","interfaceApiName","forceRemoveRid","selectedProps","strictNonNull","logger","debug","fixObjectPropertiesInPlace","ifaceDef","ontologyProvider","getInterfaceDefinition","undefined","ifaceSelected","Object","keys","properties","ret","rawObj","objectDef","getObjectDefinition","$apiName","process","env","NODE_ENV","objProps","conforming","invariantInterfacesAsViews","apiName","isConforming","reframeAsObjectInPlace","convertInterfacePropNamesToObjectPropNames","Error","osdkObject","$as","push","convertWireToOsdkObjects2","interfaceToObjectTypeMappings","interfaceToObjMapping","filter","val","includes","values","primaryKeyApiName","ifacePropsToMap","map","ifaceProp","interfaceMap","newProps","sptProp","regularProp","entries","value","assign","$primaryKey","def","obj","propsToCheck","propName","nullable","$objectType","warning","warn","console","error","objs","__rid","$rid","__apiName","__primaryKey","$title","__title"],"sources":["convertWireToOsdkObjects.ts"],"sourcesContent":["/*\n * Copyright 2023 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n InterfaceMetadata,\n NullabilityAdherence,\n ObjectMetadata,\n ObjectOrInterfaceDefinition,\n Osdk,\n} from \"@osdk/api\";\nimport type {\n InterfaceToObjectTypeMappings,\n InterfaceTypeApiName,\n OntologyObjectV2,\n} from \"@osdk/foundry.ontologies\";\nimport invariant from \"tiny-invariant\";\nimport type { MinimalClient } from \"../MinimalClientContext.js\";\nimport {\n type FetchedObjectTypeDefinition,\n} from \"../ontology/OntologyProvider.js\";\nimport { createOsdkObject } from \"./convertWireToOsdkObjects/createOsdkObject.js\";\n\n/**\n * If interfaceApiName is not undefined, converts the instances of the\n * interface into their respective\n * underlying concrete types and then returns the $as() representation\n * for the consumers.\n *\n * Otherwise just does the conversion\n *\n * May mutate in place for performance reasons. If you need a clean copy,\n * keep it first.\n *\n * However, you must use the returned value, which will be whatever is correct.\n *\n * @internal\n * @param interfaceApiName - if undefined\n */\nexport async function convertWireToOsdkObjects(\n client: MinimalClient,\n objects: OntologyObjectV2[],\n interfaceApiName: string | undefined,\n forceRemoveRid: boolean = false,\n selectedProps?: ReadonlyArray<string>,\n strictNonNull: NullabilityAdherence = false,\n): Promise<Osdk.Instance<ObjectOrInterfaceDefinition>[]> {\n client.logger?.debug(`START convertWireToOsdkObjects()`);\n\n fixObjectPropertiesInPlace(objects, forceRemoveRid);\n\n const ifaceDef = interfaceApiName\n ? await client.ontologyProvider.getInterfaceDefinition(interfaceApiName)\n : undefined;\n const ifaceSelected = ifaceDef\n ? (selectedProps ?? Object.keys(ifaceDef.properties))\n : undefined;\n\n const ret = [];\n for (const rawObj of objects) {\n const objectDef = await client.ontologyProvider.getObjectDefinition(\n rawObj.$apiName,\n );\n invariant(objectDef, `Missing definition for '${rawObj.$apiName}'`);\n\n // default value for when we are checking an object\n let objProps;\n\n let conforming = true;\n if (ifaceDef && ifaceSelected) {\n // API returns interface spt names but we cache by real values\n invariantInterfacesAsViews(objectDef, ifaceDef.apiName, client);\n\n conforming &&= isConforming(client, ifaceDef, rawObj, ifaceSelected);\n\n reframeAsObjectInPlace(objectDef, ifaceDef.apiName, rawObj);\n\n objProps = convertInterfacePropNamesToObjectPropNames(\n objectDef,\n ifaceDef.apiName,\n ifaceSelected,\n );\n } else {\n objProps = selectedProps ?? Object.keys(objectDef.properties);\n }\n\n conforming &&= isConforming(client, objectDef, rawObj, objProps);\n\n if (strictNonNull === \"throw\" && !conforming) {\n throw new Error(\n \"Unable to safely convert objects as some non nullable properties are null\",\n );\n } else if (strictNonNull === \"drop\" && !conforming) {\n continue;\n }\n\n let osdkObject = createOsdkObject(client, objectDef, rawObj);\n if (interfaceApiName) osdkObject = osdkObject.$as(interfaceApiName);\n\n ret.push(osdkObject);\n }\n\n client.logger?.debug(`END convertWireToOsdkObjects()`);\n return ret;\n}\n\n/**\n * @internal\n */\nexport async function convertWireToOsdkObjects2(\n client: MinimalClient,\n objects: OntologyObjectV2[],\n interfaceApiName: string | undefined,\n forceRemoveRid: boolean = false,\n selectedProps?: ReadonlyArray<string>,\n strictNonNull: NullabilityAdherence = false,\n interfaceToObjectTypeMappings: Record<\n InterfaceTypeApiName,\n InterfaceToObjectTypeMappings\n > = {},\n): Promise<Osdk.Instance<ObjectOrInterfaceDefinition>[]> {\n client.logger?.debug(`START convertWireToOsdkObjects2()`);\n\n fixObjectPropertiesInPlace(objects, forceRemoveRid);\n\n const ret = [];\n for (const rawObj of objects) {\n const objectDef = await client.ontologyProvider.getObjectDefinition(\n rawObj.$apiName,\n );\n invariant(objectDef, `Missing definition for '${rawObj.$apiName}'`);\n\n const interfaceToObjMapping = interfaceApiName\n ? interfaceToObjectTypeMappings[interfaceApiName as InterfaceTypeApiName][\n rawObj.$apiName\n ]\n : undefined;\n\n const ifaceSelected = interfaceApiName && interfaceToObjMapping\n ? (selectedProps\n ? Object.keys(interfaceToObjMapping).filter(\n val => {\n selectedProps?.includes(interfaceToObjMapping[val]);\n },\n )\n : [\n ...Object.values(interfaceToObjMapping),\n objectDef.primaryKeyApiName,\n ])\n : undefined;\n\n // default value for when we are checking an object\n let objProps;\n\n let conforming = true;\n if (interfaceApiName && ifaceSelected) {\n invariantInterfacesAsViews(objectDef, interfaceApiName, client);\n\n objProps = ifaceSelected;\n } else {\n objProps = selectedProps ?? Object.keys(objectDef.properties);\n }\n\n conforming &&= isConforming(client, objectDef, rawObj, objProps);\n\n if (strictNonNull === \"throw\" && !conforming) {\n throw new Error(\n \"Unable to safely convert objects as some non nullable properties are null\",\n );\n } else if (strictNonNull === \"drop\" && !conforming) {\n continue;\n }\n\n let osdkObject = createOsdkObject(client, objectDef, rawObj);\n if (interfaceApiName) osdkObject = osdkObject.$as(interfaceApiName);\n\n ret.push(osdkObject);\n }\n\n client.logger?.debug(`END convertWireToOsdkObjects2()`);\n return ret;\n}\n\n/**\n * Utility function that lets us take down selected property names from an interface\n * and convert them to an array of property names on an object.\n */\nfunction convertInterfacePropNamesToObjectPropNames(\n objectDef: FetchedObjectTypeDefinition & { interfaceMap: {} },\n interfaceApiName: string,\n ifacePropsToMap: readonly string[],\n) {\n return ifacePropsToMap.map((ifaceProp) =>\n objectDef.interfaceMap[interfaceApiName][ifaceProp]\n );\n}\n\n/**\n * Takes a raw object from the wire (contextually as an interface) and\n * updates the fields to reflect the underlying objectDef instead\n * @param objectDef\n * @param interfaceApiName\n * @param client\n * @param rawObj\n */\nfunction reframeAsObjectInPlace(\n objectDef: FetchedObjectTypeDefinition & { interfaceMap: {} },\n interfaceApiName: string,\n rawObj: OntologyObjectV2,\n) {\n const newProps: Record<string, any> = {};\n for (\n const [sptProp, regularProp] of Object.entries(\n objectDef.interfaceMap[interfaceApiName],\n )\n ) {\n if (sptProp in rawObj) {\n const value = rawObj[sptProp];\n delete rawObj[sptProp];\n if (value !== undefined) {\n newProps[regularProp] = value;\n }\n }\n }\n Object.assign(rawObj, newProps);\n\n if (!(objectDef.primaryKeyApiName in rawObj)) {\n rawObj[objectDef.primaryKeyApiName] = rawObj.$primaryKey;\n }\n}\n\nfunction isConforming(\n client: MinimalClient,\n def:\n | InterfaceMetadata\n | ObjectMetadata,\n obj: OntologyObjectV2,\n propsToCheck: readonly string[],\n) {\n for (const propName of propsToCheck) {\n if (\n propName in def.properties && def.properties[propName].nullable === false\n && obj[propName] == null\n ) {\n if (process.env.NODE_ENV !== \"production\") {\n client.logger?.debug(\n {\n obj: {\n $objectType: obj[\"$objectType\"],\n $primaryKey: obj[\"$primaryKey\"],\n },\n },\n `Found object that does not conform to its definition. Expected ${def.apiName}'s ${propName} to not be null.`,\n );\n }\n return false;\n }\n }\n return true;\n}\n\nfunction invariantInterfacesAsViews(\n objectDef: FetchedObjectTypeDefinition,\n interfaceApiName: string,\n client: MinimalClient,\n): asserts objectDef is typeof objectDef & { interfaceMap: {} } {\n if (objectDef.interfaceMap?.[interfaceApiName] == null) {\n const warning =\n \"Interfaces are only supported 'as views' but your metadata object is missing the correct information. This suggests your interfaces have not been migrated to the newer version yet and you cannot use this version of the SDK.\";\n if (client.logger) {\n client.logger.warn(warning);\n } else {\n // eslint-disable-next-line no-console\n console.error(`WARNING! ${warning}`);\n }\n throw new Error(warning);\n }\n}\n\nfunction fixObjectPropertiesInPlace(\n objs: OntologyObjectV2[],\n forceRemoveRid: boolean,\n) {\n for (const obj of objs) {\n if (forceRemoveRid) {\n delete obj.__rid;\n }\n\n if (obj.__rid) {\n obj.$rid = obj.__rid;\n delete obj.__rid;\n }\n\n // Backend returns as __apiName but we want to stick to $ structure\n obj.$apiName ??= obj.__apiName;\n\n // for now these are the same but when we start doing interface projections the $objectType will always be underlying and\n // the $apiName will be for the current view (in current designs)\n obj.$objectType = obj.$apiName;\n\n // copying over for now as its always returned. In the future, this should just be inferred from underlying\n obj.$primaryKey ??= obj.__primaryKey;\n obj.$title ??= obj.__title;\n\n // we don't want people to use these\n delete obj.__apiName;\n delete obj.__primaryKey;\n delete obj.__title;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -410,6 +410,234 @@ describe("ObjectSet", () => {
|
|
|
410
410
|
});
|
|
411
411
|
});
|
|
412
412
|
});
|
|
413
|
+
describe("Derived Properties Object Set", () => {
|
|
414
|
+
it("does not allow aggregate or selectProperty before a link type is selected", () => {
|
|
415
|
+
client(Employee).withProperties({
|
|
416
|
+
"derivedPropertyName": base =>
|
|
417
|
+
// @ts-expect-error
|
|
418
|
+
base.aggregate("employeeId:exactDistinct")
|
|
419
|
+
});
|
|
420
|
+
client(Employee).withProperties({
|
|
421
|
+
"derivedPropertyName": base =>
|
|
422
|
+
// @ts-expect-error
|
|
423
|
+
base.selectProperty("employeeId")
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
it("does not allow selectProperty when a many link was selected at any point", () => {
|
|
427
|
+
client(Employee).withProperties({
|
|
428
|
+
"derivedPropertyName": base => {
|
|
429
|
+
// @ts-expect-error
|
|
430
|
+
base.pivotTo("peeps").selectProperty("employeeId");
|
|
431
|
+
|
|
432
|
+
// @ts-expect-error
|
|
433
|
+
base.pivotTo("lead").pivotTo("peeps").selectProperty("employeeId");
|
|
434
|
+
return base.pivotTo("lead").selectProperty("employeeId");
|
|
435
|
+
}
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
it("enforces a return only of correct type", () => {
|
|
439
|
+
client(Employee).withProperties({
|
|
440
|
+
// @ts-expect-error
|
|
441
|
+
"derivedPropertyName": base => {
|
|
442
|
+
return base.pivotTo("peeps");
|
|
443
|
+
},
|
|
444
|
+
// @ts-expect-error
|
|
445
|
+
"derivedPropertyName2": () => {
|
|
446
|
+
return {
|
|
447
|
+
incorrect: "type"
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
});
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
// Executed code fails since we're providing bad strings to the function
|
|
454
|
+
it.fails("correctly narrows types of aggregate function", () => {
|
|
455
|
+
client(Employee).withProperties({
|
|
456
|
+
"derivedPropertyName": base => {
|
|
457
|
+
// @ts-expect-error
|
|
458
|
+
base.pivotTo("lead").aggregate("notAProperty:sum");
|
|
459
|
+
|
|
460
|
+
// @ts-expect-error
|
|
461
|
+
base.pivotTo("lead").aggregate(":avg");
|
|
462
|
+
|
|
463
|
+
// @ts-expect-error
|
|
464
|
+
base.pivotTo("lead").aggregate("employeeId:notAnOp");
|
|
465
|
+
|
|
466
|
+
// @ts-expect-error
|
|
467
|
+
base.pivotTo("lead").aggregate("");
|
|
468
|
+
base.pivotTo("lead").aggregate("employeeId:collectList");
|
|
469
|
+
return base.pivotTo("lead").aggregate("employeeId:sum");
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
// Executed code fails since we're providing bad strings to the function
|
|
475
|
+
it("correctly narrows types of options for aggregate functions", () => {
|
|
476
|
+
const objectSet = client(Employee).withProperties({
|
|
477
|
+
"derivedPropertyName": base => {
|
|
478
|
+
// @ts-expect-error
|
|
479
|
+
base.pivotTo("lead").aggregate("employeeId:approximateDistinct", {
|
|
480
|
+
limit: 1
|
|
481
|
+
});
|
|
482
|
+
base.pivotTo("lead").aggregate("employeeId:collectList", {
|
|
483
|
+
limit: 1
|
|
484
|
+
});
|
|
485
|
+
base.pivotTo("lead").aggregate("employeeId:collectSet", {
|
|
486
|
+
limit: 1
|
|
487
|
+
});
|
|
488
|
+
base.pivotTo("lead").aggregate("employeeId:collectList", {
|
|
489
|
+
// @ts-expect-error
|
|
490
|
+
percentile: 1
|
|
491
|
+
});
|
|
492
|
+
return base.pivotTo("lead").aggregate("employeeId:approximatePercentile", {
|
|
493
|
+
percentile: 0.5
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
expectTypeOf(objectSet).branded.toEqualTypeOf();
|
|
498
|
+
});
|
|
499
|
+
it("correctly narrows types of selectProperty function", () => {
|
|
500
|
+
client(Employee).withProperties({
|
|
501
|
+
"derivedPropertyName": base => {
|
|
502
|
+
// @ts-expect-error
|
|
503
|
+
base.pivotTo("lead").selectProperty("notAProperty");
|
|
504
|
+
return base.pivotTo("lead").selectProperty("employeeStatus");
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
it("propagates derived property type to future object set operations with correct types", () => {
|
|
509
|
+
client(Employee).withProperties({
|
|
510
|
+
"derivedPropertyName": base => base.pivotTo("lead").aggregate("employeeId:sum")
|
|
511
|
+
// @ts-expect-error
|
|
512
|
+
}).where({
|
|
513
|
+
"notAProperty": {
|
|
514
|
+
"$eq": 3
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
const numericAggregationObjectSet = client(Employee).withProperties({
|
|
518
|
+
"derivedPropertyName": base => base.pivotTo("lead").aggregate("employeeId:sum")
|
|
519
|
+
}).where({
|
|
520
|
+
"derivedPropertyName": {
|
|
521
|
+
"$eq": 3
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
expectTypeOf(numericAggregationObjectSet).toEqualTypeOf();
|
|
525
|
+
client(Employee).withProperties({
|
|
526
|
+
"derivedPropertyName": base => base.pivotTo("lead").aggregate("employeeId:collectList")
|
|
527
|
+
}).where({
|
|
528
|
+
"derivedPropertyName": {
|
|
529
|
+
"$isNull": false
|
|
530
|
+
}
|
|
531
|
+
})
|
|
532
|
+
// @ts-expect-error
|
|
533
|
+
.where({
|
|
534
|
+
"derivedPropertyName": {
|
|
535
|
+
"$eq": [1, 2]
|
|
536
|
+
}
|
|
537
|
+
});
|
|
538
|
+
const setAggregationObjectSet = client(Employee).withProperties({
|
|
539
|
+
"derivedPropertyName": base => base.pivotTo("lead").aggregate("fullName:collectSet")
|
|
540
|
+
});
|
|
541
|
+
setAggregationObjectSet.where({
|
|
542
|
+
"derivedPropertyName": {
|
|
543
|
+
"$isNull": false
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
setAggregationObjectSet.where({
|
|
547
|
+
// @ts-expect-error
|
|
548
|
+
"derivedPropertyName": {
|
|
549
|
+
"$eq": [1, 2]
|
|
550
|
+
}
|
|
551
|
+
});
|
|
552
|
+
expectTypeOf(setAggregationObjectSet).toEqualTypeOf();
|
|
553
|
+
const selectPropertyObjectSet = client(Employee).withProperties({
|
|
554
|
+
"derivedPropertyName": base => base.pivotTo("lead").selectProperty("employeeId")
|
|
555
|
+
}).where({
|
|
556
|
+
"derivedPropertyName": {
|
|
557
|
+
"$eq": 3
|
|
558
|
+
}
|
|
559
|
+
});
|
|
560
|
+
expectTypeOf(selectPropertyObjectSet).toEqualTypeOf();
|
|
561
|
+
client(Employee).withProperties({
|
|
562
|
+
"derivedPropertyName": base => base.pivotTo("lead").selectProperty("startDate")
|
|
563
|
+
}).where({
|
|
564
|
+
"derivedPropertyName": {
|
|
565
|
+
"$eq": "datetimeFilter"
|
|
566
|
+
}
|
|
567
|
+
});
|
|
568
|
+
});
|
|
569
|
+
it("correctly types multiple property definitions in one clause", () => {
|
|
570
|
+
const objectSet = client(Employee).withProperties({
|
|
571
|
+
"derivedPropertyName": base => base.pivotTo("lead").aggregate("employeeId:sum"),
|
|
572
|
+
"derivedPropertyName2": base => base.pivotTo("lead").selectProperty("fullName")
|
|
573
|
+
}).where({
|
|
574
|
+
"derivedPropertyName": {
|
|
575
|
+
"$eq": 3
|
|
576
|
+
}
|
|
577
|
+
}).where({
|
|
578
|
+
"derivedPropertyName2": {
|
|
579
|
+
"$eq": "name"
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
expectTypeOf(objectSet).toEqualTypeOf();
|
|
583
|
+
});
|
|
584
|
+
it("ensures other properties are consistently typed", () => {
|
|
585
|
+
client(Employee).withProperties({
|
|
586
|
+
"derivedPropertyName": base => base.pivotTo("lead").selectProperty("employeeId")
|
|
587
|
+
}).where({
|
|
588
|
+
"fullName": {
|
|
589
|
+
"$eq": "A"
|
|
590
|
+
}
|
|
591
|
+
});
|
|
592
|
+
client(Employee).withProperties({
|
|
593
|
+
"derivedPropertyName": base => base.pivotTo("lead").selectProperty("employeeId")
|
|
594
|
+
}).where({
|
|
595
|
+
"employeeId": {
|
|
596
|
+
"$eq": 2
|
|
597
|
+
}
|
|
598
|
+
});
|
|
599
|
+
});
|
|
600
|
+
it("allows fetching derived properties with correctly typed Osdk.Instance types", async () => {
|
|
601
|
+
const objectWithRdp = await client(Employee).withProperties({
|
|
602
|
+
"derivedPropertyName": base => base.pivotTo("lead").selectProperty("employeeId")
|
|
603
|
+
}).fetchOne(50035);
|
|
604
|
+
expectTypeOf(objectWithRdp.derivedPropertyName).toEqualTypeOf();
|
|
605
|
+
expect(objectWithRdp.derivedPropertyName).toBe(1);
|
|
606
|
+
const objectWithUndefinedRdp = await client(Employee).withProperties({
|
|
607
|
+
"derivedPropertyName": base => base.pivotTo("lead").selectProperty("employeeId")
|
|
608
|
+
}).fetchOne(50036, {
|
|
609
|
+
$select: ["derivedPropertyName"]
|
|
610
|
+
});
|
|
611
|
+
expect(objectWithUndefinedRdp.derivedPropertyName).toBeUndefined();
|
|
612
|
+
});
|
|
613
|
+
});
|
|
614
|
+
describe.each(["fetchOne", "fetchOneWithErrors"])("%s", k => {
|
|
615
|
+
describe("strictNonNull: false", () => {
|
|
616
|
+
describe("includeRid: true", () => {
|
|
617
|
+
it("returns bad data", async () => {
|
|
618
|
+
// Look at this
|
|
619
|
+
const opts = {
|
|
620
|
+
$__EXPERIMENTAL_strictNonNull: false,
|
|
621
|
+
$includeRid: true
|
|
622
|
+
};
|
|
623
|
+
const result = k === "fetchOne" ? await client(Employee).fetchOne(50033, opts) : (await client(Employee).fetchOneWithErrors(50033, opts)).value;
|
|
624
|
+
expect(result).not.toBeUndefined();
|
|
625
|
+
expectTypeOf(result).branded.toEqualTypeOf();
|
|
626
|
+
});
|
|
627
|
+
});
|
|
628
|
+
describe("includeRid: false", () => {
|
|
629
|
+
it("returns bad data", async () => {
|
|
630
|
+
const opts = {
|
|
631
|
+
$__EXPERIMENTAL_strictNonNull: false,
|
|
632
|
+
$includeRid: false
|
|
633
|
+
};
|
|
634
|
+
const result = k === "fetchOne" ? await client(Employee).fetchOne(50033, opts) : (await client(Employee).fetchOneWithErrors(50033, opts)).value;
|
|
635
|
+
expect(result).not.toBeUndefined();
|
|
636
|
+
expectTypeOf(result).branded.toEqualTypeOf();
|
|
637
|
+
});
|
|
638
|
+
});
|
|
639
|
+
});
|
|
640
|
+
});
|
|
413
641
|
describe("conversions", () => {
|
|
414
642
|
describe("strictNonNull: false", () => {
|
|
415
643
|
it("returns bad data", async () => {
|