@osdk/faux 0.3.0-beta.1 → 0.3.0-beta.3

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.
Files changed (32) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/build/browser/FauxFoundry/FauxDataStore.js +14 -9
  3. package/build/browser/FauxFoundry/FauxDataStore.js.map +1 -1
  4. package/build/browser/FauxFoundry/FauxDataStore.test.js +255 -1
  5. package/build/browser/FauxFoundry/FauxDataStore.test.js.map +1 -1
  6. package/build/browser/FauxFoundry/FauxOntology.js +4 -2
  7. package/build/browser/FauxFoundry/FauxOntology.js.map +1 -1
  8. package/build/browser/mock/OntologiesV2/Transactions.js +20 -0
  9. package/build/browser/mock/OntologiesV2/Transactions.js.map +1 -0
  10. package/build/browser/mock/OntologiesV2/index.js +1 -0
  11. package/build/browser/mock/OntologiesV2/index.js.map +1 -1
  12. package/build/cjs/index.cjs +52 -27
  13. package/build/cjs/index.cjs.map +1 -1
  14. package/build/cjs/index.d.cts +11 -4
  15. package/build/esm/FauxFoundry/FauxDataStore.js +14 -9
  16. package/build/esm/FauxFoundry/FauxDataStore.js.map +1 -1
  17. package/build/esm/FauxFoundry/FauxDataStore.test.js +255 -1
  18. package/build/esm/FauxFoundry/FauxDataStore.test.js.map +1 -1
  19. package/build/esm/FauxFoundry/FauxOntology.js +4 -2
  20. package/build/esm/FauxFoundry/FauxOntology.js.map +1 -1
  21. package/build/esm/mock/OntologiesV2/Transactions.js +20 -0
  22. package/build/esm/mock/OntologiesV2/Transactions.js.map +1 -0
  23. package/build/esm/mock/OntologiesV2/index.js +1 -0
  24. package/build/esm/mock/OntologiesV2/index.js.map +1 -1
  25. package/build/types/FauxFoundry/FauxDataStore.d.ts +2 -2
  26. package/build/types/FauxFoundry/FauxDataStore.d.ts.map +1 -1
  27. package/build/types/FauxFoundry/FauxOntology.d.ts.map +1 -1
  28. package/build/types/mock/OntologiesV2/Transactions.d.ts +3 -0
  29. package/build/types/mock/OntologiesV2/Transactions.d.ts.map +1 -0
  30. package/build/types/mock/OntologiesV2/index.d.ts +1 -0
  31. package/build/types/mock/OntologiesV2/index.d.ts.map +1 -1
  32. package/package.json +7 -7
@@ -28,6 +28,12 @@ describe(FauxDataStore, () => {
28
28
  __primaryKey: id,
29
29
  id
30
30
  }]));
