@xylabs/object 4.13.0 → 4.13.1

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.
@@ -1,47 +1,25 @@
1
1
  import { AnyNonPromise } from '@xylabs/promise';
2
- import type { AssertExMessageFunc } from '@xylabs/assert';
3
- import { AsTypeFunction as AsTypeFunction_2 } from './AsTypeFactory.ts';
2
+ import type { AnyObject } from '@xylabs/object-model';
3
+ import { AsTypeFunction } from '@xylabs/object-model';
4
4
  import type { FieldType } from '@xylabs/typeof';
5
- import type { Logger } from '@xylabs/logger';
6
5
  import { ObjectTypeShape } from '@xylabs/typeof';
7
6
  import type { Promisable } from '@xylabs/promise';
8
- import type { TypedKey } from '@xylabs/typeof';
7
+ import type { TypeCheck } from '@xylabs/object-model';
8
+ import type { TypeCheckConfig } from '@xylabs/object-model';
9
9
  import { TypedObject } from '@xylabs/typeof';
10
- import { TypedValue } from '@xylabs/typeof';
11
10
 
12
- /**
13
- * Any object, which means that it does not enforce the set of fields that it has. Extending from AnyObject
14
- * will result in a type that includes the universal set of field names
15
- */
16
- export declare type AnyObject = Record<TypedKey, unknown>;
17
-
18
- export declare const asAnyObject: AsTypeFunction_2<AnyObject>;
11
+ export declare const asAnyObject: AsTypeFunction<AnyObject>;
19
12
 
20
13
  export declare const AsObjectFactory: {
21
- create: <T extends TypedObject>(typeCheck: TypeCheck<T>) => AsTypeFunction_2<T>;
14
+ create: <T extends TypedObject>(typeCheck: TypeCheck<T>) => AsTypeFunction<T>;
22
15
  createOptional: <T extends TypedObject>(typeCheck: TypeCheck<T>) => (value: AnyNonPromise) => T | undefined;
23
16
  };
24
17
 
25
- export declare type AsOptionalTypeFunction<T extends AnyNonPromise = AnyNonPromise> = {
26
- <TType extends T>(value: AnyNonPromise): TType | undefined;
27
- };
28
-
29
18
  export declare const AsTypeFactory: {
30
19
  create: <T extends AnyNonPromise>(typeCheck: TypeCheck<T>) => AsTypeFunction<T>;
31
20
  createOptional: <T extends AnyNonPromise>(typeCheck: TypeCheck<T>) => (value: AnyNonPromise) => T | undefined;
32
21
  };
33
22
 
