@osdk/faux 0.6.0-beta.4 → 0.6.0-beta.5

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 (56) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/build/browser/FauxFoundry/FauxDataStore.js +3 -2
  3. package/build/browser/FauxFoundry/FauxDataStore.js.map +1 -1
  4. package/build/browser/FauxFoundry/collections/DefaultMap.js +30 -0
  5. package/build/browser/FauxFoundry/collections/DefaultMap.js.map +1 -0
  6. package/build/browser/FauxFoundry/collections/SetMultiMap.js +43 -0
  7. package/build/browser/FauxFoundry/collections/SetMultiMap.js.map +1 -0
  8. package/build/browser/handlers/createObjectSetHandlers.js +51 -2
  9. package/build/browser/handlers/createObjectSetHandlers.js.map +1 -1
  10. package/build/cjs/index.cjs +100 -10
  11. package/build/cjs/index.cjs.map +1 -1
  12. package/build/esm/FauxFoundry/FauxDataStore.js +3 -2
  13. package/build/esm/FauxFoundry/FauxDataStore.js.map +1 -1
  14. package/build/esm/FauxFoundry/collections/DefaultMap.js +30 -0
  15. package/build/esm/FauxFoundry/collections/DefaultMap.js.map +1 -0
  16. package/build/esm/FauxFoundry/collections/SetMultiMap.js +43 -0
  17. package/build/esm/FauxFoundry/collections/SetMultiMap.js.map +1 -0
  18. package/build/esm/handlers/createObjectSetHandlers.js +51 -2
  19. package/build/esm/handlers/createObjectSetHandlers.js.map +1 -1
  20. package/build/types/FauxFoundry/FauxDataStore.d.ts.map +1 -1
  21. package/build/types/FauxFoundry/collections/DefaultMap.d.ts +8 -0
  22. package/build/types/FauxFoundry/collections/DefaultMap.d.ts.map +1 -0
  23. package/build/types/FauxFoundry/collections/SetMultiMap.d.ts +10 -0
  24. package/build/types/FauxFoundry/collections/SetMultiMap.d.ts.map +1 -0
  25. package/build/types/handlers/createObjectSetHandlers.d.ts.map +1 -1
  26. package/package.json +3 -4
  27. package/build/browser/FauxFoundry/FauxAdmin.test.js +0 -248
  28. package/build/browser/FauxFoundry/FauxAdmin.test.js.map +0 -1
  29. package/build/browser/FauxFoundry/FauxDataStore.test.js +0 -477
  30. package/build/browser/FauxFoundry/FauxDataStore.test.js.map +0 -1
  31. package/build/browser/FauxFoundry/filterObjects.test.js +0 -216
  32. package/build/browser/FauxFoundry/filterObjects.test.js.map +0 -1
  33. package/build/browser/FauxFoundry/filterTimeSeriesData.test.js +0 -116
  34. package/build/browser/FauxFoundry/filterTimeSeriesData.test.js.map +0 -1
  35. package/build/browser/FauxFoundry/validateAction.test.js +0 -523
  36. package/build/browser/FauxFoundry/validateAction.test.js.map +0 -1
  37. package/build/esm/FauxFoundry/FauxAdmin.test.js +0 -248
  38. package/build/esm/FauxFoundry/FauxAdmin.test.js.map +0 -1
  39. package/build/esm/FauxFoundry/FauxDataStore.test.js +0 -477
  40. package/build/esm/FauxFoundry/FauxDataStore.test.js.map +0 -1
  41. package/build/esm/FauxFoundry/filterObjects.test.js +0 -216
  42. package/build/esm/FauxFoundry/filterObjects.test.js.map +0 -1
  43. package/build/esm/FauxFoundry/filterTimeSeriesData.test.js +0 -116
  44. package/build/esm/FauxFoundry/filterTimeSeriesData.test.js.map +0 -1
  45. package/build/esm/FauxFoundry/validateAction.test.js +0 -523
  46. package/build/esm/FauxFoundry/validateAction.test.js.map +0 -1
  47. package/build/types/FauxFoundry/FauxAdmin.test.d.ts +0 -1
  48. package/build/types/FauxFoundry/FauxAdmin.test.d.ts.map +0 -1
  49. package/build/types/FauxFoundry/FauxDataStore.test.d.ts +0 -1
  50. package/build/types/FauxFoundry/FauxDataStore.test.d.ts.map +0 -1
  51. package/build/types/FauxFoundry/filterObjects.test.d.ts +0 -1
  52. package/build/types/FauxFoundry/filterObjects.test.d.ts.map +0 -1
  53. package/build/types/FauxFoundry/filterTimeSeriesData.test.d.ts +0 -1
  54. package/build/types/FauxFoundry/filterTimeSeriesData.test.d.ts.map +0 -1
  55. package/build/types/FauxFoundry/validateAction.test.d.ts +0 -1
  56. package/build/types/FauxFoundry/validateAction.test.d.ts.map +0 -1