31
+ const projects = Object.fromEntries(["p1", "p2"].map(id => [id, {
32
+ __apiName: "Project",
33
+ __primaryKey: id,
34
+ id,
35
+ name: `Project ${id}`
36
+ }]));
31
37
  beforeEach(() => {
32
38
  attachmentsStore = new FauxAttachmentStore();
33
39
  fauxOntology = new FauxOntology({
@@ -36,7 +42,7 @@ describe(FauxDataStore, () => {
36
42
  displayName: "foo",
37
43
  rid: "ri.foo"
38
44
  });
39
- fauxDataStore = new FauxDataStore(fauxOntology, attachmentsStore, true);
45
+ fauxDataStore = new FauxDataStore(fauxOntology, attachmentsStore, /*strict*/true);
40
46
  fauxOntology.registerObjectType({
41
47
  implementsInterfaces: [],
42
48
  implementsInterfaces2: {},
@@ -55,6 +61,20 @@ describe(FauxDataStore, () => {
55
61
  displayName: "Lead",
56
62
  linkTypeRid: "rid.link-type.327",
57
63
  foreignKeyPropertyApiName: "leadId"
64
+ }, {
65
+ apiName: "ownedProjects",
66
+ status: "EXPERIMENTAL",
67
+ objectTypeApiName: "Project",
68
+ cardinality: "MANY",
69
+ displayName: "Owned Projects",
70
+ linkTypeRid: "rid.link-type.328"
71
+ }, {
72
+ apiName: "contributedProjects",
73
+ status: "EXPERIMENTAL",
74
+ objectTypeApiName: "Project",
75
+ cardinality: "MANY",
76
+ displayName: "Contributed Projects",
77
+ linkTypeRid: "rid.link-type.329"
58
78
  }],
59
79
  objectType: {
60
80
  apiName: "Employee",
@@ -91,11 +111,81 @@ describe(FauxDataStore, () => {
91
111
  },
92
112
  sharedPropertyTypeMapping: {}
93
113
  });
114
+ fauxOntology.registerObjectType({
115
+ implementsInterfaces: [],
116
+ implementsInterfaces2: {},
117
+ linkTypes: [{
118
+ apiName: "owner",
119
+ status: "EXPERIMENTAL",
120
+ objectTypeApiName: "Employee",
121
+ cardinality: "ONE",
122
+ displayName: "Owner",
123
+ linkTypeRid: "rid.link-type.328",
124
+ foreignKeyPropertyApiName: "ownerId"
125
+ }, {
126
+ apiName: "contributors",
127
+ status: "EXPERIMENTAL",
128
+ objectTypeApiName: "Employee",
129
+ cardinality: "MANY",
130
+ displayName: "Contributors",
131
+ linkTypeRid: "rid.link-type.329"
132
+ }],
133
+ objectType: {
134
+ apiName: "Project",
135
+ description: "Project",
136
+ displayName: "Project",
137
+ rid: "ri.Project",
138
+ icon: {
139
+ color: "#0000FF",
140
+ name: "project",
141
+ type: "blueprint"
142
+ },
143
+ pluralDisplayName: "Projects",
144
+ primaryKey: "id",
145
+ properties: {
146
+ id: {
147
+ dataType: {
148
+ type: "string"
149
+ },
150
+ rid: "ri.proj.id",
151
+ displayName: "id",
152
+ description: "id"
153
+ },
154
+ name: {
155
+ dataType: {
156
+ type: "string"
157
+ },
158
+ rid: "ri.proj.name",
159
+ displayName: "name",
160
+ description: "name"
161
+ },
162
+ ownerId: {
163
+ dataType: {
164
+ type: "string"
165
+ },
166
+ rid: "ri.proj.ownerId",
167
+ displayName: "ownerId",
168
+ description: "ownerId"
169
+ }
170
+ },
171
+ status: "ACTIVE",
172
+ titleProperty: "name"
173
+ },
174
+ sharedPropertyTypeMapping: {}
175
+ });
94
176
  });
95
177
  const getLeadsAndPeeps = id => ({
96
178
  lead: fauxDataStore.getLinksOrThrow("Employee", id, "lead")[0],
97
179
  peeps: fauxDataStore.getLinksOrThrow("Employee", id, "peeps")
98
180
  });
181
+ const getProjectLinks = projectId => ({
182
+ owner: fauxDataStore.getLinksOrThrow("Project", projectId, "owner")[0],
183
+ contributors: fauxDataStore.getLinksOrThrow("Project", projectId, "contributors")
184
+ });
185
+ const getEmployeeProjectLinks = employeeId => ({
186
+ ownedProjects: fauxDataStore.getLinksOrThrow("Employee", employeeId, "ownedProjects"),
187
+ contributedProjects: fauxDataStore.getLinksOrThrow("Employee", employeeId, "contributedProjects")
188
+ });
99
189
  it("should work in the happy paths", () => {
100
190
  const {
101
191
  a,
@@ -213,6 +303,170 @@ describe(FauxDataStore, () => {
213
303
  peeps: [c] // d no longer leads b
214
304
  });
215
305
  });
306
+ it("should work with links between different object types", () => {
307
+ const {
308
+ a,
309
+ b,
310
+ c,
311
+ d
312
+ } = employees;
313
+ const {
314
+ p1,
315
+ p2
316
+ } = projects;
317
+
318
+ // Register objects
319
+ fauxDataStore.registerObject(a);
320
+ fauxDataStore.registerObject(b);
321
+ fauxDataStore.registerObject(c);
322
+ fauxDataStore.registerObject(d);
323
+ fauxDataStore.registerObject(p1);
324
+ fauxDataStore.registerObject(p2);
325
+
326
+ // 1. Assign employee as project owner (ONE cardinality)
327
+ fauxDataStore.registerLink(p1, "owner", a, "ownedProjects");
328
+ expect(getProjectLinks("p1")).toMatchObject({
329
+ owner: a,
330
+ contributors: []
331
+ });
332
+ expect(getEmployeeProjectLinks("a")).toMatchObject({
333
+ ownedProjects: [p1],
334
+ contributedProjects: []
335
+ });
336
+ expect(fauxDataStore.getObject(p1.__apiName, p1.__primaryKey)).toMatchObject({
337
+ ownerId: "a"
338
+ });
339
+
340
+ // 2. Change project ownership
341
+ fauxDataStore.registerLink(p1, "owner", b, "ownedProjects");
342
+ expect(getProjectLinks("p1")).toMatchObject({
343
+ owner: b,
344
+ contributors: []
345
+ });
346
+ expect(getEmployeeProjectLinks("a")).toMatchObject({
347
+ ownedProjects: [],
348
+ // a no longer owns p1
349
+ contributedProjects: []
350
+ });
351
+ expect(getEmployeeProjectLinks("b")).toMatchObject({
352
+ ownedProjects: [p1],
353
+ contributedProjects: []
354
+ });
355
+ expect(fauxDataStore.getObject(p1.__apiName, p1.__primaryKey)).toMatchObject({
356
+ ownerId: "b"
357
+ });
358
+
359
+ // 3. Add project contributors (MANY cardinality)
360
+ fauxDataStore.registerLink(p1, "contributors", c, "contributedProjects");
361
+ fauxDataStore.registerLink(p1, "contributors", d, "contributedProjects");
362
+ expect(getProjectLinks("p1")).toMatchObject({
363
+ owner: b,
364
+ contributors: [c, d]
365
+ });
366
+ expect(getEmployeeProjectLinks("c")).toMatchObject({
367
+ ownedProjects: [],
368
+ contributedProjects: [p1]
369
+ });
370
+ expect(getEmployeeProjectLinks("d")).toMatchObject({
371
+ ownedProjects: [],
372
+ contributedProjects: [p1]
373
+ });
374
+
375
+ // 4. Remove a contributor
376
+ fauxDataStore.unregisterLink(p1, "contributors", c, "contributedProjects");
377
+ expect(getProjectLinks("p1")).toMatchObject({
378
+ owner: b,
379
+ contributors: [d] // c is removed
380
+ });
381
+ expect(getEmployeeProjectLinks("c")).toMatchObject({
382
+ ownedProjects: [],
383
+ contributedProjects: [] // no longer contributing to p1
384
+ });
385
+ expect(getEmployeeProjectLinks("d")).toMatchObject({
386
+ ownedProjects: [],
387
+ contributedProjects: [p1] // still contributing to p1
388
+ });
389
+
390
+ // 5. Test with multiple projects
391
+ fauxDataStore.registerLink(p2, "contributors", b, "contributedProjects");
392
+ expect(getProjectLinks("p2")).toMatchObject({
393
+ owner: undefined,
394
+ contributors: [b]
395
+ });
396
+ expect(getEmployeeProjectLinks("b")).toMatchObject({
397
+ ownedProjects: [p1],
398
+ // owns p1
399
+ contributedProjects: [p2] // contributes to p2
400
+ });
401
+
402
+ // 6. Remove owner using the opposite direction for unregistering
403
+ fauxDataStore.unregisterLink(b, "ownedProjects", p1, "owner");
404
+ expect(getProjectLinks("p1")).toMatchObject({
405
+ owner: undefined,
406
+ contributors: [d]
407
+ });
408
+ expect(getEmployeeProjectLinks("b")).toMatchObject({
409
+ ownedProjects: [],
410
+ // no longer owns p1
411
+ contributedProjects: [p2]
412
+ });
413
+ expect(fauxDataStore.getObject(p1.__apiName, p1.__primaryKey)).toMatchObject({
414
+ "ownerId": undefined
415
+ });
416
+
417
+ // 7. Test setting foreign key directly on project object
418
+ const updatedP1 = {
419
+ ...p1,
420
+ ownerId: "c"
421
+ };
422
+ fauxDataStore.replaceObjectOrThrow(updatedP1);
423
+
424
+ // Verify links are automatically updated
425
+ expect(getProjectLinks("p1")).toMatchObject({
426
+ owner: c,
427
+ contributors: [d]
428
+ });
429
+ expect(getEmployeeProjectLinks("c")).toMatchObject({
430
+ ownedProjects: [p1],
431
+ contributedProjects: []
432
+ });
433
+ expect(fauxDataStore.getObject(p1.__apiName, p1.__primaryKey)).toMatchObject({
434
+ "ownerId": "c"
435
+ });
436
+
437
+ // 8. Test removing foreign key by setting it to undefined
438
+ const unlinkedP1 = {
439
+ ...p1,
440
+ ownerId: undefined
441
+ };
442
+ fauxDataStore.replaceObjectOrThrow(unlinkedP1);
443
+
444
+ // Verify links are properly removed
445
+ expect(getProjectLinks("p1")).toMatchObject({
446
+ owner: undefined,
447
+ contributors: [d]
448
+ });
449
+ expect(getEmployeeProjectLinks("c")).toMatchObject({
450
+ ownedProjects: [],
451
+ contributedProjects: []
452
+ });
453
+
454
+ // 9. Test setting multiple links through foreign keys
455
+ // Add both d and c as owners by setting one at a time
456
+ const p2WithOwner = {
457
+ ...p2,
458
+ ownerId: "d"
459
+ };
460
+ fauxDataStore.replaceObjectOrThrow(p2WithOwner);
461
+ expect(getProjectLinks("p2")).toMatchObject({
462
+ owner: d,
463
+ contributors: [b]
464
+ });
465
+ expect(getEmployeeProjectLinks("d")).toMatchObject({
466
+ ownedProjects: [p2],
467
+ contributedProjects: [p1]
468
+ });
469
+ });
216
470
  });
217
471
  });
218
472
  //# sourceMappingURL=FauxDataStore.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FauxDataStore.test.js","names":["beforeEach","describe","expect","it","FauxAttachmentStore","FauxDataStore","FauxOntology","attachmentsStore","fauxOntology","fauxDataStore","employees","Object","fromEntries","map","id","__apiName","__primaryKey","apiName","description","displayName","rid","registerObjectType","implementsInterfaces","implementsInterfaces2","linkTypes","status","objectTypeApiName","cardinality","linkTypeRid","foreignKeyPropertyApiName","objectType","icon","color","name","type","pluralDisplayName","primaryKey","properties","dataType","leadId","titleProperty","sharedPropertyTypeMapping","getLeadsAndPeeps","lead","getLinksOrThrow","peeps","a","b","c","d","registerObject","registerLink","toMatchObject","undefined","getObject","toMatchInlineSnapshot","unregisterLink"],"sources":["FauxDataStore.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 { beforeEach, describe, expect, it } from \"vitest\";\nimport type { BaseServerObject } from \"./BaseServerObject.js\";\nimport { FauxAttachmentStore } from \"./FauxAttachmentStore.js\";\nimport { FauxDataStore } from \"./FauxDataStore.js\";\nimport { FauxOntology } from \"./FauxOntology.js\";\n\ndescribe(FauxDataStore, () => {\n describe(\"Simple Employee ontology\", () => {\n let attachmentsStore: FauxAttachmentStore;\n let fauxOntology: FauxOntology;\n let fauxDataStore: FauxDataStore;\n\n const pks = [\"a\", \"b\", \"c\", \"d\"] as const;\n const employees = Object\n .fromEntries(\n pks.map((id) =>\n [id, {\n __apiName: \"Employee\",\n __primaryKey: id,\n id,\n }] as const\n ),\n ) as unknown as Record<typeof pks[number], BaseServerObject>;\n\n beforeEach(() => {\n attachmentsStore = new FauxAttachmentStore();\n fauxOntology = new FauxOntology({\n apiName: \"foo\",\n description: \"foo\",\n displayName: \"foo\",\n rid: \"ri.foo\",\n });\n fauxDataStore = new FauxDataStore(fauxOntology, attachmentsStore, true);\n\n const Employee = {\n implementsInterfaces: [],\n implementsInterfaces2: {},\n linkTypes: [{\n apiName: \"peeps\",\n status: \"EXPERIMENTAL\",\n objectTypeApiName: \"Employee\",\n cardinality: \"MANY\",\n displayName: \"Peeps\",\n linkTypeRid: \"rid.link-type.327\",\n }, {\n apiName: \"lead\",\n status: \"EXPERIMENTAL\",\n objectTypeApiName: \"Employee\",\n cardinality: \"ONE\",\n displayName: \"Lead\",\n linkTypeRid: \"rid.link-type.327\",\n foreignKeyPropertyApiName: \"leadId\",\n }],\n objectType: {\n apiName: \"Employee\",\n description: \"Employee\",\n displayName: \"Employee\",\n rid: \"ri.Employee\",\n icon: {\n color: \"#000000\",\n name: \"whoCares\",\n type: \"blueprint\",\n },\n pluralDisplayName: \"Employees\",\n primaryKey: \"id\",\n properties: {\n id: {\n dataType: { type: \"string\" },\n rid: \"ri.id\",\n displayName: \"id\",\n description: \"id\",\n },\n leadId: {\n dataType: { type: \"string\" },\n rid: \"ri.leadId\",\n displayName: \"leadId\",\n description: \"leadId\",\n },\n },\n status: \"ACTIVE\",\n titleProperty: \"id\",\n },\n sharedPropertyTypeMapping: {},\n } as const;\n\n fauxOntology.registerObjectType(Employee);\n });\n\n const getLeadsAndPeeps = (id: string) => ({\n lead: fauxDataStore.getLinksOrThrow(\"Employee\", id, \"lead\")[0],\n peeps: fauxDataStore.getLinksOrThrow(\"Employee\", id, \"peeps\"),\n });\n\n it(\"should work in the happy paths\", () => {\n const { a, b, c, d } = employees;\n\n // set a's lead to b\n fauxDataStore.registerObject(a);\n fauxDataStore.registerObject(b);\n fauxDataStore.registerLink(a, \"lead\", b, \"peeps\");\n\n expect(getLeadsAndPeeps(\"a\")).toMatchObject({\n lead: b,\n peeps: [],\n });\n expect(getLeadsAndPeeps(\"b\")).toMatchObject({\n lead: undefined,\n peeps: [a],\n });\n\n // try the reverse (many to one this time)\n fauxDataStore.registerObject(c);\n fauxDataStore.registerObject(d);\n // set c's lead to d\n fauxDataStore.registerLink(d, \"peeps\", c, \"lead\");\n\n expect(getLeadsAndPeeps(\"d\")).toMatchObject({\n lead: undefined,\n peeps: [c],\n });\n expect(getLeadsAndPeeps(\"c\")).toMatchObject({\n lead: d,\n peeps: [],\n });\n\n // set b's lead to c\n fauxDataStore.registerLink(c, \"peeps\", b, \"lead\");\n expect(fauxDataStore.getObject(b.__apiName, b.__primaryKey))\n .toMatchInlineSnapshot(`\n {\n \"__apiName\": \"Employee\",\n \"__primaryKey\": \"b\",\n \"id\": \"b\",\n \"leadId\": \"c\",\n }\n `);\n expect(getLeadsAndPeeps(\"b\")).toMatchObject({\n lead: c,\n peeps: [a],\n });\n expect(getLeadsAndPeeps(\"c\")).toMatchObject({\n lead: d,\n peeps: [b],\n });\n\n // change b's lead to d\n fauxDataStore.registerLink(d, \"peeps\", b, \"lead\");\n expect(getLeadsAndPeeps(\"b\")).toMatchObject({\n lead: d,\n peeps: [a], // b's peeps should not change\n });\n expect(fauxDataStore.getObject(b.__apiName, b.__primaryKey))\n .toMatchObject({\n leadId: \"d\",\n });\n expect(getLeadsAndPeeps(\"c\")).toMatchObject({\n lead: d,\n peeps: [], // c should no longer have b as a peep\n });\n expect(getLeadsAndPeeps(\"d\")).toMatchObject({\n lead: undefined,\n peeps: [c, b], // d has two peeps now\n });\n\n // remove b's lead\n fauxDataStore.unregisterLink(d, \"peeps\", b, \"lead\");\n expect(fauxDataStore.getObject(b.__apiName, b.__primaryKey))\n .toMatchInlineSnapshot(`\n {\n \"__apiName\": \"Employee\",\n \"__primaryKey\": \"b\",\n \"id\": \"b\",\n \"leadId\": undefined,\n }\n `);\n expect(getLeadsAndPeeps(\"b\")).toMatchObject({\n lead: undefined,\n peeps: [a], // b's peeps should not change\n });\n expect(getLeadsAndPeeps(\"d\")).toMatchObject({\n lead: undefined,\n peeps: [c], // d no longer leads b\n });\n\n // change b's lead to d but in the other direction\n fauxDataStore.registerLink(b, \"lead\", d, \"peeps\");\n expect(getLeadsAndPeeps(\"b\")).toMatchObject({\n lead: d,\n peeps: [a], // b's peeps should not change\n });\n expect(getLeadsAndPeeps(\"c\")).toMatchObject({\n lead: d,\n peeps: [], // c should no longer have b as a peep\n });\n expect(getLeadsAndPeeps(\"d\")).toMatchObject({\n lead: undefined,\n peeps: [c, b], // d has two peeps now\n });\n\n // remove b's lead in the other direction\n fauxDataStore.unregisterLink(b, \"lead\", d, \"peeps\");\n expect(getLeadsAndPeeps(\"b\")).toMatchObject({\n lead: undefined,\n peeps: [a], // b's peeps should not change\n });\n expect(getLeadsAndPeeps(\"d\")).toMatchObject({\n lead: undefined,\n peeps: [c], // d no longer leads b\n });\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"FauxDataStore.test.js","names":["beforeEach","describe","expect","it","FauxAttachmentStore","FauxDataStore","FauxOntology","attachmentsStore","fauxOntology","fauxDataStore","employees","Object","fromEntries","map","id","__apiName","__primaryKey","projects","name","apiName","description","displayName","rid","registerObjectType","implementsInterfaces","implementsInterfaces2","linkTypes","status","objectTypeApiName","cardinality","linkTypeRid","foreignKeyPropertyApiName","objectType","icon","color","type","pluralDisplayName","primaryKey","properties","dataType","leadId","titleProperty","sharedPropertyTypeMapping","ownerId","getLeadsAndPeeps","lead","getLinksOrThrow","peeps","getProjectLinks","projectId","owner","contributors","getEmployeeProjectLinks","employeeId","ownedProjects","contributedProjects","a","b","c","d","registerObject","registerLink","toMatchObject","undefined","getObject","toMatchInlineSnapshot","unregisterLink","p1","p2","updatedP1","replaceObjectOrThrow","unlinkedP1","p2WithOwner"],"sources":["FauxDataStore.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 { beforeEach, describe, expect, it } from \"vitest\";\nimport type { BaseServerObject } from \"./BaseServerObject.js\";\nimport { FauxAttachmentStore } from \"./FauxAttachmentStore.js\";\nimport { FauxDataStore } from \"./FauxDataStore.js\";\nimport { FauxOntology } from \"./FauxOntology.js\";\n\ndescribe(FauxDataStore, () => {\n describe(\"Simple Employee ontology\", () => {\n let attachmentsStore: FauxAttachmentStore;\n let fauxOntology: FauxOntology;\n let fauxDataStore: FauxDataStore;\n\n const pks = [\"a\", \"b\", \"c\", \"d\"] as const;\n const employees = Object\n .fromEntries(\n pks.map((id) =>\n [id, {\n __apiName: \"Employee\",\n __primaryKey: id,\n id,\n }] as const\n ),\n ) as unknown as Record<typeof pks[number], BaseServerObject>;\n\n const projectPks = [\"p1\", \"p2\"] as const;\n const projects = Object\n .fromEntries(\n projectPks.map((id) =>\n [id, {\n __apiName: \"Project\",\n __primaryKey: id,\n id,\n name: `Project ${id}`,\n }] as const\n ),\n ) as unknown as Record<typeof projectPks[number], BaseServerObject>;\n\n beforeEach(() => {\n attachmentsStore = new FauxAttachmentStore();\n fauxOntology = new FauxOntology({\n apiName: \"foo\",\n description: \"foo\",\n displayName: \"foo\",\n rid: \"ri.foo\",\n });\n fauxDataStore = new FauxDataStore(\n fauxOntology,\n attachmentsStore,\n /*strict*/ true,\n );\n\n const Employee = {\n implementsInterfaces: [],\n implementsInterfaces2: {},\n linkTypes: [{\n apiName: \"peeps\",\n status: \"EXPERIMENTAL\",\n objectTypeApiName: \"Employee\",\n cardinality: \"MANY\",\n displayName: \"Peeps\",\n linkTypeRid: \"rid.link-type.327\",\n }, {\n apiName: \"lead\",\n status: \"EXPERIMENTAL\",\n objectTypeApiName: \"Employee\",\n cardinality: \"ONE\",\n displayName: \"Lead\",\n linkTypeRid: \"rid.link-type.327\",\n foreignKeyPropertyApiName: \"leadId\",\n }, {\n apiName: \"ownedProjects\",\n status: \"EXPERIMENTAL\",\n objectTypeApiName: \"Project\",\n cardinality: \"MANY\",\n displayName: \"Owned Projects\",\n linkTypeRid: \"rid.link-type.328\",\n }, {\n apiName: \"contributedProjects\",\n status: \"EXPERIMENTAL\",\n objectTypeApiName: \"Project\",\n cardinality: \"MANY\",\n displayName: \"Contributed Projects\",\n linkTypeRid: \"rid.link-type.329\",\n }],\n objectType: {\n apiName: \"Employee\",\n description: \"Employee\",\n displayName: \"Employee\",\n rid: \"ri.Employee\",\n icon: {\n color: \"#000000\",\n name: \"whoCares\",\n type: \"blueprint\",\n },\n pluralDisplayName: \"Employees\",\n primaryKey: \"id\",\n properties: {\n id: {\n dataType: { type: \"string\" },\n rid: \"ri.id\",\n displayName: \"id\",\n description: \"id\",\n },\n leadId: {\n dataType: { type: \"string\" },\n rid: \"ri.leadId\",\n displayName: \"leadId\",\n description: \"leadId\",\n },\n },\n status: \"ACTIVE\",\n titleProperty: \"id\",\n },\n sharedPropertyTypeMapping: {},\n } as const;\n\n const Project = {\n implementsInterfaces: [],\n implementsInterfaces2: {},\n linkTypes: [{\n apiName: \"owner\",\n status: \"EXPERIMENTAL\",\n objectTypeApiName: \"Employee\",\n cardinality: \"ONE\",\n displayName: \"Owner\",\n linkTypeRid: \"rid.link-type.328\",\n foreignKeyPropertyApiName: \"ownerId\",\n }, {\n apiName: \"contributors\",\n status: \"EXPERIMENTAL\",\n objectTypeApiName: \"Employee\",\n cardinality: \"MANY\",\n displayName: \"Contributors\",\n linkTypeRid: \"rid.link-type.329\",\n }],\n objectType: {\n apiName: \"Project\",\n description: \"Project\",\n displayName: \"Project\",\n rid: \"ri.Project\",\n icon: {\n color: \"#0000FF\",\n name: \"project\",\n type: \"blueprint\",\n },\n pluralDisplayName: \"Projects\",\n primaryKey: \"id\",\n properties: {\n id: {\n dataType: { type: \"string\" },\n rid: \"ri.proj.id\",\n displayName: \"id\",\n description: \"id\",\n },\n name: {\n dataType: { type: \"string\" },\n rid: \"ri.proj.name\",\n displayName: \"name\",\n description: \"name\",\n },\n ownerId: {\n dataType: { type: \"string\" },\n rid: \"ri.proj.ownerId\",\n displayName: \"ownerId\",\n description: \"ownerId\",\n },\n },\n status: \"ACTIVE\",\n titleProperty: \"name\",\n },\n sharedPropertyTypeMapping: {},\n } as const;\n\n fauxOntology.registerObjectType(Employee);\n fauxOntology.registerObjectType(Project);\n });\n\n const getLeadsAndPeeps = (id: string) => ({\n lead: fauxDataStore.getLinksOrThrow(\"Employee\", id, \"lead\")[0],\n peeps: fauxDataStore.getLinksOrThrow(\"Employee\", id, \"peeps\"),\n });\n\n const getProjectLinks = (projectId: string) => ({\n owner: fauxDataStore.getLinksOrThrow(\"Project\", projectId, \"owner\")[0],\n contributors: fauxDataStore.getLinksOrThrow(\n \"Project\",\n projectId,\n \"contributors\",\n ),\n });\n\n const getEmployeeProjectLinks = (employeeId: string) => ({\n ownedProjects: fauxDataStore.getLinksOrThrow(\n \"Employee\",\n employeeId,\n \"ownedProjects\",\n ),\n contributedProjects: fauxDataStore.getLinksOrThrow(\n \"Employee\",\n employeeId,\n \"contributedProjects\",\n ),\n });\n\n it(\"should work in the happy paths\", () => {\n const { a, b, c, d } = employees;\n\n // set a's lead to b\n fauxDataStore.registerObject(a);\n fauxDataStore.registerObject(b);\n fauxDataStore.registerLink(a, \"lead\", b, \"peeps\");\n\n expect(getLeadsAndPeeps(\"a\")).toMatchObject({\n lead: b,\n peeps: [],\n });\n expect(getLeadsAndPeeps(\"b\")).toMatchObject({\n lead: undefined,\n peeps: [a],\n });\n\n // try the reverse (many to one this time)\n fauxDataStore.registerObject(c);\n fauxDataStore.registerObject(d);\n // set c's lead to d\n fauxDataStore.registerLink(d, \"peeps\", c, \"lead\");\n\n expect(getLeadsAndPeeps(\"d\")).toMatchObject({\n lead: undefined,\n peeps: [c],\n });\n expect(getLeadsAndPeeps(\"c\")).toMatchObject({\n lead: d,\n peeps: [],\n });\n\n // set b's lead to c\n fauxDataStore.registerLink(c, \"peeps\", b, \"lead\");\n expect(fauxDataStore.getObject(b.__apiName, b.__primaryKey))\n .toMatchInlineSnapshot(`\n {\n \"__apiName\": \"Employee\",\n \"__primaryKey\": \"b\",\n \"id\": \"b\",\n \"leadId\": \"c\",\n }\n `);\n expect(getLeadsAndPeeps(\"b\")).toMatchObject({\n lead: c,\n peeps: [a],\n });\n expect(getLeadsAndPeeps(\"c\")).toMatchObject({\n lead: d,\n peeps: [b],\n });\n\n // change b's lead to d\n fauxDataStore.registerLink(d, \"peeps\", b, \"lead\");\n expect(getLeadsAndPeeps(\"b\")).toMatchObject({\n lead: d,\n peeps: [a], // b's peeps should not change\n });\n expect(fauxDataStore.getObject(b.__apiName, b.__primaryKey))\n .toMatchObject({\n leadId: \"d\",\n });\n expect(getLeadsAndPeeps(\"c\")).toMatchObject({\n lead: d,\n peeps: [], // c should no longer have b as a peep\n });\n expect(getLeadsAndPeeps(\"d\")).toMatchObject({\n lead: undefined,\n peeps: [c, b], // d has two peeps now\n });\n\n // remove b's lead\n fauxDataStore.unregisterLink(d, \"peeps\", b, \"lead\");\n expect(fauxDataStore.getObject(b.__apiName, b.__primaryKey))\n .toMatchInlineSnapshot(`\n {\n \"__apiName\": \"Employee\",\n \"__primaryKey\": \"b\",\n \"id\": \"b\",\n \"leadId\": undefined,\n }\n `);\n expect(getLeadsAndPeeps(\"b\")).toMatchObject({\n lead: undefined,\n peeps: [a], // b's peeps should not change\n });\n expect(getLeadsAndPeeps(\"d\")).toMatchObject({\n lead: undefined,\n peeps: [c], // d no longer leads b\n });\n\n // change b's lead to d but in the other direction\n fauxDataStore.registerLink(b, \"lead\", d, \"peeps\");\n expect(getLeadsAndPeeps(\"b\")).toMatchObject({\n lead: d,\n peeps: [a], // b's peeps should not change\n });\n expect(getLeadsAndPeeps(\"c\")).toMatchObject({\n lead: d,\n peeps: [], // c should no longer have b as a peep\n });\n expect(getLeadsAndPeeps(\"d\")).toMatchObject({\n lead: undefined,\n peeps: [c, b], // d has two peeps now\n });\n\n // remove b's lead in the other direction\n fauxDataStore.unregisterLink(b, \"lead\", d, \"peeps\");\n expect(getLeadsAndPeeps(\"b\")).toMatchObject({\n lead: undefined,\n peeps: [a], // b's peeps should not change\n });\n expect(getLeadsAndPeeps(\"d\")).toMatchObject({\n lead: undefined,\n peeps: [c], // d no longer leads b\n });\n });\n\n it(\"should work with links between different object types\", () => {\n const { a, b, c, d } = employees;\n const { p1, p2 } = projects;\n\n // Register objects\n fauxDataStore.registerObject(a);\n fauxDataStore.registerObject(b);\n fauxDataStore.registerObject(c);\n fauxDataStore.registerObject(d);\n fauxDataStore.registerObject(p1);\n fauxDataStore.registerObject(p2);\n\n // 1. Assign employee as project owner (ONE cardinality)\n fauxDataStore.registerLink(p1, \"owner\", a, \"ownedProjects\");\n\n expect(getProjectLinks(\"p1\")).toMatchObject({\n owner: a,\n contributors: [],\n });\n expect(getEmployeeProjectLinks(\"a\")).toMatchObject({\n ownedProjects: [p1],\n contributedProjects: [],\n });\n expect(fauxDataStore.getObject(p1.__apiName, p1.__primaryKey))\n .toMatchObject({\n ownerId: \"a\",\n });\n\n // 2. Change project ownership\n fauxDataStore.registerLink(p1, \"owner\", b, \"ownedProjects\");\n\n expect(getProjectLinks(\"p1\")).toMatchObject({\n owner: b,\n contributors: [],\n });\n expect(getEmployeeProjectLinks(\"a\")).toMatchObject({\n ownedProjects: [], // a no longer owns p1\n contributedProjects: [],\n });\n expect(getEmployeeProjectLinks(\"b\")).toMatchObject({\n ownedProjects: [p1],\n contributedProjects: [],\n });\n expect(fauxDataStore.getObject(p1.__apiName, p1.__primaryKey))\n .toMatchObject({\n ownerId: \"b\",\n });\n\n // 3. Add project contributors (MANY cardinality)\n fauxDataStore.registerLink(p1, \"contributors\", c, \"contributedProjects\");\n fauxDataStore.registerLink(p1, \"contributors\", d, \"contributedProjects\");\n\n expect(getProjectLinks(\"p1\")).toMatchObject({\n owner: b,\n contributors: [c, d],\n });\n expect(getEmployeeProjectLinks(\"c\")).toMatchObject({\n ownedProjects: [],\n contributedProjects: [p1],\n });\n expect(getEmployeeProjectLinks(\"d\")).toMatchObject({\n ownedProjects: [],\n contributedProjects: [p1],\n });\n\n // 4. Remove a contributor\n fauxDataStore.unregisterLink(\n p1,\n \"contributors\",\n c,\n \"contributedProjects\",\n );\n\n expect(getProjectLinks(\"p1\")).toMatchObject({\n owner: b,\n contributors: [d], // c is removed\n });\n expect(getEmployeeProjectLinks(\"c\")).toMatchObject({\n ownedProjects: [],\n contributedProjects: [], // no longer contributing to p1\n });\n expect(getEmployeeProjectLinks(\"d\")).toMatchObject({\n ownedProjects: [],\n contributedProjects: [p1], // still contributing to p1\n });\n\n // 5. Test with multiple projects\n fauxDataStore.registerLink(p2, \"contributors\", b, \"contributedProjects\");\n\n expect(getProjectLinks(\"p2\")).toMatchObject({\n owner: undefined,\n contributors: [b],\n });\n expect(getEmployeeProjectLinks(\"b\")).toMatchObject({\n ownedProjects: [p1], // owns p1\n contributedProjects: [p2], // contributes to p2\n });\n\n // 6. Remove owner using the opposite direction for unregistering\n fauxDataStore.unregisterLink(b, \"ownedProjects\", p1, \"owner\");\n\n expect(getProjectLinks(\"p1\")).toMatchObject({\n owner: undefined,\n contributors: [d],\n });\n expect(getEmployeeProjectLinks(\"b\")).toMatchObject({\n ownedProjects: [], // no longer owns p1\n contributedProjects: [p2],\n });\n expect(fauxDataStore.getObject(p1.__apiName, p1.__primaryKey))\n .toMatchObject({\n \"ownerId\": undefined,\n });\n\n // 7. Test setting foreign key directly on project object\n const updatedP1 = {\n ...p1,\n ownerId: \"c\",\n };\n fauxDataStore.replaceObjectOrThrow(updatedP1);\n\n // Verify links are automatically updated\n expect(getProjectLinks(\"p1\")).toMatchObject({\n owner: c,\n contributors: [d],\n });\n expect(getEmployeeProjectLinks(\"c\")).toMatchObject({\n ownedProjects: [p1],\n contributedProjects: [],\n });\n expect(fauxDataStore.getObject(p1.__apiName, p1.__primaryKey))\n .toMatchObject({\n \"ownerId\": \"c\",\n });\n\n // 8. Test removing foreign key by setting it to undefined\n const unlinkedP1 = {\n ...p1,\n ownerId: undefined,\n };\n fauxDataStore.replaceObjectOrThrow(unlinkedP1);\n\n // Verify links are properly removed\n expect(getProjectLinks(\"p1\")).toMatchObject({\n owner: undefined,\n contributors: [d],\n });\n expect(getEmployeeProjectLinks(\"c\")).toMatchObject({\n ownedProjects: [],\n contributedProjects: [],\n });\n\n // 9. Test setting multiple links through foreign keys\n // Add both d and c as owners by setting one at a time\n const p2WithOwner = {\n ...p2,\n ownerId: \"d\",\n };\n fauxDataStore.replaceObjectOrThrow(p2WithOwner);\n\n expect(getProjectLinks(\"p2\")).toMatchObject({\n owner: d,\n contributors: [b],\n });\n expect(getEmployeeProjectLinks(\"d\")).toMatchObject({\n ownedProjects: [p2],\n contributedProjects: [p1],\n });\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -33,7 +33,8 @@ export class FauxOntology {
33
33
  objectTypes: {},
34
34
  ontology,
35
35
  queryTypes: {},
36
- sharedPropertyTypes: {}
36
+ sharedPropertyTypes: {},
37
+ valueTypes: {}
37
38
  };