34
- export declare type AsTypeFunction<T extends AnyNonPromise = AnyNonPromise> = {
35
- <TType extends T>(value: AnyNonPromise): TType | undefined;
36
- <TType extends T>(value: AnyNonPromise, config: TypeCheckRequiredConfig): TType;
37
- <TType extends T>(value: AnyNonPromise, config: TypeCheckConfig | TypeCheckOptionalConfig): TType | undefined;
38
- <TType extends T>(value: AnyNonPromise, assert: StringOrAlertFunction<TType>): TType | undefined;
39
- <TType extends T>(value: AnyNonPromise, assert: StringOrAlertFunction<TType>, config: TypeCheckRequiredConfig): TType;
40
- <TType extends T>(value: AnyNonPromise, assert: StringOrAlertFunction<TType>, config: TypeCheckConfig | TypeCheckOptionalConfig): TType | undefined;
41
- };
42
-
43
- export declare type Compare<T> = (a: T, b: T) => number;
44
-
45
23
  /**
46
24
  * Creates a deep merge function with the specified options.
47
25
  * @param options Options for merging.
@@ -183,8 +161,6 @@ export declare type StringKeyObject<T = unknown> = {
183
161
  [key: string]: T;
184
162
  };
185
163
 
186
- export declare type StringOrAlertFunction<T extends AnyNonPromise> = string | AssertExMessageFunc<T>;
187
-
188
164
  export declare const toJson: (value: unknown, maxDepth?: number) => JsonValue;
189
165
 
190
166
  export declare const toJsonArray: (value: unknown[], cycleList?: unknown[], maxDepth?: number) => JsonArray;
@@ -195,20 +171,6 @@ export declare const toJsonString: (value: unknown, maxDepth?: number) => string
195
171
 
196
172
  export declare const toJsonValue: (value: unknown, cycleList?: unknown[], maxDepth?: number) => JsonValue;
197
173
 
198
- export declare type TypeCheck<T extends TypedValue> = (obj: AnyNonPromise, config?: TypeCheckConfig) => obj is T;
199
-
200
- export declare interface TypeCheckConfig {
201
- log?: boolean | Logger;
202
- }
203
-
204
- export declare interface TypeCheckOptionalConfig extends TypeCheckConfig {
205
- required: false;
206
- }
207
-
208
- export declare interface TypeCheckRequiredConfig extends TypeCheckConfig {
209
- required: true;
210
- }
211
-
212
174
  export declare interface Validator<T extends EmptyObject = AnyObject> {
213
175
  validate(payload: T): Promisable<Error[]>;
214
176
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AsTypeFactory.ts","../../src/AsObjectFactory.ts","../../src/isType.ts","../../src/isObject.ts","../../src/asObject.ts","../../src/deepMerge.ts","../../src/IsObjectFactory.ts","../../src/JsonObject.ts","../../src/ObjectWrapper.ts","../../src/omitBy.ts","../../src/pickBy.ts","../../src/removeFields.ts","../../src/toJson.ts","../../src/Validator.ts"],"sourcesContent":["import type { AssertExMessageFunc } from '@xylabs/assert'\nimport { assertDefinedEx } from '@xylabs/assert'\nimport type { Logger } from '@xylabs/logger'\nimport type { AnyNonPromise } from '@xylabs/promise'\nimport { isPromise } from '@xylabs/promise'\nimport { isTruthy, type TypedValue } from '@xylabs/typeof'\n\nexport interface TypeCheckConfig {\n log?: boolean | Logger\n}\n\nexport interface TypeCheckRequiredConfig extends TypeCheckConfig {\n required: true\n}\n\nexport interface TypeCheckOptionalConfig extends TypeCheckConfig {\n required: false\n}\n\nexport type StringOrAlertFunction<T extends AnyNonPromise> = string | AssertExMessageFunc<T>\n\nexport type TypeCheck<T extends TypedValue> = (obj: AnyNonPromise, config?: TypeCheckConfig) => obj is T\n\nexport type AsOptionalTypeFunction<T extends AnyNonPromise = AnyNonPromise> = {\n <TType extends T>(value: AnyNonPromise): TType | undefined\n}\n\nexport type AsTypeFunction<T extends AnyNonPromise = AnyNonPromise> = {\n <TType extends T>(value: AnyNonPromise): TType | undefined\n <TType extends T>(value: AnyNonPromise, config: TypeCheckRequiredConfig): TType\n <TType extends T>(value: AnyNonPromise, config: TypeCheckConfig | TypeCheckOptionalConfig): TType | undefined\n <TType extends T>(value: AnyNonPromise, assert: StringOrAlertFunction<TType>): TType | undefined\n <TType extends T>(value: AnyNonPromise, assert: StringOrAlertFunction<TType>, config: TypeCheckRequiredConfig): TType\n <TType extends T>(value: AnyNonPromise, assert: StringOrAlertFunction<TType>, config: TypeCheckConfig | TypeCheckOptionalConfig): TType | undefined\n}\n\nexport const AsTypeFactory = {\n create: <T extends AnyNonPromise>(typeCheck: TypeCheck<T>): AsTypeFunction<T> => {\n const func = (\n value: AnyNonPromise,\n assertOrConfig?: StringOrAlertFunction<T> | TypeCheckConfig,\n config?: TypeCheckConfig,\n ): T | undefined => {\n // when used as a predicate, it seems that the index is passed as the second parameter (filter,map)\n const isPredicate = typeof assertOrConfig === 'number'\n const resolvedAssert = isPredicate\n ? undefined\n : (typeof assertOrConfig === 'object' ? undefined : assertOrConfig) as (StringOrAlertFunction<T> | undefined)\n const resolvedConfig = isPredicate ? undefined : typeof assertOrConfig === 'object' ? assertOrConfig : config\n\n // only return undefined if not required\n const required = isTruthy((resolvedConfig as (TypeCheckRequiredConfig | undefined))?.required)\n if (!required && (value === undefined || value === null)) {\n return undefined\n }\n\n if (isPromise(value)) {\n throw new TypeError('un-awaited promises may not be sent to \"as\" functions')\n }\n\n const result = typeCheck(value, resolvedConfig) ? (value as T) : undefined\n\n if (resolvedAssert !== undefined) {\n return typeof resolvedAssert === 'function' ? assertDefinedEx<T>(result, resolvedAssert) : assertDefinedEx<T>(result, () => resolvedAssert)\n }\n return result\n }\n return func\n },\n createOptional: <T extends AnyNonPromise>(typeCheck: TypeCheck<T>) => {\n const func = (value: AnyNonPromise): T | undefined => {\n if (value === undefined || value === null) return undefined\n if (isPromise(value)) {\n throw new TypeError('un-awaited promises may not be sent to \"as\" functions')\n }\n return typeCheck(value) ? (value as T) : undefined\n }\n return func\n },\n}\n","import type { TypedObject } from '@xylabs/typeof'\n\nimport type { TypeCheck } from './AsTypeFactory.ts'\nimport { AsTypeFactory } from './AsTypeFactory.ts'\n\nexport const AsObjectFactory = {\n create: <T extends TypedObject>(typeCheck: TypeCheck<T>) => {\n return AsTypeFactory.create<T>(typeCheck)\n },\n createOptional: <T extends TypedObject>(typeCheck: TypeCheck<T>) => {\n return AsTypeFactory.createOptional<T>(typeCheck)\n },\n}\n","import type { FieldType } from '@xylabs/typeof'\n\nexport const isType = (value: unknown, expectedType: FieldType) => {\n const typeofValue = typeof value\n switch (expectedType) {\n case 'array': {\n return Array.isArray(value)\n }\n case 'null': {\n return value === null\n }\n case 'undefined': {\n return value === undefined\n }\n case 'object': {\n // nulls resolve to objects, so exclude them\n if (value === null) {\n return false\n }\n // arrays resolve to objects, so exclude them\n return typeofValue === 'object' && !Array.isArray(value)\n }\n default: {\n return typeofValue === expectedType\n }\n }\n}\n","import { isType } from './isType.ts'\n\nexport const isObject = <T>(value: T): value is T & object => {\n return isType(value, 'object')\n}\n","import type { AnyObject } from './AnyObject.ts'\nimport { AsObjectFactory } from './AsObjectFactory.ts'\nimport { isObject } from './isObject.ts'\n\nexport const asAnyObject = (() => AsObjectFactory.create<AnyObject>(<T extends AnyObject>(obj: unknown): obj is T => isObject(obj)))()\n","import type { AnyObject } from './AnyObject.ts'\n\n/**\n * Deeply merges two types into a new type.\n */\ntype DeepMerge<A, B> = {\n [K in keyof A | keyof B]:\n K extends keyof B\n ? K extends keyof A\n ? A[K] extends object\n ? B[K] extends object\n ? DeepMerge<A[K], B[K]>\n : B[K]\n : B[K]\n : B[K]\n : K extends keyof A\n ? A[K]\n : never;\n}\n\n/**\n * Merges multiple types into a new type.\n */\ntype MergeAll<T extends object[], R = {}>\n = T extends [infer First extends object, ...infer Rest extends object[]]\n ? MergeAll<Rest, DeepMerge<R, First>>\n : R\n\n/**\n * Options for merging objects in the deep merge function.\n */\ntype MergeOptions = {\n /**\n * Strategy for merging arrays.\n * - 'overwrite': Overwrites the array with the last object's value.\n * - 'concat': Concatenates arrays from all objects.\n * @default 'overwrite'\n */\n arrayStrategy?: 'overwrite' | 'concat'\n /**\n * Mutate the first object in the list instead of creating a new one.\n * @default false\n */\n mutate?: boolean\n}\n\nconst isUnsafeKey = (key: string | symbol): boolean =>\n key === '__proto__' || key === 'constructor' || key === 'prototype'\n\nfunction merge<T extends AnyObject>(target: AnyObject, source?: AnyObject, options?: MergeOptions): T {\n if (!source || typeof source !== 'object') return target as T\n\n for (const key of Reflect.ownKeys(source)) {\n const value = source[key]\n if (isUnsafeKey(key)) {\n continue\n } else if (Array.isArray(value)) {\n target[key]\n // If the value is an array, handle it based on the configured array strategy\n = options?.arrayStrategy === 'concat' && Array.isArray(target[key])\n ? [...target[key], ...value]\n : value\n } else if (value !== null && typeof value === 'object') {\n // Recursively merge nested objects\n if (!target[key] || typeof target[key] !== 'object') {\n target[key] = {}\n }\n merge(target[key] as AnyObject, value as AnyObject, options)\n } else {\n // Overwrite with non-object values\n target[key] = value\n }\n }\n\n return target as T\n}\n\n/**\n * Creates a deep merge function with the specified options.\n * @param options Options for merging.\n * @returns A deep merge function configured for the specified options.\n */\nexport function createDeepMerge(options: MergeOptions) {\n return function deepMerge<T extends AnyObject[]>(...objects: T): MergeAll<T> {\n const result = (options.mutate ? objects[0] ?? {} : {}) as MergeAll<T>\n for (const obj of objects) {\n merge(result, obj, options)\n }\n return result\n }\n}\n\n/**\n * Deeply merges multiple objects into a new object.\n * @param objects Multiple objects to merge deeply.\n * The function merges properties from all objects into a new object.\n * If a property exists in multiple objects, the last object's value will be used.\n * If a property is an object, it will be merged recursively.\n * If a property is an array, it will be overwritten by the last object's value.\n * If a property is a primitive value, it will be overwritten by the last object's value.\n * If a property is undefined in the source, it will be skipped.\n * If a property is a symbol, it will be merged as well.\n * @returns A new object with the merged properties.\n */\nexport const deepMerge = createDeepMerge({ arrayStrategy: 'overwrite', mutate: false })\n","import {\n isObject, isTruthy,\n type ObjectTypeShape, type TypedObject,\n} from '@xylabs/typeof'\n\nimport type { TypeCheck, TypeCheckConfig } from './AsTypeFactory.ts'\nimport { isType } from './isType.ts'\n\nexport interface ObjectTypeConfig extends TypeCheckConfig {}\n\nexport class IsObjectFactory<T extends TypedObject> {\n create(shape?: ObjectTypeShape, additionalChecks?: TypeCheck<TypedObject>[]): TypeCheck<T> {\n return (obj, { log } = {}): obj is T => {\n if (!isObject(obj)) {\n return false\n }\n return (\n // do primary check\n Object.entries(shape ?? {}).filter(([key, type]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = isType((obj as any)[key], type)\n if (!result && isTruthy(log)) {\n const logger = typeof log === 'object' ? log : console\n logger.warn(`isType Failed: ${key}: ${type}`)\n }\n return !result\n }).length === 0\n // perform additional checks\n && (additionalChecks?.reduce((prev, check) => prev && check(obj, { log }), true) ?? true)\n )\n }\n }\n}\n","import { isObject } from '@xylabs/typeof'\n\nexport type JsonValue = string | number | boolean | null | JsonObject | JsonArray\nexport type JsonObject = { [key: string]: JsonValue }\nexport type JsonArray = JsonValue[]\n\nexport const isJsonValue = (value: unknown): value is JsonValue => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean': {\n return true\n }\n default: {\n return value === null || isJsonObject(value) || isJsonArray(value)\n }\n }\n}\n\nexport const isJsonArray = (value: unknown): value is JsonArray => {\n return Array.isArray(value) && !value.some(item => !isJsonValue(item))\n}\n\nexport const isValidJsonFieldPair = ([key, value]: [key: unknown, value: unknown]) => {\n return typeof key === 'string' && isJsonValue(value)\n}\n\nexport const isJsonObject = (value: unknown): value is JsonObject => {\n return (\n isObject(value)\n // check if all keys are strings\n && !Object.entries(value).some(item => !isValidJsonFieldPair(item))\n )\n}\n","import type { EmptyObject } from './EmptyObject.ts'\nimport type { StringKeyObject } from './StringKeyObject.ts'\n\nexport abstract class ObjectWrapper<T extends EmptyObject = EmptyObject> {\n readonly obj: T\n constructor(obj: T) {\n this.obj = obj\n }\n\n protected get stringKeyObj() {\n return this.obj as StringKeyObject\n }\n}\n","import { assertEx } from '@xylabs/assert'\n\nimport type { EmptyObject } from './EmptyObject.ts'\nimport type { JsonObject } from './JsonObject.ts'\nimport type { DeepOmitStartsWith } from './OmitStartsWith.ts'\n\nexport type OmitByPredicate<T extends EmptyObject = Record<string, unknown>> = (value: T[keyof T], key: keyof T) => boolean\n\nconst omitByArray = <T>(\n obj: T[],\n predicate: OmitByPredicate,\n maxDepth: number,\n): T[] => {\n return obj.map((value) => {\n return (value !== null && typeof value === 'object') ? omitBy(value, predicate, maxDepth) : value\n }) as T[]\n}\n\nconst omitByObject = <T extends EmptyObject>(\n obj: T,\n predicate: OmitByPredicate,\n maxDepth: number,\n): Partial<T> => {\n const result: JsonObject = {}\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key]\n if (!predicate(value, key)) {\n result[key] = ((value !== null && typeof value === 'object') ? omitBy(value, predicate, maxDepth - 1) : value) as JsonObject\n }\n }\n }\n\n return result as T\n}\n\nexport const omitBy = <T extends EmptyObject>(\n obj: T,\n predicate: OmitByPredicate,\n maxDepth = 1,\n): Partial<T> => {\n if (maxDepth <= 0) {\n return obj\n }\n\n return Array.isArray(obj) ? omitByArray(obj, predicate, maxDepth - 1) as T : omitByObject(obj, predicate, maxDepth - 1) as T\n}\n\nconst omitByPrefixPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n}\n\nexport const omitByPrefix = <T extends EmptyObject, P extends string>(payload: T, prefix: P, maxDepth = 100): DeepOmitStartsWith<T, P> => {\n return omitBy(payload, omitByPrefixPredicate(prefix), maxDepth) as unknown as DeepOmitStartsWith<T, P>\n}\n","import { assertEx } from '@xylabs/assert'\n\nimport type { EmptyObject } from './EmptyObject.ts'\nimport type { JsonObject } from './JsonObject.ts'\nimport type { DeepPickStartsWith } from './PickStartsWith.ts'\n\nexport type PickByPredicate<T extends EmptyObject = Record<string, unknown>> = (value: T[keyof T], key: keyof T) => boolean\n\nconst pickByArray = <T>(\n obj: T[],\n predicate: PickByPredicate,\n maxDepth: number,\n): T[] => {\n return obj.map((value) => {\n return (value !== null && typeof value === 'object') ? pickBy(value, predicate, maxDepth) : value\n }) as T[]\n}\n\nconst pickByObject = <T extends EmptyObject>(\n obj: T,\n predicate: PickByPredicate,\n maxDepth: number,\n): Partial<T> => {\n const result: JsonObject = {}\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key]\n if (predicate(value, key)) {\n result[key] = ((value !== null && typeof value === 'object') ? pickBy(value, predicate, maxDepth - 1) : value) as JsonObject\n }\n }\n }\n\n return result as T\n}\n\nexport const pickBy = <T extends EmptyObject>(\n obj: T,\n predicate: PickByPredicate,\n maxDepth = 1,\n): Partial<T> => {\n if (maxDepth <= 0) {\n return obj\n }\n\n return Array.isArray(obj) ? pickByArray(obj, predicate, maxDepth - 1) as T : pickByObject(obj, predicate, maxDepth - 1) as T\n}\n\nconst pickByPrefixPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n}\n\nexport const pickByPrefix = <T extends EmptyObject, P extends string>(payload: T, prefix: P, maxDepth = 100): DeepPickStartsWith<T, P> => {\n return pickBy(payload, pickByPrefixPredicate(prefix), maxDepth) as unknown as DeepPickStartsWith<T, P>\n}\n","import type { EmptyObject } from './EmptyObject.ts'\n\nexport const removeFields = <T extends EmptyObject, K extends keyof T>(obj: T, fields: K[]): Omit<T, K> => {\n const clone = { ...obj }\n for (const field of fields) {\n delete clone[field]\n }\n return clone\n}\n","import type {\n JsonArray, JsonObject, JsonValue,\n} from './JsonObject.ts'\n\nexport const toJsonArray = (value: unknown[], cycleList?: unknown[], maxDepth = 3): JsonArray => {\n return value.map(item => toJsonValue(item, cycleList, maxDepth))\n}\n\nexport const toJsonObject = (value: object, cycleList?: unknown[], maxDepth = 3): JsonObject => {\n const result: JsonObject = {}\n for (const [key, entry] of Object.entries(value)) {\n result[key] = value === undefined ? '[Undefined]' : toJsonValue(entry, cycleList, maxDepth)\n }\n return result\n}\n\nexport const toJsonValue = (value: unknown, cycleList?: unknown[], maxDepth = 3): JsonValue => {\n if (maxDepth <= 0 && typeof value === 'object') {\n return '[MaxDepth]'\n }\n if (cycleList?.includes(value)) {\n return '[Circular]'\n }\n switch (typeof value) {\n case 'string':\n case 'boolean':\n case 'number': {\n return value\n }\n case 'object': {\n if (value === null) {\n return null\n }\n const newCycleList = cycleList ?? []\n newCycleList.push(value)\n return Array.isArray(value) ? toJsonArray(value, newCycleList, maxDepth - 1) : toJsonObject(value, newCycleList, maxDepth - 1)\n }\n default: {\n return `[${typeof value}]`\n }\n }\n}\n\nexport const toJsonString = (value: unknown, maxDepth = 3) => {\n return JSON.stringify(toJson(value, maxDepth), null, 2)\n}\n\nexport const toJson = (value: unknown, maxDepth = 3): JsonValue => {\n return toJsonValue(value, undefined, maxDepth)\n}\n","import type { Promisable } from '@xylabs/promise'\n\nimport type { AnyObject } from './AnyObject.ts'\nimport type { EmptyObject } from './EmptyObject.ts'\nimport { ObjectWrapper } from './ObjectWrapper.ts'\n\nexport interface Validator<T extends EmptyObject = AnyObject> {\n validate(payload: T): Promisable<Error[]>\n}\n\nexport abstract class ValidatorBase<T extends EmptyObject = AnyObject> extends ObjectWrapper<Partial<T>> implements Validator<T> {\n abstract validate(payload: T): Promisable<Error[]>\n}\n"],"mappings":"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","names":["deepMerge","isObject","isTruthy","isObject","isTruthy","isObject","assertEx"]}
1
+ {"version":3,"sources":["../../src/AsTypeFactory.ts","../../src/AsObjectFactory.ts","../../src/isType.ts","../../src/isObject.ts","../../src/asObject.ts","../../src/deepMerge.ts","../../src/IsObjectFactory.ts","../../src/JsonObject.ts","../../src/ObjectWrapper.ts","../../src/omitBy.ts","../../src/pickBy.ts","../../src/removeFields.ts","../../src/toJson.ts","../../src/Validator.ts"],"sourcesContent":["import { assertDefinedEx } from '@xylabs/assert'\nimport type {\n AsTypeFunction,\n StringOrAlertFunction, TypeCheck, TypeCheckConfig,\n TypeCheckRequiredConfig,\n} from '@xylabs/object-model'\nimport type { AnyNonPromise } from '@xylabs/promise'\nimport { isPromise } from '@xylabs/promise'\nimport { isTruthy } from '@xylabs/typeof'\n\nexport const AsTypeFactory = {\n create: <T extends AnyNonPromise>(typeCheck: TypeCheck<T>): AsTypeFunction<T> => {\n const func = (\n value: AnyNonPromise,\n assertOrConfig?: StringOrAlertFunction<T> | TypeCheckConfig,\n config?: TypeCheckConfig,\n ): T | undefined => {\n // when used as a predicate, it seems that the index is passed as the second parameter (filter,map)\n const isPredicate = typeof assertOrConfig === 'number'\n const resolvedAssert = isPredicate\n ? undefined\n : (typeof assertOrConfig === 'object' ? undefined : assertOrConfig) as (StringOrAlertFunction<T> | undefined)\n const resolvedConfig = isPredicate ? undefined : typeof assertOrConfig === 'object' ? assertOrConfig : config\n\n // only return undefined if not required\n const required = isTruthy((resolvedConfig as (TypeCheckRequiredConfig | undefined))?.required)\n if (!required && (value === undefined || value === null)) {\n return undefined\n }\n\n if (isPromise(value)) {\n throw new TypeError('un-awaited promises may not be sent to \"as\" functions')\n }\n\n const result = typeCheck(value, resolvedConfig) ? (value as T) : undefined\n\n if (resolvedAssert !== undefined) {\n return typeof resolvedAssert === 'function' ? assertDefinedEx<T>(result, resolvedAssert) : assertDefinedEx<T>(result, () => resolvedAssert)\n }\n return result\n }\n return func\n },\n createOptional: <T extends AnyNonPromise>(typeCheck: TypeCheck<T>) => {\n const func = (value: AnyNonPromise): T | undefined => {\n if (value === undefined || value === null) return undefined\n if (isPromise(value)) {\n throw new TypeError('un-awaited promises may not be sent to \"as\" functions')\n }\n return typeCheck(value) ? (value as T) : undefined\n }\n return func\n },\n}\n","import type { TypeCheck } from '@xylabs/object-model'\nimport type { TypedObject } from '@xylabs/typeof'\n\nimport { AsTypeFactory } from './AsTypeFactory.ts'\n\nexport const AsObjectFactory = {\n create: <T extends TypedObject>(typeCheck: TypeCheck<T>) => {\n return AsTypeFactory.create<T>(typeCheck)\n },\n createOptional: <T extends TypedObject>(typeCheck: TypeCheck<T>) => {\n return AsTypeFactory.createOptional<T>(typeCheck)\n },\n}\n","import type { FieldType } from '@xylabs/typeof'\n\nexport const isType = (value: unknown, expectedType: FieldType) => {\n const typeofValue = typeof value\n switch (expectedType) {\n case 'array': {\n return Array.isArray(value)\n }\n case 'null': {\n return value === null\n }\n case 'undefined': {\n return value === undefined\n }\n case 'object': {\n // nulls resolve to objects, so exclude them\n if (value === null) {\n return false\n }\n // arrays resolve to objects, so exclude them\n return typeofValue === 'object' && !Array.isArray(value)\n }\n default: {\n return typeofValue === expectedType\n }\n }\n}\n","import { isType } from './isType.ts'\n\nexport const isObject = <T>(value: T): value is T & object => {\n return isType(value, 'object')\n}\n","import type { AnyObject } from '@xylabs/object-model'\n\nimport { AsObjectFactory } from './AsObjectFactory.ts'\nimport { isObject } from './isObject.ts'\n\nexport const asAnyObject = (() => AsObjectFactory.create<AnyObject>(<T extends AnyObject>(obj: unknown): obj is T => isObject(obj)))()\n","import type { AnyObject } from '@xylabs/object-model'\n\n/**\n * Deeply merges two types into a new type.\n */\ntype DeepMerge<A, B> = {\n [K in keyof A | keyof B]:\n K extends keyof B\n ? K extends keyof A\n ? A[K] extends object\n ? B[K] extends object\n ? DeepMerge<A[K], B[K]>\n : B[K]\n : B[K]\n : B[K]\n : K extends keyof A\n ? A[K]\n : never;\n}\n\n/**\n * Merges multiple types into a new type.\n */\ntype MergeAll<T extends object[], R = {}>\n = T extends [infer First extends object, ...infer Rest extends object[]]\n ? MergeAll<Rest, DeepMerge<R, First>>\n : R\n\n/**\n * Options for merging objects in the deep merge function.\n */\ntype MergeOptions = {\n /**\n * Strategy for merging arrays.\n * - 'overwrite': Overwrites the array with the last object's value.\n * - 'concat': Concatenates arrays from all objects.\n * @default 'overwrite'\n */\n arrayStrategy?: 'overwrite' | 'concat'\n /**\n * Mutate the first object in the list instead of creating a new one.\n * @default false\n */\n mutate?: boolean\n}\n\nconst isUnsafeKey = (key: string | symbol): boolean =>\n key === '__proto__' || key === 'constructor' || key === 'prototype'\n\nfunction merge<T extends AnyObject>(target: AnyObject, source?: AnyObject, options?: MergeOptions): T {\n if (!source || typeof source !== 'object') return target as T\n\n for (const key of Reflect.ownKeys(source)) {\n const value = source[key]\n if (isUnsafeKey(key)) {\n continue\n } else if (Array.isArray(value)) {\n target[key]\n // If the value is an array, handle it based on the configured array strategy\n = options?.arrayStrategy === 'concat' && Array.isArray(target[key])\n ? [...target[key], ...value]\n : value\n } else if (value !== null && typeof value === 'object') {\n // Recursively merge nested objects\n if (!target[key] || typeof target[key] !== 'object') {\n target[key] = {}\n }\n merge(target[key] as AnyObject, value as AnyObject, options)\n } else {\n // Overwrite with non-object values\n target[key] = value\n }\n }\n\n return target as T\n}\n\n/**\n * Creates a deep merge function with the specified options.\n * @param options Options for merging.\n * @returns A deep merge function configured for the specified options.\n */\nexport function createDeepMerge(options: MergeOptions) {\n return function deepMerge<T extends AnyObject[]>(...objects: T): MergeAll<T> {\n const result = (options.mutate ? objects[0] ?? {} : {}) as MergeAll<T>\n for (const obj of objects) {\n merge(result, obj, options)\n }\n return result\n }\n}\n\n/**\n * Deeply merges multiple objects into a new object.\n * @param objects Multiple objects to merge deeply.\n * The function merges properties from all objects into a new object.\n * If a property exists in multiple objects, the last object's value will be used.\n * If a property is an object, it will be merged recursively.\n * If a property is an array, it will be overwritten by the last object's value.\n * If a property is a primitive value, it will be overwritten by the last object's value.\n * If a property is undefined in the source, it will be skipped.\n * If a property is a symbol, it will be merged as well.\n * @returns A new object with the merged properties.\n */\nexport const deepMerge = createDeepMerge({ arrayStrategy: 'overwrite', mutate: false })\n","import type { TypeCheck, TypeCheckConfig } from '@xylabs/object-model'\nimport {\n isObject, isTruthy,\n type ObjectTypeShape, type TypedObject,\n} from '@xylabs/typeof'\n\nimport { isType } from './isType.ts'\n\nexport interface ObjectTypeConfig extends TypeCheckConfig {}\n\nexport class IsObjectFactory<T extends TypedObject> {\n create(shape?: ObjectTypeShape, additionalChecks?: TypeCheck<TypedObject>[]): TypeCheck<T> {\n return (obj, { log } = {}): obj is T => {\n if (!isObject(obj)) {\n return false\n }\n return (\n // do primary check\n Object.entries(shape ?? {}).filter(([key, type]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = isType((obj as any)[key], type)\n if (!result && isTruthy(log)) {\n const logger = typeof log === 'object' ? log : console\n logger.warn(`isType Failed: ${key}: ${type}`)\n }\n return !result\n }).length === 0\n // perform additional checks\n && (additionalChecks?.reduce((prev, check) => prev && check(obj, { log }), true) ?? true)\n )\n }\n }\n}\n","import { isObject } from '@xylabs/typeof'\n\nexport type JsonValue = string | number | boolean | null | JsonObject | JsonArray\nexport type JsonObject = { [key: string]: JsonValue }\nexport type JsonArray = JsonValue[]\n\nexport const isJsonValue = (value: unknown): value is JsonValue => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean': {\n return true\n }\n default: {\n return value === null || isJsonObject(value) || isJsonArray(value)\n }\n }\n}\n\nexport const isJsonArray = (value: unknown): value is JsonArray => {\n return Array.isArray(value) && !value.some(item => !isJsonValue(item))\n}\n\nexport const isValidJsonFieldPair = ([key, value]: [key: unknown, value: unknown]) => {\n return typeof key === 'string' && isJsonValue(value)\n}\n\nexport const isJsonObject = (value: unknown): value is JsonObject => {\n return (\n isObject(value)\n // check if all keys are strings\n && !Object.entries(value).some(item => !isValidJsonFieldPair(item))\n )\n}\n","import type { EmptyObject } from './EmptyObject.ts'\nimport type { StringKeyObject } from './StringKeyObject.ts'\n\nexport abstract class ObjectWrapper<T extends EmptyObject = EmptyObject> {\n readonly obj: T\n constructor(obj: T) {\n this.obj = obj\n }\n\n protected get stringKeyObj() {\n return this.obj as StringKeyObject\n }\n}\n","import { assertEx } from '@xylabs/assert'\n\nimport type { EmptyObject } from './EmptyObject.ts'\nimport type { JsonObject } from './JsonObject.ts'\nimport type { DeepOmitStartsWith } from './OmitStartsWith.ts'\n\nexport type OmitByPredicate<T extends EmptyObject = Record<string, unknown>> = (value: T[keyof T], key: keyof T) => boolean\n\nconst omitByArray = <T>(\n obj: T[],\n predicate: OmitByPredicate,\n maxDepth: number,\n): T[] => {\n return obj.map((value) => {\n return (value !== null && typeof value === 'object') ? omitBy(value, predicate, maxDepth) : value\n }) as T[]\n}\n\nconst omitByObject = <T extends EmptyObject>(\n obj: T,\n predicate: OmitByPredicate,\n maxDepth: number,\n): Partial<T> => {\n const result: JsonObject = {}\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key]\n if (!predicate(value, key)) {\n result[key] = ((value !== null && typeof value === 'object') ? omitBy(value, predicate, maxDepth - 1) : value) as JsonObject\n }\n }\n }\n\n return result as T\n}\n\nexport const omitBy = <T extends EmptyObject>(\n obj: T,\n predicate: OmitByPredicate,\n maxDepth = 1,\n): Partial<T> => {\n if (maxDepth <= 0) {\n return obj\n }\n\n return Array.isArray(obj) ? omitByArray(obj, predicate, maxDepth - 1) as T : omitByObject(obj, predicate, maxDepth - 1) as T\n}\n\nconst omitByPrefixPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n}\n\nexport const omitByPrefix = <T extends EmptyObject, P extends string>(payload: T, prefix: P, maxDepth = 100): DeepOmitStartsWith<T, P> => {\n return omitBy(payload, omitByPrefixPredicate(prefix), maxDepth) as unknown as DeepOmitStartsWith<T, P>\n}\n","import { assertEx } from '@xylabs/assert'\n\nimport type { EmptyObject } from './EmptyObject.ts'\nimport type { JsonObject } from './JsonObject.ts'\nimport type { DeepPickStartsWith } from './PickStartsWith.ts'\n\nexport type PickByPredicate<T extends EmptyObject = Record<string, unknown>> = (value: T[keyof T], key: keyof T) => boolean\n\nconst pickByArray = <T>(\n obj: T[],\n predicate: PickByPredicate,\n maxDepth: number,\n): T[] => {\n return obj.map((value) => {\n return (value !== null && typeof value === 'object') ? pickBy(value, predicate, maxDepth) : value\n }) as T[]\n}\n\nconst pickByObject = <T extends EmptyObject>(\n obj: T,\n predicate: PickByPredicate,\n maxDepth: number,\n): Partial<T> => {\n const result: JsonObject = {}\n\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n const value = obj[key]\n if (predicate(value, key)) {\n result[key] = ((value !== null && typeof value === 'object') ? pickBy(value, predicate, maxDepth - 1) : value) as JsonObject\n }\n }\n }\n\n return result as T\n}\n\nexport const pickBy = <T extends EmptyObject>(\n obj: T,\n predicate: PickByPredicate,\n maxDepth = 1,\n): Partial<T> => {\n if (maxDepth <= 0) {\n return obj\n }\n\n return Array.isArray(obj) ? pickByArray(obj, predicate, maxDepth - 1) as T : pickByObject(obj, predicate, maxDepth - 1) as T\n}\n\nconst pickByPrefixPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n}\n\nexport const pickByPrefix = <T extends EmptyObject, P extends string>(payload: T, prefix: P, maxDepth = 100): DeepPickStartsWith<T, P> => {\n return pickBy(payload, pickByPrefixPredicate(prefix), maxDepth) as unknown as DeepPickStartsWith<T, P>\n}\n","import type { EmptyObject } from './EmptyObject.ts'\n\nexport const removeFields = <T extends EmptyObject, K extends keyof T>(obj: T, fields: K[]): Omit<T, K> => {\n const clone = { ...obj }\n for (const field of fields) {\n delete clone[field]\n }\n return clone\n}\n","import type {\n JsonArray, JsonObject, JsonValue,\n} from './JsonObject.ts'\n\nexport const toJsonArray = (value: unknown[], cycleList?: unknown[], maxDepth = 3): JsonArray => {\n return value.map(item => toJsonValue(item, cycleList, maxDepth))\n}\n\nexport const toJsonObject = (value: object, cycleList?: unknown[], maxDepth = 3): JsonObject => {\n const result: JsonObject = {}\n for (const [key, entry] of Object.entries(value)) {\n result[key] = value === undefined ? '[Undefined]' : toJsonValue(entry, cycleList, maxDepth)\n }\n return result\n}\n\nexport const toJsonValue = (value: unknown, cycleList?: unknown[], maxDepth = 3): JsonValue => {\n if (maxDepth <= 0 && typeof value === 'object') {\n return '[MaxDepth]'\n }\n if (cycleList?.includes(value)) {\n return '[Circular]'\n }\n switch (typeof value) {\n case 'string':\n case 'boolean':\n case 'number': {\n return value\n }\n case 'object': {\n if (value === null) {\n return null\n }\n const newCycleList = cycleList ?? []\n newCycleList.push(value)\n return Array.isArray(value) ? toJsonArray(value, newCycleList, maxDepth - 1) : toJsonObject(value, newCycleList, maxDepth - 1)\n }\n default: {\n return `[${typeof value}]`\n }\n }\n}\n\nexport const toJsonString = (value: unknown, maxDepth = 3) => {\n return JSON.stringify(toJson(value, maxDepth), null, 2)\n}\n\nexport const toJson = (value: unknown, maxDepth = 3): JsonValue => {\n return toJsonValue(value, undefined, maxDepth)\n}\n","import type { AnyObject } from '@xylabs/object-model'\nimport type { Promisable } from '@xylabs/promise'\n\nimport type { EmptyObject } from './EmptyObject.ts'\nimport { ObjectWrapper } from './ObjectWrapper.ts'\n\nexport interface Validator<T extends EmptyObject = AnyObject> {\n validate(payload: T): Promisable<Error[]>\n}\n\nexport abstract class ValidatorBase<T extends EmptyObject = AnyObject> extends ObjectWrapper<Partial<T>> implements Validator<T> {\n abstract validate(payload: T): Promisable<Error[]>\n}\n"],"mappings":"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","names":["deepMerge","isObject","isTruthy","isObject","isTruthy","isObject","assertEx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xylabs/object",
3
- "version": "4.13.0",
3
+ "version": "4.13.1",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -29,10 +29,10 @@
29
29
  "module": "dist/neutral/index.mjs",
30
30
  "types": "dist/neutral/index.d.ts",
31
31
  "dependencies": {
32
- "@xylabs/assert": "^4.13.0",
33
- "@xylabs/logger": "^4.13.0",
34
- "@xylabs/promise": "^4.13.0",
35
- "@xylabs/typeof": "^4.13.0"
32
+ "@xylabs/assert": "^4.13.1",
33
+ "@xylabs/object-model": "^4.13.1",
34
+ "@xylabs/promise": "^4.13.1",
35
+ "@xylabs/typeof": "^4.13.1"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@xylabs/ts-scripts-yarn3": "^7.0.0-rc.7",
@@ -1,6 +1,6 @@
1
+ import type { TypeCheck } from '@xylabs/object-model'
1
2
  import type { TypedObject } from '@xylabs/typeof'
2
3
 
3
- import type { TypeCheck } from './AsTypeFactory.ts'
4
4
  import { AsTypeFactory } from './AsTypeFactory.ts'
5
5
 
6
6
  export const AsObjectFactory = {
@@ -1,38 +1,12 @@
1
- import type { AssertExMessageFunc } from '@xylabs/assert'
2
1
  import { assertDefinedEx } from '@xylabs/assert'
3
- import type { Logger } from '@xylabs/logger'
2
+ import type {
3
+ AsTypeFunction,
4
+ StringOrAlertFunction, TypeCheck, TypeCheckConfig,
5
+ TypeCheckRequiredConfig,
6
+ } from '@xylabs/object-model'
4
7
  import type { AnyNonPromise } from '@xylabs/promise'
5
8
  import { isPromise } from '@xylabs/promise'
6
- import { isTruthy, type TypedValue } from '@xylabs/typeof'
7
-
8
- export interface TypeCheckConfig {
9
- log?: boolean | Logger
10
- }
11
-
12
- export interface TypeCheckRequiredConfig extends TypeCheckConfig {
13
- required: true
14
- }
15
-
16
- export interface TypeCheckOptionalConfig extends TypeCheckConfig {
17
- required: false
18
- }
19
-
20
- export type StringOrAlertFunction<T extends AnyNonPromise> = string | AssertExMessageFunc<T>
21
-
22
- export type TypeCheck<T extends TypedValue> = (obj: AnyNonPromise, config?: TypeCheckConfig) => obj is T
23
-
24
- export type AsOptionalTypeFunction<T extends AnyNonPromise = AnyNonPromise> = {
25
- <TType extends T>(value: AnyNonPromise): TType | undefined
26
- }
27
-
28
- export type AsTypeFunction<T extends AnyNonPromise = AnyNonPromise> = {
29
- <TType extends T>(value: AnyNonPromise): TType | undefined
30
- <TType extends T>(value: AnyNonPromise, config: TypeCheckRequiredConfig): TType
31
- <TType extends T>(value: AnyNonPromise, config: TypeCheckConfig | TypeCheckOptionalConfig): TType | undefined
32
- <TType extends T>(value: AnyNonPromise, assert: StringOrAlertFunction<TType>): TType | undefined
33
- <TType extends T>(value: AnyNonPromise, assert: StringOrAlertFunction<TType>, config: TypeCheckRequiredConfig): TType
34
- <TType extends T>(value: AnyNonPromise, assert: StringOrAlertFunction<TType>, config: TypeCheckConfig | TypeCheckOptionalConfig): TType | undefined
35
- }
9
+ import { isTruthy } from '@xylabs/typeof'
36
10
 
37
11
  export const AsTypeFactory = {
38
12
  create: <T extends AnyNonPromise>(typeCheck: TypeCheck<T>): AsTypeFunction<T> => {
@@ -1,9 +1,9 @@
1
+ import type { TypeCheck, TypeCheckConfig } from '@xylabs/object-model'
1
2
  import {
2
3
  isObject, isTruthy,
3
4
  type ObjectTypeShape, type TypedObject,
4
5
  } from '@xylabs/typeof'
5
6
 
6
- import type { TypeCheck, TypeCheckConfig } from './AsTypeFactory.ts'
7
7
  import { isType } from './isType.ts'
8
8
 
9
9
  export interface ObjectTypeConfig extends TypeCheckConfig {}
package/src/Validator.ts CHANGED
@@ -1,6 +1,6 @@
1
+ import type { AnyObject } from '@xylabs/object-model'
1
2
  import type { Promisable } from '@xylabs/promise'
2
3
 
3
- import type { AnyObject } from './AnyObject.ts'
4
4
  import type { EmptyObject } from './EmptyObject.ts'
5
5
  import { ObjectWrapper } from './ObjectWrapper.ts'
6
6
 
package/src/asObject.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { AnyObject } from './AnyObject.ts'
1
+ import type { AnyObject } from '@xylabs/object-model'
2
+
2
3
  import { AsObjectFactory } from './AsObjectFactory.ts'
3
4
  import { isObject } from './isObject.ts'
4
5
 
package/src/deepMerge.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { AnyObject } from './AnyObject.ts'
1
+ import type { AnyObject } from '@xylabs/object-model'
2
2
 
3
3
  /**
4
4
  * Deeply merges two types into a new type.
package/src/index.ts CHANGED
@@ -1,8 +1,6 @@
1
- export * from './AnyObject.ts'
2
1
  export * from './asObject.ts'
3
2
  export * from './AsObjectFactory.ts'
4
3
  export * from './AsTypeFactory.ts'
5
- export * from './Compare.ts'
6
4
  export * from './deepMerge.ts'
7
5
  export * from './EmptyObject.ts'
8
6
  export * from './isObject.ts'
package/src/AnyObject.ts DELETED
@@ -1,7 +0,0 @@
1
- import type { TypedKey } from '@xylabs/typeof'
2
-
3
- /**
4
- * Any object, which means that it does not enforce the set of fields that it has. Extending from AnyObject
5
- * will result in a type that includes the universal set of field names
6
- */
7
- export type AnyObject = Record<TypedKey, unknown>
package/src/Compare.ts DELETED
@@ -1,2 +0,0 @@
1
- // Returns a negative number if a < b, zero if a == b, and a positive number if a > b
2
- export type Compare<T> = (a: T, b: T) => number