@osdk/faux 0.2.0-beta.4 → 0.2.0-beta.6

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.
@@ -277,7 +277,7 @@ type OrUndefinedToOptional<T extends object> = {
277
277
  };
278
278
  declare class FauxDataStore {
279
279
  #private;
280
- constructor(fauxOntology: FauxOntology, attachments: FauxAttachmentStore);
280
+ constructor(fauxOntology: FauxOntology, attachments: FauxAttachmentStore, strict: boolean);
281
281
  /**
282
282
  * Removes all data that is associated with a namespace/ontology.
283
283
  *
@@ -301,7 +301,7 @@ declare class FauxDataStore {
301
301
  replaceObjectOrThrow(x: BaseServerObject): void;
302
302
  /** Throws if the object does not already exist */
303
303
  unregisterObjectOrThrow(objectType: string, primaryKey: string | number | boolean): void;
304
- registerLink(src: BaseServerObject, srcLinkName: string, dst: BaseServerObject, destLinkName: string): void;
304
+ registerLink(tmpSrc: BaseServerObject, srcLinkName: string, tmpDst: BaseServerObject, destLinkName: string): void;
305
305
  unregisterLink(src: BaseServerObject, srcLinkName: string, dst: BaseServerObject, dstLinkName: string): void;
306
306
  registerTimeSeriesData(objectType: OntologiesV2$1.ObjectTypeApiName, primaryKey: string, property: OntologiesV2$1.PropertyApiName, data: OntologiesV2$1.TimeSeriesPoint[]): void;
307
307
  getTimeSeriesData(objectType: OntologiesV2$1.ObjectTypeApiName, primaryKey: string, property: OntologiesV2$1.PropertyApiName, filter?: OntologiesV2$1.StreamTimeSeriesPointsRequest): OntologiesV2$1.TimeSeriesPoint[];
@@ -350,8 +350,10 @@ declare class FauxFoundry {
350
350
  readonly baseUrl: string;
351
351
  readonly defaultOntologyRid: any;
352
352
  readonly logger: Logger | undefined;
353
- constructor(baseUrl: string, defaultOntology?: Ontology, { logger }?: {
353
+ strict: boolean;
354
+ constructor(baseUrl: string, defaultOntology?: Ontology, { logger, strict }?: {
354
355
  logger?: Logger;
356
+ strict?: boolean;
355
357
  });
356
358
  get handlers(): RequestHandler[];
357
359
  getDefaultOntology(): FauxOntology;
@@ -53,9 +53,11 @@ export class FauxDataStore {
53
53
  #media = new DefaultMap(() => new DefaultMap(() => {
54
54
  return new Map();
55
55
  }));
56
- constructor(fauxOntology, attachments) {
56
+ #strict;
57
+ constructor(fauxOntology, attachments, strict) {
57
58
  this.#fauxOntology = fauxOntology;
58
59
  this.#attachments = attachments;
60
+ this.#strict = strict;
59
61
  }
60
62
 
61
63
  /**
@@ -167,8 +169,67 @@ export class FauxDataStore {
167
169
  };
168
170
  }
169
171
  replaceObjectOrThrow(x) {
170
- this.#assertObjectExists(x.__apiName, x.__primaryKey);
172
+ const objectType = this.ontology.getObjectTypeFullMetadataOrThrow(x.__apiName);
173
+ const oldObject = this.getObjectOrThrow(x.__apiName, x.__primaryKey);
174
+ const linksToUpdate = [];
175
+ const linksToRemove = [];
176
+ for (const linkDef of objectType.linkTypes) {
177
+ if (linkDef.cardinality === "ONE") {
178
+ !(this.#strict && linkDef.foreignKeyPropertyApiName) ? process.env.NODE_ENV !== "production" ? invariant(false, `Error examining ${objectType.objectType.apiName}.${linkDef.apiName}: ONE side of links should have a foreign key. `) : invariant(false) : void 0;
179
+ const fkName = linkDef.foreignKeyPropertyApiName;
180
+ const fkValue = x[fkName];
181
+ const oldFkValue = oldObject[fkName];
182
+ if (oldObject[fkName] !== x[fkName]) {
183
+ const dstSide = this.ontology.getOtherLinkTypeSideV2OrThrow(objectType.objectType.apiName, linkDef.apiName);
184
+ const dstLocator = objectLocator({
185
+ __apiName: dstSide.objectTypeApiName,
186
+ __primaryKey: fkValue
187
+ });
188
+ const target = this.getObject(dstSide.objectTypeApiName, fkValue);
189
+ if (fkValue != null && !target) {
190
+ // eslint-disable-next-line no-console
191
+ console.log(`WARNING! Setting a FK value to a non-existent object: ${dstLocator}`);
192
+ }
193
+ if (fkValue != null) {
194
+ linksToUpdate.push({
195
+ dstSide,
196
+ dstLocator,
197
+ srcSide: linkDef,
198
+ srcLocator: objectLocator(x)
199
+ });
200
+ } else {
201
+ linksToRemove.push({
202
+ srcLocator: objectLocator(x),
203
+ srcSide: linkDef,
204
+ dstLocator: objectLocator({
205
+ __apiName: dstSide.objectTypeApiName,
206
+ __primaryKey: oldFkValue
207
+ }),
208
+ dstSide
209
+ });
210
+ }
211
+ }
212
+ }
213
+ }
171
214
  this.#objects.get(x.__apiName).set(String(x.__primaryKey), x);
215
+ for (const {
216
+ srcSide,
217
+ srcLocator,
218
+ dstSide,
219
+ dstLocator
220
+ } of linksToUpdate) {
221
+ this.#updateSingleLinkSide(srcSide, srcLocator, dstSide, dstLocator);
222
+ this.#updateSingleLinkSide(dstSide, dstLocator, srcSide, srcLocator);
223
+ }
224
+ for (const {
225
+ srcSide,
226
+ srcLocator,
227
+ dstSide,
228
+ dstLocator
229
+ } of linksToRemove) {
230
+ this.#removeSingleSideOfLink(srcLocator, srcSide, dstLocator);
231
+ this.#removeSingleSideOfLink(dstLocator, dstSide, srcLocator);
232
+ }
172
233
  }
173
234
 
174
235
  /** Throws if the object does not already exist */
@@ -176,12 +237,41 @@ export class FauxDataStore {
176
237
  this.#assertObjectExists(objectType, primaryKey);
177
238
  this.#objects.get(objectType).delete(String(primaryKey));
178
239
  }
179
- registerLink(src, srcLinkName, dst, destLinkName) {
240
+ registerLink(tmpSrc, srcLinkName, tmpDst, destLinkName) {
241
+ const src = this.getObjectOrThrow(tmpSrc.__apiName, tmpSrc.__primaryKey);
242
+ const dst = this.getObjectOrThrow(tmpDst.__apiName, tmpDst.__primaryKey);
180
243
  const srcLocator = objectLocator(src);
181
244
  const dstLocator = objectLocator(dst);
182
245
  const [srcSide, dstSide] = this.#fauxOntology.getBothLinkTypeSides(src.__apiName, srcLinkName, dst.__apiName);
183
246
  !(srcSide.linkTypeRid === dstSide.linkTypeRid) ? process.env.NODE_ENV !== "production" ? invariant(false, `Expected both sides of the link to have the same rid, but got ${srcSide.linkTypeRid} and ${dstSide.linkTypeRid}`) : invariant(false) : void 0;
184
247
  !(dstSide.apiName === destLinkName) ? process.env.NODE_ENV !== "production" ? invariant(false, `Link name mismatch on dst side. Expected ${destLinkName} but found ${dstSide.apiName}`) : invariant(false) : void 0;
248
+ if (this.#strict) {
249
+ const oneSide = srcSide.cardinality === "ONE" ? {
250
+ object: src,
251
+ link: srcSide
252
+ } : dstSide.cardinality === "ONE" ? {
253
+ object: dst,
254
+ link: dstSide
255
+ } : undefined;
256
+ const manySide = oneSide ? srcSide.cardinality === "MANY" ? {
257
+ object: src,
258
+ link: srcSide
259
+ } : {
260
+ object: dst,
261
+ link: dstSide
262
+ } : undefined;
263
+ if (oneSide && manySide) {
264
+ !oneSide.link.foreignKeyPropertyApiName ? process.env.NODE_ENV !== "production" ? invariant(false, `Expected to find a foreignKeyPropertyApiName on the one side: ${oneSide.object.__apiName}.${oneSide.link.apiName}`) : invariant(false) : void 0;
265
+ const newObj = {
266
+ ...oneSide.object,
267
+ [oneSide.link.foreignKeyPropertyApiName]: manySide.object.__primaryKey
268
+ };
269
+
270
+ // This method call will also do the work to update the sides
271
+ this.replaceObjectOrThrow(newObj);
272
+ return;
273
+ }
274
+ }
185
275
  this.#updateSingleLinkSide(srcSide, srcLocator, dstSide, dstLocator);
186
276
  this.#updateSingleLinkSide(dstSide, dstLocator, srcSide, srcLocator);
187
277
  }
@@ -190,6 +280,23 @@ export class FauxDataStore {
190
280
  const dstLocator = objectLocator(dst);
191
281
  const [srcSide, dstSide] = this.#fauxOntology.getBothLinkTypeSides(src.__apiName, srcLinkName, dst.__apiName);
192
282
  !(dstSide.apiName === dstLinkName) ? process.env.NODE_ENV !== "production" ? invariant(false, `Link name mismatch on dst side. Expected ${dstLinkName} but found ${dstSide.apiName}`) : invariant(false) : void 0;
283
+ if (this.#strict) {
284
+ const {
285
+ oneSide,
286
+ manySide
287
+ } = extractOneManySide(srcSide, src, dstSide, dst);
288
+ if (oneSide && manySide) {
289
+ !oneSide.link.foreignKeyPropertyApiName ? process.env.NODE_ENV !== "production" ? invariant(false, `Expected to find a foreignKeyPropertyApiName on the one side: ${oneSide.object.__apiName}.${oneSide.link.apiName}`) : invariant(false) : void 0;
290
+ const newObj = {
291
+ ...oneSide.object,
292
+ [oneSide.link.foreignKeyPropertyApiName]: undefined
293
+ };
294
+
295
+ // This method call will also do the work to update the sides
296
+ this.replaceObjectOrThrow(newObj);
297
+ return;
298
+ }
299
+ }
193
300
  this.#removeSingleSideOfLink(srcLocator, srcSide, dstLocator);
194
301
  this.#removeSingleSideOfLink(dstLocator, dstSide, srcLocator);
195
302
  }
@@ -468,4 +575,24 @@ export class FauxDataStore {
468
575
  };
469
576
  }
470
577
  }
578
+ function extractOneManySide(srcSide, src, dstSide, dst) {
579
+ const oneSide = srcSide.cardinality === "ONE" ? {
580
+ object: src,
581
+ link: srcSide
582
+ } : dstSide.cardinality === "ONE" ? {
583
+ object: dst,
584
+ link: dstSide
585
+ } : undefined;
586
+ const manySide = oneSide ? srcSide.cardinality === "MANY" ? {
587
+ object: src,
588
+ link: srcSide
589
+ } : {
590
+ object: dst,
591
+ link: dstSide
592
+ } : undefined;
593
+ return {
594
+ oneSide,
595
+ manySide
596
+ };
597
+ }
471
598
  //# sourceMappingURL=FauxDataStore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FauxDataStore.js","names":["DefaultMap","MultiMap","randomUUID","crypto","invariant","InvalidRequest","ObjectNotFoundError","subSelectProperties","getPaginationParamsFromRequest","OpenApiCallError","pageThroughResponseSearchParams","isBaseServerObject","FauxDataStoreBatch","filterTimeSeriesData","createOrderBySortFn","getObjectsFromSet","objectLocator","parseLocator","validateAction","FauxDataStore","objects","Map","singleLinks","manyLinks","Set","fauxOntology","attachments","timeSeriesData","media","constructor","clear","ontology","assertObjectExists","#assertObjectExists","objectType","primaryKey","getObject","String","assertObjectDoesNotExist","#assertObjectDoesNotExist","errorCode","errorName","errorInstanceId","parameters","registerObject","anyObj","bso","process","env","NODE_ENV","Object","keys","some","s","startsWith","osdkCreatableToBso","apiName","__apiName","$apiName","__primaryKey","$primaryKey","others","get","set","freeze","#osdkCreatableToBso","meta","getObjectTypeFullMetadataOrThrow","realPrimaryKey","maybeTitle","titleProperty","rid","$rid","JSON","stringify","__title","undefined","__rid","replaceObjectOrThrow","x","unregisterObjectOrThrow","delete","registerLink","src","srcLinkName","dst","destLinkName","srcLocator","dstLocator","srcSide","dstSide","getBothLinkTypeSides","linkTypeRid","updateSingleLinkSide","unregisterLink","dstLinkName","removeSingleSideOfLink","registerTimeSeriesData","property","data","getObjectOrThrow","def","properties","dataType","type","getTimeSeriesData","filter","allData","#updateSingleLinkSide","cardinality","linkNameToObj","oldLocator","Error","registerMedia","content","mediaType","path","mediaItemRid","mediaRef","mimeType","reference","mediaSetViewItem","mediaSetRid","mediaSetViewRid","metaData","sizeBytes","byteLength","getMediaOrThrow","obj","propertyDef","propertyBaseType","propertyValue","ret","#removeSingleSideOfLink","locator","linkSide","expectedPriorValue","links","has","remove","object","getObjectByRid","pkToObjects","getLinksOrThrow","linkApiName","linkTypeSide","getLinkTypeSideV2","locators","Array","from","map","a","split","getLinkOrThrow","linkType","targetPrimaryKey","allLinks","l","getObjectsOfType","values","getObjectsFromObjectSet","parsedBody","selected","select","objectSet","length","totalCount","nextPageToken","orderBy","sort","page","excludeRid","getAttachmentMetadata","propertyName","getAttachmentMetadataByRid","getAttachmentBuffer","applyAction","actionTypeApiName","req","actionDef","getActionDef","actionImpl","getActionImpl","validation","result","batch","r","submissionCriteria","edits","options","mode","returnEdits","objectEdits","batchApplyAction","batchReq","requests","actionType","item"],"sources":["FauxDataStore.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 { CompileTimeMetadata, ObjectTypeDefinition } from \"@osdk/api\";\nimport type {\n MediaItemRid,\n MediaReference,\n MediaType,\n} from \"@osdk/foundry.core\";\nimport type * as OntologiesV2 from \"@osdk/foundry.ontologies\";\nimport { DefaultMap, MultiMap } from \"mnemonist\";\nimport { randomUUID } from \"node:crypto\";\nimport * as crypto from \"node:crypto\";\nimport invariant from \"tiny-invariant\";\nimport type { ReadonlyDeep } from \"type-fest\";\nimport { InvalidRequest, ObjectNotFoundError } from \"../errors.js\";\nimport { subSelectProperties } from \"../filterObjects.js\";\nimport { getPaginationParamsFromRequest } from \"../handlers/util/getPaginationParams.js\";\nimport { OpenApiCallError } from \"../handlers/util/handleOpenApiCall.js\";\nimport type { PagedBodyResponseWithTotal } from \"../handlers/util/pageThroughResponseSearchParams.js\";\nimport { pageThroughResponseSearchParams } from \"../handlers/util/pageThroughResponseSearchParams.js\";\nimport {\n type BaseServerObject,\n isBaseServerObject,\n} from \"./BaseServerObject.js\";\nimport type { FauxAttachmentStore } from \"./FauxAttachmentStore.js\";\nimport { FauxDataStoreBatch } from \"./FauxDataStoreBatch.js\";\nimport type { FauxOntology } from \"./FauxOntology.js\";\nimport { filterTimeSeriesData } from \"./filterTimeSeriesData.js\";\nimport { createOrderBySortFn, getObjectsFromSet } from \"./getObjectsFromSet.js\";\nimport type { ObjectLocator } from \"./ObjectLocator.js\";\nimport { objectLocator, parseLocator } from \"./ObjectLocator.js\";\nimport type { JustProps } from \"./typeHelpers/JustProps.js\";\nimport { validateAction } from \"./validateAction.js\";\n\nexport interface MediaMetadataAndContent {\n content: ArrayBuffer;\n mediaRef: MediaReference;\n metaData: OntologiesV2.MediaMetadata;\n}\n\ntype ObjectTypeCreatableWithoutApiName<T extends ObjectTypeDefinition> =\n OrUndefinedToOptional<JustProps<T>>;\n\n/**\n * Represents the properties needed to create an object, specifically,\n * the properties of the object and the $apiName\n */\ntype ObjectTypeCreatable<T extends ObjectTypeDefinition> =\n & ObjectTypeCreatableWithoutApiName<T>\n & { $apiName: CompileTimeMetadata<T>[\"apiName\"] };\n\n/**\n * Helper type for converting `foo: string | undefined` into `foo?: string`\n */\ntype OrUndefinedToOptional<T extends object> =\n & {\n [K in keyof T as T[K] extends undefined ? K : never]?: T[K];\n }\n & {\n [K in keyof T as T[K] extends undefined ? never : K]?: T[K];\n };\n\n/**\n * Type safe object for representing \"client\" side objects.\n */\ninterface BaseObjectTypeCreatable {\n $apiName?: OntologiesV2.ObjectTypeApiName;\n\n /** if present it must match the correct value */\n $primaryKey?: string | number | boolean;\n\n /** If set, will use the as the $rid for the object, otherwise one is created for you */\n $rid?: string;\n\n /**\n * All the properties.\n *\n * FUTURE: This only handles the primitive types right now. If we want to be able to create\n * objects with some helpers for other types, this will need to be updated.\n */\n [key: string]: string | number | boolean | undefined;\n}\n\nexport class FauxDataStore {\n #objects = new DefaultMap<\n OntologiesV2.ObjectTypeApiName,\n Map<string, BaseServerObject>\n >(\n (key) => new Map(),\n );\n\n #singleLinks = new DefaultMap(\n (_objectLocator: ObjectLocator) =>\n new Map<OntologiesV2.LinkTypeApiName, ObjectLocator>(),\n );\n\n #manyLinks = new DefaultMap(\n (_objectLocator: ObjectLocator) => new MultiMap<string, ObjectLocator>(Set),\n );\n\n #fauxOntology: FauxOntology;\n\n #attachments: FauxAttachmentStore;\n\n #timeSeriesData = new DefaultMap(\n (_objectType: OntologiesV2.ObjectTypeApiName) =>\n new DefaultMap((_pk: string) =>\n new DefaultMap((_property: OntologiesV2.PropertyApiName) =>\n [] as Array<OntologiesV2.TimeSeriesPoint>\n )\n ),\n );\n\n #media = new DefaultMap(\n (_objectType: OntologiesV2.ObjectTypeApiName) =>\n new DefaultMap((_propName: OntologiesV2.PropertyApiName) => {\n return new Map<MediaItemRid, MediaMetadataAndContent>();\n }),\n );\n\n constructor(fauxOntology: FauxOntology, attachments: FauxAttachmentStore) {\n this.#fauxOntology = fauxOntology;\n this.#attachments = attachments;\n }\n\n /**\n * Removes all data that is associated with a namespace/ontology.\n *\n * Note: does not clear `attachments` nor does it clear the ontology itself.\n */\n public clear(): void {\n this.#media.clear();\n this.#timeSeriesData.clear();\n this.#manyLinks.clear();\n this.#singleLinks.clear();\n this.#objects.clear();\n }\n\n get ontology(): FauxOntology {\n return this.#fauxOntology;\n }\n\n #assertObjectExists(\n objectType: string,\n primaryKey: string | number | boolean,\n ) {\n if (!this.getObject(objectType, primaryKey)) {\n throw new OpenApiCallError(\n 404,\n ObjectNotFoundError(objectType, String(primaryKey)),\n );\n }\n }\n\n #assertObjectDoesNotExist(\n objectType: string,\n primaryKey: string | number | boolean,\n ): void {\n if (this.getObject(objectType, primaryKey)) {\n throw new OpenApiCallError(\n 500,\n {\n errorCode: \"CONFLICT\",\n errorName: \"ObjectAlreadyExists\",\n errorInstanceId: \"faux-foundry\",\n parameters: {\n objectType,\n primaryKey: String(primaryKey),\n },\n } satisfies OntologiesV2.ObjectAlreadyExists,\n );\n }\n }\n\n /**\n * Version for use in places like @osdk/client.\n *\n * @param obj An `Osdk.Instance` like object for the ObjectType in the generics\n */\n registerObject<T extends ObjectTypeDefinition>(\n objectType: T,\n obj: ObjectTypeCreatable<T> | ObjectTypeCreatableWithoutApiName<T>,\n ): void;\n /**\n * Version of register object generally used in shared.test\n * @param obj A raw server side representation of an object\n *\n * Don't use, its too easy to end up with an any.\n */\n registerObject(obj: BaseServerObject): void;\n registerObject(\n objectType: string | ObjectTypeDefinition | BaseServerObject,\n anyObj?: BaseServerObject | BaseObjectTypeCreatable,\n ): void {\n let bso: BaseServerObject;\n // obj = { ...obj }; // make a copy so we can mutate it\n\n if (isBaseServerObject(objectType)) {\n invariant(\n anyObj == null,\n \"Internal overload should only pass one argument\",\n );\n invariant(\n !Object.keys(objectType).some(s => s.startsWith(\"$\")),\n \"Object should not have any keys starting with $ if it has __apiName\",\n );\n bso = objectType;\n } else if (anyObj == null) {\n invariant(false, \"should not be possible due to overloads\");\n } else if (isBaseServerObject(anyObj)) {\n invariant(\n !Object.keys(anyObj).some(s => s.startsWith(\"$\")),\n \"Object should not have any keys starting with $ if it has __apiName\",\n );\n bso = anyObj;\n } else {\n bso = this.#osdkCreatableToBso(objectType, anyObj);\n }\n\n const apiName = bso.__apiName || bso.$apiName;\n invariant(apiName, \"Object should have an __apiName or $apiName\");\n\n this.#assertObjectDoesNotExist(apiName, bso.__primaryKey);\n\n if (!(\"__apiName\" in bso && \"__primaryKey\" in bso)) {\n invariant(\n \"$apiName\" in bso && \"$primaryKey\" in bso,\n \"Object should have (__apiName and __primaryKey) or ($apiName and $primaryKey)\",\n );\n const { $apiName, $primaryKey, ...others } = bso as\n & {\n $apiName: OntologiesV2.ObjectTypeApiName;\n $primaryKey: string | number | boolean;\n }\n & Record<\n string,\n unknown\n >;\n bso = {\n __apiName: $apiName,\n __primaryKey: $primaryKey,\n ...others,\n };\n }\n this.#assertObjectDoesNotExist(bso.__apiName, bso.__primaryKey);\n this.#objects.get(bso.__apiName).set(\n String(bso.__primaryKey),\n Object.freeze({ ...bso }),\n );\n }\n\n #osdkCreatableToBso(\n objectType: string | ObjectTypeDefinition,\n anyObj: BaseObjectTypeCreatable,\n ) {\n objectType = typeof objectType === \"string\"\n ? objectType\n : objectType.apiName;\n\n if (\"$apiName\" in anyObj) {\n invariant(anyObj.$apiName === objectType);\n }\n const { $apiName, $primaryKey, ...others } = anyObj;\n\n const meta = this.ontology.getObjectTypeFullMetadataOrThrow(\n objectType,\n );\n const realPrimaryKey = anyObj[meta.objectType.primaryKey] as\n | string\n | number\n | boolean;\n\n const maybeTitle = anyObj[meta.objectType.titleProperty];\n const rid = anyObj.$rid\n ?? `ri.phonograph2-objects.main.object.${crypto.randomUUID()}`;\n\n invariant(\n realPrimaryKey != null,\n `Object should have a primary key. ${JSON.stringify(anyObj)}`,\n );\n\n invariant(\n $primaryKey == null || $primaryKey === realPrimaryKey,\n \"Primary key mismatch\",\n );\n\n return {\n __apiName: objectType,\n __primaryKey: realPrimaryKey,\n __title: maybeTitle ? String(maybeTitle) : undefined,\n __rid: rid,\n ...others,\n };\n }\n\n replaceObjectOrThrow(x: BaseServerObject): void {\n this.#assertObjectExists(x.__apiName, x.__primaryKey);\n this.#objects.get(x.__apiName).set(String(x.__primaryKey), x);\n }\n\n /** Throws if the object does not already exist */\n unregisterObjectOrThrow(\n objectType: string,\n primaryKey: string | number | boolean,\n ): void {\n this.#assertObjectExists(objectType, primaryKey);\n this.#objects.get(objectType).delete(String(primaryKey));\n }\n\n registerLink(\n src: BaseServerObject,\n srcLinkName: string,\n dst: BaseServerObject,\n destLinkName: string,\n ): void {\n const srcLocator = objectLocator(src);\n const dstLocator = objectLocator(dst);\n const [srcSide, dstSide] = this.#fauxOntology.getBothLinkTypeSides(\n src.__apiName,\n srcLinkName,\n dst.__apiName,\n );\n\n invariant(\n srcSide.linkTypeRid === dstSide.linkTypeRid,\n `Expected both sides of the link to have the same rid, but got ${srcSide.linkTypeRid} and ${dstSide.linkTypeRid}`,\n );\n invariant(\n dstSide.apiName === destLinkName,\n `Link name mismatch on dst side. Expected ${destLinkName} but found ${dstSide.apiName}`,\n );\n\n this.#updateSingleLinkSide(\n srcSide,\n srcLocator,\n dstSide,\n dstLocator,\n );\n this.#updateSingleLinkSide(\n dstSide,\n dstLocator,\n srcSide,\n srcLocator,\n );\n }\n\n unregisterLink(\n src: BaseServerObject,\n srcLinkName: string,\n dst: BaseServerObject,\n dstLinkName: string,\n ): void {\n const srcLocator = objectLocator(src);\n const dstLocator = objectLocator(dst);\n const [srcSide, dstSide] = this.#fauxOntology.getBothLinkTypeSides(\n src.__apiName,\n srcLinkName,\n dst.__apiName,\n );\n\n invariant(\n dstSide.apiName === dstLinkName,\n `Link name mismatch on dst side. Expected ${dstLinkName} but found ${dstSide.apiName}`,\n );\n\n this.#removeSingleSideOfLink(srcLocator, srcSide, dstLocator);\n this.#removeSingleSideOfLink(dstLocator, dstSide, srcLocator);\n }\n\n registerTimeSeriesData(\n objectType: OntologiesV2.ObjectTypeApiName,\n primaryKey: string,\n property: OntologiesV2.PropertyApiName,\n data: OntologiesV2.TimeSeriesPoint[],\n ): void {\n this.getObjectOrThrow(objectType, primaryKey);\n const def = this.ontology.getObjectTypeFullMetadataOrThrow(objectType);\n invariant(\n def.objectType.properties[property].dataType.type === \"timeseries\"\n || def.objectType.properties[property].dataType.type\n === \"geotimeSeriesReference\",\n );\n this.#timeSeriesData.get(objectType).get(String(primaryKey)).set(\n property,\n data,\n );\n }\n\n getTimeSeriesData(\n objectType: OntologiesV2.ObjectTypeApiName,\n primaryKey: string,\n property: OntologiesV2.PropertyApiName,\n filter?: OntologiesV2.StreamTimeSeriesPointsRequest,\n ): OntologiesV2.TimeSeriesPoint[] {\n this.getObjectOrThrow(objectType, primaryKey);\n const allData = this.#timeSeriesData.get(objectType).get(String(primaryKey))\n .get(\n property,\n );\n if (!filter) return allData;\n return filterTimeSeriesData(allData, filter);\n }\n\n #updateSingleLinkSide(\n srcSide: OntologiesV2.LinkTypeSideV2,\n srcLocator: ObjectLocator,\n dstSide: OntologiesV2.LinkTypeSideV2,\n dstLocator: ObjectLocator,\n ) {\n const srcLinkName = srcSide.apiName;\n if (srcSide.cardinality === \"ONE\") {\n const linkNameToObj = this.#singleLinks.get(srcLocator);\n const oldLocator = linkNameToObj.get(srcLinkName);\n\n if (oldLocator && oldLocator !== dstLocator) {\n // we need to remove the other side's old value\n this.#removeSingleSideOfLink(\n oldLocator,\n dstSide,\n srcLocator,\n );\n }\n linkNameToObj.set(srcLinkName, dstLocator);\n } else if (srcSide.cardinality === \"MANY\") {\n const linkNameToObj = this.#manyLinks.get(srcLocator);\n linkNameToObj.set(srcLinkName, dstLocator);\n } else {\n // \"never\" case\n throw new Error(\"unexpected cardinality: \" + srcSide.cardinality);\n }\n }\n\n registerMedia(\n objectType: OntologiesV2.ObjectTypeApiName,\n property: OntologiesV2.PropertyApiName,\n content: ArrayBuffer,\n mediaType: MediaType,\n path: string | undefined,\n // This should be the correct prefix, per\n // https://github.com/palantir/osdk-ts/pull/1303#discussion_r2001989395\n mediaItemRid: MediaItemRid = `ri.mio.main.media-item.${randomUUID()}`,\n ): MediaReference {\n const mediaRef: ReadonlyDeep<MediaReference> = Object.freeze({\n mimeType: mediaType,\n reference: Object.freeze({\n type: \"mediaSetViewItem\",\n mediaSetViewItem: Object.freeze({\n mediaItemRid,\n mediaSetRid: \"ri.unimplemented.in.shared.test\",\n mediaSetViewRid: \"ri.unimplemented.in.shared.test\",\n }),\n }),\n });\n\n this.#media.get(objectType).get(property).set(\n mediaItemRid,\n Object.freeze({\n content,\n mediaRef,\n metaData: Object.freeze({\n mediaType,\n path,\n sizeBytes: String(content.byteLength),\n }),\n }),\n );\n\n return mediaRef;\n }\n\n getMediaOrThrow(\n objectType: OntologiesV2.ObjectTypeApiName,\n primaryKey: string,\n property: OntologiesV2.PropertyApiName,\n ): MediaMetadataAndContent {\n const obj = this.getObjectOrThrow(objectType, primaryKey);\n const propertyDef =\n this.ontology.getObjectTypeFullMetadataOrThrow(objectType)\n .objectType.properties[property];\n\n if (!propertyDef) {\n // This should be the correct error, per\n // https://github.com/palantir/osdk-ts/pull/1303#discussion_r2001968959\n throw new OpenApiCallError(\n 400,\n {\n errorCode: \"NOT_FOUND\",\n errorName: \"PropertiesNotFound\",\n errorInstanceId: \"faux-foundry\",\n parameters: {\n objectType,\n properties: [property],\n },\n } satisfies OntologiesV2.PropertiesNotFound,\n );\n }\n\n if (propertyDef.dataType.type !== \"mediaReference\") {\n // FIXME: what would the backend do here?\n throw new OpenApiCallError(\n 400,\n {\n errorCode: \"INVALID_ARGUMENT\",\n errorName: \"InvalidPropertyType\",\n errorInstanceId: \"faux-foundry\",\n parameters: {\n property,\n propertyBaseType: propertyDef.dataType.type,\n },\n } satisfies OntologiesV2.InvalidPropertyType,\n );\n }\n\n const rid = obj[property].reference.mediaSetViewItem.mediaItemRid;\n\n if (!rid || !rid.startsWith(\"ri.\")) {\n throw new OpenApiCallError(\n 400,\n {\n errorCode: \"INVALID_ARGUMENT\",\n errorName: \"InvalidPropertyValue\",\n errorInstanceId: \"faux-foundry\",\n parameters: {\n property,\n propertyBaseType: propertyDef.dataType.type,\n propertyValue: rid,\n },\n } satisfies OntologiesV2.InvalidPropertyValue,\n );\n }\n\n const ret = this.#media.get(objectType).get(property).get(rid);\n\n if (!ret) {\n throw new OpenApiCallError(400, InvalidRequest(\"Invalid parameters\"));\n }\n return ret;\n }\n\n #removeSingleSideOfLink(\n locator: ObjectLocator,\n linkSide: OntologiesV2.LinkTypeSideV2,\n expectedPriorValue: ObjectLocator,\n ) {\n const destLinkName = linkSide.apiName;\n if (linkSide.cardinality === \"ONE\") {\n const links = this.#singleLinks.get(locator);\n invariant(links.get(destLinkName) === expectedPriorValue);\n links.delete(destLinkName);\n } else {\n const links = this.#manyLinks.get(locator);\n invariant(links.get(destLinkName)?.has(expectedPriorValue));\n links.remove(destLinkName, expectedPriorValue);\n }\n }\n\n getObject(\n apiName: string,\n primaryKey: string | number | boolean,\n ): BaseServerObject | undefined {\n return this.#objects\n .get(apiName)\n .get(String(primaryKey));\n }\n\n getObjectOrThrow(\n apiName: string,\n primaryKey: string | number | boolean,\n ): BaseServerObject {\n const object = this.getObject(apiName, primaryKey);\n\n if (!object) {\n throw new OpenApiCallError(\n 404,\n ObjectNotFoundError(apiName, String(primaryKey)),\n );\n }\n return object;\n }\n\n getObjectByRid(rid: string): BaseServerObject | undefined {\n for (const [, pkToObjects] of this.#objects) {\n for (const [, obj] of pkToObjects) {\n if (obj.__rid === rid) {\n return obj;\n }\n }\n }\n }\n\n getLinksOrThrow(\n apiName: string,\n primaryKey: string | number | boolean,\n linkApiName: string,\n ): BaseServerObject[] {\n const object = this.getObjectOrThrow(apiName, primaryKey);\n\n const linkTypeSide = this.#fauxOntology.getLinkTypeSideV2(\n apiName,\n linkApiName,\n );\n\n if (linkTypeSide.cardinality === \"ONE\") {\n const locator = this.#singleLinks\n .get(objectLocator(object))\n .get(linkApiName);\n if (locator === undefined) {\n return [];\n }\n const { objectType, primaryKey } = parseLocator(locator);\n\n return [this.getObjectOrThrow(objectType, primaryKey)]; // will throw if not found\n } else {\n const locators = this.#manyLinks\n .get(objectLocator(object))\n .get(linkApiName);\n\n return Array.from(locators ?? [])\n .map((a) => {\n const [objectType, primaryKey] = a.split(\":\") ?? [];\n invariant(objectType && primaryKey, \"Invalid locator format\");\n return this.getObjectOrThrow(objectType, primaryKey);\n });\n }\n }\n\n getLinkOrThrow(\n objectType: string,\n primaryKey: string | number | boolean,\n linkType: string,\n targetPrimaryKey: string | number | boolean,\n ): BaseServerObject {\n const allLinks = this.getLinksOrThrow(objectType, primaryKey, linkType);\n const object =\n allLinks.filter(l => String(l.__primaryKey) === targetPrimaryKey)[0];\n\n if (!object) {\n throw new OpenApiCallError(\n 404,\n ObjectNotFoundError(\n `${objectType} -> ${linkType}`,\n String(targetPrimaryKey),\n ),\n );\n }\n return object;\n }\n\n getObjectsOfType(apiName: string): Iterable<BaseServerObject> {\n this.ontology.getObjectTypeFullMetadataOrThrow(apiName);\n return this.#objects\n .get(apiName)\n .values();\n }\n\n getObjectsFromObjectSet(\n parsedBody:\n | OntologiesV2.LoadObjectSetV2MultipleObjectTypesRequest\n | OntologiesV2.LoadObjectSetRequestV2,\n ): PagedBodyResponseWithTotal<BaseServerObject> {\n const selected = parsedBody.select;\n // when we have interfaces in here, we have a little trick for\n // caching off the important properties\n let objects = getObjectsFromSet(this, parsedBody.objectSet, undefined);\n\n if (!objects || objects.length === 0) {\n return {\n data: [],\n totalCount: \"0\",\n nextPageToken: undefined,\n };\n }\n\n if (parsedBody.orderBy) {\n objects = objects.sort(createOrderBySortFn(parsedBody.orderBy));\n }\n\n // finally, if we got interfaces, the objects have names like the interface and we need\n // to return them like the object.\n\n const page = pageThroughResponseSearchParams(\n objects,\n getPaginationParamsFromRequest(parsedBody),\n false,\n );\n\n if (!page) {\n throw new OpenApiCallError(\n 404,\n InvalidRequest(\n `No objects found for ${JSON.stringify(parsedBody)}`,\n ),\n );\n }\n const ret = subSelectProperties(\n page,\n [...selected],\n true,\n parsedBody.excludeRid,\n );\n\n return ret;\n }\n\n getAttachmentMetadata(\n objectType: string,\n primaryKey: string | number | boolean,\n propertyName: string,\n ): OntologiesV2.AttachmentV2 {\n const rid = this.getObjectOrThrow(objectType, primaryKey)[propertyName];\n return this.#attachments.getAttachmentMetadataByRid(rid);\n }\n\n getAttachmentBuffer(\n objectType: string,\n primaryKey: string | number | boolean,\n propertyName: string,\n ): ArrayBuffer {\n const rid = this.getObjectOrThrow(objectType, primaryKey)[propertyName];\n return this.#attachments.getAttachmentBuffer(rid);\n }\n\n applyAction(\n actionTypeApiName: string,\n req: OntologiesV2.ApplyActionRequestV2,\n ): OntologiesV2.SyncApplyActionResponseV2 {\n const actionDef = this.#fauxOntology.getActionDef(actionTypeApiName);\n const actionImpl = this.#fauxOntology.getActionImpl(actionTypeApiName);\n\n const validation = validateAction(req, actionDef, this);\n if (validation.result === \"INVALID\") {\n return { validation };\n }\n\n const batch = new FauxDataStoreBatch(this);\n const r = actionImpl(batch, req, {\n def: actionDef,\n attachments: this.#attachments,\n });\n\n // The legacy actions return the full payload\n // they want to return, so we need to do that\n // but the future is for the actionImpl's to\n // return void and to do validation details here\n if (r) return r;\n\n return {\n validation: {\n parameters: {},\n result: \"VALID\",\n submissionCriteria: [],\n },\n edits: req.options?.mode === \"VALIDATE_AND_EXECUTE\"\n && (\n req.options.returnEdits === \"ALL\"\n || req.options.returnEdits === \"ALL_V2_WITH_DELETIONS\"\n )\n ? {\n type: \"edits\",\n ...batch.objectEdits,\n }\n : undefined,\n };\n }\n\n batchApplyAction(\n actionTypeApiName: string,\n batchReq: OntologiesV2.BatchApplyActionRequestV2,\n ): OntologiesV2.BatchApplyActionResponseV2 {\n const actionDef = this.#fauxOntology.getActionDef(actionTypeApiName);\n const actionImpl = this.#fauxOntology.getActionImpl(actionTypeApiName);\n\n for (const req of batchReq.requests) {\n const result = validateAction(req, actionDef, this);\n if (result.result === \"INVALID\") {\n throw new OpenApiCallError(\n 500,\n {\n errorCode: \"INVALID_ARGUMENT\",\n errorName: \"ActionValidationFailed\",\n errorInstanceId: \"faux-foundry\",\n parameters: {\n actionType: actionTypeApiName,\n },\n } as OntologiesV2.ActionValidationFailed,\n );\n }\n }\n\n const batch = new FauxDataStoreBatch(this);\n\n const returnLargeScaleEdits = false;\n for (const item of batchReq.requests) {\n actionImpl(\n batch,\n {\n ...item,\n options: {\n mode: \"VALIDATE_AND_EXECUTE\",\n returnEdits: batchReq.options?.returnEdits,\n },\n },\n { def: actionDef, attachments: this.#attachments },\n );\n }\n if (batchReq.options?.returnEdits === \"NONE\") {\n return {};\n }\n\n if (returnLargeScaleEdits) {\n const editedObjectTypes = new Set<OntologiesV2.ObjectTypeApiName>();\n for (const edit of batch.objectEdits.edits) {\n if (\n edit.type === \"modifyObject\" || edit.type === \"addObject\"\n || edit.type === \"deleteObject\"\n ) {\n editedObjectTypes.add(edit.objectType);\n }\n }\n\n return {\n edits: {\n type: \"largeScaleEdits\",\n editedObjectTypes: Array.from(editedObjectTypes),\n },\n };\n }\n\n return {\n edits: {\n type: \"edits\",\n ...batch.objectEdits,\n edits: batch.objectEdits.edits.filter(x =>\n x.type !== \"deleteObject\" && x.type !== \"deleteLink\"\n ),\n },\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"FauxDataStore.js","names":["DefaultMap","MultiMap","randomUUID","crypto","invariant","InvalidRequest","ObjectNotFoundError","subSelectProperties","getPaginationParamsFromRequest","OpenApiCallError","pageThroughResponseSearchParams","isBaseServerObject","FauxDataStoreBatch","filterTimeSeriesData","createOrderBySortFn","getObjectsFromSet","objectLocator","parseLocator","validateAction","FauxDataStore","objects","Map","singleLinks","manyLinks","Set","fauxOntology","attachments","timeSeriesData","media","strict","constructor","clear","ontology","assertObjectExists","#assertObjectExists","objectType","primaryKey","getObject","String","assertObjectDoesNotExist","#assertObjectDoesNotExist","errorCode","errorName","errorInstanceId","parameters","registerObject","anyObj","bso","process","env","NODE_ENV","Object","keys","some","s","startsWith","osdkCreatableToBso","apiName","__apiName","$apiName","__primaryKey","$primaryKey","others","get","set","freeze","#osdkCreatableToBso","meta","getObjectTypeFullMetadataOrThrow","realPrimaryKey","maybeTitle","titleProperty","rid","$rid","JSON","stringify","__title","undefined","__rid","replaceObjectOrThrow","x","oldObject","getObjectOrThrow","linksToUpdate","linksToRemove","linkDef","linkTypes","cardinality","foreignKeyPropertyApiName","fkName","fkValue","oldFkValue","dstSide","getOtherLinkTypeSideV2OrThrow","dstLocator","objectTypeApiName","target","console","log","push","srcSide","srcLocator","updateSingleLinkSide","removeSingleSideOfLink","unregisterObjectOrThrow","delete","registerLink","tmpSrc","srcLinkName","tmpDst","destLinkName","src","dst","getBothLinkTypeSides","linkTypeRid","oneSide","object","link","manySide","newObj","unregisterLink","dstLinkName","extractOneManySide","registerTimeSeriesData","property","data","def","properties","dataType","type","getTimeSeriesData","filter","allData","#updateSingleLinkSide","linkNameToObj","oldLocator","Error","registerMedia","content","mediaType","path","mediaItemRid","mediaRef","mimeType","reference","mediaSetViewItem","mediaSetRid","mediaSetViewRid","metaData","sizeBytes","byteLength","getMediaOrThrow","obj","propertyDef","propertyBaseType","propertyValue","ret","#removeSingleSideOfLink","locator","linkSide","expectedPriorValue","links","has","remove","getObjectByRid","pkToObjects","getLinksOrThrow","linkApiName","linkTypeSide","getLinkTypeSideV2","locators","Array","from","map","a","split","getLinkOrThrow","linkType","targetPrimaryKey","allLinks","l","getObjectsOfType","values","getObjectsFromObjectSet","parsedBody","selected","select","objectSet","length","totalCount","nextPageToken","orderBy","sort","page","excludeRid","getAttachmentMetadata","propertyName","getAttachmentMetadataByRid","getAttachmentBuffer","applyAction","actionTypeApiName","req","actionDef","getActionDef","actionImpl","getActionImpl","validation","result","batch","r","submissionCriteria","edits","options","mode","returnEdits","objectEdits","batchApplyAction","batchReq","requests","actionType","item"],"sources":["FauxDataStore.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 { CompileTimeMetadata, ObjectTypeDefinition } from \"@osdk/api\";\nimport type {\n MediaItemRid,\n MediaReference,\n MediaType,\n} from \"@osdk/foundry.core\";\nimport type * as OntologiesV2 from \"@osdk/foundry.ontologies\";\nimport { DefaultMap, MultiMap } from \"mnemonist\";\nimport { randomUUID } from \"node:crypto\";\nimport * as crypto from \"node:crypto\";\nimport invariant from \"tiny-invariant\";\nimport type { ReadonlyDeep } from \"type-fest\";\nimport { InvalidRequest, ObjectNotFoundError } from \"../errors.js\";\nimport { subSelectProperties } from \"../filterObjects.js\";\nimport { getPaginationParamsFromRequest } from \"../handlers/util/getPaginationParams.js\";\nimport { OpenApiCallError } from \"../handlers/util/handleOpenApiCall.js\";\nimport type { PagedBodyResponseWithTotal } from \"../handlers/util/pageThroughResponseSearchParams.js\";\nimport { pageThroughResponseSearchParams } from \"../handlers/util/pageThroughResponseSearchParams.js\";\nimport {\n type BaseServerObject,\n isBaseServerObject,\n} from \"./BaseServerObject.js\";\nimport type { FauxAttachmentStore } from \"./FauxAttachmentStore.js\";\nimport { FauxDataStoreBatch } from \"./FauxDataStoreBatch.js\";\nimport type { FauxOntology } from \"./FauxOntology.js\";\nimport { filterTimeSeriesData } from \"./filterTimeSeriesData.js\";\nimport { createOrderBySortFn, getObjectsFromSet } from \"./getObjectsFromSet.js\";\nimport type { ObjectLocator } from \"./ObjectLocator.js\";\nimport { objectLocator, parseLocator } from \"./ObjectLocator.js\";\nimport type { JustProps } from \"./typeHelpers/JustProps.js\";\nimport { validateAction } from \"./validateAction.js\";\n\nexport interface MediaMetadataAndContent {\n content: ArrayBuffer;\n mediaRef: MediaReference;\n metaData: OntologiesV2.MediaMetadata;\n}\n\ntype ObjectTypeCreatableWithoutApiName<T extends ObjectTypeDefinition> =\n OrUndefinedToOptional<JustProps<T>>;\n\n/**\n * Represents the properties needed to create an object, specifically,\n * the properties of the object and the $apiName\n */\ntype ObjectTypeCreatable<T extends ObjectTypeDefinition> =\n & ObjectTypeCreatableWithoutApiName<T>\n & { $apiName: CompileTimeMetadata<T>[\"apiName\"] };\n\n/**\n * Helper type for converting `foo: string | undefined` into `foo?: string`\n */\ntype OrUndefinedToOptional<T extends object> =\n & {\n [K in keyof T as T[K] extends undefined ? K : never]?: T[K];\n }\n & {\n [K in keyof T as T[K] extends undefined ? never : K]?: T[K];\n };\n\n/**\n * Type safe object for representing \"client\" side objects.\n */\ninterface BaseObjectTypeCreatable {\n $apiName?: OntologiesV2.ObjectTypeApiName;\n\n /** if present it must match the correct value */\n $primaryKey?: string | number | boolean;\n\n /** If set, will use the as the $rid for the object, otherwise one is created for you */\n $rid?: string;\n\n /**\n * All the properties.\n *\n * FUTURE: This only handles the primitive types right now. If we want to be able to create\n * objects with some helpers for other types, this will need to be updated.\n */\n [key: string]: string | number | boolean | undefined;\n}\n\nexport class FauxDataStore {\n #objects = new DefaultMap<\n OntologiesV2.ObjectTypeApiName,\n Map<string, BaseServerObject>\n >(\n (key) => new Map(),\n );\n\n #singleLinks = new DefaultMap(\n (_objectLocator: ObjectLocator) =>\n new Map<OntologiesV2.LinkTypeApiName, ObjectLocator>(),\n );\n\n #manyLinks = new DefaultMap(\n (_objectLocator: ObjectLocator) => new MultiMap<string, ObjectLocator>(Set),\n );\n\n #fauxOntology: FauxOntology;\n\n #attachments: FauxAttachmentStore;\n\n #timeSeriesData = new DefaultMap(\n (_objectType: OntologiesV2.ObjectTypeApiName) =>\n new DefaultMap((_pk: string) =>\n new DefaultMap((_property: OntologiesV2.PropertyApiName) =>\n [] as Array<OntologiesV2.TimeSeriesPoint>\n )\n ),\n );\n\n #media = new DefaultMap(\n (_objectType: OntologiesV2.ObjectTypeApiName) =>\n new DefaultMap((_propName: OntologiesV2.PropertyApiName) => {\n return new Map<MediaItemRid, MediaMetadataAndContent>();\n }),\n );\n #strict: boolean;\n\n constructor(\n fauxOntology: FauxOntology,\n attachments: FauxAttachmentStore,\n strict: boolean,\n ) {\n this.#fauxOntology = fauxOntology;\n this.#attachments = attachments;\n this.#strict = strict;\n }\n\n /**\n * Removes all data that is associated with a namespace/ontology.\n *\n * Note: does not clear `attachments` nor does it clear the ontology itself.\n */\n public clear(): void {\n this.#media.clear();\n this.#timeSeriesData.clear();\n this.#manyLinks.clear();\n this.#singleLinks.clear();\n this.#objects.clear();\n }\n\n get ontology(): FauxOntology {\n return this.#fauxOntology;\n }\n\n #assertObjectExists(\n objectType: string,\n primaryKey: string | number | boolean,\n ) {\n if (!this.getObject(objectType, primaryKey)) {\n throw new OpenApiCallError(\n 404,\n ObjectNotFoundError(objectType, String(primaryKey)),\n );\n }\n }\n\n #assertObjectDoesNotExist(\n objectType: string,\n primaryKey: string | number | boolean,\n ): void {\n if (this.getObject(objectType, primaryKey)) {\n throw new OpenApiCallError(\n 500,\n {\n errorCode: \"CONFLICT\",\n errorName: \"ObjectAlreadyExists\",\n errorInstanceId: \"faux-foundry\",\n parameters: {\n objectType,\n primaryKey: String(primaryKey),\n },\n } satisfies OntologiesV2.ObjectAlreadyExists,\n );\n }\n }\n\n /**\n * Version for use in places like @osdk/client.\n *\n * @param obj An `Osdk.Instance` like object for the ObjectType in the generics\n */\n registerObject<T extends ObjectTypeDefinition>(\n objectType: T,\n obj: ObjectTypeCreatable<T> | ObjectTypeCreatableWithoutApiName<T>,\n ): void;\n /**\n * Version of register object generally used in shared.test\n * @param obj A raw server side representation of an object\n *\n * Don't use, its too easy to end up with an any.\n */\n registerObject(obj: BaseServerObject): void;\n registerObject(\n objectType: string | ObjectTypeDefinition | BaseServerObject,\n anyObj?: BaseServerObject | BaseObjectTypeCreatable,\n ): void {\n let bso: BaseServerObject;\n // obj = { ...obj }; // make a copy so we can mutate it\n\n if (isBaseServerObject(objectType)) {\n invariant(\n anyObj == null,\n \"Internal overload should only pass one argument\",\n );\n invariant(\n !Object.keys(objectType).some(s => s.startsWith(\"$\")),\n \"Object should not have any keys starting with $ if it has __apiName\",\n );\n bso = objectType;\n } else if (anyObj == null) {\n invariant(false, \"should not be possible due to overloads\");\n } else if (isBaseServerObject(anyObj)) {\n invariant(\n !Object.keys(anyObj).some(s => s.startsWith(\"$\")),\n \"Object should not have any keys starting with $ if it has __apiName\",\n );\n bso = anyObj;\n } else {\n bso = this.#osdkCreatableToBso(objectType, anyObj);\n }\n\n const apiName = bso.__apiName || bso.$apiName;\n invariant(apiName, \"Object should have an __apiName or $apiName\");\n\n this.#assertObjectDoesNotExist(apiName, bso.__primaryKey);\n\n if (!(\"__apiName\" in bso && \"__primaryKey\" in bso)) {\n invariant(\n \"$apiName\" in bso && \"$primaryKey\" in bso,\n \"Object should have (__apiName and __primaryKey) or ($apiName and $primaryKey)\",\n );\n const { $apiName, $primaryKey, ...others } = bso as\n & {\n $apiName: OntologiesV2.ObjectTypeApiName;\n $primaryKey: string | number | boolean;\n }\n & Record<\n string,\n unknown\n >;\n bso = {\n __apiName: $apiName,\n __primaryKey: $primaryKey,\n ...others,\n };\n }\n this.#assertObjectDoesNotExist(bso.__apiName, bso.__primaryKey);\n this.#objects.get(bso.__apiName).set(\n String(bso.__primaryKey),\n Object.freeze({ ...bso }),\n );\n }\n\n #osdkCreatableToBso(\n objectType: string | ObjectTypeDefinition,\n anyObj: BaseObjectTypeCreatable,\n ) {\n objectType = typeof objectType === \"string\"\n ? objectType\n : objectType.apiName;\n\n if (\"$apiName\" in anyObj) {\n invariant(anyObj.$apiName === objectType);\n }\n const { $apiName, $primaryKey, ...others } = anyObj;\n\n const meta = this.ontology.getObjectTypeFullMetadataOrThrow(\n objectType,\n );\n const realPrimaryKey = anyObj[meta.objectType.primaryKey] as\n | string\n | number\n | boolean;\n\n const maybeTitle = anyObj[meta.objectType.titleProperty];\n const rid = anyObj.$rid\n ?? `ri.phonograph2-objects.main.object.${crypto.randomUUID()}`;\n\n invariant(\n realPrimaryKey != null,\n `Object should have a primary key. ${JSON.stringify(anyObj)}`,\n );\n\n invariant(\n $primaryKey == null || $primaryKey === realPrimaryKey,\n \"Primary key mismatch\",\n );\n\n return {\n __apiName: objectType,\n __primaryKey: realPrimaryKey,\n __title: maybeTitle ? String(maybeTitle) : undefined,\n __rid: rid,\n ...others,\n };\n }\n\n replaceObjectOrThrow(x: BaseServerObject): void {\n const objectType = this.ontology.getObjectTypeFullMetadataOrThrow(\n x.__apiName,\n );\n const oldObject = this.getObjectOrThrow(x.__apiName, x.__primaryKey);\n\n const linksToUpdate: Array<\n {\n srcSide: OntologiesV2.LinkTypeSideV2;\n srcLocator: ObjectLocator;\n dstSide: OntologiesV2.LinkTypeSideV2;\n dstLocator: ObjectLocator;\n }\n > = [];\n\n const linksToRemove: Array<{\n srcSide: OntologiesV2.LinkTypeSideV2;\n srcLocator: ObjectLocator;\n dstSide: OntologiesV2.LinkTypeSideV2;\n dstLocator: ObjectLocator;\n }> = [];\n\n for (const linkDef of objectType.linkTypes) {\n if (linkDef.cardinality === \"ONE\") {\n invariant(\n this.#strict && linkDef.foreignKeyPropertyApiName,\n `Error examining ${objectType.objectType.apiName}.${linkDef.apiName}: ONE side of links should have a foreign key. `,\n );\n\n const fkName = linkDef.foreignKeyPropertyApiName;\n const fkValue = x[fkName];\n const oldFkValue = oldObject[fkName];\n\n if (oldObject[fkName] !== x[fkName]) {\n const dstSide = this.ontology.getOtherLinkTypeSideV2OrThrow(\n objectType.objectType.apiName,\n linkDef.apiName,\n );\n const dstLocator = objectLocator({\n __apiName: dstSide.objectTypeApiName,\n __primaryKey: fkValue,\n });\n\n const target = this.getObject(dstSide.objectTypeApiName, fkValue);\n\n if (fkValue != null && !target) {\n // eslint-disable-next-line no-console\n console.log(\n `WARNING! Setting a FK value to a non-existent object: ${dstLocator}`,\n );\n }\n\n if (fkValue != null) {\n linksToUpdate.push({\n dstSide,\n dstLocator,\n srcSide: linkDef,\n srcLocator: objectLocator(x),\n });\n } else {\n linksToRemove.push({\n srcLocator: objectLocator(x),\n srcSide: linkDef,\n dstLocator: objectLocator({\n __apiName: dstSide.objectTypeApiName,\n __primaryKey: oldFkValue,\n }),\n dstSide,\n });\n }\n }\n }\n }\n\n this.#objects.get(x.__apiName).set(String(x.__primaryKey), x);\n for (const { srcSide, srcLocator, dstSide, dstLocator } of linksToUpdate) {\n this.#updateSingleLinkSide(\n srcSide,\n srcLocator,\n dstSide,\n dstLocator,\n );\n this.#updateSingleLinkSide(\n dstSide,\n dstLocator,\n srcSide,\n srcLocator,\n );\n }\n\n for (const { srcSide, srcLocator, dstSide, dstLocator } of linksToRemove) {\n this.#removeSingleSideOfLink(srcLocator, srcSide, dstLocator);\n this.#removeSingleSideOfLink(dstLocator, dstSide, srcLocator);\n }\n }\n\n /** Throws if the object does not already exist */\n unregisterObjectOrThrow(\n objectType: string,\n primaryKey: string | number | boolean,\n ): void {\n this.#assertObjectExists(objectType, primaryKey);\n this.#objects.get(objectType).delete(String(primaryKey));\n }\n\n registerLink(\n tmpSrc: BaseServerObject,\n srcLinkName: string,\n tmpDst: BaseServerObject,\n destLinkName: string,\n ): void {\n const src = this.getObjectOrThrow(tmpSrc.__apiName, tmpSrc.__primaryKey);\n const dst = this.getObjectOrThrow(tmpDst.__apiName, tmpDst.__primaryKey);\n\n const srcLocator = objectLocator(src);\n const dstLocator = objectLocator(dst);\n const [srcSide, dstSide] = this.#fauxOntology.getBothLinkTypeSides(\n src.__apiName,\n srcLinkName,\n dst.__apiName,\n );\n\n invariant(\n srcSide.linkTypeRid === dstSide.linkTypeRid,\n `Expected both sides of the link to have the same rid, but got ${srcSide.linkTypeRid} and ${dstSide.linkTypeRid}`,\n );\n invariant(\n dstSide.apiName === destLinkName,\n `Link name mismatch on dst side. Expected ${destLinkName} but found ${dstSide.apiName}`,\n );\n\n if (this.#strict) {\n const oneSide = srcSide.cardinality === \"ONE\"\n ? { object: src, link: srcSide }\n : dstSide.cardinality === \"ONE\"\n ? { object: dst, link: dstSide }\n : undefined;\n const manySide = oneSide\n ? (srcSide.cardinality === \"MANY\"\n ? { object: src, link: srcSide }\n : { object: dst, link: dstSide })\n : undefined;\n\n if (oneSide && manySide) {\n invariant(\n oneSide.link.foreignKeyPropertyApiName,\n `Expected to find a foreignKeyPropertyApiName on the one side: ${oneSide.object.__apiName}.${oneSide.link.apiName}`,\n );\n\n const newObj = {\n ...oneSide.object,\n [oneSide.link.foreignKeyPropertyApiName]:\n manySide.object.__primaryKey,\n };\n\n // This method call will also do the work to update the sides\n this.replaceObjectOrThrow(newObj);\n return;\n }\n }\n\n this.#updateSingleLinkSide(\n srcSide,\n srcLocator,\n dstSide,\n dstLocator,\n );\n this.#updateSingleLinkSide(\n dstSide,\n dstLocator,\n srcSide,\n srcLocator,\n );\n }\n\n unregisterLink(\n src: BaseServerObject,\n srcLinkName: string,\n dst: BaseServerObject,\n dstLinkName: string,\n ): void {\n const srcLocator = objectLocator(src);\n const dstLocator = objectLocator(dst);\n const [srcSide, dstSide] = this.#fauxOntology.getBothLinkTypeSides(\n src.__apiName,\n srcLinkName,\n dst.__apiName,\n );\n\n invariant(\n dstSide.apiName === dstLinkName,\n `Link name mismatch on dst side. Expected ${dstLinkName} but found ${dstSide.apiName}`,\n );\n\n if (this.#strict) {\n const { oneSide, manySide } = extractOneManySide(\n srcSide,\n src,\n dstSide,\n dst,\n );\n\n if (oneSide && manySide) {\n invariant(\n oneSide.link.foreignKeyPropertyApiName,\n `Expected to find a foreignKeyPropertyApiName on the one side: ${oneSide.object.__apiName}.${oneSide.link.apiName}`,\n );\n\n const newObj = {\n ...oneSide.object,\n [oneSide.link.foreignKeyPropertyApiName]: undefined,\n };\n\n // This method call will also do the work to update the sides\n this.replaceObjectOrThrow(newObj);\n return;\n }\n }\n\n this.#removeSingleSideOfLink(srcLocator, srcSide, dstLocator);\n this.#removeSingleSideOfLink(dstLocator, dstSide, srcLocator);\n }\n\n registerTimeSeriesData(\n objectType: OntologiesV2.ObjectTypeApiName,\n primaryKey: string,\n property: OntologiesV2.PropertyApiName,\n data: OntologiesV2.TimeSeriesPoint[],\n ): void {\n this.getObjectOrThrow(objectType, primaryKey);\n const def = this.ontology.getObjectTypeFullMetadataOrThrow(objectType);\n invariant(\n def.objectType.properties[property].dataType.type === \"timeseries\"\n || def.objectType.properties[property].dataType.type\n === \"geotimeSeriesReference\",\n );\n this.#timeSeriesData.get(objectType).get(String(primaryKey)).set(\n property,\n data,\n );\n }\n\n getTimeSeriesData(\n objectType: OntologiesV2.ObjectTypeApiName,\n primaryKey: string,\n property: OntologiesV2.PropertyApiName,\n filter?: OntologiesV2.StreamTimeSeriesPointsRequest,\n ): OntologiesV2.TimeSeriesPoint[] {\n this.getObjectOrThrow(objectType, primaryKey);\n const allData = this.#timeSeriesData.get(objectType).get(String(primaryKey))\n .get(\n property,\n );\n if (!filter) return allData;\n return filterTimeSeriesData(allData, filter);\n }\n\n #updateSingleLinkSide(\n srcSide: OntologiesV2.LinkTypeSideV2,\n srcLocator: ObjectLocator,\n dstSide: OntologiesV2.LinkTypeSideV2,\n dstLocator: ObjectLocator,\n ) {\n const srcLinkName = srcSide.apiName;\n if (srcSide.cardinality === \"ONE\") {\n const linkNameToObj = this.#singleLinks.get(srcLocator);\n const oldLocator = linkNameToObj.get(srcLinkName);\n\n if (oldLocator && oldLocator !== dstLocator) {\n // we need to remove the other side's old value\n this.#removeSingleSideOfLink(\n oldLocator,\n dstSide,\n srcLocator,\n );\n }\n linkNameToObj.set(srcLinkName, dstLocator);\n } else if (srcSide.cardinality === \"MANY\") {\n const linkNameToObj = this.#manyLinks.get(srcLocator);\n linkNameToObj.set(srcLinkName, dstLocator);\n } else {\n // \"never\" case\n throw new Error(\"unexpected cardinality: \" + srcSide.cardinality);\n }\n }\n\n registerMedia(\n objectType: OntologiesV2.ObjectTypeApiName,\n property: OntologiesV2.PropertyApiName,\n content: ArrayBuffer,\n mediaType: MediaType,\n path: string | undefined,\n // This should be the correct prefix, per\n // https://github.com/palantir/osdk-ts/pull/1303#discussion_r2001989395\n mediaItemRid: MediaItemRid = `ri.mio.main.media-item.${randomUUID()}`,\n ): MediaReference {\n const mediaRef: ReadonlyDeep<MediaReference> = Object.freeze({\n mimeType: mediaType,\n reference: Object.freeze({\n type: \"mediaSetViewItem\",\n mediaSetViewItem: Object.freeze({\n mediaItemRid,\n mediaSetRid: \"ri.unimplemented.in.shared.test\",\n mediaSetViewRid: \"ri.unimplemented.in.shared.test\",\n }),\n }),\n });\n\n this.#media.get(objectType).get(property).set(\n mediaItemRid,\n Object.freeze({\n content,\n mediaRef,\n metaData: Object.freeze({\n mediaType,\n path,\n sizeBytes: String(content.byteLength),\n }),\n }),\n );\n\n return mediaRef;\n }\n\n getMediaOrThrow(\n objectType: OntologiesV2.ObjectTypeApiName,\n primaryKey: string,\n property: OntologiesV2.PropertyApiName,\n ): MediaMetadataAndContent {\n const obj = this.getObjectOrThrow(objectType, primaryKey);\n const propertyDef =\n this.ontology.getObjectTypeFullMetadataOrThrow(objectType)\n .objectType.properties[property];\n\n if (!propertyDef) {\n // This should be the correct error, per\n // https://github.com/palantir/osdk-ts/pull/1303#discussion_r2001968959\n throw new OpenApiCallError(\n 400,\n {\n errorCode: \"NOT_FOUND\",\n errorName: \"PropertiesNotFound\",\n errorInstanceId: \"faux-foundry\",\n parameters: {\n objectType,\n properties: [property],\n },\n } satisfies OntologiesV2.PropertiesNotFound,\n );\n }\n\n if (propertyDef.dataType.type !== \"mediaReference\") {\n // FIXME: what would the backend do here?\n throw new OpenApiCallError(\n 400,\n {\n errorCode: \"INVALID_ARGUMENT\",\n errorName: \"InvalidPropertyType\",\n errorInstanceId: \"faux-foundry\",\n parameters: {\n property,\n propertyBaseType: propertyDef.dataType.type,\n },\n } satisfies OntologiesV2.InvalidPropertyType,\n );\n }\n\n const rid = obj[property].reference.mediaSetViewItem.mediaItemRid;\n\n if (!rid || !rid.startsWith(\"ri.\")) {\n throw new OpenApiCallError(\n 400,\n {\n errorCode: \"INVALID_ARGUMENT\",\n errorName: \"InvalidPropertyValue\",\n errorInstanceId: \"faux-foundry\",\n parameters: {\n property,\n propertyBaseType: propertyDef.dataType.type,\n propertyValue: rid,\n },\n } satisfies OntologiesV2.InvalidPropertyValue,\n );\n }\n\n const ret = this.#media.get(objectType).get(property).get(rid);\n\n if (!ret) {\n throw new OpenApiCallError(400, InvalidRequest(\"Invalid parameters\"));\n }\n return ret;\n }\n\n #removeSingleSideOfLink(\n locator: ObjectLocator,\n linkSide: OntologiesV2.LinkTypeSideV2,\n expectedPriorValue: ObjectLocator,\n ) {\n const destLinkName = linkSide.apiName;\n if (linkSide.cardinality === \"ONE\") {\n const links = this.#singleLinks.get(locator);\n invariant(links.get(destLinkName) === expectedPriorValue);\n links.delete(destLinkName);\n } else {\n const links = this.#manyLinks.get(locator);\n invariant(links.get(destLinkName)?.has(expectedPriorValue));\n links.remove(destLinkName, expectedPriorValue);\n }\n }\n\n getObject(\n apiName: string,\n primaryKey: string | number | boolean,\n ): BaseServerObject | undefined {\n return this.#objects\n .get(apiName)\n .get(String(primaryKey));\n }\n\n getObjectOrThrow(\n apiName: string,\n primaryKey: string | number | boolean,\n ): BaseServerObject {\n const object = this.getObject(apiName, primaryKey);\n\n if (!object) {\n throw new OpenApiCallError(\n 404,\n ObjectNotFoundError(apiName, String(primaryKey)),\n );\n }\n return object;\n }\n\n getObjectByRid(rid: string): BaseServerObject | undefined {\n for (const [, pkToObjects] of this.#objects) {\n for (const [, obj] of pkToObjects) {\n if (obj.__rid === rid) {\n return obj;\n }\n }\n }\n }\n\n getLinksOrThrow(\n apiName: string,\n primaryKey: string | number | boolean,\n linkApiName: string,\n ): BaseServerObject[] {\n const object = this.getObjectOrThrow(apiName, primaryKey);\n\n const linkTypeSide = this.#fauxOntology.getLinkTypeSideV2(\n apiName,\n linkApiName,\n );\n\n if (linkTypeSide.cardinality === \"ONE\") {\n const locator = this.#singleLinks\n .get(objectLocator(object))\n .get(linkApiName);\n if (locator === undefined) {\n return [];\n }\n const { objectType, primaryKey } = parseLocator(locator);\n\n return [this.getObjectOrThrow(objectType, primaryKey)]; // will throw if not found\n } else {\n const locators = this.#manyLinks\n .get(objectLocator(object))\n .get(linkApiName);\n\n return Array.from(locators ?? [])\n .map((a) => {\n const [objectType, primaryKey] = a.split(\":\") ?? [];\n invariant(objectType && primaryKey, \"Invalid locator format\");\n return this.getObjectOrThrow(objectType, primaryKey);\n });\n }\n }\n\n getLinkOrThrow(\n objectType: string,\n primaryKey: string | number | boolean,\n linkType: string,\n targetPrimaryKey: string | number | boolean,\n ): BaseServerObject {\n const allLinks = this.getLinksOrThrow(objectType, primaryKey, linkType);\n const object =\n allLinks.filter(l => String(l.__primaryKey) === targetPrimaryKey)[0];\n\n if (!object) {\n throw new OpenApiCallError(\n 404,\n ObjectNotFoundError(\n `${objectType} -> ${linkType}`,\n String(targetPrimaryKey),\n ),\n );\n }\n return object;\n }\n\n getObjectsOfType(apiName: string): Iterable<BaseServerObject> {\n this.ontology.getObjectTypeFullMetadataOrThrow(apiName);\n return this.#objects\n .get(apiName)\n .values();\n }\n\n getObjectsFromObjectSet(\n parsedBody:\n | OntologiesV2.LoadObjectSetV2MultipleObjectTypesRequest\n | OntologiesV2.LoadObjectSetRequestV2,\n ): PagedBodyResponseWithTotal<BaseServerObject> {\n const selected = parsedBody.select;\n // when we have interfaces in here, we have a little trick for\n // caching off the important properties\n let objects = getObjectsFromSet(this, parsedBody.objectSet, undefined);\n\n if (!objects || objects.length === 0) {\n return {\n data: [],\n totalCount: \"0\",\n nextPageToken: undefined,\n };\n }\n\n if (parsedBody.orderBy) {\n objects = objects.sort(createOrderBySortFn(parsedBody.orderBy));\n }\n\n // finally, if we got interfaces, the objects have names like the interface and we need\n // to return them like the object.\n\n const page = pageThroughResponseSearchParams(\n objects,\n getPaginationParamsFromRequest(parsedBody),\n false,\n );\n\n if (!page) {\n throw new OpenApiCallError(\n 404,\n InvalidRequest(\n `No objects found for ${JSON.stringify(parsedBody)}`,\n ),\n );\n }\n const ret = subSelectProperties(\n page,\n [...selected],\n true,\n parsedBody.excludeRid,\n );\n\n return ret;\n }\n\n getAttachmentMetadata(\n objectType: string,\n primaryKey: string | number | boolean,\n propertyName: string,\n ): OntologiesV2.AttachmentV2 {\n const rid = this.getObjectOrThrow(objectType, primaryKey)[propertyName];\n return this.#attachments.getAttachmentMetadataByRid(rid);\n }\n\n getAttachmentBuffer(\n objectType: string,\n primaryKey: string | number | boolean,\n propertyName: string,\n ): ArrayBuffer {\n const rid = this.getObjectOrThrow(objectType, primaryKey)[propertyName];\n return this.#attachments.getAttachmentBuffer(rid);\n }\n\n applyAction(\n actionTypeApiName: string,\n req: OntologiesV2.ApplyActionRequestV2,\n ): OntologiesV2.SyncApplyActionResponseV2 {\n const actionDef = this.#fauxOntology.getActionDef(actionTypeApiName);\n const actionImpl = this.#fauxOntology.getActionImpl(actionTypeApiName);\n\n const validation = validateAction(req, actionDef, this);\n if (validation.result === \"INVALID\") {\n return { validation };\n }\n\n const batch = new FauxDataStoreBatch(this);\n const r = actionImpl(batch, req, {\n def: actionDef,\n attachments: this.#attachments,\n });\n\n // The legacy actions return the full payload\n // they want to return, so we need to do that\n // but the future is for the actionImpl's to\n // return void and to do validation details here\n if (r) return r;\n\n return {\n validation: {\n parameters: {},\n result: \"VALID\",\n submissionCriteria: [],\n },\n edits: req.options?.mode === \"VALIDATE_AND_EXECUTE\"\n && (\n req.options.returnEdits === \"ALL\"\n || req.options.returnEdits === \"ALL_V2_WITH_DELETIONS\"\n )\n ? {\n type: \"edits\",\n ...batch.objectEdits,\n }\n : undefined,\n };\n }\n\n batchApplyAction(\n actionTypeApiName: string,\n batchReq: OntologiesV2.BatchApplyActionRequestV2,\n ): OntologiesV2.BatchApplyActionResponseV2 {\n const actionDef = this.#fauxOntology.getActionDef(actionTypeApiName);\n const actionImpl = this.#fauxOntology.getActionImpl(actionTypeApiName);\n\n for (const req of batchReq.requests) {\n const result = validateAction(req, actionDef, this);\n if (result.result === \"INVALID\") {\n throw new OpenApiCallError(\n 500,\n {\n errorCode: \"INVALID_ARGUMENT\",\n errorName: \"ActionValidationFailed\",\n errorInstanceId: \"faux-foundry\",\n parameters: {\n actionType: actionTypeApiName,\n },\n } as OntologiesV2.ActionValidationFailed,\n );\n }\n }\n\n const batch = new FauxDataStoreBatch(this);\n\n const returnLargeScaleEdits = false;\n for (const item of batchReq.requests) {\n actionImpl(\n batch,\n {\n ...item,\n options: {\n mode: \"VALIDATE_AND_EXECUTE\",\n returnEdits: batchReq.options?.returnEdits,\n },\n },\n { def: actionDef, attachments: this.#attachments },\n );\n }\n if (batchReq.options?.returnEdits === \"NONE\") {\n return {};\n }\n\n if (returnLargeScaleEdits) {\n const editedObjectTypes = new Set<OntologiesV2.ObjectTypeApiName>();\n for (const edit of batch.objectEdits.edits) {\n if (\n edit.type === \"modifyObject\" || edit.type === \"addObject\"\n || edit.type === \"deleteObject\"\n ) {\n editedObjectTypes.add(edit.objectType);\n }\n }\n\n return {\n edits: {\n type: \"largeScaleEdits\",\n editedObjectTypes: Array.from(editedObjectTypes),\n },\n };\n }\n\n return {\n edits: {\n type: \"edits\",\n ...batch.objectEdits,\n edits: batch.objectEdits.edits.filter(x =>\n x.type !== \"deleteObject\" && x.type !== \"deleteLink\"\n ),\n },\n };\n }\n}\nfunction extractOneManySide(\n srcSide: OntologiesV2.LinkTypeSideV2,\n src: BaseServerObject,\n dstSide: OntologiesV2.LinkTypeSideV2,\n dst: BaseServerObject,\n) {\n const oneSide = srcSide.cardinality === \"ONE\"\n ? { object: src, link: srcSide }\n : dstSide.cardinality === \"ONE\"\n ? { object: dst, link: dstSide }\n : undefined;\n const manySide = oneSide\n ? (srcSide.cardinality === \"MANY\"\n ? { object: src, link: srcSide }\n : { object: dst, link: dstSide })\n : undefined;\n return { oneSide, manySide };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -36,7 +36,7 @@ describe(FauxDataStore, () => {
36
36
  displayName: "foo",
37
37
  rid: "ri.foo"
38
38
  });
