{
  "version": 3,
  "sources": ["../../src/Builder.ts"],
  "sourcesContent": ["import type {\n  AnyObject, Compare, EmptyObject, Hash, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n  assertEx,\n  exists,\n  isJsonObject, omitByPrefix, pickByPrefix, toSafeJson,\n} from '@xylabs/sdk-js'\nimport { ObjectHasher, removeEmptyFields } from '@xyo-network/hash'\nimport type {\n  Payload, Schema,\n  Sequence,\n  WithHashMeta,\n  WithOnlyClientMeta,\n  WithOptionalSchema,\n  WithoutClientMeta,\n  WithoutMeta,\n  WithoutPrivateStorageMeta,\n  WithoutSchema,\n  WithoutStorageMeta,\n  WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n  SequenceComparer,\n  SequenceParser,\n} from '@xyo-network/payload-model'\n\nimport type { PayloadBuilderOptions } from './Options.ts'\n\nexport const omitSchema = <T extends WithOptionalSchema>(payload: T): WithoutSchema<T> => {\n  const result = structuredClone(payload)\n  delete result.schema\n  return result\n}\n\nexport class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {\n  readonly options: PayloadBuilderOptions\n\n  protected _fields?: WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>\n  protected _meta?: WithOnlyClientMeta<T>\n  protected _schema: Schema\n\n  constructor(options: PayloadBuilderOptions) {\n    this.options = options\n    const { schema } = options\n    this._schema = schema\n  }\n\n  static async addHashMeta<T extends Payload>(payload: T): Promise<WithHashMeta<T>>\n  static async addHashMeta<T extends Payload>(payloads: T[]): Promise<WithHashMeta<T>[]>\n  static async addHashMeta<T extends Payload>(payloads: T | T[]): Promise<WithHashMeta<T>[] | WithHashMeta<T>> {\n    if (Array.isArray(payloads)) {\n      return await Promise.all(\n        payloads.map(async (payload) => {\n          return await this.addHashMeta(payload)\n        }),\n      )\n    }\n    const _hash = await this.hash(payloads)\n    const _dataHash = await this.dataHash(payloads)\n    return {\n      ...payloads,\n      _dataHash,\n      _hash,\n    }\n  }\n\n  static async addStorageMeta<T extends Payload>(payload: T, index?: number): Promise<WithStorageMeta<T>>\n  static async addStorageMeta<T extends Payload>(payloads: T[]): Promise<WithStorageMeta<T>[]>\n  static async addStorageMeta<T extends Payload>(payloads: T | T[], index = 0): Promise<WithStorageMeta<T>[] | WithStorageMeta<T>> {\n    return Array.isArray(payloads)\n      ? await (async () => {\n          const timestamp = Date.now()\n          const sequencedPayloads = await Promise.all(payloads.map(async (payload, i) => await this.addSequencedStorageMeta(\n            payload,\n            timestamp,\n            i,\n          )))\n          return sequencedPayloads.toSorted(this.compareStorageMeta)\n        })()\n      : this.addSequencedStorageMeta(\n          payloads,\n          index,\n        )\n  }\n\n  static compareStorageMeta(\n    this: void,\n    a: WithStorageMeta<Payload>,\n    b: WithStorageMeta<Payload>,\n    comparer: Compare<Sequence> = SequenceComparer.local,\n  ) {\n    return comparer(a._sequence, b._sequence)\n  }\n\n  static async dataHash<T extends Payload>(payload: T): Promise<Hash> {\n    return await ObjectHasher.hash(this.omitMeta(payload))\n  }\n\n  static async dataHashPairs<T extends Payload>(payloads: T[]): Promise<[T, Hash][]> {\n    return await Promise.all(\n      payloads.map(async (payload) => {\n        const dataHash = await this.dataHash(payload)\n        return [payload, dataHash]\n      }),\n    )\n  }\n\n  static dataHashableFields<T extends Payload>(\n    schema: Schema,\n    payload: WithoutSchema<T>,\n\n  ): Promisable<WithoutMeta<T>> {\n    const cleanFields = removeEmptyFields({ ...payload, schema })\n    assertEx(\n      cleanFields == undefined || isJsonObject(cleanFields),\n      () => `Fields must be JsonObject: ${JSON.stringify(toSafeJson(cleanFields), null, 2)}`,\n    )\n    return this.omitMeta(cleanFields) as WithoutMeta<T>\n  }\n\n  static async dataHashes(payloads: undefined): Promise<undefined>\n  static async dataHashes<T extends Payload>(payloads: T[]): Promise<Hash[]>\n  static async dataHashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {\n    return payloads\n      ? await Promise.all(\n          payloads.map(async (payload) => {\n            return await this.dataHash(payload)\n          }),\n        )\n      : undefined\n  }\n\n  static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n    return await ObjectHasher.filterExcludeByHash(await this.filterExcludeByDataHash(payloads, hash), hash)\n  }\n\n  static async filterExcludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n    const hashes = Array.isArray(hash) ? hash : [hash]\n    const pairs = await this.dataHashPairs(payloads)\n    return pairs.filter(([_, objHash]) => !hashes.includes(objHash))?.map(pair => pair[0])\n  }\n\n  static async filterIncludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n    const hashes = Array.isArray(hash) ? hash : [hash]\n    const pairs = await this.dataHashPairs(payloads)\n    return pairs.filter(([_, objHash]) => hashes.includes(objHash))?.map(pair => pair[0])\n  }\n\n  static async filterIncludeByEitherHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n    const hashes = Array.isArray(hash) ? hash : [hash]\n    const map = await this.toAllHashMap(payloads) as Record<string, T>\n    return hashes.map(hash => map[String(hash)]).filter(exists)\n  }\n\n  static async findByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash): Promise<T | undefined> {\n    const pairs = await this.dataHashPairs(payloads)\n    return pairs.find(([_, objHash]) => objHash === hash)?.[0]\n  }\n\n  static async hash<T extends Payload>(payload: T): Promise<Hash> {\n    return await ObjectHasher.hash(this.omitStorageMeta(payload))\n  }\n\n  /**\n   * Creates an array of payload/hash tuples based on the payloads passed in\n   * @param objs Any array of payloads\n   * @returns An array of payload/hash tuples\n   */\n  static async hashPairs<T extends Payload>(payloads: T[]): Promise<[T, Hash][]> {\n    return await Promise.all(\n      payloads.map<Promise<[T, Hash]>>(async (payload) => {\n        return [payload, await this.hash(payload)]\n      }),\n    )\n  }\n\n  static hashableFields<T extends Payload>(\n    payload: T,\n  ): WithoutStorageMeta<T> {\n    return this.omitStorageMeta(payload)\n  }\n\n  static async hashes(payloads: undefined): Promise<undefined>\n  static async hashes<T extends Payload>(payloads: T[]): Promise<Hash[]>\n  static async hashes<T extends Payload>(payloads?: T[]) {\n    return await ObjectHasher.hashes(payloads)\n  }\n\n  static omitClientMeta<T extends Payload>(payloads: T[], maxDepth?: number): WithoutClientMeta<T>[]\n  static omitClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutClientMeta<T>[]\n  static omitClientMeta<T extends Payload>(payload: T, maxDepth?: number): WithoutClientMeta<T>\n  static omitClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutClientMeta<T>\n  static omitClientMeta<T extends Payload>(payloads: T | T[], maxDepth = 1) {\n    return Array.isArray(payloads)\n      ? payloads.map(payload => this.omitClientMeta(payload, maxDepth))\n      : omitByPrefix(payloads, '$', maxDepth)\n  }\n\n  static omitMeta<T extends Payload>(payloads: T[], maxDepth?: number): WithoutMeta<T>[]\n  static omitMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutMeta<T>[]\n  static omitMeta<T extends Payload>(payload: T, maxDepth?: number): WithoutMeta<T>\n  static omitMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutMeta<T>\n  static omitMeta<T extends Payload>(payloads: T | T[], maxDepth = 1) {\n    return Array.isArray(payloads)\n      ? payloads.map(payload => this.omitMeta(payload, maxDepth))\n      : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth)\n  }\n\n  static omitPrivateStorageMeta<T extends Payload>(payloads: T[], maxDepth?: number): WithoutPrivateStorageMeta<T>[]\n  static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutPrivateStorageMeta<T>[]\n  static omitPrivateStorageMeta<T extends Payload>(payload: T, maxDepth?: number): WithoutPrivateStorageMeta<T>\n  static omitPrivateStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutPrivateStorageMeta<T>\n  static omitPrivateStorageMeta<T extends Payload>(payloads: T | T[], maxDepth = 1) {\n    return Array.isArray(payloads)\n      ? payloads.map(payload => this.omitPrivateStorageMeta(payload, maxDepth))\n      : omitByPrefix(payloads, '__', maxDepth)\n  }\n\n  static omitStorageMeta<T extends EmptyObject[]>(payloads: T, maxDepth?: number): WithoutStorageMeta<T[number]>[]\n  static omitStorageMeta<T extends Payload[]>(payloads: T, maxDepth?: number): WithoutStorageMeta<T[number]>[]\n  static omitStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutStorageMeta<T>\n  static omitStorageMeta<T extends Payload>(payload: T, maxDepth?: number): WithoutStorageMeta<T>\n  static omitStorageMeta<T extends Payload | EmptyObject>(payloads: T | T[], maxDepth = 1) {\n    return Array.isArray(payloads)\n      ? payloads.map((payload): WithoutStorageMeta<T> => this.omitStorageMeta(payload, maxDepth) as WithoutStorageMeta<T>)\n      : (omitByPrefix(payloads, '_', maxDepth) as WithoutStorageMeta<T>)\n  }\n\n  static pickClientMeta<T extends Payload>(payloads: T[], maxDepth?: number): WithOnlyClientMeta<T>[]\n  static pickClientMeta<T extends Payload>(payload: T, maxDepth?: number): WithOnlyClientMeta<T>\n  static pickClientMeta<T extends Payload>(payloads: T | T[], maxDepth = 1) {\n    return Array.isArray(payloads)\n      ? payloads.map(payload => this.pickClientMeta(payload, maxDepth))\n      : pickByPrefix(payloads, '$', maxDepth)\n  }\n\n  static sortByStorageMeta<T extends Payload>(\n    payloads: WithStorageMeta<T>[],\n    direction: -1 | 1 = 1,\n    comparer: Compare<Sequence> = SequenceComparer.local,\n  ) {\n    return payloads.toSorted((a, b) => direction * comparer(a._sequence, b._sequence))\n  }\n\n  static async toAllHashMap<T extends Payload>(payloads: T[]): Promise<Record<Hash, T>> {\n    const pairs = await this.hashPairs(payloads)\n    const entries = await Promise.all(\n      pairs.map(async ([payload, payloadHash]) => {\n        const dataHash = await this.dataHash(payload)\n        return [\n          [payloadHash, payload],\n          [dataHash, payload],\n        ] as const\n      }),\n    )\n    return Object.fromEntries(entries.flat())\n  }\n\n  static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, T>> {\n    const pairs = await this.dataHashPairs(objs)\n    return Object.fromEntries(pairs.map(([payload, dataHash]) => [dataHash, payload]))\n  }\n\n  /**\n   * Creates an object map of payload hashes to payloads based on the payloads passed in\n   * @param objs Any array of payloads\n   * @returns A map of hashes to payloads\n   */\n  static async toHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, T>> {\n    const pairs = await this.hashPairs(objs)\n    return Object.fromEntries(pairs.map(([payload, payloadHash]) => [payloadHash, payload]))\n  }\n\n  private static async addSequencedStorageMeta<T extends Payload = Payload>(payload: T, timestamp: number, index = 0): Promise<WithStorageMeta<T>> {\n    const withHashMeta = await this.addHashMeta(payload)\n    const _sequence = SequenceParser.from(timestamp, withHashMeta._hash, index).localSequence\n    return {\n      ...withHashMeta,\n      _sequence,\n    }\n  }\n\n  build(): R {\n    return {\n      schema: this._schema,\n      ...this._fields,\n      ...this._meta,\n    } as R\n  }\n\n  async dataHashableFields() {\n    return await PayloadBuilder.dataHashableFields(\n      assertEx(this._schema, () => 'Payload: Missing Schema'),\n      // TODO: Add verification that required fields are present\n      this._fields as WithoutSchema<T>,\n    )\n  }\n\n  fields(fields: WithoutSchema<WithoutStorageMeta<WithoutClientMeta<T>>>) {\n    // we need to do the cast here since ts seems to not like nested, yet same, generics\n    const clonedFields = structuredClone(fields)\n    const withoutEmptyFields = removeEmptyFields(clonedFields)\n    const withoutSchema = omitSchema(withoutEmptyFields)\n    const withoutStorageMeta = PayloadBuilder.omitStorageMeta(withoutSchema)\n    this._fields = PayloadBuilder.omitClientMeta(withoutStorageMeta) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>\n    return this\n  }\n\n  meta(meta: WithOnlyClientMeta<T>) {\n    // we need to do the cast here since ts seems to not like nested, yet same, generics\n    this._meta = pickByPrefix(meta, '$') as WithOnlyClientMeta<T>\n    return this\n  }\n\n  schema(value: Schema) {\n    this._schema = value\n  }\n}\n"],
  "mappings": "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",
  "names": ["hash"]
}
