{"version":3,"file":"index.cjs","names":["ZAggregateBuilder","_aggregate","id","value","next","count","build","structuredClone","keyBy","values","ZOperatorBinary","ZFilterBinaryBuilder","Type","_filter","subject","value","operator","__type__","val","equal","bind","notEqual","lessThan","greaterThan","lessThanEqualTo","greaterThanEqualTo","like","startsWith","endsWith","build","isBinaryFilter","filter","ZOperatorsBinary","_ZOperatorsBinaryLookup","isBinaryOperator","candidate","Object","prototype","hasOwnProperty","call","ZBinaryComparators","d","v","indexOf","values","keyBy","keyBy","values","ZOperatorCollection","ZFilterCollectionBuilder","Type","_filter","subject","operator","__type__","val","value","push","in","bind","notIn","build","JSON","parse","stringify","isCollectionFilter","filter","ZCollectionComparators","d","v","indexOf","ZOperatorsCollection","_ZOperatorsCollectionLookup","isCollectionOperator","candidate","Object","prototype","hasOwnProperty","call","values","keyBy","keyBy","values","ZOperatorLogic","ZFilterLogicBuilder","Type","_filter","clauses","operator","__type__","val","and","bind","or","clause","push","build","isLogicFilter","filter","ZOperatorsLogic","_ZOperatorsLogicLookup","isLogicOperator","candidate","Object","prototype","hasOwnProperty","call","values","keyBy","keyBy","values","ZOperatorUnary","ZFilterUnaryBuilder","Type","_filter","subject","operator","__type__","val","isNull","bind","isNotNull","build","isUnaryFilter","filter","ZOperatorsUnary","_ZOperatorsUnaryLookup","isUnaryOperator","candidate","Object","prototype","hasOwnProperty","call","ZUnaryComparators","data","values","keyBy","get","ZBinaryComparators","isCollectionFilter","ZCollectionComparators","isLogicFilter","ZOperatorLogic","isUnaryFilter","ZUnaryComparators","ZDataFilterFields","_matchLogicFilter","data","filter","operator","And","clauses","every","f","match","some","_matchSubjectFilter","comparators","value","comparator","compareAgainst","subject","values","get","ZOperatorsBinary","ZOperatorsCollection","ZOperatorsLogic","ZOperatorsUnary","ZOperatorsFilter","concat","peel","peelBetween","trim","trimStart","ZOperatorsFilter","isBinaryOperator","ZFilterBinaryBuilder","isCollectionOperator","ZFilterCollectionBuilder","isLogicOperator","ZFilterLogicBuilder","isUnaryOperator","ZFilterUnaryBuilder","ZFilterDeserialize","deserialize","candidate","filter","rest","_parseFilter","length","Error","_peelBetweenParens","args","argList","_splitArgs","operator","minArgs","maxArgs","splitArgs","split","x","msg","JSON","stringify","expected","_parseUnaryFilter","subject","build","_parseBinaryFilter","value","parse","_parseCollectionFilter","Infinity","values","slice","map","a","_parseLogicFilter","argsList","remaining","builder","clause","trim","peelBetween","trimStart","peel","isBinaryFilter","isCollectionFilter","isLogicFilter","isUnaryFilter","ZFilterSerialize","serialize","candidate","operator","subject","JSON","stringify","value","values","map","v","join","clauses","c","undefined","ZDataMatchAlways","match","ZDataMatchOptional","_match","match","data","filter","createGuid","ZMetadataType","ZMetadataBuilder","_metadata","id","name","type","val","path","description","fallback","format","cls","precision","width","height","square","text","bind","file","custom","date","number","icon","image","boolean","sortable","value","editable","copy","other","structuredClone","build","createGuid","ZWellKnownIconClasses","ZPageBuilder","_page","count","data","empty","all","singleton","item","length","current","next","copy","slice","other","build","get","ZDataSearchFields","_fields","match","data","filter","Object","keys","_filter","toUpperCase","some","field","value","indexOf","get","ZDataSearchText","match","data","filter","_filter","toUpperCase","indexOf","castArray","values","ZSortDirection","ZSortBuilder","_sort","sorts","val","sort","_sorts","concat","ascending","subject","direction","descending","build","JSON","parse","stringify","ZSortDirections","castArray","values","peel","peelBetween","trim","trimStart","ZSortBuilder","ZSortDirections","ZSortDeserialize","deserialize","candidate","_candidate","rest","$candidate","builder","remaining","strippedSort","_parseSort","sort","build","direction","Error","peeledSubject","subject","remainingSortsToParse","peelBetween","trim","trimStart","peel","ZSortSerialize","serialize","candidate","length","undefined","params","map","s","direction","subject","join","ZSortBuilder","ZSortDirection","ZSorterSingle","_sorted","initial","index","subject","sorted","direction","undefined","sort","ascending","build","Descending","descending","tryFallback","ZFilterDeserialize","ZSortDeserialize","ZDataRequestBuilder","_request","page","Math","max","size","search","filter","f","deserialize","sort","s","copy","other","JSON","parse","stringify","query","isNaN","build","tryFallback","chunk","get","ZDataMatchOptional","ZSortDirection","paginate","data","page","size","Infinity","_page","Math","max","pages","filter","match","_match","sort","sorts","_data","slice","length","x","y","i","s","m","direction","Ascending","xV","subject","yV","chunk","get","ZDataFilterFields","ZDataMatchAlways","ZDataSourceStaticOptionsBuilder","_options","search","filter","delay","val","build","filter","paginate","sort","ZDataSourceStaticOptionsBuilder","ZDataSourceStatic","_data","_options","build","items","data","Error","Promise","reject","slice","insert","item","index","Infinity","Math","max","splice","remove","indexOf","removeAt","length","set","count","request","search","_search","_filter","_","setTimeout","delay","arr","resolve","retrieve","page","size","_sort"],"sources":["../src/aggregate/aggregate.mts","../src/filter/filter-binary.mts","../src/filter/filter-collection.mts","../src/filter/filter-logic.mts","../src/filter/filter-unary.mts","../src/filter/data-filter-fields.mts","../src/filter/filter.mts","../src/filter/filter-deserialize.mts","../src/filter/filter-serialize.mts","../src/match/data-match-always.mts","../src/match/data-match-optional.mts","../src/metadata/metadata.mts","../src/metadata/well-known-icon-classes.mts","../src/page/page.mts","../src/search/data-search-fields.mts","../src/search/data-search-text.mts","../src/sort/sort.mts","../src/sort/sort-deserialize.mts","../src/sort/sort-serialize.mts","../src/sort/sorter-single.mts","../src/source/data-request.mts","../src/source/data-results.mts","../src/source/data-source-static-options.mts","../src/source/data-source-static.mts"],"sourcesContent":["/**\n * Represents an aggregate calculation on a collection of data.\n */\nexport interface IZAggregate<T = any> {\n  /**\n   * The id of the aggregate.\n   */\n  id: string;\n\n  /**\n   * The resulting value of the aggregate.\n   */\n  value: T;\n}\n\n/**\n * A builder for the aggregate model.\n */\nexport class ZAggregateBuilder<T = any> {\n  private _aggregate: IZAggregate<T> = {\n    id: \"zero\",\n    value: 0 as T,\n  };\n\n  /**\n   * Sets the id of the aggregate.\n   *\n   * @param value -\n   *        The id to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public id(value: string) {\n    this._aggregate.id = value;\n    return this;\n  }\n\n  /**\n   * Sets the value of the aggregate.\n   *\n   * @param value -\n   *        The value to set.\n   *\n   * @returns\n   *        A new aggregate builder that is of type V.\n   */\n  public value<V>(value: V): ZAggregateBuilder<V> {\n    const next = new ZAggregateBuilder<V>().id(this._aggregate.id);\n    next._aggregate.value = value;\n    return next;\n  }\n\n  /**\n   * Creates a count aggregate.\n   *\n   * The id of the aggregate will be 'count'\n   *\n   * @param value -\n   *        The count value.\n   *\n   * @returns\n   *        A new aggregate builder that is of type number.\n   */\n  public count(value: number): ZAggregateBuilder<number> {\n    return this.id(\"count\").value(value);\n  }\n\n  /**\n   * Builds the aggregate.\n   *\n   * @returns\n   *        The constructed aggregate value.\n   */\n  public build(): IZAggregate<T> {\n    // Given how to construct this builder, we know how\n    return structuredClone(this._aggregate);\n  }\n}\n","import { keyBy, values } from \"lodash-es\";\n\nimport type { IZFilterMetadata, IZFilterSubject } from \"./filter-subject.mjs\";\n\n/**\n * The operators for a {@link IZFilterBinary} filter.\n */\nexport enum ZOperatorBinary {\n  /**\n   * Equals\n   */\n  Equal = \"eq\",\n  /**\n   * Not equals.\n   */\n  NotEqual = \"neq\",\n  /**\n   * Less than or equal to.\n   */\n  LessThanEqualTo = \"lteq\",\n  /**\n   * Less than.\n   */\n  LessThan = \"lt\",\n  /**\n   * Greater than or equal to.\n   */\n  GreaterThanEqualTo = \"gteq\",\n  /**\n   * Greater than.\n   */\n  GreaterThan = \"gt\",\n  /**\n   * Like (Contains)\n   */\n  Like = \"like\",\n  /**\n   * Starts with\n   */\n  StartsWith = \"sw\",\n  /**\n   * Ends with\n   */\n  EndsWith = \"ew\",\n}\n\n/**\n * Represents a standard comparison filter between a subject field and a wanted value.\n */\nexport interface IZFilterBinary extends IZFilterSubject<ZOperatorBinary> {\n  /**\n   * The value to sort by.\n   */\n  value: any;\n}\n\n/**\n * Represents an object that can build up a binary filter.\n */\nexport class ZFilterBinaryBuilder {\n  /**\n   * The __type__ identifier for an {@link IZFilterBinary} object.\n   */\n  public static readonly Type = \"binary\";\n\n  private _filter: IZFilterBinary;\n\n  /**\n   * Initializes a new instance of this object.\n   */\n  public constructor() {\n    this._filter = {\n      subject: \"\",\n      value: null,\n      operator: ZOperatorBinary.Equal,\n      __type__: ZFilterBinaryBuilder.Type,\n    };\n  }\n\n  /**\n   * Sets the subject.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public subject(val: string): this {\n    this._filter.subject = val;\n    return this;\n  }\n\n  /**\n   * Overrides the value.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public value(val: any): this {\n    this._filter.value = val;\n    return this;\n  }\n\n  /**\n   * Sets the operator.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public operator(val: ZOperatorBinary) {\n    this._filter.operator = val;\n    return this;\n  }\n\n  /**\n   * Constructs an equal relationship.\n   *\n   * @returns\n   *        This object\n   */\n  public equal = this.operator.bind(this, ZOperatorBinary.Equal);\n\n  /**\n   * Constructs a not equal filter.\n   *\n   * @returns\n   *        This object\n   */\n  public notEqual = this.operator.bind(this, ZOperatorBinary.NotEqual);\n\n  /**\n   * Constructs a less than filter.\n   *\n   * @returns\n   *        This object\n   */\n  public lessThan = this.operator.bind(this, ZOperatorBinary.LessThan);\n\n  /**\n   * Constructs a greater than filter.\n   *\n   * @returns\n   *        This object.\n   */\n  public greaterThan = this.operator.bind(this, ZOperatorBinary.GreaterThan);\n\n  /**\n   * Constructs a less than or equal to filter.\n   *\n   * @returns\n   *        This object.\n   */\n  public lessThanEqualTo = this.operator.bind(\n    this,\n    ZOperatorBinary.LessThanEqualTo,\n  );\n\n  /**\n   * Constructs a greater than or equal to filter.\n   *\n   * @returns\n   *        This object.\n   */\n  public greaterThanEqualTo = this.operator.bind(\n    this,\n    ZOperatorBinary.GreaterThanEqualTo,\n  );\n\n  /**\n   * Constructs a like filter.\n   *\n   * @returns\n   *        This object.\n   */\n  public like = this.operator.bind(this, ZOperatorBinary.Like);\n\n  /**\n   * Constructs a starts with filter.\n   *\n   * @returns\n   *        This object.\n   */\n  public startsWith = this.operator.bind(this, ZOperatorBinary.StartsWith);\n\n  /**\n   * Constructs an ends with filter.\n   *\n   * @returns\n   *        This object.\n   */\n  public endsWith = this.operator.bind(this, ZOperatorBinary.EndsWith);\n\n  /**\n   * Returns a copy of the currently built filter.\n   *\n   * @returns\n   *        A copy of the currently built filter.\n   */\n  public build(): IZFilterBinary {\n    return { ...this._filter };\n  }\n}\n\n/**\n * Type guard for determining if a target filter is a binary filter.\n *\n * @param filter -\n *        The filter to test.\n *\n * @returns\n *        True if filters type is a binary filter.  False otherwise.\n */\nexport function isBinaryFilter(\n  filter: IZFilterMetadata | null | undefined,\n): filter is IZFilterBinary {\n  return filter?.__type__ === ZFilterBinaryBuilder.Type;\n}\n\n/**\n * The possible operators as a constant list.\n */\nexport const ZOperatorsBinary = values(ZOperatorBinary);\n\nconst _ZOperatorsBinaryLookup = keyBy(ZOperatorsBinary);\n\n/**\n * Gets whether a candidate string represents a binary operator.\n *\n * @returns\n *        Type guard true if candidate is a binary operator, false\n *        otherwise.\n */\nexport function isBinaryOperator(\n  candidate: string | null | undefined,\n): candidate is ZOperatorBinary {\n  return (\n    candidate != null &&\n    Object.prototype.hasOwnProperty.call(_ZOperatorsBinaryLookup, candidate)\n  );\n}\n\n/**\n * A mapping of comparators that relates a data to a value.\n */\nexport const ZBinaryComparators: Record<\n  ZOperatorBinary,\n  (data: any, value: any) => boolean\n> = {\n  [ZOperatorBinary.Equal]: (d, v) => d === v,\n  [ZOperatorBinary.NotEqual]: (d, v) => d !== v,\n  [ZOperatorBinary.GreaterThan]: (d, v) => d > v,\n  [ZOperatorBinary.GreaterThanEqualTo]: (d, v) => d >= v,\n  [ZOperatorBinary.LessThan]: (d, v) => d < v,\n  [ZOperatorBinary.LessThanEqualTo]: (d, v) => d <= v,\n  [ZOperatorBinary.Like]: (d, v) => `${d}`.indexOf(`${v}`) >= 0,\n  [ZOperatorBinary.StartsWith]: (d, v) => `${d}`.startsWith(`${v}`),\n  [ZOperatorBinary.EndsWith]: (d, v) => `${d}`.endsWith(`${v}`),\n};\n","import { keyBy, values } from \"lodash-es\";\n\nimport type { IZFilterMetadata, IZFilterSubject } from \"./filter-subject.mjs\";\n\n/**\n * The operators for the {@link IZFilterCollection} filter.\n */\nexport enum ZOperatorCollection {\n  /**\n   * In\n   */\n  In = \"in\",\n  /**\n   * Not in.\n   */\n  NotIn = \"not-in\",\n}\n\n/**\n * A filter that operates on a collection of values.\n */\nexport interface IZFilterCollection extends IZFilterSubject<ZOperatorCollection> {\n  /**\n   * The values to compare the field against.\n   */\n  values: any[];\n}\n\n/**\n * Represents a builder for a collection filter.\n */\nexport class ZFilterCollectionBuilder {\n  /**\n   * The __type__ identifier for an {@link IZFilterCollection} object.\n   */\n  public static readonly Type = \"collection\";\n\n  private _filter: IZFilterCollection;\n\n  /**\n   * Initializes a new instance of this object.\n   */\n  public constructor() {\n    this._filter = {\n      subject: \"\",\n      operator: ZOperatorCollection.In,\n      values: [],\n      __type__: ZFilterCollectionBuilder.Type,\n    };\n  }\n\n  /**\n   * Sets the field.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public subject(val: string): this {\n    this._filter.subject = val;\n    return this;\n  }\n\n  /**\n   * Sets all of the values.\n   *\n   * @param values -\n   *        The collection of values.\n   *\n   * @returns\n   *        This object.\n   */\n  public values(values: any[]): this {\n    this._filter.values = values;\n    return this;\n  }\n\n  /**\n   * Adds a value to the existing collection of values.\n   *\n   * @param value -\n   *        The value to add.\n   *\n   * @returns\n   *        This object.\n   */\n  public value(value: any): this {\n    this._filter.values.push(value);\n    return this;\n  }\n\n  /**\n   * Sets the operator.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public operator(val: ZOperatorCollection) {\n    this._filter.operator = val;\n    return this;\n  }\n\n  /**\n   * Constructs an in filter.\n   *\n   * @returns\n   *        This object.\n   */\n  public in = this.operator.bind(this, ZOperatorCollection.In);\n\n  /**\n   * Constructs a not in filter.\n   *\n   * @returns\n   *        This object.\n   */\n  public notIn = this.operator.bind(this, ZOperatorCollection.NotIn);\n\n  /**\n   * Returns a copy of the constructed filter.\n   *\n   * @returns\n   *        A copy of the currently built filter.\n   */\n  public build(): IZFilterCollection {\n    return JSON.parse(JSON.stringify(this._filter));\n  }\n}\n\n/**\n * Type guard for determining if a target filter is a collection filter.\n *\n * @param filter -\n *        The filter to test.\n *\n * @returns\n *        True if filters type is a collection filter.  False otherwise.\n */\nexport function isCollectionFilter(\n  filter: IZFilterMetadata | null | undefined,\n): filter is IZFilterCollection {\n  return filter?.__type__ === ZFilterCollectionBuilder.Type;\n}\n\n/**\n * A mapping of comparators that determine if data exists or does not exist within a data set.\n */\nexport const ZCollectionComparators: Record<\n  ZOperatorCollection,\n  (data: any, values: any[]) => boolean\n> = {\n  [ZOperatorCollection.In]: (d, v) => v.indexOf(d) >= 0,\n  [ZOperatorCollection.NotIn]: (d, v) => v.indexOf(d) < 0,\n};\n\n/**\n * A list of all collection operators.\n */\nexport const ZOperatorsCollection = values(ZOperatorCollection);\nconst _ZOperatorsCollectionLookup = keyBy(ZOperatorsCollection);\n\n/**\n * Gets whether a candidate string represents a collection operator.\n *\n * @returns\n *        Type guard true if candidate is a collection operator, false\n *        otherwise.\n */\nexport function isCollectionOperator(\n  candidate: string | null | undefined,\n): candidate is ZOperatorCollection {\n  return (\n    candidate != null &&\n    Object.prototype.hasOwnProperty.call(_ZOperatorsCollectionLookup, candidate)\n  );\n}\n","import { keyBy, values } from \"lodash-es\";\n\nimport type { IZFilter } from \"./filter.mjs\";\nimport type { IZFilterMetadata, IZFilterOperator } from \"./filter-subject.mjs\";\n\n/**\n * The connectors for an {@link IZFilterLogic} filter.\n */\nexport enum ZOperatorLogic {\n  /**\n   * And.\n   */\n  And = \"and\",\n  /**\n   * Or\n   */\n  Or = \"or\",\n}\n\n/**\n * Represents a composite logical filter.\n *\n * Logical filters do not have associated subjects and values. Instead\n * they relate a conjunction of child filters with {@link ZOperatorLogic.And} / {@link ZOperatorLogic.Or}\n * operators.\n */\nexport interface IZFilterLogic extends IZFilterOperator<ZOperatorLogic> {\n  /**\n   * Child clauses that are related by and/or.\n   */\n  clauses: IZFilter[];\n}\n\n/**\n * Represents a builder for a logic filter.\n */\nexport class ZFilterLogicBuilder {\n  /**\n   * The __type__ identifier for an {@link IZFilterLogic} object.\n   */\n  public static readonly Type = \"logic\";\n\n  private _filter: IZFilterLogic;\n\n  /**\n   * Initializes a new instance of this object.\n   */\n  public constructor() {\n    this._filter = {\n      clauses: [],\n      operator: ZOperatorLogic.And,\n      __type__: ZFilterLogicBuilder.Type,\n    };\n  }\n\n  /**\n   * Sets the operator.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public operator(val: ZOperatorLogic) {\n    this._filter.operator = val;\n    return this;\n  }\n\n  /**\n   * Sets the operator to and.\n   *\n   * @returns\n   *        This object.\n   */\n  public and = this.operator.bind(this, ZOperatorLogic.And);\n\n  /**\n   * Sets the operator to or.\n   *\n   * @returns\n   *        This object.\n   */\n  public or = this.operator.bind(this, ZOperatorLogic.Or);\n\n  /**\n   * Adds another clause.\n   *\n   * @param val -\n   *        The clause to add.\n   *\n   * @returns\n   *        This object.\n   */\n  public clause(val: IZFilter): this {\n    this._filter.clauses.push(val);\n    return this;\n  }\n\n  /**\n   * Sets the list of clauses.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object\n   */\n  public clauses(val: IZFilter[]): this {\n    this._filter.clauses = val;\n    return this;\n  }\n\n  /**\n   * Returns the filter.\n   *\n   * @returns\n   *        The logic filter\n   */\n  public build(): IZFilterLogic {\n    return { ...this._filter };\n  }\n}\n\n/**\n * Type guard for determining if a target filter is a logic filter.\n *\n * @param filter -\n *        The filter to test.\n *\n * @returns\n *        True if filters type is a logic filter.  False otherwise.\n */\nexport function isLogicFilter(\n  filter: IZFilterMetadata | null | undefined,\n): filter is IZFilterLogic {\n  return filter?.__type__ === ZFilterLogicBuilder.Type;\n}\n\n/**\n * A list of all logic operators.\n */\nexport const ZOperatorsLogic = values(ZOperatorLogic);\nconst _ZOperatorsLogicLookup = keyBy(ZOperatorsLogic);\n\n/**\n * Gets whether a candidate string represents a logic operator.\n *\n * @returns\n *        Type guard true if candidate is a logic operator, false\n *        otherwise.\n */\nexport function isLogicOperator(\n  candidate: string | null | undefined,\n): candidate is ZOperatorLogic {\n  return (\n    candidate != null &&\n    Object.prototype.hasOwnProperty.call(_ZOperatorsLogicLookup, candidate)\n  );\n}\n","import { keyBy, values } from \"lodash-es\";\n\nimport type { IZFilterMetadata, IZFilterSubject } from \"./filter-subject.mjs\";\n\n/**\n * The operators for an {@link IZFilterUnary} filter.\n */\nexport enum ZOperatorUnary {\n  /**\n   * Is null.\n   */\n  IsNull = \"null\",\n  /**\n   * Is not null.\n   */\n  IsNotNull = \"is-not-null\",\n}\n\n/**\n * Represents a yes/no style filter.\n */\nexport type IZFilterUnary = IZFilterSubject<ZOperatorUnary>;\n\n/**\n * Represents a builder for a UnaryFilter object.\n */\nexport class ZFilterUnaryBuilder {\n  /**\n   * The __type__ identifier for an {@link IZFilterUnary} object.\n   */\n  public static readonly Type = \"unary\";\n\n  private _filter: IZFilterUnary;\n\n  /**\n   * Initializes a new instance of this object.\n   */\n  public constructor() {\n    this._filter = {\n      subject: null as any,\n      operator: ZOperatorUnary.IsNull,\n      __type__: \"unary\",\n    };\n  }\n\n  /**\n   * Sets the subject.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public subject(val: string): this {\n    this._filter.subject = val;\n    return this;\n  }\n\n  /**\n   * Sets the operator.\n   *\n   * @param val -\n   *        The operator to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public operator(val: ZOperatorUnary): this {\n    this._filter.operator = val;\n    return this;\n  }\n\n  /**\n   * Sets the operator to is null.\n   *\n   * @returns\n   *        This object.\n   */\n  public isNull = this.operator.bind(this, ZOperatorUnary.IsNull);\n\n  /**\n   * Sets the operator to is null.\n   *\n   * @returns\n   *        This object.\n   */\n  public isNotNull = this.operator.bind(this, ZOperatorUnary.IsNotNull);\n\n  /**\n   * Returns a copy of the built filter.\n   *\n   * @returns\n   *        A copy of the current filter.\n   */\n  public build(): IZFilterUnary {\n    return { ...this._filter };\n  }\n}\n\n/**\n * Type guard for determining if a target filter is a unary filter.\n *\n * @param filter -\n *        The filter to test.\n *\n * @returns\n *        True if filters type is a unary filter.  False otherwise.\n */\nexport function isUnaryFilter(\n  filter: IZFilterMetadata | null | undefined,\n): filter is IZFilterUnary {\n  return filter?.__type__ === ZFilterUnaryBuilder.Type;\n}\n\n/**\n * A list of all unary operators.\n */\nexport const ZOperatorsUnary = values(ZOperatorUnary);\nconst _ZOperatorsUnaryLookup = keyBy(ZOperatorsUnary);\n\n/**\n * Gets whether a candidate string represents a unary operator.\n *\n * @returns\n *        Type guard true if candidate is a unary operator, false\n *        otherwise.\n */\nexport function isUnaryOperator(\n  candidate: string | null | undefined,\n): candidate is ZOperatorUnary {\n  return (\n    candidate != null &&\n    Object.prototype.hasOwnProperty.call(_ZOperatorsUnaryLookup, candidate)\n  );\n}\n\n/**\n * Comparators for unary operators.\n */\nexport const ZUnaryComparators: Record<ZOperatorUnary, (data: any) => boolean> =\n  {\n    [ZOperatorUnary.IsNull]: (data: any) => data == null,\n    [ZOperatorUnary.IsNotNull]: (data: any) => data != null,\n  };\n","import { get } from \"lodash-es\";\n\nimport type { IZDataMatch } from \"../match/data-match.mjs\";\nimport type { IZFilter } from \"./filter.mjs\";\nimport { ZBinaryComparators } from \"./filter-binary.mjs\";\nimport {\n  isCollectionFilter,\n  ZCollectionComparators,\n} from \"./filter-collection.mjs\";\nimport type { IZFilterLogic } from \"./filter-logic.mjs\";\nimport { isLogicFilter, ZOperatorLogic } from \"./filter-logic.mjs\";\nimport type { IZFilterSubject } from \"./filter-subject.mjs\";\nimport { isUnaryFilter, ZUnaryComparators } from \"./filter-unary.mjs\";\n\n/**\n * Represents a data match object that applies a filter.\n *\n * This implementation of a data match will search against fields on the given target\n * object where the filter subject matches a property on said object.\n *\n * @param TData -\n *        The type of data being filtered.\n */\nexport class ZDataFilterFields<TData> implements IZDataMatch<TData, IZFilter> {\n  private _matchLogicFilter(data: TData, filter: IZFilterLogic): boolean {\n    return filter.operator === ZOperatorLogic.And\n      ? filter.clauses.every((f) => this.match(data, f))\n      : filter.clauses.some((f) => this.match(data, f));\n  }\n\n  private _matchSubjectFilter<T extends string, F extends IZFilterSubject<T>>(\n    data: TData,\n    filter: F,\n    comparators: Record<T, (d: any, v?: any) => boolean>,\n    value?: any,\n  ) {\n    const comparator = comparators[filter.operator];\n    const compareAgainst = filter.subject\n      ? get(data, filter.subject, null)\n      : data;\n    return comparator(compareAgainst, value);\n  }\n\n  public match(data: TData, filter: IZFilter): boolean {\n    if (isLogicFilter(filter)) {\n      return this._matchLogicFilter(data, filter);\n    }\n\n    if (isCollectionFilter(filter)) {\n      return this._matchSubjectFilter(\n        data,\n        filter,\n        ZCollectionComparators,\n        filter.values,\n      );\n    }\n\n    if (isUnaryFilter(filter)) {\n      return this._matchSubjectFilter(data, filter, ZUnaryComparators);\n    }\n\n    return this._matchSubjectFilter(\n      data,\n      filter,\n      ZBinaryComparators,\n      filter.value,\n    );\n  }\n}\n","import type { IZFilterBinary, ZOperatorBinary } from \"./filter-binary.mjs\";\nimport { ZOperatorsBinary } from \"./filter-binary.mjs\";\nimport type {\n  IZFilterCollection,\n  ZOperatorCollection,\n} from \"./filter-collection.mjs\";\nimport { ZOperatorsCollection } from \"./filter-collection.mjs\";\nimport type { IZFilterLogic, ZOperatorLogic } from \"./filter-logic.mjs\";\nimport { ZOperatorsLogic } from \"./filter-logic.mjs\";\nimport type { IZFilterUnary, ZOperatorUnary } from \"./filter-unary.mjs\";\nimport { ZOperatorsUnary } from \"./filter-unary.mjs\";\n\n/**\n * Represents one of the filter types.\n */\nexport type IZFilter =\n  IZFilterBinary | IZFilterLogic | IZFilterCollection | IZFilterUnary;\n\n/**\n * Represents one of the operator types.\n */\nexport type ZOperatorFilter =\n  ZOperatorBinary | ZOperatorCollection | ZOperatorLogic | ZOperatorUnary;\n\n/**\n * A list of all possible filter operators in one collection.\n */\nexport const ZOperatorsFilter = ([] as ZOperatorFilter[])\n  .concat(ZOperatorsBinary)\n  .concat(ZOperatorsCollection)\n  .concat(ZOperatorsLogic)\n  .concat(ZOperatorsUnary);\n","import type { IZDeserialize } from \"@zthun/helpful-fn\";\nimport { peel, peelBetween } from \"@zthun/helpful-fn\";\nimport { trim, trimStart } from \"lodash-es\";\n\nimport type { IZFilter, ZOperatorFilter } from \"./filter.mjs\";\nimport { ZOperatorsFilter } from \"./filter.mjs\";\nimport type { IZFilterBinary, ZOperatorBinary } from \"./filter-binary.mjs\";\nimport { isBinaryOperator, ZFilterBinaryBuilder } from \"./filter-binary.mjs\";\nimport type {\n  IZFilterCollection,\n  ZOperatorCollection,\n} from \"./filter-collection.mjs\";\nimport {\n  isCollectionOperator,\n  ZFilterCollectionBuilder,\n} from \"./filter-collection.mjs\";\nimport type { IZFilterLogic, ZOperatorLogic } from \"./filter-logic.mjs\";\nimport { isLogicOperator, ZFilterLogicBuilder } from \"./filter-logic.mjs\";\nimport type { IZFilterUnary, ZOperatorUnary } from \"./filter-unary.mjs\";\nimport { isUnaryOperator, ZFilterUnaryBuilder } from \"./filter-unary.mjs\";\n\n/**\n * Represents a parser object that can parse an {@link IZFilter} from a string.\n */\nexport class ZFilterDeserialize implements IZDeserialize<IZFilter> {\n  /**\n   * Attempts to parse an {@link IZFilter} from the candidate string.\n   *\n   * @param candidate -\n   *        The candidate string to parse.\n   *\n   * @returns\n   *        The filter parsed from the candidate.\n   * @throws\n   *        If there is a syntax error in candidate.\n   */\n  public deserialize(candidate: string): IZFilter {\n    const [filter, rest] = this._parseFilter(candidate);\n\n    if (trim(rest).length > 0) {\n      throw new Error(\n        `Extraneous characters found at the end of the candidate filter: ${rest}`,\n      );\n    }\n\n    return filter;\n  }\n\n  private _peelBetweenParens(args: string): [string, string] {\n    const [argList, rest] = peelBetween(args, \"(\", \")\");\n\n    if (argList == null) {\n      throw new Error(\n        `Unable to find opening and closing parenthesis for ${args}.  Check syntax.`,\n      );\n    }\n\n    return [argList, rest];\n  }\n\n  private _splitArgs(\n    operator: ZOperatorFilter,\n    args: string,\n    minArgs: number,\n    maxArgs = minArgs,\n  ): [string[], string] {\n    const [argList, rest] = this._peelBetweenParens(args);\n\n    const splitArgs = argList.split(\",\").filter((x) => !!x);\n\n    if (splitArgs.length < minArgs) {\n      const msg = `Not enough arguments for ${operator} filter: ${JSON.stringify(splitArgs)}.`;\n      const expected = `Expected at least ${minArgs} arguments, but got ${splitArgs.length} instead.`;\n      throw new Error(`${msg}.  ${expected}`);\n    }\n\n    if (splitArgs.length > maxArgs) {\n      const msg = `Too many arguments for ${operator} filter: ${JSON.stringify(splitArgs)}.`;\n      const expected = `Expected at most ${maxArgs} arguments, but got ${splitArgs.length} instead.`;\n      throw new Error(`${msg}.  ${expected}`);\n    }\n\n    return [splitArgs, rest];\n  }\n\n  private _parseUnaryFilter(\n    operator: ZOperatorUnary,\n    args: string,\n  ): [IZFilterUnary, string] {\n    const [argList, rest] = this._splitArgs(operator, args, 1);\n    let [subject] = argList;\n    subject = trim(subject);\n    return [\n      new ZFilterUnaryBuilder().operator(operator).subject(subject).build(),\n      rest,\n    ];\n  }\n\n  private _parseBinaryFilter(\n    operator: ZOperatorBinary,\n    args: string,\n  ): [IZFilterBinary, string] {\n    const [argList, rest] = this._splitArgs(operator, args, 2);\n    let [subject, value] = argList;\n    subject = trim(subject);\n    value = JSON.parse(value);\n    return [\n      new ZFilterBinaryBuilder()\n        .operator(operator)\n        .subject(subject)\n        .value(value)\n        .build(),\n      rest,\n    ];\n  }\n\n  private _parseCollectionFilter(\n    operator: ZOperatorCollection,\n    args: string,\n  ): [IZFilterCollection, string] {\n    const [argList, rest] = this._splitArgs(operator, args, 1, Infinity);\n    let [subject] = argList;\n    subject = trim(subject);\n    const values = argList.slice(1).map((a) => JSON.parse(trim(a)));\n    return [\n      new ZFilterCollectionBuilder()\n        .operator(operator)\n        .subject(subject)\n        .values(values)\n        .build(),\n      rest,\n    ];\n  }\n\n  private _parseLogicFilter(\n    operator: ZOperatorLogic,\n    args: string,\n  ): [IZFilterLogic, string] {\n    const argsList = this._peelBetweenParens(trim(args));\n    let [remaining] = argsList;\n    const [, rest] = argsList;\n\n    let builder = new ZFilterLogicBuilder().operator(operator);\n\n    while (remaining) {\n      const split = this._parseFilter(remaining);\n      const [clause] = split;\n      [, remaining] = split;\n      remaining = trimStart(remaining, \" ,\");\n      builder = builder.clause(clause);\n    }\n\n    return [builder.build(), rest];\n  }\n\n  private _parseFilter(candidate: string): [IZFilter, string] {\n    const [operator, rest] = peel(trim(candidate), ZOperatorsFilter);\n\n    if (isUnaryOperator(operator)) {\n      return this._parseUnaryFilter(operator, rest);\n    }\n\n    if (isBinaryOperator(operator)) {\n      return this._parseBinaryFilter(operator, rest);\n    }\n\n    if (isCollectionOperator(operator)) {\n      return this._parseCollectionFilter(operator, rest);\n    }\n\n    if (isLogicOperator(operator)) {\n      return this._parseLogicFilter(operator, rest);\n    }\n\n    throw new Error(`Cannot determine filter operator at ${candidate}.`);\n  }\n}\n","import type { IZSerialize } from \"@zthun/helpful-fn\";\n\nimport type { IZFilter } from \"./filter.mjs\";\nimport { isBinaryFilter } from \"./filter-binary.mjs\";\nimport { isCollectionFilter } from \"./filter-collection.mjs\";\nimport { isLogicFilter } from \"./filter-logic.mjs\";\nimport { isUnaryFilter } from \"./filter-unary.mjs\";\n\n/**\n * Represents a serializer that can serialize a filter object to a string.\n */\nexport class ZFilterSerialize implements IZSerialize<IZFilter> {\n  public serialize(candidate: IZFilter | null | undefined): string | undefined {\n    if (isBinaryFilter(candidate)) {\n      return `${candidate.operator}(${candidate.subject}, ${JSON.stringify(candidate.value)})`;\n    }\n\n    if (isUnaryFilter(candidate)) {\n      return `${candidate.operator}(${candidate.subject})`;\n    }\n\n    if (isCollectionFilter(candidate)) {\n      return `${candidate.operator}(${candidate.subject}, ${candidate.values.map((v) => JSON.stringify(v)).join(\", \")})`;\n    }\n\n    if (isLogicFilter(candidate)) {\n      return `${candidate.operator}(${candidate.clauses.map((c) => this.serialize(c)).join(\", \")})`;\n    }\n\n    return undefined;\n  }\n}\n","import type { IZDataMatch } from \"./data-match.mjs\";\n\n/**\n * An implementation of an IZDataMatch that always returns true on match.\n */\nexport class ZDataMatchAlways implements IZDataMatch<any, any> {\n  /**\n   * Returns true.\n   *\n   * @returns\n   *        true\n   */\n  public match() {\n    return true;\n  }\n}\n","import type { IZDataMatch } from \"./data-match.mjs\";\n\n/**\n * Represents a data match that forwards to an inner match if the filter is null or undefined.\n *\n * @param TData -\n *        The type of data being matched.\n * @param TFilter -\n *        The type of filter performing the match.\n */\nexport class ZDataMatchOptional<TData, TFilter> implements IZDataMatch<\n  TData,\n  TFilter | undefined | null\n> {\n  /**\n   * Initializes a new instance of this object.\n   *\n   * @param _match -\n   *        The inner match object which does not support\n   *        null or undefined filters.\n   */\n  public constructor(private _match: IZDataMatch<TData, TFilter>) {}\n\n  /**\n   * Gets whether the given data matches the given filter.\n   *\n   * @param data -\n   *        The data to check.\n   * @param filter -\n   *        The filter to match against.\n   *\n   * @returns\n   *        True if filter is null or undefined.  Otherwise,\n   *        the result from the inner match with data and filter\n   *        is returned.\n   */\n  public match(data: TData, filter: TFilter | undefined | null): boolean {\n    if (filter == null) {\n      return true;\n    }\n\n    return this._match.match(data, filter);\n  }\n}\n","import { createGuid } from \"@zthun/helpful-fn\";\n\n/**\n * Represents the underlying metadata type.\n */\nexport enum ZMetadataType {\n  /**\n   * A date.\n   *\n   * Should be a string or Date value.\n   */\n  Date = \"date\",\n  /**\n   * A number.\n   *\n   * Should be a string or number value.\n   */\n  Number = \"number\",\n  /**\n   * A raw string.\n   *\n   * This is the default type.  Should be a string value.\n   */\n  Text = \"text\",\n  /**\n   * A text field that represents a path to a file.\n   *\n   * Should behave the same as a text field.\n   */\n  File = \"file\",\n  /**\n   * A flag.\n   */\n  Boolean = \"boolean\",\n  /**\n   * An icon value.\n   *\n   * The underlying metadata cls should be set that\n   * defines which class style the icon comes from.\n   */\n  Icon = \"icon\",\n  /**\n   * An image value.\n   *\n   * The value should be a URL to an image file.  If the image\n   * is binary, then it should be a data URL.\n   */\n  Image = \"image\",\n  /**\n   * Custom value that is defined by the person who is using this\n   * metadata.\n   */\n  Custom = \"custom\",\n}\n\n/**\n * Represents metadata about a object field.\n *\n * This of this as data about the data.\n */\nexport interface IZMetadata {\n  /**\n   * The id.\n   *\n   * This can be a guid or a human readable\n   * value.  The most important feature is that\n   * this must be unique across a collection of\n   * metadata.\n   */\n  id: string;\n\n  /**\n   * Human readable name of the field data.\n   */\n  name: string;\n\n  /**\n   * The metadata type.\n   */\n  type: ZMetadataType;\n\n  /**\n   * The field path into the entity that targets\n   * the value.\n   */\n  path?: string;\n\n  /**\n   * An explanation of what the field is for.\n   *\n   * This can act like a comment.  Those looking\n   * at the metadata can use this to get a better\n   * idea of what the value represents.\n   */\n  description?: string;\n\n  /**\n   * The default value that should be used for null or undefined\n   * representations of this value.\n   */\n  fallback?: any;\n\n  /**\n   * The expected format.\n   *\n   * The usage of this depends on the type.\n   * For example, for date fields, this can be something\n   * such as 'L LT' and for numbers this can be something\n   * such as 'currency' or 'percentage'.\n   */\n  format?: string;\n\n  /**\n   * Whether or not this metadata can be sorted.\n   */\n  sortable?: boolean;\n\n  /**\n   * Whether or not this metadata can be edited.\n   */\n  editable?: boolean;\n\n  /**\n   * The class type of the metadata.\n   *\n   * This is useful for icons where you need to specify\n   * which set the icon value comes from.\n   *\n   * For example, if the value is refresh, then this\n   * value can be font-awesome to specify usage of\n   * the refresh icon from the font-awesome set.\n   *\n   * The actual class usage is determined by the one\n   * using the metadata.\n   */\n  cls?: string;\n\n  /**\n   * Decimal precision.\n   *\n   * Useful for numbers.\n   */\n  precision?: number;\n\n  /**\n   * The width represented as a string.\n   *\n   * Useful for things like icons and images.\n   *\n   * This allows for pseudo sizes such as xs,\n   * sm, lg, etc, as well as css values such as\n   * 24px, 2rem, etc.\n   *\n   * The usage of this depends on the developer using it.\n   */\n  width?: string;\n\n  /**\n   * The height represented as a string.\n   *\n   * Useful for things like icons and images.\n   *\n   * This allows for pseudo sizes such as xs,\n   * sm, lg, etc, as well as css values such as\n   * 24px, 2rem, etc.\n   *\n   * The usage of this depends on the developer using it.\n   */\n  height?: string;\n}\n\n/**\n * Represents a builder for metadata.\n */\nexport class ZMetadataBuilder {\n  private _metadata: IZMetadata;\n\n  /**\n   * Initializes a new instance of this object.\n   */\n  public constructor() {\n    const id = createGuid();\n\n    this._metadata = {\n      id,\n      name: id,\n      type: ZMetadataType.Text,\n    };\n  }\n\n  /**\n   * Sets the id of the metadata.\n   *\n   * @param val -\n   *        The value to set.  If this\n   *        is undefined, then a new\n   *        guid will be set as the value.\n   *\n   * @returns\n   *        This object.\n   */\n  public id(val = createGuid()): this {\n    this._metadata.id = val;\n    return this;\n  }\n\n  /**\n   * Sets the name of the metadata.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public name(val: string): this {\n    this._metadata.name = val;\n    return this;\n  }\n\n  /**\n   * Sets the path of the metadata.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public path(val: string): this {\n    this._metadata.path = val;\n    return this;\n  }\n\n  /**\n   * Sets the description for the field.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public description(val: string): this {\n    this._metadata.description = val;\n    return this;\n  }\n\n  /**\n   * Sets the fallback value for the field.\n   *\n   * @param val -\n   *        The fallback value.\n   *\n   * @returns\n   *        This object.\n   */\n  public fallback(val: any): this {\n    this._metadata.fallback = val;\n    return this;\n  }\n\n  /**\n   * Sets the format of the metadata.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public format(val?: string): this {\n    this._metadata.format = val;\n    return this;\n  }\n\n  /**\n   * Sets the class type of the metadata.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public cls(val?: string): this {\n    this._metadata.cls = val;\n    return this;\n  }\n\n  /**\n   * Sets the precision of the metadata.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public precision(val?: number): this {\n    this._metadata.precision = val;\n    return this;\n  }\n\n  /**\n   * Sets the width of the metadata.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public width(val?: string): this {\n    this._metadata.width = val;\n    return this;\n  }\n\n  /**\n   * Sets the height of the metadata.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public height(val?: string): this {\n    this._metadata.height = val;\n    return this;\n  }\n\n  /**\n   * Sets both width and height.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public square(val?: string): this {\n    return this.width(val).height(val);\n  }\n\n  /**\n   * Sets the type of the metadata.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public type(val: ZMetadataType): this {\n    this._metadata.type = val;\n    return this;\n  }\n\n  /**\n   * Sets the type as text.\n   *\n   * @returns\n   *        This object.\n   */\n  public text = this.type.bind(this, ZMetadataType.Text);\n\n  /**\n   * Sets the type as file.\n   *\n   * @returns\n   *        This object.\n   */\n  public file = this.type.bind(this, ZMetadataType.File);\n\n  /**\n   * Sets the type as custom.\n   *\n   * @returns\n   *        This object.\n   */\n  public custom = this.type.bind(this, ZMetadataType.Custom);\n\n  /**\n   * Sets the type as date.\n   *\n   * @returns\n   *        This object.\n   */\n  public date = this.type.bind(this, ZMetadataType.Date);\n\n  /**\n   * Sets the type as a number.\n   *\n   * @returns\n   *        This object.\n   */\n  public number = this.type.bind(this, ZMetadataType.Number);\n\n  /**\n   * Sets the type as an icon.\n   *\n   * @returns\n   *        This object.\n   */\n  public icon = this.type.bind(this, ZMetadataType.Icon);\n\n  /**\n   * Sets the type as an image.\n   *\n   * @returns\n   *        This object.\n   */\n  public image = this.type.bind(this, ZMetadataType.Image);\n\n  /**\n   * Sets the type as a boolean.\n   *\n   * @returns\n   *        This object.\n   */\n  public boolean = this.type.bind(this, ZMetadataType.Boolean);\n\n  /**\n   * Sets the metadata as sortable.\n   *\n   * @param value -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public sortable(value = true) {\n    this._metadata.sortable = value;\n    return this;\n  }\n\n  /**\n   * Sets the metadata as editable.\n   *\n   * @param value -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public editable(value = true) {\n    this._metadata.editable = value;\n    return this;\n  }\n\n  /**\n   * Copies another metadata object into this object.\n   *\n   * @param other -\n   *        The metadata to copy.\n   *\n   * @returns\n   *         This object.\n   */\n  public copy(other: IZMetadata): this {\n    this._metadata = structuredClone(other);\n    return this;\n  }\n\n  /**\n   * Returns the constructed metadata.\n   *\n   * @returns\n   *        The built metadata.\n   */\n  public build(): IZMetadata {\n    return structuredClone(this._metadata);\n  }\n}\n","/**\n * Represents well known icon font classes for reuse.\n */\nexport enum ZWellKnownIconClasses {\n  /**\n   * Font Awesome Classic.\n   *\n   * @see {@link https://fontawesome.com}\n   */\n  FontAwesome = \"https://fontawesome.com\",\n\n  /**\n   * Font Awesome Brands.\n   *\n   * @see {@link https://fontawesome.com/search?o=r&f=brands}\n   */\n  FontAwesomeBrands = \"https://fontawesome.com/search?o=r&f=brands\",\n\n  /**\n   * Font Awesome Sharp.\n   *\n   * @see {@link https://fontawesome.com/search?o=r&f=sharp}\n   */\n  FontAwesomeSharp = \"https://fontawesome.com/search?o=r&f=sharp\",\n\n  /**\n   * Material design.\n   *\n   * @see {@link https://mui.com/material-ui/material-icons}\n   */\n  Material = \"https://mui.com/material-ui/material-icons\",\n}\n","/**\n * Represents a page of data.\n *\n * @param T -\n *        The type of data on the page.\n */\nexport interface IZPage<T> {\n  /**\n   * The total number of items across all pages.\n   */\n  count: number;\n  /**\n   * The current data view on the page.\n   */\n  data: T[];\n}\n\n/**\n * A builder for a page object.\n */\nexport class ZPageBuilder<T = unknown> {\n  private _page: IZPage<T>;\n\n  /**\n   * Initializes a new instance of this object.\n   */\n  public constructor() {\n    this._page = {\n      count: 0,\n      data: [],\n    };\n  }\n\n  /**\n   * Sets the count to 0 and the data to the empty array.\n   *\n   * @returns\n   *        This object.\n   */\n  public empty() {\n    return this.all([]);\n  }\n\n  /**\n   * Creates a page of data that has only one item, and it represents the entire data set.\n   *\n   * @param item -\n   *        The only item in the data set.\n   *\n   * @returns\n   *        This object.\n   */\n  public singleton<D>(item: D) {\n    return this.all([item]);\n  }\n\n  /**\n   * Creates a page of data where the data represents the entire data set.\n   *\n   * @param data -\n   *        The entire data set.\n   *\n   * @returns\n   *        This object.\n   */\n  public all<D>(data: D[]) {\n    return this.data(data).count(data.length);\n  }\n\n  /**\n   * Sets the page view.\n   *\n   * @param data -\n   *        The view of the data on the given page.\n   *\n   * @returns\n   *        This object.\n   */\n  public data<D>(data: D[]): ZPageBuilder<D> {\n    const current = this._page as unknown as IZPage<D>;\n    const next = new ZPageBuilder<D>().copy(current);\n    next._page.data = data.slice();\n    return next;\n  }\n\n  /**\n   * Sets the total item count across all pages.\n   *\n   * @param count -\n   *        The total item count across all pages.\n   *\n   * @returns\n   *        This object.\n   */\n  public count(count: number) {\n    this._page.count = count;\n    return this;\n  }\n\n  /**\n   * Copies another page object into this page builder.\n   *\n   * @param other -\n   *        The page to copy.\n   *\n   * @returns\n   *        This object.\n   */\n  public copy(other: IZPage<T>) {\n    this._page = { ...other };\n    this._page.data = this._page.data.slice();\n    return this;\n  }\n\n  /**\n   * Returns the built page.\n   *\n   * @returns\n   *        The built page.\n   */\n  public build(): IZPage<T> {\n    const copy = { ...this._page };\n    copy.data = copy.data.slice();\n    return copy;\n  }\n}\n","import { get } from \"lodash-es\";\n\nimport type { IZDataMatch } from \"../match/data-match.mjs\";\n\n/**\n * Represents a data match where the data qualifies if any fields contain the search text.\n */\nexport class ZDataSearchFields<TData extends object> implements IZDataMatch<\n  TData,\n  string\n> {\n  /**\n   * Initializes a new instance of this object.\n   *\n   * @param _fields -\n   *        The fields to match.\n   */\n  public constructor(private _fields?: string[]) {}\n\n  public match(data: TData, filter: string): boolean {\n    const _fields = this._fields || Object.keys(data);\n    const _filter = filter.toUpperCase();\n\n    return _fields.some((field) => {\n      const value = `${get(data, field) || \"\"}`.toUpperCase();\n      return value.indexOf(_filter) >= 0;\n    });\n  }\n}\n","import type { IZDataMatch } from \"../match/data-match.mjs\";\n\n/**\n * Represents a data match for text strings.\n *\n * The data should match when it's text\n * representation matches the filter string.\n */\nexport class ZDataSearchText implements IZDataMatch<any, string> {\n  public match(data: any, filter: string): boolean {\n    const _filter = filter.toUpperCase();\n    return `${data}`.toUpperCase().indexOf(_filter) >= 0;\n  }\n}\n","import { castArray, values } from \"lodash-es\";\n\n/**\n * A sorting direction.\n */\nexport enum ZSortDirection {\n  /**\n   * Ascending sort.\n   */\n  Ascending = \"asc\",\n  /**\n   * Descending sort.\n   */\n  Descending = \"desc\",\n}\n\n/**\n * Represents an option for sorting.\n */\nexport interface IZSort {\n  /**\n   * The subject to sort by.\n   */\n  subject?: string;\n\n  /**\n   * The direction to sort.\n   */\n  direction: ZSortDirection;\n}\n\n/**\n * Represents a builder for a sort list.\n */\nexport class ZSortBuilder {\n  private _sort: IZSort[];\n\n  /**\n   * Initializes a new instance of this object.\n   */\n  public constructor() {\n    this._sort = [];\n  }\n\n  /**\n   * Sets all sorts.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @returns\n   *        This object.\n   */\n  public sorts(val: IZSort[]): this {\n    this._sort = val;\n    return this;\n  }\n\n  /**\n   * Adds 1 or more sorts.\n   *\n   * @param val -\n   *        The value to concat to the sorts.\n   *\n   * @returns\n   *        This object.\n   */\n  public sort(val: IZSort | IZSort[]): this {\n    const _sorts = castArray(val);\n    return this.sorts(this._sort.concat(_sorts));\n  }\n\n  /**\n   * Adds an ascending order clause.\n   *\n   * @param subject -\n   *        The subject to sort by.\n   *\n   * @returns\n   *        This object\n   */\n  public ascending(subject?: string): this {\n    return this.sort({ subject, direction: ZSortDirection.Ascending });\n  }\n\n  /**\n   * Adds a descending order clause.\n   *\n   * @param subject -\n   *        The subject to sort by.\n   *\n   * @returns\n   *        This object\n   */\n  public descending(subject?: string): this {\n    return this.sort({ subject, direction: ZSortDirection.Descending });\n  }\n\n  /**\n   * Returns the current sort state.\n   *\n   * @returns\n   *        The current sort state.\n   */\n  public build(): IZSort[] {\n    return JSON.parse(JSON.stringify(this._sort));\n  }\n}\n\n/**\n * A list of all sort directions.\n */\nexport const ZSortDirections = values(ZSortDirection);\n","import type { IZDeserialize } from \"@zthun/helpful-fn\";\nimport { peel, peelBetween } from \"@zthun/helpful-fn\";\nimport { trim, trimStart } from \"lodash-es\";\n\nimport type { IZSort } from \"./sort.mjs\";\nimport { ZSortBuilder, ZSortDirections } from \"./sort.mjs\";\n\n/**\n * A object that can deserialize an {@link IZSort} list from a string.\n */\nexport class ZSortDeserialize implements IZDeserialize<IZSort[]> {\n  public deserialize(candidate: string): IZSort[] {\n    // A sort candidate can be fully between parens to allow for multi sort\n    // or can just be a single sort.\n    const [_candidate, rest] = peelBetween(trim(candidate), \"(\", \")\");\n    const $candidate = _candidate == null ? rest : _candidate;\n    let builder = new ZSortBuilder();\n\n    let remaining = $candidate;\n\n    while (remaining) {\n      const strippedSort = this._parseSort(remaining);\n      const [sort] = strippedSort;\n      [, remaining] = strippedSort;\n      builder = builder.sort(sort);\n      remaining = trimStart(remaining, \", \");\n    }\n\n    return builder.build();\n  }\n\n  private _parseSort(candidate: string): [IZSort, string] {\n    const [direction, rest] = peel(candidate, ZSortDirections);\n\n    if (direction == null) {\n      throw new Error(`Cannot determine sort direction at ${candidate}`);\n    }\n\n    const peeledSubject = peelBetween(rest, \"(\", \")\");\n    let [subject] = peeledSubject;\n    const [, remainingSortsToParse] = peeledSubject;\n\n    if (subject == null) {\n      throw new Error(`Cannot determine sort subject at ${rest}.`);\n    }\n\n    subject = trim(subject);\n\n    if (!subject) {\n      throw new Error(`Cannot determine sort subject at ${rest}.`);\n    }\n\n    return [{ direction, subject }, remainingSortsToParse];\n  }\n}\n","import type { IZSort } from \"./sort.mjs\";\n\n/**\n * An object that can serialize an {@link IZSort} list to a string.\n */\nexport class ZSortSerialize {\n  /**\n   * Serializes a sort list to a string.\n   *\n   * @param candidate -\n   *        The sort list to serialize.\n   *\n   * @returns\n   *        The string representation of the sort.  Returns undefined\n   *        if the list is empty, null, or undefined.\n   */\n  public serialize(candidate: IZSort[] | null | undefined): string | undefined {\n    if (!candidate?.length) {\n      return undefined;\n    }\n\n    const params = candidate\n      .map((s) => `${s.direction}(${s.subject})`)\n      .join(\", \");\n    return candidate.length > 1 ? `(${params})` : params;\n  }\n}\n","import type { IZSort } from \"./sort.mjs\";\nimport { ZSortBuilder, ZSortDirection } from \"./sort.mjs\";\nimport type { IZSorter } from \"./sorter.mjs\";\n\n/**\n * Represents a sorter that simulates a single sort at a time.\n */\nexport class ZSorterSingle implements IZSorter {\n  private _sorted: IZSort | undefined;\n\n  /**\n   * Initializes a new instance of this object.\n   *\n   * @param initial -\n   *        The initial sort list.\n   */\n  public constructor(initial: IZSort[] = []) {\n    [this._sorted] = initial;\n  }\n\n  public index(subject?: string): number {\n    return this._sorted?.subject === subject ? 1 : -1;\n  }\n\n  public sorted(subject?: string): ZSortDirection | undefined {\n    return this._sorted && this._sorted.subject === subject\n      ? this._sorted.direction\n      : undefined;\n  }\n\n  public sort(subject?: string): IZSort[] {\n    this._sorted = this._sorted?.subject === subject ? this._sorted : undefined;\n\n    if (!this._sorted) {\n      [this._sorted] = new ZSortBuilder().ascending(subject).build();\n    } else if (this._sorted.direction === ZSortDirection.Descending) {\n      this._sorted = undefined;\n    } else {\n      [this._sorted] = new ZSortBuilder().descending(subject).build();\n    }\n\n    return this._sorted ? [this._sorted] : [];\n  }\n}\n","import { tryFallback } from \"@zthun/helpful-fn\";\n\nimport type { IZFilter } from \"../filter/filter.mjs\";\nimport { ZFilterDeserialize } from \"../filter/filter-deserialize.mjs\";\nimport type { IZSort } from \"../sort/sort.mjs\";\nimport { ZSortDeserialize } from \"../sort/sort-deserialize.mjs\";\n\n/**\n * Describes a request as if it was placed an a url in the query params.\n */\nexport interface IZDataRequestQuery {\n  /**\n   * Page number.\n   */\n  page?: string;\n  /**\n   * Page size.\n   */\n  size?: string;\n  /**\n   * Search criterion.\n   */\n  search?: string;\n  /**\n   * Filter criterion.\n   */\n  filter?: string;\n  /**\n   * Sort criterion.\n   */\n  sort?: string;\n}\n\n/**\n * Describes a request for a given set of data.\n */\nexport interface IZDataRequest {\n  /**\n   * The page number.\n   *\n   * This is one based.  Should always default\n   * to 1.\n   */\n  page?: number;\n  /**\n   * The page size.\n   *\n   * If not set, it will be up to the consumer\n   * to decide the default.\n   */\n  size?: number;\n\n  /**\n   * Search query.\n   *\n   * How the search is performed is done\n   * through the consumer.\n   *\n   * @see\n   *        {@link ZDataSearchFields} for a basic\n   *        implementation.\n   */\n  search?: string;\n\n  /**\n   * The filter query.\n   *\n   * How the filter is applied is done through\n   * the consumer.\n   *\n   * @see\n   *        {@link ZDataFilterFields} for a basic\n   *        implementation.\n   */\n  filter?: IZFilter;\n\n  /**\n   * The sort order.\n   *\n   * How the sort is applied is done through\n   * the consumer.\n   *\n   * @see\n   *        {@link ZSorterSingle} for a basic\n   *        implementation.\n   */\n  sort?: IZSort[];\n}\n\n/**\n * Represents a builder for a data request.\n */\nexport class ZDataRequestBuilder {\n  private _request: IZDataRequest;\n\n  /**\n   * Initializes a new instance of this object.\n   */\n  public constructor() {\n    this._request = {};\n  }\n\n  /**\n   * Sets the page to retrieve.\n   *\n   * @param page -\n   *        The page number\n   *\n   * @returns\n   *        A reference to this object.\n   */\n  public page(page?: number): this {\n    if (page != null) {\n      this._request.page = Math.max(page, 1);\n    } else {\n      delete this._request.page;\n    }\n    return this;\n  }\n\n  /**\n   * Sets the page size.\n   *\n   * @param size -\n   *        The page size.\n   *\n   * @returns\n   *        A reference to this object.\n   */\n  public size(size?: number): this {\n    if (size != null) {\n      this._request.size = Math.max(size, 0);\n    } else {\n      delete this._request.size;\n    }\n    return this;\n  }\n\n  /**\n   * Sets the search criteria.\n   *\n   * @param search -\n   *        The search query.\n   *\n   * @returns\n   *        A reference to this object.\n   */\n  public search(search?: string): this {\n    this._request.search = search;\n    return this;\n  }\n\n  /**\n   * Sets the filter criteria.\n   *\n   * @param filter -\n   *        The filter criteria.  If this is a string,\n   *        then it will be parsed according to the filter\n   *        criteria.\n   *\n   * @returns\n   *        A reference to this object.\n   */\n  public filter(filter?: IZFilter | string): this {\n    if (filter == null) {\n      delete this._request.filter;\n    } else {\n      const f =\n        typeof filter === \"string\"\n          ? tryFallback(() => new ZFilterDeserialize().deserialize(filter))\n          : filter;\n      this._request.filter = f;\n    }\n    return this;\n  }\n\n  /**\n   * Sets the sort criteria.\n   *\n   * @param sort -\n   *        The list of sorts to make on the request.\n   *\n   * @returns\n   *        A reference to this object.\n   */\n  public sort(sort?: IZSort[] | string): this {\n    if (sort == null) {\n      delete this._request.sort;\n    } else {\n      const s =\n        typeof sort === \"string\"\n          ? tryFallback(() => new ZSortDeserialize().deserialize(sort))\n          : sort;\n      this._request.sort = s;\n    }\n    return this;\n  }\n\n  /**\n   * Copies an existing data request into this object.\n   *\n   * @param other -\n   *        The data request object to copy.\n   *\n   * @returns\n   *        A reference to this object.\n   */\n  public copy(other: IZDataRequest) {\n    this._request = JSON.parse(JSON.stringify(other));\n    return this;\n  }\n\n  /**\n   * Constructs the data from a request query.\n   *\n   * This is useful for putting request parameters on a url.\n   *\n   * @param query -\n   *        The query that was requested.\n   *\n   * @returns\n   *        This object.\n   */\n  public query(query: IZDataRequestQuery) {\n    if (query.filter != null) {\n      this.filter(query.filter);\n    }\n\n    if (query.sort != null) {\n      this.sort(query.sort);\n    }\n\n    if (query.page != null) {\n      const page = +query.page;\n      this.page(isNaN(page) ? this._request.page : page);\n    }\n\n    if (query.size != null) {\n      const size = +query.size;\n      this.size(isNaN(size) ? this._request.size : size);\n    }\n\n    if (query.search != null) {\n      this.search(query.search);\n    }\n\n    return this;\n  }\n\n  /**\n   * Returns the currently built request.\n   *\n   * The returned request will be a deep copy.\n   *\n   * @returns\n   *        The currently built request.\n   */\n  public build(): IZDataRequest {\n    return JSON.parse(JSON.stringify(this._request));\n  }\n}\n","import { chunk, get } from \"lodash-es\";\n\nimport type { IZDataMatch } from \"../match/data-match.mjs\";\nimport { ZDataMatchOptional } from \"../match/data-match-optional.mjs\";\nimport type { IZSort } from \"../sort/sort.mjs\";\nimport { ZSortDirection } from \"../sort/sort.mjs\";\n\n/**\n * Takes a list of data and paginates it in memory.\n *\n * @param data -\n *        The data to paginate.\n * @param page -\n *        The page number to retrieve.\n * @param size -\n *        The size of a single page\n *\n * @returns\n *        The subset page of data that was offset and limited to.  If\n *        page goes beyond the last page, then the result set should be empty.\n *        If the page is less than 1, then the first page will be used.\n *        If size is 0, then an empty page will be returned.\n */\nexport function paginate<T>(data: T[], page: number, size: number) {\n  if (size === Infinity) {\n    return page <= 1 ? data : [];\n  }\n\n  const _page = Math.max(0, page - 1);\n\n  const pages = chunk(data, size);\n  return pages[_page] || [];\n}\n\n/**\n * Matches data given a data set to a given filter.\n *\n * @param data -\n *        The data to filter.\n * @param filter -\n *        The filter to apply to the data.  If this\n *        is null or undefined, then the entire\n *        data set will match.\n * @param match -\n *        The match implementation that determine if\n *        a single item in data matches the provided\n *        filter.\n *\n * @returns\n *        A subset of data that matches to the given filter.\n */\nexport function filter<T, F>(\n  data: T[],\n  filter: F | undefined | null,\n  match: IZDataMatch<T, F>,\n) {\n  const _match = new ZDataMatchOptional<T, F>(match);\n  return data.filter((data) => _match.match(data, filter));\n}\n\n/**\n * Sorts the data.\n *\n * @param data -\n *        The data to sort.\n * @param sort -\n *        The sort criteria.\n *\n * @returns\n *        The data sorted to the sort criteria.\n */\nexport function sort<T>(data: T[], sorts: IZSort[] | undefined): T[] {\n  const _data = data.slice();\n\n  if (!sorts?.length) {\n    return _data;\n  }\n\n  _data.sort((x: T | null, y: T | null) => {\n    for (let i = 0; i < sorts.length; ++i) {\n      const s = sorts[i];\n      const m = s.direction === ZSortDirection.Ascending ? 1 : -1;\n      const xV: any = s.subject ? get(x, s.subject, null) : x;\n      const yV: any = s.subject ? get(y, s.subject, null) : y;\n\n      if (xV == null && yV == null) {\n        continue;\n      }\n\n      if (xV == null && yV != null) {\n        return -1 * m;\n      }\n\n      if (xV != null && yV == null) {\n        return m;\n      }\n\n      if (xV === yV) {\n        continue;\n      }\n\n      return m * (xV < yV ? -1 : 1);\n    }\n\n    return 0;\n  });\n\n  return _data;\n}\n","import { ZDataFilterFields } from \"../filter/data-filter-fields.mjs\";\nimport type { IZFilter } from \"../filter/filter.mjs\";\nimport type { IZDataMatch } from \"../match/data-match.mjs\";\nimport { ZDataMatchAlways } from \"../match/data-match-always.mjs\";\n\n/**\n * Options for an {@link ZDataSourceStatic} object.\n */\nexport interface IZDataSourceStaticOptions<T> {\n  /**\n   * How the search field in the request is handled.\n   */\n  search: IZDataMatch<T, string>;\n  /**\n   * How the filter field in the request is handled.\n   */\n  filter: IZDataMatch<T, IZFilter>;\n  /**\n   * The total number of milliseconds to debounce each\n   * request before resolving the results.\n   */\n  delay: number;\n}\n\n/**\n * A builder for a {@link IZDataSourceStaticOptions} object.\n */\nexport class ZDataSourceStaticOptionsBuilder<T> {\n  private _options: IZDataSourceStaticOptions<T>;\n\n  /**\n   * Initializes a new instance of this object.\n   */\n  public constructor() {\n    this._options = {\n      search: new ZDataMatchAlways(),\n      filter: new ZDataFilterFields(),\n      delay: 0,\n    };\n  }\n\n  /**\n   * Sets the search implementation.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @see\n   *        {@link IZDataSourceStaticOptions.search}\n   *\n   * @returns\n   *        A reference to this object.\n   */\n  public search(val: IZDataMatch<T, string> | undefined): this {\n    this._options.search = val || new ZDataMatchAlways();\n    return this;\n  }\n\n  /**\n   * Sets the search implementation.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @see\n   *        {@link IZDataSourceStaticOptions.filter}\n   *\n   * @returns\n   *        A reference to this object.\n   */\n  public filter(val: IZDataMatch<T, IZFilter> | undefined): this {\n    this._options.filter = val || new ZDataFilterFields();\n    return this;\n  }\n\n  /**\n   * Sets the delay in milliseconds.\n   *\n   * @param val -\n   *        The value to set.\n   *\n   * @see\n   *        {@link IZDataSourceStaticOptions.delay}\n   *\n   * @returns\n   *        A reference to this object.\n   */\n  public delay(val: number | undefined): this {\n    this._options.delay = val || 0;\n    return this;\n  }\n\n  /**\n   * Builds the options and returns the object.\n   *\n   * @returns\n   *        A shallow copy of the built options.\n   */\n  public build(): IZDataSourceStaticOptions<T> {\n    return { ...this._options };\n  }\n}\n","import type { IZDataRequest } from \"./data-request.mjs\";\nimport { filter, paginate, sort } from \"./data-results.mjs\";\nimport type { IZDataSource } from \"./data-source.mjs\";\nimport type { IZDataSourceStaticOptions } from \"./data-source-static-options.mjs\";\nimport { ZDataSourceStaticOptionsBuilder } from \"./data-source-static-options.mjs\";\n\n/**\n * Represents an in memory data source.\n *\n * This is very useful for testing and when you\n * need to cache a data set that you already have.\n */\nexport class ZDataSourceStatic<T> implements IZDataSource<T> {\n  /**\n   * Initializes a new instance of this object.\n   *\n   * @param _data -\n   *        The static data to search, sort, filter, and paginate.\n   * @param _options -\n   *        The options for the static source.\n   */\n  public constructor(\n    private _data: T[] | Promise<T[]> | Error | Promise<Error>,\n    private _options: IZDataSourceStaticOptions<T> = new ZDataSourceStaticOptionsBuilder().build(),\n  ) {}\n\n  /**\n   * Gets a copy of the current list of items.\n   *\n   * This is equivalent to invoking retrieve\n   * with the default data request.\n   *\n   * @returns\n   *      A shallow copy of the current item list.\n   *      Returns a rejected promise if the initial\n   *      data is an error.\n   */\n  public async items(): Promise<T[]> {\n    const data = await this._data;\n\n    if (data instanceof Error) {\n      return Promise.reject(data);\n    }\n\n    return data.slice();\n  }\n\n  /**\n   * Inserts an item into the existing data array.\n   *\n   * @param item -\n   *        The item to insert.\n   * @param index -\n   *        The index to insert at.  If this is equal to or less than 0\n   *        Then the item will be inserted at the front of the data list.\n   *        If this is greater than or equal to the maximum number of\n   *        items in the current list, then the item will be inserted\n   *        at the end of the list.\n   *\n   * @returns\n   *        A new data source where the item list has been updated to include\n   *        the new item.\n   */\n  public async insert(\n    item: T,\n    index = Infinity,\n  ): Promise<ZDataSourceStatic<T>> {\n    const items = await this.items();\n    index = Math.max(index, 0);\n    items.splice(index, 0, item);\n    return new ZDataSourceStatic(items, this._options);\n  }\n\n  /**\n   * Removes a specific matched item in the list.\n   *\n   * @param item -\n   *        The item to remove.  This will be an exact match.\n   *\n   * @returns\n   *        A new data source with the item removed, or a direct\n   *        copy if no such item exists within the list. Returns\n   *        a rejected promise if the original data is an error.\n   */\n  public async remove(item: T): Promise<ZDataSourceStatic<T>> {\n    const items = await this.items();\n    const index = items.indexOf(item);\n\n    if (index >= 0) {\n      items.splice(index, 1);\n    }\n\n    return new ZDataSourceStatic(items, this._options);\n  }\n\n  /**\n   * Removes a specific item at a given index.\n   *\n   * @param index -\n   *        The index of the item to remove.\n   *\n   * @returns\n   *        A new data source with the item at the given index\n   *        removed, or a direct copy if the index is out\n   *        of range.  Returns a rejected promise if the\n   *        original data is an Error.\n   */\n  public async removeAt(index: number): Promise<ZDataSourceStatic<T>> {\n    const items = await this.items();\n\n    if (index >= 0 && index < items.length) {\n      items.splice(index, 1);\n    }\n\n    return new ZDataSourceStatic(items, this._options);\n  }\n\n  /**\n   * Updates an item at the given index.\n   *\n   * @param item -\n   *        The item to set.\n   * @param index -\n   *        The index of the item to replace.\n   *\n   * @returns\n   *        A new data source with the item at the given index\n   *        updated, or a direct copy if the index is out\n   *        of range.  Returns a rejected promise if the\n   *        original data is an Error.\n   *\n   */\n  public async set(item: T, index: number): Promise<ZDataSourceStatic<T>> {\n    const items = await this.items();\n\n    if (index >= 0 && index < items.length) {\n      items[index] = item;\n    }\n\n    return new ZDataSourceStatic(items, this._options);\n  }\n\n  public async count(request: IZDataRequest): Promise<number> {\n    const { search: _search, filter: _filter } = request;\n    const data = await this._data;\n\n    if (data instanceof Error) {\n      return new Promise((_, reject) =>\n        setTimeout(() => reject(data), this._options.delay),\n      );\n    }\n\n    let arr: T[] = data;\n    arr = filter(arr, _search, this._options.search);\n    arr = filter(arr, _filter, this._options.filter);\n    return new Promise((resolve) =>\n      setTimeout(() => resolve(arr.length), this._options.delay),\n    );\n  }\n\n  public async retrieve(request: IZDataRequest): Promise<T[]> {\n    const {\n      page = 1,\n      size = Infinity,\n      search: _search,\n      filter: _filter,\n      sort: _sort,\n    } = request;\n    const data = await this._data;\n\n    if (data instanceof Error) {\n      return new Promise((_, reject) =>\n        setTimeout(() => reject(data), this._options.delay),\n      );\n    }\n\n    let arr: T[] = data;\n    arr = filter(arr, _search, this._options.search);\n    arr = filter(arr, _filter, this._options.filter);\n    arr = sort(arr, _sort);\n    arr = paginate(arr, page, size);\n\n    return new Promise((resolve) =>\n      setTimeout(() => resolve(arr), this._options.delay),\n    );\n  }\n}\n"],"mappings":"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"}