@@ -1,477 +0,0 @@
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 { beforeEach, describe, expect, it } from "vitest";
18
- import { FauxAttachmentStore } from "./FauxAttachmentStore.js";
19
- import { FauxDataStore } from "./FauxDataStore.js";
20
- import { FauxOntology } from "./FauxOntology.js";
21
- describe(FauxDataStore, () => {
22
- describe("Simple Employee ontology", () => {
23
- let attachmentsStore;
24
- let fauxOntology;
25
- let fauxDataStore;
26
- const employees = Object.fromEntries(["a", "b", "c", "d"].map(id => [id, {
27
- __apiName: "Employee",
28
- __primaryKey: id,
29
- id
30
- }]));
31
- const projects = Object.fromEntries(["p1", "p2"].map(id => [id, {
32
- __apiName: "Project",
33
- __primaryKey: id,
34
- id,
35
- name: `Project ${id}`
36
- }]));
37
- beforeEach(() => {
38
- attachmentsStore = new FauxAttachmentStore();
39
- fauxOntology = new FauxOntology({
40
- apiName: "foo",
41
- description: "foo",
42
- displayName: "foo",
43
- rid: "ri.foo"
44
- });
45
- fauxDataStore = new FauxDataStore(fauxOntology, attachmentsStore, /*strict*/true);
46
- fauxOntology.registerObjectType({
47
- implementsInterfaces: [],
48
- implementsInterfaces2: {},
49
- linkTypes: [{
50
- apiName: "peeps",
51
- status: "EXPERIMENTAL",
52
- objectTypeApiName: "Employee",
53
- cardinality: "MANY",
54
- displayName: "Peeps",
55
- linkTypeRid: "rid.link-type.327"
56
- }, {
57
- apiName: "lead",
58
- status: "EXPERIMENTAL",
59
- objectTypeApiName: "Employee",
60
- cardinality: "ONE",
61
- displayName: "Lead",
62
- linkTypeRid: "rid.link-type.327",
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"
78
- }],
79
- objectType: {
80
- apiName: "Employee",
81
- description: "Employee",
82
- displayName: "Employee",
83
- rid: "ri.Employee",
84
- icon: {
85
- color: "#000000",
86
- name: "whoCares",
87
- type: "blueprint"
88
- },
89
- pluralDisplayName: "Employees",
90
- primaryKey: "id",
91
- properties: {
92
- id: {
93
- dataType: {
94
- type: "string"
95
- },
96
- rid: "ri.id",
97
- displayName: "id",
98
- description: "id",
99
- typeClasses: []
100
- },
101
- leadId: {
102
- dataType: {
103
- type: "string"
104
- },
105
- rid: "ri.leadId",
106
- displayName: "leadId",
107
- description: "leadId",
108
- typeClasses: []
109
- }
110
- },
111
- status: "ACTIVE",
112
- titleProperty: "id"
113
- },
114
- sharedPropertyTypeMapping: {}
115
- });
116
- fauxOntology.registerObjectType({
117
- implementsInterfaces: [],
118
- implementsInterfaces2: {},
119
- linkTypes: [{
120
- apiName: "owner",
121
- status: "EXPERIMENTAL",
122
- objectTypeApiName: "Employee",
123
- cardinality: "ONE",
124
- displayName: "Owner",
125
- linkTypeRid: "rid.link-type.328",
126
- foreignKeyPropertyApiName: "ownerId"
127
- }, {
128
- apiName: "contributors",
129
- status: "EXPERIMENTAL",
130
- objectTypeApiName: "Employee",
131
- cardinality: "MANY",
132
- displayName: "Contributors",
133
- linkTypeRid: "rid.link-type.329"
134
- }],
135
- objectType: {
136
- apiName: "Project",
137
- description: "Project",
138
- displayName: "Project",
139
- rid: "ri.Project",
140
- icon: {
141
- color: "#0000FF",
142
- name: "project",
143
- type: "blueprint"
144
- },
145
- pluralDisplayName: "Projects",
146
- primaryKey: "id",
147
- properties: {
148
- id: {
149
- dataType: {
150
- type: "string"
151
- },
152
- rid: "ri.proj.id",
153
- displayName: "id",
154
- description: "id",
155
- typeClasses: []
156
- },
157
- name: {
158
- dataType: {
159
- type: "string"
160
- },
161
- rid: "ri.proj.name",
162
- displayName: "name",
163
- description: "name",
164
- typeClasses: []
165
- },
166
- ownerId: {
167
- dataType: {
168
- type: "string"
169
- },
170
- rid: "ri.proj.ownerId",
171
- displayName: "ownerId",
172
- description: "ownerId",
173
- typeClasses: []
174
- }
175
- },
176
- status: "ACTIVE",
177
- titleProperty: "name"
178
- },
179
- sharedPropertyTypeMapping: {}
180
- });
181
- });
182
- const getLeadsAndPeeps = id => ({
183
- lead: fauxDataStore.getLinksOrThrow("Employee", id, "lead")[0],
184
- peeps: fauxDataStore.getLinksOrThrow("Employee", id, "peeps")
185
- });
186
- const getProjectLinks = projectId => ({
187
- owner: fauxDataStore.getLinksOrThrow("Project", projectId, "owner")[0],
188
- contributors: fauxDataStore.getLinksOrThrow("Project", projectId, "contributors")
189
- });
190
- const getEmployeeProjectLinks = employeeId => ({
191
- ownedProjects: fauxDataStore.getLinksOrThrow("Employee", employeeId, "ownedProjects"),
192
- contributedProjects: fauxDataStore.getLinksOrThrow("Employee", employeeId, "contributedProjects")
193
- });
194
- it("should work in the happy paths", () => {
195
- const {
196
- a,
197
- b,
198
- c,
199
- d
200
- } = employees;
201
-
202
- // set a's lead to b
203
- fauxDataStore.registerObject(a);
204
- fauxDataStore.registerObject(b);
205
- fauxDataStore.registerLink(a, "lead", b, "peeps");
206
- expect(getLeadsAndPeeps("a")).toMatchObject({
207
- lead: b,
208
- peeps: []
209
- });
210
- expect(getLeadsAndPeeps("b")).toMatchObject({
211
- lead: undefined,
212
- peeps: [a]
213
- });
214
-
215
- // try the reverse (many to one this time)
216
- fauxDataStore.registerObject(c);
217
- fauxDataStore.registerObject(d);
218
- // set c's lead to d
219
- fauxDataStore.registerLink(d, "peeps", c, "lead");
220
- expect(getLeadsAndPeeps("d")).toMatchObject({
221
- lead: undefined,
222
- peeps: [c]
223
- });
224
- expect(getLeadsAndPeeps("c")).toMatchObject({
225
- lead: d,
226
- peeps: []
227
- });
228
-
229
- // set b's lead to c
230
- fauxDataStore.registerLink(c, "peeps", b, "lead");
231
- expect(fauxDataStore.getObject(b.__apiName, b.__primaryKey)).toMatchInlineSnapshot(`
232
- {
233
- "__apiName": "Employee",
234
- "__primaryKey": "b",
235
- "id": "b",
236
- "leadId": "c",
237
- }
238
- `);
239
- expect(getLeadsAndPeeps("b")).toMatchObject({
240
- lead: c,
241
- peeps: [a]
242
- });
243
- expect(getLeadsAndPeeps("c")).toMatchObject({
244
- lead: d,
245
- peeps: [b]
246
- });
247
-
248
- // change b's lead to d
249
- fauxDataStore.registerLink(d, "peeps", b, "lead");
250
- expect(getLeadsAndPeeps("b")).toMatchObject({
251
- lead: d,
252
- peeps: [a] // b's peeps should not change
253
- });
254
- expect(fauxDataStore.getObject(b.__apiName, b.__primaryKey)).toMatchObject({
255
- leadId: "d"
256
- });
257
- expect(getLeadsAndPeeps("c")).toMatchObject({
258
- lead: d,
259
- peeps: [] // c should no longer have b as a peep
260
- });
261
- expect(getLeadsAndPeeps("d")).toMatchObject({
262
- lead: undefined,
263
- peeps: [c, b] // d has two peeps now
264
- });
265
-
266
- // remove b's lead
267
- fauxDataStore.unregisterLink(d, "peeps", b, "lead");
268
- expect(fauxDataStore.getObject(b.__apiName, b.__primaryKey)).toMatchInlineSnapshot(`
269
- {
270
- "__apiName": "Employee",
271
- "__primaryKey": "b",
272
- "id": "b",
273
- "leadId": undefined,
274
- }
275
- `);
276
- expect(getLeadsAndPeeps("b")).toMatchObject({
277
- lead: undefined,
278
- peeps: [a] // b's peeps should not change
279
- });
280
- expect(getLeadsAndPeeps("d")).toMatchObject({
281
- lead: undefined,
282
- peeps: [c] // d no longer leads b
283
- });
284
-
285
- // change b's lead to d but in the other direction
286
- fauxDataStore.registerLink(b, "lead", d, "peeps");
287
- expect(getLeadsAndPeeps("b")).toMatchObject({
288
- lead: d,
289
- peeps: [a] // b's peeps should not change
290
- });
291
- expect(getLeadsAndPeeps("c")).toMatchObject({
292
- lead: d,
293
- peeps: [] // c should no longer have b as a peep
294
- });
295
- expect(getLeadsAndPeeps("d")).toMatchObject({
296
- lead: undefined,
297
- peeps: [c, b] // d has two peeps now
298
- });
299
-
300
- // remove b's lead in the other direction
301
- fauxDataStore.unregisterLink(b, "lead", d, "peeps");
302
- expect(getLeadsAndPeeps("b")).toMatchObject({
303
- lead: undefined,
304
- peeps: [a] // b's peeps should not change
305
- });
306
- expect(getLeadsAndPeeps("d")).toMatchObject({
307
- lead: undefined,
308
- peeps: [c] // d no longer leads b
309
- });
310
- });
311
- it("should work with links between different object types", () => {
312
- const {
313
- a,
314
- b,
315
- c,
316
- d
317
- } = employees;
318
- const {
319
- p1,
320
- p2
321
- } = projects;
322
-
323
- // Register objects
324
- fauxDataStore.registerObject(a);
325
- fauxDataStore.registerObject(b);
326
- fauxDataStore.registerObject(c);
327
- fauxDataStore.registerObject(d);
328
- fauxDataStore.registerObject(p1);
329
- fauxDataStore.registerObject(p2);
330
-
331
- // 1. Assign employee as project owner (ONE cardinality)
332
- fauxDataStore.registerLink(p1, "owner", a, "ownedProjects");
333
- expect(getProjectLinks("p1")).toMatchObject({
334
- owner: a,
335
- contributors: []
336
- });
337
- expect(getEmployeeProjectLinks("a")).toMatchObject({
338
- ownedProjects: [p1],
339
- contributedProjects: []
340
- });
341
- expect(fauxDataStore.getObject(p1.__apiName, p1.__primaryKey)).toMatchObject({
342
- ownerId: "a"
343
- });
344
-
345
- // 2. Change project ownership
346
- fauxDataStore.registerLink(p1, "owner", b, "ownedProjects");
347
- expect(getProjectLinks("p1")).toMatchObject({
348
- owner: b,
349
- contributors: []
350
- });
351
- expect(getEmployeeProjectLinks("a")).toMatchObject({
352
- ownedProjects: [],
353
- // a no longer owns p1
354
- contributedProjects: []
355
- });
356
- expect(getEmployeeProjectLinks("b")).toMatchObject({
357
- ownedProjects: [p1],
358
- contributedProjects: []
359
- });
360
- expect(fauxDataStore.getObject(p1.__apiName, p1.__primaryKey)).toMatchObject({
361
- ownerId: "b"
362
- });
363
-
364
- // 3. Add project contributors (MANY cardinality)
365
- fauxDataStore.registerLink(p1, "contributors", c, "contributedProjects");
366
- fauxDataStore.registerLink(p1, "contributors", d, "contributedProjects");
367
- expect(getProjectLinks("p1")).toMatchObject({
368
- owner: b,
369
- contributors: [c, d]
370
- });
371
- expect(getEmployeeProjectLinks("c")).toMatchObject({
372
- ownedProjects: [],
373
- contributedProjects: [p1]
374
- });
375
- expect(getEmployeeProjectLinks("d")).toMatchObject({
376
- ownedProjects: [],
377
- contributedProjects: [p1]
378
- });
379
-
380
- // 4. Remove a contributor
381
- fauxDataStore.unregisterLink(p1, "contributors", c, "contributedProjects");
382
- expect(getProjectLinks("p1")).toMatchObject({
383
- owner: b,
384
- contributors: [d] // c is removed
385
- });
386
- expect(getEmployeeProjectLinks("c")).toMatchObject({
387
- ownedProjects: [],
388
- contributedProjects: [] // no longer contributing to p1
389
- });
390
- expect(getEmployeeProjectLinks("d")).toMatchObject({
391
- ownedProjects: [],
392
- contributedProjects: [p1] // still contributing to p1
393
- });
394
-
395
- // 5. Test with multiple projects
396
- fauxDataStore.registerLink(p2, "contributors", b, "contributedProjects");
397
- expect(getProjectLinks("p2")).toMatchObject({
398
- owner: undefined,
399
- contributors: [b]
400
- });
401
- expect(getEmployeeProjectLinks("b")).toMatchObject({
402
- ownedProjects: [p1],
403
- // owns p1
404
- contributedProjects: [p2] // contributes to p2
405
- });
406
-
407
- // 6. Remove owner using the opposite direction for unregistering
408
- fauxDataStore.unregisterLink(b, "ownedProjects", p1, "owner");
409
- expect(getProjectLinks("p1")).toMatchObject({
410
- owner: undefined,
411
- contributors: [d]
412
- });
413
- expect(getEmployeeProjectLinks("b")).toMatchObject({
414
- ownedProjects: [],
415
- // no longer owns p1
416
- contributedProjects: [p2]
417
- });
418
- expect(fauxDataStore.getObject(p1.__apiName, p1.__primaryKey)).toMatchObject({
419
- "ownerId": undefined
420
- });
421
-
422
- // 7. Test setting foreign key directly on project object
423
- const updatedP1 = {
424
- ...p1,
425
- ownerId: "c"
426
- };
427
- fauxDataStore.replaceObjectOrThrow(updatedP1);
428
-
429
- // Verify links are automatically updated
430
- expect(getProjectLinks("p1")).toMatchObject({
431
- owner: c,
432
- contributors: [d]
433
- });
434
- expect(getEmployeeProjectLinks("c")).toMatchObject({
435
- ownedProjects: [p1],
436
- contributedProjects: []
437
- });
438
- expect(fauxDataStore.getObject(p1.__apiName, p1.__primaryKey)).toMatchObject({
439
- "ownerId": "c"
440
- });
441
-
442
- // 8. Test removing foreign key by setting it to undefined
443
- const unlinkedP1 = {
444
- ...p1,
445
- ownerId: undefined
446
- };
447
- fauxDataStore.replaceObjectOrThrow(unlinkedP1);
448
-
449
- // Verify links are properly removed
450
- expect(getProjectLinks("p1")).toMatchObject({
451
- owner: undefined,
452
- contributors: [d]
453
- });
454
- expect(getEmployeeProjectLinks("c")).toMatchObject({
455
- ownedProjects: [],
456
- contributedProjects: []
457
- });
458
-
459
- // 9. Test setting multiple links through foreign keys
460
- // Add both d and c as owners by setting one at a time
461
- const p2WithOwner = {
462
- ...p2,
463
- ownerId: "d"
464
- };
465
- fauxDataStore.replaceObjectOrThrow(p2WithOwner);
466
- expect(getProjectLinks("p2")).toMatchObject({
467
- owner: d,
468
- contributors: [b]
469
- });
470
- expect(getEmployeeProjectLinks("d")).toMatchObject({
471
- ownedProjects: [p2],
472
- contributedProjects: [p1]
473
- });
474
- });
475
- });
476
- });
477
- //# sourceMappingURL=FauxDataStore.test.js.map
@@ -1 +0,0 @@
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","typeClasses","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 typeClasses: [],\n },\n leadId: {\n dataType: { type: \"string\" },\n rid: \"ri.leadId\",\n displayName: \"leadId\",\n description: \"leadId\",\n typeClasses: [],\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 typeClasses: [],\n },\n name: {\n dataType: { type: \"string\" },\n rid: \"ri.proj.name\",\n displayName: \"name\",\n description: \"name\",\n typeClasses: [],\n },\n ownerId: {\n dataType: { type: \"string\" },\n rid: \"ri.proj.ownerId\",\n displayName: \"ownerId\",\n description: \"ownerId\",\n typeClasses: [],\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":[]}