38
39
  }
39
40
  get apiName() {
@@ -52,7 +53,8 @@ export class FauxOntology {
52
53
  actionTypes: filterRecord(this.#ontology.actionTypes, request.actionTypes),
53
54
  queryTypes: this.#getFilteredQueryTypes(request),
54
55
  interfaceTypes: filterRecord(this.#ontology.interfaceTypes, request.interfaceTypes),
55
- sharedPropertyTypes: {}
56
+ sharedPropertyTypes: {},
57
+ valueTypes: {}
56
58
  };
57
59
  }
58
60
  getAllInterfaceTypes() {
@@ -1 +1 @@
1
- {"version":3,"file":"FauxOntology.js","names":["semver","valid","invariant","ActionNotFoundError","LinkTypeNotFound","ObjectNotFoundError","ObjectTypeDoesNotExistError","QueryNotFoundError","OpenApiCallError","FauxOntology","ontology","actionImpl","Map","queryImpl","constructor","actionTypes","interfaceTypes","objectTypes","queryTypes","sharedPropertyTypes","apiName","getOntologyFullMetadata","getFilteredOntologyMetadata","request","Object","fromEntries","entries","filter","objectType","includes","map","objectTypeApiName","objectTypeDefinition","linkTypes","linkType","filterRecord","getFilteredQueryTypes","getAllInterfaceTypes","values","getAllObjectTypes","getAllActionTypes","getAllQueryTypes","getInterfaceType","interfaceType","ret","undefined","getObjectTypeFullMetadata","getObjectTypeFullMetadataOrThrow","getActionDef","actionTypeApiName","actionType","getActionImpl","impl","get","process","env","NODE_ENV","getQueryDef","queryTypeApiNameAndVersion","queryType","convertToVersionedApiName","getQueryImpl","queryTypeApiName","version","versionMap","rsort","Array","from","keys","getInterfaceToObjectTypeMappings","objectApiNames","objectDefs","ifaceToObjMap","objDef","ifaceApiName","properties","implementsInterfaces2","getLinkTypeSideV2","linkTypeName","find","a","getOtherLinkTypeSideV2OrThrow","thisSideLink","otherObj","candidates","l","linkTypeRid","length","candidate","getBothLinkTypeSides","leftObjectType","leftLinkName","rightObjectType","leftTypeSideV2","rightTypeSideV2","registerObjectType","def","Error","registerActionType","implementation","set","registerQueryType","has","registerInterfaceType","registerSharedPropertyType","#getFilteredQueryTypes","remappedQueryTypes","x","queryTypeDefinition","indexOf","#convertToVersionedApiName","extractVersion","split","record","key"],"sources":["FauxOntology.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 ObjectTypeDefinition } from \"@osdk/api\";\nimport type * as OntologiesV2 from \"@osdk/foundry.ontologies\";\nimport type {\n LoadOntologyMetadataRequest,\n VersionedQueryTypeApiName,\n} from \"@osdk/internal.foundry.ontologies\";\nimport semver, { valid } from \"semver\";\nimport invariant from \"tiny-invariant\";\nimport type { ReadonlyDeep } from \"type-fest\";\nimport {\n ActionNotFoundError,\n LinkTypeNotFound,\n ObjectNotFoundError,\n ObjectTypeDoesNotExistError,\n QueryNotFoundError,\n} from \"../errors.js\";\nimport { OpenApiCallError } from \"../handlers/util/handleOpenApiCall.js\";\nimport type { FauxActionImpl } from \"./FauxActionImpl.js\";\nimport type { FauxQueryImpl } from \"./FauxQueryImpl.js\";\nimport type { TH_ObjectTypeFullMetadata } from \"./typeHelpers/TH_ObjectTypeFullMetadata.js\";\n\n/**\n * Currently Unsupported Concepts:\n * - many:many links.\n */\nexport class FauxOntology {\n #ontology: OntologiesV2.OntologyFullMetadata;\n #actionImpl: Map<OntologiesV2.ActionTypeApiName, FauxActionImpl> = new Map();\n #queryImpl: Map<\n OntologiesV2.QueryApiName,\n Map<OntologiesV2.FunctionVersion, FauxQueryImpl>\n > = new Map();\n\n constructor(ontology: OntologiesV2.OntologyV2) {\n this.#ontology = {\n actionTypes: {},\n interfaceTypes: {},\n objectTypes: {},\n ontology,\n queryTypes: {},\n sharedPropertyTypes: {},\n };\n }\n\n get apiName(): OntologiesV2.OntologyApiName {\n return this.#ontology.ontology.apiName;\n }\n\n getOntologyFullMetadata(): OntologiesV2.OntologyFullMetadata {\n return this.#ontology;\n }\n\n getFilteredOntologyMetadata(\n request: OntologiesV2.LoadOntologyMetadataRequest,\n ): OntologiesV2.OntologyFullMetadata {\n return {\n ontology: this.#ontology.ontology,\n objectTypes: Object.fromEntries(\n Object.entries(this.#ontology.objectTypes).filter(([objectType]) =>\n request.objectTypes.includes(objectType)\n ).map(([objectTypeApiName, objectTypeDefinition]) => [\n objectTypeApiName,\n {\n ...objectTypeDefinition,\n linkTypes: objectTypeDefinition.linkTypes.filter(linkType =>\n request.linkTypes.includes(linkType.apiName)\n ),\n },\n ]),\n ),\n actionTypes: filterRecord(\n this.#ontology.actionTypes,\n request.actionTypes,\n ),\n queryTypes: this.#getFilteredQueryTypes(request),\n\n interfaceTypes: filterRecord(\n this.#ontology.interfaceTypes,\n request.interfaceTypes,\n ),\n sharedPropertyTypes: {},\n };\n }\n\n getAllInterfaceTypes(): OntologiesV2.InterfaceType[] {\n return Object.values(this.#ontology.interfaceTypes);\n }\n\n getAllObjectTypes(): OntologiesV2.ObjectTypeFullMetadata[] {\n return Object.values(this.#ontology.objectTypes);\n }\n\n getAllActionTypes(): OntologiesV2.ActionTypeV2[] {\n return Object.values(this.#ontology.actionTypes);\n }\n\n getAllQueryTypes(): OntologiesV2.QueryTypeV2[] {\n return Object.values(this.#ontology.queryTypes);\n }\n\n getInterfaceType(interfaceType: string): OntologiesV2.InterfaceType {\n const ret = this.#ontology.interfaceTypes[interfaceType];\n\n if (ret === undefined) {\n throw new OpenApiCallError(\n 404,\n ObjectNotFoundError(interfaceType, \"\"),\n );\n }\n\n return (\n this.#ontology.interfaceTypes[interfaceType]\n );\n }\n\n public getObjectTypeFullMetadata(\n objectTypeApiName: string,\n ): OntologiesV2.ObjectTypeFullMetadata | undefined {\n return this.#ontology.objectTypes[objectTypeApiName];\n }\n\n public getObjectTypeFullMetadataOrThrow(\n objectTypeApiName: string,\n ): OntologiesV2.ObjectTypeFullMetadata {\n const objectType = this.#ontology.objectTypes[objectTypeApiName];\n if (objectType === undefined) {\n throw new OpenApiCallError(\n 404,\n ObjectTypeDoesNotExistError(objectTypeApiName),\n );\n }\n return objectType;\n }\n\n public getActionDef(actionTypeApiName: string): OntologiesV2.ActionTypeV2 {\n const actionType = this.#ontology.actionTypes[actionTypeApiName];\n if (actionType === undefined) {\n throw new OpenApiCallError(\n 404,\n ActionNotFoundError(),\n );\n }\n return actionType;\n }\n\n public getActionImpl(actionTypeApiName: string): FauxActionImpl {\n const impl = this.#actionImpl.get(actionTypeApiName);\n invariant(impl, \"Action implementation not found for \" + actionTypeApiName);\n return impl;\n }\n\n public getQueryDef(\n queryTypeApiNameAndVersion: string,\n ): OntologiesV2.QueryTypeV2 {\n const queryType = this.#ontology\n .queryTypes[this.#convertToVersionedApiName(queryTypeApiNameAndVersion)];\n if (queryType === undefined) {\n throw new OpenApiCallError(\n 404,\n QueryNotFoundError(queryTypeApiNameAndVersion),\n );\n }\n return queryType;\n }\n\n public getQueryImpl(\n queryTypeApiName: string,\n version?: string,\n ): FauxQueryImpl {\n const versionMap = this.#queryImpl.get(queryTypeApiName);\n\n const impl = version !== undefined\n ? versionMap?.get(version)\n : versionMap?.get(semver.rsort(Array.from(versionMap.keys() ?? []))[0]);\n\n if (!impl) {\n throw new OpenApiCallError(\n 404,\n QueryNotFoundError(queryTypeApiName),\n );\n }\n invariant(impl, \"Query implementation not found for \" + queryTypeApiName);\n return impl;\n }\n\n public getInterfaceToObjectTypeMappings(\n objectApiNames: Iterable<OntologiesV2.ObjectTypeApiName>,\n ): Record<\n OntologiesV2.InterfaceTypeApiName,\n OntologiesV2.InterfaceToObjectTypeMappings\n > {\n const objectDefs = Array.from(objectApiNames).map(apiName =>\n this.getObjectTypeFullMetadataOrThrow(apiName)\n );\n\n const ifaceToObjMap: Record<\n OntologiesV2.InterfaceTypeApiName,\n OntologiesV2.InterfaceToObjectTypeMappings\n > = {};\n\n for (const objDef of objectDefs) {\n for (\n const [ifaceApiName, { properties }] of Object.entries(\n objDef.implementsInterfaces2,\n )\n ) {\n if (ifaceToObjMap[ifaceApiName] === undefined) {\n ifaceToObjMap[ifaceApiName] = {};\n }\n\n ifaceToObjMap[ifaceApiName][objDef.objectType.apiName] = properties;\n }\n }\n\n return ifaceToObjMap;\n }\n\n public getLinkTypeSideV2(\n objectTypeApiName: string,\n linkTypeName: string,\n ): OntologiesV2.LinkTypeSideV2 {\n const objectType = this.getObjectTypeFullMetadataOrThrow(objectTypeApiName);\n const linkType = objectType.linkTypes.find((a) =>\n a.apiName === linkTypeName\n );\n if (linkType === undefined) {\n throw new OpenApiCallError(\n 404,\n LinkTypeNotFound(objectTypeApiName, linkTypeName),\n );\n }\n return linkType;\n }\n\n public getOtherLinkTypeSideV2OrThrow(\n objectTypeApiName: string,\n linkTypeName: string,\n ): OntologiesV2.LinkTypeSideV2 {\n const thisSideLink = this.getLinkTypeSideV2(\n objectTypeApiName,\n linkTypeName,\n );\n const otherObj = this.getObjectTypeFullMetadataOrThrow(\n thisSideLink.objectTypeApiName,\n );\n const candidates = otherObj.linkTypes.filter(l =>\n l.linkTypeRid === thisSideLink.linkTypeRid\n );\n if (otherObj.objectType.apiName !== objectTypeApiName) {\n // if its not the same object type then there should only be one\n invariant(\n candidates.length === 1,\n \"Expected only one candidate link type\",\n );\n return candidates[0];\n }\n // if its the same object type, then this could be a link that points to itself that\n // is 1:1, many:1 or many:many. In the 1:1 case, the link could have the same name\n // and there would only be 1 entry in that case. Otherwise there should be 2 entries\n // and we want the one that doesn't match the one passed in.\n if (candidates.length === 1) {\n return candidates[0];\n }\n invariant(\n candidates.length === 2,\n \"Expected only two candidate link types\",\n );\n const candidate = candidates.find(l => l.apiName !== thisSideLink.apiName);\n invariant(\n candidate,\n \"Expected to find a candidate link type that is not the same as the one passed in\",\n );\n return candidate;\n }\n\n getBothLinkTypeSides(\n leftObjectType: string,\n leftLinkName: string,\n rightObjectType: string,\n ): [OntologiesV2.LinkTypeSideV2, OntologiesV2.LinkTypeSideV2] {\n const leftTypeSideV2 = this.getLinkTypeSideV2(\n leftObjectType,\n leftLinkName,\n );\n\n // the rhs passed in should match the target of the lhs\n invariant(rightObjectType === leftTypeSideV2.objectTypeApiName);\n\n const rightTypeSideV2 = this.getOtherLinkTypeSideV2OrThrow(\n leftObjectType,\n leftLinkName,\n );\n\n return [leftTypeSideV2, rightTypeSideV2];\n }\n\n registerObjectType<Q extends ObjectTypeDefinition>(\n def: TH_ObjectTypeFullMetadata<Q>,\n ): void;\n registerObjectType(\n def: ReadonlyDeep<OntologiesV2.ObjectTypeFullMetadata>,\n ): void;\n registerObjectType<Q extends ObjectTypeDefinition>(\n def:\n | TH_ObjectTypeFullMetadata<Q>\n | OntologiesV2.ObjectTypeFullMetadata,\n ): void {\n if (def.objectType.apiName in this.#ontology.objectTypes) {\n throw new Error(\n `ObjectType ${def.objectType.apiName} already registered`,\n );\n }\n this.#ontology.objectTypes[def.objectType.apiName] = def;\n }\n\n registerActionType<Q extends OntologiesV2.ActionTypeV2>(\n def: Q,\n implementation?: FauxActionImpl<Q>,\n ): void;\n registerActionType(\n def: OntologiesV2.ActionTypeV2,\n implementation?: FauxActionImpl,\n ): void;\n registerActionType(\n def: OntologiesV2.ActionTypeV2,\n implementation?: FauxActionImpl,\n ): void {\n if (def.apiName in this.#ontology.actionTypes) {\n throw new Error(\n `ActionType ${def.apiName} already registered`,\n );\n }\n this.#ontology.actionTypes[def.apiName] = def;\n if (implementation) {\n this.#actionImpl.set(def.apiName, implementation);\n }\n }\n\n registerQueryType(\n def: OntologiesV2.QueryTypeV2,\n implementation?: FauxQueryImpl,\n ): void {\n if (`${def.apiName}:${def.version}` in this.#ontology.queryTypes) {\n throw new Error(\n `QueryType ${def.apiName} already registered`,\n );\n }\n this.#ontology\n .queryTypes[\n `${def.apiName}:${def.version}` as VersionedQueryTypeApiName\n ] = def;\n if (implementation) {\n if (!this.#queryImpl.has(def.apiName)) {\n this.#queryImpl.set(def.apiName, new Map());\n }\n if (!valid(def.version)) {\n throw new Error(\n `QueryType ${def.apiName} version ${def.version} is not semver valid`,\n );\n }\n this.#queryImpl.get(def.apiName)?.set(\n def.version,\n implementation,\n );\n }\n }\n\n registerInterfaceType(def: OntologiesV2.InterfaceType): void {\n if (def.apiName in this.#ontology.interfaceTypes) {\n throw new Error(\n `InterfaceType ${def.apiName} already registered`,\n );\n }\n this.#ontology.interfaceTypes[def.apiName] = def;\n }\n\n registerSharedPropertyType(def: OntologiesV2.SharedPropertyType): void {\n if (def.apiName in this.#ontology.sharedPropertyTypes) {\n throw new Error(\n `SharedPropertyType ${def.apiName} already registered`,\n );\n }\n this.#ontology.sharedPropertyTypes[def.apiName] = def;\n }\n\n #getFilteredQueryTypes(request: LoadOntologyMetadataRequest): Record<\n OntologiesV2.QueryApiName,\n OntologiesV2.QueryTypeV2\n > {\n const remappedQueryTypes = request.queryTypes.map(x =>\n this.#convertToVersionedApiName(x)\n );\n return Object.fromEntries(\n Object.entries(this.#ontology.queryTypes).filter((\n [queryTypeApiName],\n ) => remappedQueryTypes.includes(queryTypeApiName)).map((\n [queryTypeApiName, queryTypeDefinition],\n ) => [\n request.queryTypes[remappedQueryTypes.indexOf(queryTypeApiName)],\n queryTypeDefinition,\n ]),\n );\n }\n\n #convertToVersionedApiName(\n apiName: string,\n ): VersionedQueryTypeApiName {\n // If a query is requested without a version, we remap it to include a versioned api name with the latest version\n if (extractVersion(apiName) !== undefined) {\n return apiName as VersionedQueryTypeApiName;\n }\n const version = semver.rsort(\n Object.keys(this.#ontology.queryTypes).filter(\n queryTypeApiName => queryTypeApiName.split(\":\")[0] === apiName,\n ).map(x => extractVersion(x)),\n )[0];\n return `${apiName}:${version}`;\n }\n}\n\nfunction filterRecord<T>(\n record: Record<string, T>,\n keys: string[],\n): Record<string, T> {\n return Object.fromEntries(\n Object.entries(record).filter(([key]) => keys.includes(key)),\n );\n}\n\nfunction extractVersion(\n apiName: string,\n): string {\n return apiName.split(\":\")[1];\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"FauxOntology.js","names":["semver","valid","invariant","ActionNotFoundError","LinkTypeNotFound","ObjectNotFoundError","ObjectTypeDoesNotExistError","QueryNotFoundError","OpenApiCallError","FauxOntology","ontology","actionImpl","Map","queryImpl","constructor","actionTypes","interfaceTypes","objectTypes","queryTypes","sharedPropertyTypes","valueTypes","apiName","getOntologyFullMetadata","getFilteredOntologyMetadata","request","Object","fromEntries","entries","filter","objectType","includes","map","objectTypeApiName","objectTypeDefinition","linkTypes","linkType","filterRecord","getFilteredQueryTypes","getAllInterfaceTypes","values","getAllObjectTypes","getAllActionTypes","getAllQueryTypes","getInterfaceType","interfaceType","ret","undefined","getObjectTypeFullMetadata","getObjectTypeFullMetadataOrThrow","getActionDef","actionTypeApiName","actionType","getActionImpl","impl","get","process","env","NODE_ENV","getQueryDef","queryTypeApiNameAndVersion","queryType","convertToVersionedApiName","getQueryImpl","queryTypeApiName","version","versionMap","rsort","Array","from","keys","getInterfaceToObjectTypeMappings","objectApiNames","objectDefs","ifaceToObjMap","objDef","ifaceApiName","properties","implementsInterfaces2","getLinkTypeSideV2","linkTypeName","find","a","getOtherLinkTypeSideV2OrThrow","thisSideLink","otherObj","candidates","l","linkTypeRid","length","candidate","getBothLinkTypeSides","leftObjectType","leftLinkName","rightObjectType","leftTypeSideV2","rightTypeSideV2","registerObjectType","def","Error","registerActionType","implementation","set","registerQueryType","has","registerInterfaceType","registerSharedPropertyType","#getFilteredQueryTypes","remappedQueryTypes","x","queryTypeDefinition","indexOf","#convertToVersionedApiName","extractVersion","split","record","key"],"sources":["FauxOntology.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 ObjectTypeDefinition } from \"@osdk/api\";\nimport type * as OntologiesV2 from \"@osdk/foundry.ontologies\";\nimport type {\n LoadOntologyMetadataRequest,\n VersionedQueryTypeApiName,\n} from \"@osdk/internal.foundry.ontologies\";\nimport semver, { valid } from \"semver\";\nimport invariant from \"tiny-invariant\";\nimport type { ReadonlyDeep } from \"type-fest\";\nimport {\n ActionNotFoundError,\n LinkTypeNotFound,\n ObjectNotFoundError,\n ObjectTypeDoesNotExistError,\n QueryNotFoundError,\n} from \"../errors.js\";\nimport { OpenApiCallError } from \"../handlers/util/handleOpenApiCall.js\";\nimport type { FauxActionImpl } from \"./FauxActionImpl.js\";\nimport type { FauxQueryImpl } from \"./FauxQueryImpl.js\";\nimport type { TH_ObjectTypeFullMetadata } from \"./typeHelpers/TH_ObjectTypeFullMetadata.js\";\n\n/**\n * Currently Unsupported Concepts:\n * - many:many links.\n */\nexport class FauxOntology {\n #ontology: OntologiesV2.OntologyFullMetadata;\n #actionImpl: Map<OntologiesV2.ActionTypeApiName, FauxActionImpl> = new Map();\n #queryImpl: Map<\n OntologiesV2.QueryApiName,\n Map<OntologiesV2.FunctionVersion, FauxQueryImpl>\n > = new Map();\n\n constructor(ontology: OntologiesV2.OntologyV2) {\n this.#ontology = {\n actionTypes: {},\n interfaceTypes: {},\n objectTypes: {},\n ontology,\n queryTypes: {},\n sharedPropertyTypes: {},\n valueTypes: {},\n };\n }\n\n get apiName(): OntologiesV2.OntologyApiName {\n return this.#ontology.ontology.apiName;\n }\n\n getOntologyFullMetadata(): OntologiesV2.OntologyFullMetadata {\n return this.#ontology;\n }\n\n getFilteredOntologyMetadata(\n request: OntologiesV2.LoadOntologyMetadataRequest,\n ): OntologiesV2.OntologyFullMetadata {\n return {\n ontology: this.#ontology.ontology,\n objectTypes: Object.fromEntries(\n Object.entries(this.#ontology.objectTypes).filter(([objectType]) =>\n request.objectTypes.includes(objectType)\n ).map(([objectTypeApiName, objectTypeDefinition]) => [\n objectTypeApiName,\n {\n ...objectTypeDefinition,\n linkTypes: objectTypeDefinition.linkTypes.filter(linkType =>\n request.linkTypes.includes(linkType.apiName)\n ),\n },\n ]),\n ),\n actionTypes: filterRecord(\n this.#ontology.actionTypes,\n request.actionTypes,\n ),\n queryTypes: this.#getFilteredQueryTypes(request),\n\n interfaceTypes: filterRecord(\n this.#ontology.interfaceTypes,\n request.interfaceTypes,\n ),\n sharedPropertyTypes: {},\n valueTypes: {},\n };\n }\n\n getAllInterfaceTypes(): OntologiesV2.InterfaceType[] {\n return Object.values(this.#ontology.interfaceTypes);\n }\n\n getAllObjectTypes(): OntologiesV2.ObjectTypeFullMetadata[] {\n return Object.values(this.#ontology.objectTypes);\n }\n\n getAllActionTypes(): OntologiesV2.ActionTypeV2[] {\n return Object.values(this.#ontology.actionTypes);\n }\n\n getAllQueryTypes(): OntologiesV2.QueryTypeV2[] {\n return Object.values(this.#ontology.queryTypes);\n }\n\n getInterfaceType(interfaceType: string): OntologiesV2.InterfaceType {\n const ret = this.#ontology.interfaceTypes[interfaceType];\n\n if (ret === undefined) {\n throw new OpenApiCallError(\n 404,\n ObjectNotFoundError(interfaceType, \"\"),\n );\n }\n\n return (\n this.#ontology.interfaceTypes[interfaceType]\n );\n }\n\n public getObjectTypeFullMetadata(\n objectTypeApiName: string,\n ): OntologiesV2.ObjectTypeFullMetadata | undefined {\n return this.#ontology.objectTypes[objectTypeApiName];\n }\n\n public getObjectTypeFullMetadataOrThrow(\n objectTypeApiName: string,\n ): OntologiesV2.ObjectTypeFullMetadata {\n const objectType = this.#ontology.objectTypes[objectTypeApiName];\n if (objectType === undefined) {\n throw new OpenApiCallError(\n 404,\n ObjectTypeDoesNotExistError(objectTypeApiName),\n );\n }\n return objectType;\n }\n\n public getActionDef(actionTypeApiName: string): OntologiesV2.ActionTypeV2 {\n const actionType = this.#ontology.actionTypes[actionTypeApiName];\n if (actionType === undefined) {\n throw new OpenApiCallError(\n 404,\n ActionNotFoundError(),\n );\n }\n return actionType;\n }\n\n public getActionImpl(actionTypeApiName: string): FauxActionImpl {\n const impl = this.#actionImpl.get(actionTypeApiName);\n invariant(impl, \"Action implementation not found for \" + actionTypeApiName);\n return impl;\n }\n\n public getQueryDef(\n queryTypeApiNameAndVersion: string,\n ): OntologiesV2.QueryTypeV2 {\n const queryType = this.#ontology\n .queryTypes[this.#convertToVersionedApiName(queryTypeApiNameAndVersion)];\n if (queryType === undefined) {\n throw new OpenApiCallError(\n 404,\n QueryNotFoundError(queryTypeApiNameAndVersion),\n );\n }\n return queryType;\n }\n\n public getQueryImpl(\n queryTypeApiName: string,\n version?: string,\n ): FauxQueryImpl {\n const versionMap = this.#queryImpl.get(queryTypeApiName);\n\n const impl = version !== undefined\n ? versionMap?.get(version)\n : versionMap?.get(semver.rsort(Array.from(versionMap.keys() ?? []))[0]);\n\n if (!impl) {\n throw new OpenApiCallError(\n 404,\n QueryNotFoundError(queryTypeApiName),\n );\n }\n invariant(impl, \"Query implementation not found for \" + queryTypeApiName);\n return impl;\n }\n\n public getInterfaceToObjectTypeMappings(\n objectApiNames: Iterable<OntologiesV2.ObjectTypeApiName>,\n ): Record<\n OntologiesV2.InterfaceTypeApiName,\n OntologiesV2.InterfaceToObjectTypeMappings\n > {\n const objectDefs = Array.from(objectApiNames).map(apiName =>\n this.getObjectTypeFullMetadataOrThrow(apiName)\n );\n\n const ifaceToObjMap: Record<\n OntologiesV2.InterfaceTypeApiName,\n OntologiesV2.InterfaceToObjectTypeMappings\n > = {};\n\n for (const objDef of objectDefs) {\n for (\n const [ifaceApiName, { properties }] of Object.entries(\n objDef.implementsInterfaces2,\n )\n ) {\n if (ifaceToObjMap[ifaceApiName] === undefined) {\n ifaceToObjMap[ifaceApiName] = {};\n }\n\n ifaceToObjMap[ifaceApiName][objDef.objectType.apiName] = properties;\n }\n }\n\n return ifaceToObjMap;\n }\n\n public getLinkTypeSideV2(\n objectTypeApiName: string,\n linkTypeName: string,\n ): OntologiesV2.LinkTypeSideV2 {\n const objectType = this.getObjectTypeFullMetadataOrThrow(objectTypeApiName);\n const linkType = objectType.linkTypes.find((a) =>\n a.apiName === linkTypeName\n );\n if (linkType === undefined) {\n throw new OpenApiCallError(\n 404,\n LinkTypeNotFound(objectTypeApiName, linkTypeName),\n );\n }\n return linkType;\n }\n\n public getOtherLinkTypeSideV2OrThrow(\n objectTypeApiName: string,\n linkTypeName: string,\n ): OntologiesV2.LinkTypeSideV2 {\n const thisSideLink = this.getLinkTypeSideV2(\n objectTypeApiName,\n linkTypeName,\n );\n const otherObj = this.getObjectTypeFullMetadataOrThrow(\n thisSideLink.objectTypeApiName,\n );\n const candidates = otherObj.linkTypes.filter(l =>\n l.linkTypeRid === thisSideLink.linkTypeRid\n );\n if (otherObj.objectType.apiName !== objectTypeApiName) {\n // if its not the same object type then there should only be one\n invariant(\n candidates.length === 1,\n \"Expected only one candidate link type\",\n );\n return candidates[0];\n }\n // if its the same object type, then this could be a link that points to itself that\n // is 1:1, many:1 or many:many. In the 1:1 case, the link could have the same name\n // and there would only be 1 entry in that case. Otherwise there should be 2 entries\n // and we want the one that doesn't match the one passed in.\n if (candidates.length === 1) {\n return candidates[0];\n }\n invariant(\n candidates.length === 2,\n \"Expected only two candidate link types\",\n );\n const candidate = candidates.find(l => l.apiName !== thisSideLink.apiName);\n invariant(\n candidate,\n \"Expected to find a candidate link type that is not the same as the one passed in\",\n );\n return candidate;\n }\n\n getBothLinkTypeSides(\n leftObjectType: string,\n leftLinkName: string,\n rightObjectType: string,\n ): [OntologiesV2.LinkTypeSideV2, OntologiesV2.LinkTypeSideV2] {\n const leftTypeSideV2 = this.getLinkTypeSideV2(\n leftObjectType,\n leftLinkName,\n );\n\n // the rhs passed in should match the target of the lhs\n invariant(rightObjectType === leftTypeSideV2.objectTypeApiName);\n\n const rightTypeSideV2 = this.getOtherLinkTypeSideV2OrThrow(\n leftObjectType,\n leftLinkName,\n );\n\n return [leftTypeSideV2, rightTypeSideV2];\n }\n\n registerObjectType<Q extends ObjectTypeDefinition>(\n def: TH_ObjectTypeFullMetadata<Q>,\n ): void;\n registerObjectType(\n def: ReadonlyDeep<OntologiesV2.ObjectTypeFullMetadata>,\n ): void;\n registerObjectType<Q extends ObjectTypeDefinition>(\n def:\n | TH_ObjectTypeFullMetadata<Q>\n | OntologiesV2.ObjectTypeFullMetadata,\n ): void {\n if (def.objectType.apiName in this.#ontology.objectTypes) {\n throw new Error(\n `ObjectType ${def.objectType.apiName} already registered`,\n );\n }\n this.#ontology.objectTypes[def.objectType.apiName] = def;\n }\n\n registerActionType<Q extends OntologiesV2.ActionTypeV2>(\n def: Q,\n implementation?: FauxActionImpl<Q>,\n ): void;\n registerActionType(\n def: OntologiesV2.ActionTypeV2,\n implementation?: FauxActionImpl,\n ): void;\n registerActionType(\n def: OntologiesV2.ActionTypeV2,\n implementation?: FauxActionImpl,\n ): void {\n if (def.apiName in this.#ontology.actionTypes) {\n throw new Error(\n `ActionType ${def.apiName} already registered`,\n );\n }\n this.#ontology.actionTypes[def.apiName] = def;\n if (implementation) {\n this.#actionImpl.set(def.apiName, implementation);\n }\n }\n\n registerQueryType(\n def: OntologiesV2.QueryTypeV2,\n implementation?: FauxQueryImpl,\n ): void {\n if (`${def.apiName}:${def.version}` in this.#ontology.queryTypes) {\n throw new Error(\n `QueryType ${def.apiName} already registered`,\n );\n }\n this.#ontology\n .queryTypes[\n `${def.apiName}:${def.version}` as VersionedQueryTypeApiName\n ] = def;\n if (implementation) {\n if (!this.#queryImpl.has(def.apiName)) {\n this.#queryImpl.set(def.apiName, new Map());\n }\n if (!valid(def.version)) {\n throw new Error(\n `QueryType ${def.apiName} version ${def.version} is not semver valid`,\n );\n }\n this.#queryImpl.get(def.apiName)?.set(\n def.version,\n implementation,\n );\n }\n }\n\n registerInterfaceType(def: OntologiesV2.InterfaceType): void {\n if (def.apiName in this.#ontology.interfaceTypes) {\n throw new Error(\n `InterfaceType ${def.apiName} already registered`,\n );\n }\n this.#ontology.interfaceTypes[def.apiName] = def;\n }\n\n registerSharedPropertyType(def: OntologiesV2.SharedPropertyType): void {\n if (def.apiName in this.#ontology.sharedPropertyTypes) {\n throw new Error(\n `SharedPropertyType ${def.apiName} already registered`,\n );\n }\n this.#ontology.sharedPropertyTypes[def.apiName] = def;\n }\n\n #getFilteredQueryTypes(request: LoadOntologyMetadataRequest): Record<\n OntologiesV2.QueryApiName,\n OntologiesV2.QueryTypeV2\n > {\n const remappedQueryTypes = request.queryTypes.map(x =>\n this.#convertToVersionedApiName(x)\n );\n return Object.fromEntries(\n Object.entries(this.#ontology.queryTypes).filter((\n [queryTypeApiName],\n ) => remappedQueryTypes.includes(queryTypeApiName)).map((\n [queryTypeApiName, queryTypeDefinition],\n ) => [\n request.queryTypes[remappedQueryTypes.indexOf(queryTypeApiName)],\n queryTypeDefinition,\n ]),\n );\n }\n\n #convertToVersionedApiName(\n apiName: string,\n ): VersionedQueryTypeApiName {\n // If a query is requested without a version, we remap it to include a versioned api name with the latest version\n if (extractVersion(apiName) !== undefined) {\n return apiName as VersionedQueryTypeApiName;\n }\n const version = semver.rsort(\n Object.keys(this.#ontology.queryTypes).filter(\n queryTypeApiName => queryTypeApiName.split(\":\")[0] === apiName,\n ).map(x => extractVersion(x)),\n )[0];\n return `${apiName}:${version}`;\n }\n}\n\nfunction filterRecord<T>(\n record: Record<string, T>,\n keys: string[],\n): Record<string, T> {\n return Object.fromEntries(\n Object.entries(record).filter(([key]) => keys.includes(key)),\n );\n}\n\nfunction extractVersion(\n apiName: string,\n): string {\n return apiName.split(\":\")[1];\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,20 @@
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 { OntologyTransactions } from "@osdk/foundry.ontologies";
18
+ import { handleOpenApiCall } from "../../handlers/util/handleOpenApiCall.js";
19
+ export const postEdits = handleOpenApiCall(OntologyTransactions.postEdits, ["ontologyApiName", "transactionRid"]);
20
+ //# sourceMappingURL=Transactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transactions.js","names":["OntologyTransactions","handleOpenApiCall","postEdits"],"sources":["Transactions.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 { OntologyTransactions } from \"@osdk/foundry.ontologies\";\nimport type { CallFactory } from \"../../handlers/util/handleOpenApiCall.js\";\nimport { handleOpenApiCall } from \"../../handlers/util/handleOpenApiCall.js\";\n\nexport const postEdits: CallFactory<\n \"ontologyApiName\" | \"transactionRid\",\n typeof OntologyTransactions.postEdits\n> = handleOpenApiCall(OntologyTransactions.postEdits, [\n \"ontologyApiName\",\n \"transactionRid\",\n]);\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,oBAAoB,QAAQ,0BAA0B;AAE/D,SAASC,iBAAiB,QAAQ,0CAA0C;AAE5E,OAAO,MAAMC,SAGZ,GAAGD,iBAAiB,CAACD,oBAAoB,CAACE,SAAS,EAAE,CACpD,iBAAiB,EACjB,gBAAgB,CACjB,CAAC","ignoreList":[]}
@@ -29,4 +29,5 @@ export * as Queries from "./Queries.js";
29
29
  export * as QueryTypes from "./QueryTypes.js";
30
30
  export * as TimeSeriesPropertiesV2 from "./TimeSeriesPropertiesV2.js";
31
31
  export * as TimeSeriesValueBankProperties from "./TimeSeriesValueBankProperties.js";
32
+ export * as OntologyTransactions from "./Transactions.js";
32
33
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Actions","ActionTypesV2","AttachmentPropertiesV2","Attachments","LinkedObjectsV2","MediaReferenceProperties","ObjectTypesV2","OntologiesV2","OntologyInterfaces","OntologyObjectSets","OntologyObjectsV2","Queries","QueryTypes","TimeSeriesPropertiesV2","TimeSeriesValueBankProperties"],"sources":["index.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\nexport * as Actions from \"./Actions.js\";\nexport * as ActionTypesV2 from \"./ActionTypesV2.js\";\nexport * as AttachmentPropertiesV2 from \"./AttachmentPropertiesV2.js\";\nexport * as Attachments from \"./Attachments.js\";\nexport * as LinkedObjectsV2 from \"./LinkedObjectsV2.js\";\nexport * as MediaReferenceProperties from \"./MediaReferenceProperties.js\";\nexport * as ObjectTypesV2 from \"./ObjectTypesV2.js\";\nexport * as OntologiesV2 from \"./OntologiesV2.js\";\nexport * as OntologyInterfaces from \"./OntologyInterfaces.js\";\nexport * as OntologyObjectSets from \"./OntologyObjectSets.js\";\nexport * as OntologyObjectsV2 from \"./OntologyObjectsV2.js\";\nexport * as Queries from \"./Queries.js\";\nexport * as QueryTypes from \"./QueryTypes.js\";\nexport * as TimeSeriesPropertiesV2 from \"./TimeSeriesPropertiesV2.js\";\nexport * as TimeSeriesValueBankProperties from \"./TimeSeriesValueBankProperties.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,KAAKA,OAAO,MAAM,cAAc;AACvC,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AACnD,OAAO,KAAKC,sBAAsB,MAAM,6BAA6B;AACrE,OAAO,KAAKC,WAAW,MAAM,kBAAkB;AAC/C,OAAO,KAAKC,eAAe,MAAM,sBAAsB;AACvD,OAAO,KAAKC,wBAAwB,MAAM,+BAA+B;AACzE,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AACnD,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AACjD,OAAO,KAAKC,kBAAkB,MAAM,yBAAyB;AAC7D,OAAO,KAAKC,kBAAkB,MAAM,yBAAyB;AAC7D,OAAO,KAAKC,iBAAiB,MAAM,wBAAwB;AAC3D,OAAO,KAAKC,OAAO,MAAM,cAAc;AACvC,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAC7C,OAAO,KAAKC,sBAAsB,MAAM,6BAA6B;AACrE,OAAO,KAAKC,6BAA6B,MAAM,oCAAoC","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Actions","ActionTypesV2","AttachmentPropertiesV2","Attachments","LinkedObjectsV2","MediaReferenceProperties","ObjectTypesV2","OntologiesV2","OntologyInterfaces","OntologyObjectSets","OntologyObjectsV2","Queries","QueryTypes","TimeSeriesPropertiesV2","TimeSeriesValueBankProperties","OntologyTransactions"],"sources":["index.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\nexport * as Actions from \"./Actions.js\";\nexport * as ActionTypesV2 from \"./ActionTypesV2.js\";\nexport * as AttachmentPropertiesV2 from \"./AttachmentPropertiesV2.js\";\nexport * as Attachments from \"./Attachments.js\";\nexport * as LinkedObjectsV2 from \"./LinkedObjectsV2.js\";\nexport * as MediaReferenceProperties from \"./MediaReferenceProperties.js\";\nexport * as ObjectTypesV2 from \"./ObjectTypesV2.js\";\nexport * as OntologiesV2 from \"./OntologiesV2.js\";\nexport * as OntologyInterfaces from \"./OntologyInterfaces.js\";\nexport * as OntologyObjectSets from \"./OntologyObjectSets.js\";\nexport * as OntologyObjectsV2 from \"./OntologyObjectsV2.js\";\nexport * as Queries from \"./Queries.js\";\nexport * as QueryTypes from \"./QueryTypes.js\";\nexport * as TimeSeriesPropertiesV2 from \"./TimeSeriesPropertiesV2.js\";\nexport * as TimeSeriesValueBankProperties from \"./TimeSeriesValueBankProperties.js\";\nexport * as OntologyTransactions from \"./Transactions.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,KAAKA,OAAO,MAAM,cAAc;AACvC,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AACnD,OAAO,KAAKC,sBAAsB,MAAM,6BAA6B;AACrE,OAAO,KAAKC,WAAW,MAAM,kBAAkB;AAC/C,OAAO,KAAKC,eAAe,MAAM,sBAAsB;AACvD,OAAO,KAAKC,wBAAwB,MAAM,+BAA+B;AACzE,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AACnD,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AACjD,OAAO,KAAKC,kBAAkB,MAAM,yBAAyB;AAC7D,OAAO,KAAKC,kBAAkB,MAAM,yBAAyB;AAC7D,OAAO,KAAKC,iBAAiB,MAAM,wBAAwB;AAC3D,OAAO,KAAKC,OAAO,MAAM,cAAc;AACvC,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAC7C,OAAO,KAAKC,sBAAsB,MAAM,6BAA6B;AACrE,OAAO,KAAKC,6BAA6B,MAAM,oCAAoC;AACnF,OAAO,KAAKC,oBAAoB,MAAM,mBAAmB","ignoreList":[]}
@@ -38,14 +38,14 @@ export declare class FauxDataStore {
38
38
  *
39
39
  * @param obj An `Osdk.Instance` like object for the ObjectType in the generics
40
40
  */
41
- registerObject<T extends ObjectTypeDefinition>(objectType: T, obj: ObjectTypeCreatable<T> | ObjectTypeCreatableWithoutApiName<T>): void;
41
+ registerObject<T extends ObjectTypeDefinition>(objectType: T, obj: ObjectTypeCreatable<T> | ObjectTypeCreatableWithoutApiName<T>): BaseServerObject;
42
42
  /**
43
43
  * Version of register object generally used in shared.test
44
44
  * @param obj A raw server side representation of an object
45
45
  *
46
46
  * Don't use, its too easy to end up with an any.
47
47
  */
48
- registerObject(obj: BaseServerObject): void;
48
+ registerObject(obj: BaseServerObject): BaseServerObject;
49
49
  replaceObjectOrThrow(x: BaseServerObject): void;
50
50
  /** Throws if the object does not already exist */
51
51
  unregisterObjectOrThrow(objectType: string, primaryKey: string | number | boolean): void;