39
- fauxDataStore = new FauxDataStore(fauxOntology, attachmentsStore);
39
+ fauxDataStore = new FauxDataStore(fauxOntology, attachmentsStore, true);
40
40
  fauxOntology.registerObjectType({
41
41
  implementsInterfaces: [],
42
42
  implementsInterfaces2: {},
@@ -53,7 +53,8 @@ describe(FauxDataStore, () => {
53
53
  objectTypeApiName: "Employee",
54
54
  cardinality: "ONE",
55
55
  displayName: "Lead",
56
- linkTypeRid: "rid.link-type.327"
56
+ linkTypeRid: "rid.link-type.327",
57
+ foreignKeyPropertyApiName: "leadId"
57
58
  }],
58
59
  objectType: {
59
60
  apiName: "Employee",
@@ -75,6 +76,14 @@ describe(FauxDataStore, () => {
75
76
  rid: "ri.id",
76
77
  displayName: "id",
77
78
  description: "id"
79
+ },
80
+ leadId: {
81
+ dataType: {
82
+ type: "string"
83
+ },
84
+ rid: "ri.leadId",
85
+ displayName: "leadId",
86
+ description: "leadId"
78
87
  }
79
88
  },
80
89
  status: "ACTIVE",
@@ -124,6 +133,14 @@ describe(FauxDataStore, () => {
124
133
 
125
134
  // set b's lead to c
126
135
  fauxDataStore.registerLink(c, "peeps", b, "lead");
136
+ expect(fauxDataStore.getObject(b.__apiName, b.__primaryKey)).toMatchInlineSnapshot(`
137
+ {
138
+ "__apiName": "Employee",
139
+ "__primaryKey": "b",
140
+ "id": "b",
141
+ "leadId": "c",
142
+ }
143
+ `);
127
144
  expect(getLeadsAndPeeps("b")).toMatchObject({
128
145
  lead: c,
129
146
  peeps: [a]
@@ -139,6 +156,9 @@ describe(FauxDataStore, () => {
139
156
  lead: d,
140
157
  peeps: [a] // b's peeps should not change
141
158
  });
159
+ expect(fauxDataStore.getObject(b.__apiName, b.__primaryKey)).toMatchObject({
160
+ leadId: "d"
161
+ });
142
162
  expect(getLeadsAndPeeps("c")).toMatchObject({
143
163
  lead: d,
144
164
  peeps: [] // c should no longer have b as a peep
@@ -150,6 +170,14 @@ describe(FauxDataStore, () => {
150
170
 
151
171
  // remove b's lead
152
172
  fauxDataStore.unregisterLink(d, "peeps", b, "lead");
173
+ expect(fauxDataStore.getObject(b.__apiName, b.__primaryKey)).toMatchInlineSnapshot(`
174
+ {
175
+ "__apiName": "Employee",
176
+ "__primaryKey": "b",
177
+ "id": "b",
178
+ "leadId": undefined,
179
+ }
180
+ `);
153
181
  expect(getLeadsAndPeeps("b")).toMatchObject({
154
182
  lead: undefined,
155
183
  peeps: [a] // b's peeps should not change
@@ -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","objectType","icon","color","name","type","pluralDisplayName","primaryKey","properties","dataType","titleProperty","sharedPropertyTypeMapping","getLeadsAndPeeps","lead","getLinksOrThrow","peeps","a","b","c","d","registerObject","registerLink","toMatchObject","undefined","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);\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 }],\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 },\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(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(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(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","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":[]}
@@ -33,8 +33,10 @@ export class FauxFoundry {
33
33
  description: "The default ontology",
34
34
  rid: `ri.ontology.main.ontology.${crypto.randomUUID()}`
35
35
  }, {
36
- logger
36
+ logger,
37
+ strict
37
38
  } = {}) {
39
+ this.strict = strict ?? true;
38
40
  this.baseUrl = baseUrl;
39
41
  this.#handlers = createFauxFoundryHandlers(baseUrl, this);
40
42
  this.createOntology(defaultOntology);
@@ -74,7 +76,7 @@ export class FauxFoundry {
74
76
  const ontology = this.getOntology(ontologyApiNameOrRid); // will throw
75
77
  const dataStore = this.#dataStoresByOntologyApiName.get(ontology.apiName);
76
78
  if (!dataStore) {
77
- const ret = new FauxDataStore(ontology, this.attachments);
79
+ const ret = new FauxDataStore(ontology, this.attachments, this.strict);
78
80
  this.setDataStore(ontologyApiNameOrRid, ret);
79
81
  return ret;
80
82
  }