import { StringKeys } from './util'; /** * */ export type DateString = string & { __DateBrand: never }; export type BlobString = string & { __BlobBrand: never }; export type Address = { city: string | null; country: string | null; geocodeAccuracy: string | null; latitude: number | null; longitude: number | null; postalCode: string | null; state: string | null; street: string | null; }; export type SObjectFieldType = | number | boolean | DateString | BlobString | string | Address; export type SObjectDefinition = { Name: N; Fields: { [name: string]: SObjectFieldType | null }; ParentReferences: { [name: string]: SObjectDefinition | null }; ChildRelationships: { [name: string]: SObjectDefinition }; } export type Schema = { SObjects: { [name: string]: SObjectDefinition }; } /** * */ export type SObjectNames = StringKeys; export type SObjectFieldNames< S extends Schema, N extends SObjectNames > = StringKeys; export type ParentReferenceNames< S extends Schema, N extends SObjectNames > = StringKeys; type ParentReferenceSObjectName_< S extends Schema, N extends SObjectNames, PRN extends ParentReferenceNames, PSO extends SObjectDefinition = NonNullable< S['SObjects'][N]['ParentReferences'][PRN] >, SK extends keyof S['SObjects'] = keyof S['SObjects'] > = Extract; export type ParentReferenceSObjectName< S extends Schema, N extends SObjectNames, PRN extends ParentReferenceNames > = ParentReferenceSObjectName_; export type ChildRelationshipNames< S extends Schema, N extends SObjectNames > = StringKeys; type ChildRelationshipSObjectName_< S extends Schema, N extends SObjectNames, CRN extends ChildRelationshipNames, CSO extends SObjectDefinition = S['SObjects'][N]['ChildRelationships'][CRN], SK extends keyof S['SObjects'] = keyof S['SObjects'] > = Extract; export type ChildRelationshipSObjectName< S extends Schema, N extends SObjectNames, CRN extends ChildRelationshipNames > = ChildRelationshipSObjectName_;