From 60daa8ec3aabb135394255dc32bb56e4c59a28d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sat, 30 Dec 2023 01:59:45 +0100 Subject: [PATCH] Util file --- bun.lockb | Bin 0 -> 150218 bytes package.json | 6 +- src/index.ts | 195 --------------------------------------- src/legacy/tests.ts | 74 --------------- src/legacy/trait.ts | 126 ------------------------- src/legacy/util/class.ts | 109 ---------------------- src/tests.ts | 70 -------------- src/util.ts | 73 +++++++++++++++ 8 files changed, 78 insertions(+), 575 deletions(-) create mode 100755 bun.lockb delete mode 100644 src/legacy/tests.ts delete mode 100644 src/legacy/trait.ts delete mode 100644 src/legacy/util/class.ts delete mode 100644 src/tests.ts create mode 100644 src/util.ts diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..692b0f6e2e5e15465484758c10d9eb64860dd447 GIT binary patch literal 150218 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 z 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 SK@xTWM=(+BbFKe{|NI|?ozG+d literal 0 HcmV?d00001 diff --git a/package.json b/package.json index e2d658f..4f0ff3b 100644 --- a/package.json +++ b/package.json @@ -28,9 +28,13 @@ "clean:node": "rm -rf node_modules" }, "dependencies": { - "type-fest": "^4.9.0" + "effect": "^2.0.0-next.62", + "lodash-es": "^4.17.21", + "type-fest": "^4.9.0", + "zod": "^3.22.4" }, "devDependencies": { + "@types/lodash-es": "^4.17.12", "bun-types": "latest", "npm-check-updates": "^16.14.12", "npm-sort": "^0.0.4", diff --git a/src/index.ts b/src/index.ts index 8351eca..e69de29 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,195 +0,0 @@ -import { AbstractClass, AbstractConstructor, Opaque, UnionToIntersection } from "type-fest" - - -/** - * Represents the static members of a class. - * @template C - The class type. - */ -export type StaticMembers = { - [Key in keyof C as Key extends "prototype" ? never : Key]: C[Key] -} - - -/** - * Represents a trait that can be applied to a class. - * @template C - The abstract class type. - */ -export type Trait< - C extends AbstractClass -> = Opaque< - TraitApplier, - "thilatrait/Trait" -> - -/** - * Represents the function signature for applying a trait to a parent class. - * @template C - The abstract class type. - */ -export type TraitApplier< - C extends AbstractClass -> = - (Parent: AbstractConstructor) => C - -/** - * Unwraps the type of the class from a given trait. - * @template T - The trait type. - */ -export type UnwrapTraitC = - T extends Trait - ? C - : never - - -/** - * Creates a trait using the provided trait applier function. - * @template C - The abstract class type. - * @param applier - The trait applier function. - * @returns A trait. - * @example - * Creates a trait: - * ```ts - * const Permissible = trait(Parent => { - * abstract class Permissible extends Parent { - * static readonly defaultPermissions: string[] = [] - * permissions: string[] = [] - * - * // Constructor is optional - * // If you wish to use it, make sure it takes any[] as an args array and passes it to the super call. This is necessary for inheritance to work properly. - * // Trait constructors cannot have typed arguments of their own, they only serve to run logic during object instantiation. - * constructor(...args: any[]) { - * super(...args) - * } - * } - * - * return Permissible - * }) - * ``` - * Creates a generic trait: - * ```ts - * const Identifiable = () => - * trait(Parent => { - * abstract class Identifiable extends Parent { - * abstract readonly id: ID - * - * equals(el: Identifiable) { - * return this.id === el.id - * } - * - * // Optional - * constructor(...args: any[]) { - * super(...args) - * } - * } - * - * return Identifiable - * }) - * ``` - * Creates a subtrait: - * ```ts - * const ImplementsIdentifiable = (defaultID: ID) => - * trait(Parent => { - * abstract class ImplementsIdentifiable extends extendsAndExpresses( - * Parent, - * [Identifiable()], - * ) { - * id: ID = defaultID - * - * // Optional - * constructor(...args: any[]) { - * super(...args) - * } - * } - * - * return ImplementsIdentifiable - * }) - * ``` - */ -export function trait< - C extends AbstractClass ->( - applier: TraitApplier -) { - return applier as Trait -} - - -/** - * Extends a class with the given traits and expresses their combined functionality. - * @template C - The abstract class type. - * @template Traits - An array of traits. - * @param extend - The class to extend. - * @param traits - An array of traits to apply. - * @returns A new class type expressing the combined functionality of the base class and traits. - * @example - * Extends a superclass and applies traits: - * ```ts - * class User extends extendsAndExpresses(Entity, [Identifiable(), Permissible]) { - * readonly id: bigint - * - * constructor(id: bigint) { - * super() - * this.id = id - * } - * } - * ``` - */ -export function extendsAndExpresses< - C extends AbstractClass, - Traits extends readonly Trait[], ->( - extend: C, - traits: Traits, -) { - return traits.reduce( - (previous, trait) => trait(previous), - extend, - ) as ( - AbstractClass< - InstanceType & - UnionToIntersection< - InstanceType< - UnwrapTraitC< - Traits[number] - > - > - >, - - ConstructorParameters - > & - - StaticMembers & - StaticMembers< - UnionToIntersection< - UnwrapTraitC< - Traits[number] - > - > - > - ) -} - -/** - * Expresses the combined functionality of multiple traits. - * @template Traits - An array of trait. - * @param traits - An array of trait to apply. - * @returns A new class type expressing the combined functionality of the traits. - * @example - * Applies traits to a class: - * ```ts - * class User extends expresses(Identifiable(), Permissible) { - * readonly id: bigint - * - * constructor(id: bigint) { - * super() - * this.id = id - * } - * } - * ``` - */ -export function expresses< - Traits extends readonly Trait[], ->( - ...traits: Traits -) { - return extendsAndExpresses(Object, traits) -} diff --git a/src/legacy/tests.ts b/src/legacy/tests.ts deleted file mode 100644 index e86528d..0000000 --- a/src/legacy/tests.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { AbstractClass } from "type-fest" -import { expresses } from "./trait" - - -function inspectClass(class_: AbstractClass) { - Object.getOwnPropertyNames(class_).forEach(name => { - console.log( - "[static]", - name, - Object.getOwnPropertyDescriptor(class_, name) - ) - }) - - Object.getOwnPropertyNames(class_.prototype).forEach(name => { - console.log( - "[prototype]", - name, - Object.getOwnPropertyDescriptor(class_.prototype, name) - ) - }) -} - - -abstract class Identified { - abstract id: ID - - equals(el: Identified) { - return this.id === el.id - } - - // initializer() { - // console.log("Identified initializer") - // } -} - -class ImplementsIdentifiable extends Identified { - id!: ID -} - - -abstract class Permissible { - static readonly defaultPermissions: string[] = [] - permissions: string[] = [] - // permissions!: string[] - - constructor() { - console.log("Permissible constructor") - } - - initializer() { - console.log("Permissible initializer") - this.permissions = [] - } -} - - -class User extends expresses( - Identified as typeof Identified, - // Identified, - Permissible, -) { - readonly id: bigint - - constructor(id: bigint) { - super() - this.id = id - } -} - -const user1 = new User(BigInt(1)) -const user2 = new User(BigInt(2)) - -console.log(user1) -console.log(user1.equals(user2)) diff --git a/src/legacy/trait.ts b/src/legacy/trait.ts deleted file mode 100644 index 10cc87b..0000000 --- a/src/legacy/trait.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { AbstractClass, Class, UnionToIntersection } from "type-fest" -import { StaticMembers, copyProperties, getInheritanceHierarchy } from "./util/class" - - -/** - * Represents a trait that can be used to define common behavior - * for classes and abstract classes. - * @typeParam T - The type of the trait. - */ -export type Trait = - AbstractClass - - -/** - * Creates a link class that expresses the given traits. - * @param traits - An array of traits to be expressed by the link class. - * @returns A dynamically created class that expresses the given traits. - * @typeParam Traits - An array of traits that the link class expresses. - */ -export function expresses< - Traits extends readonly Trait[] ->( - ...traits: Traits -) { - return makeLinkClass(traits) -} - - -/** - * Creates a link class that extends a base class and expresses the given traits. - * @param extend - The base class or abstract class to extend. - * @param traits - An array of traits to be expressed by the link class. - * @returns A dynamically created class that extends the given base class and expresses the given traits. - * @typeParam C - The type of the base class to extend. - * @typeParam Traits - An array of traits that the link class expresses. - */ -export function extendsAndExpresses< - C extends Class - | AbstractClass, - Traits extends readonly Trait[], ->( - extend: C, - ...traits: Traits -) { - return makeLinkClass(traits, extend) -} - - -/** - * Creates a link class that expresses the given traits and optionally extends a base class. - * @param traits - An array of traits to be expressed by the link class. - * @param extend - The base class or abstract class to extend (optional). - * @returns A dynamically created class that expresses the given traits and extends the base class. - * @typeParam Traits - An array of traits that the link class expresses. - * @typeParam C - The type of the base class to extend (optional). - */ -export function makeLinkClass< - Traits extends readonly Trait[], - C extends Class - | AbstractClass - | undefined = undefined, ->( - traits: Traits, - extend?: C, -) { - const class_ = extend - ? class extends extend { - constructor(...args: any[]) { - super(...args) - - traits.forEach(trait => { - trait.prototype.initializer?.call(this) - }) - } - } - : class { - constructor() { - traits.forEach(trait => { - trait.prototype.initializer?.call(this) - }) - } - } - - traits.forEach(trait => { - getInheritanceHierarchy(trait).forEach(current => { - copyProperties( - current, - class_, - ["name", "length"], - ["constructor"], - ) - }) - }) - - return class_ as unknown as ( - (C extends Class | AbstractClass - ? ( - AbstractClass< - InstanceType & - UnionToIntersection< - InstanceType< - Traits[number] - > - >, - - ConstructorParameters - > & - - StaticMembers - ) - : Trait< - UnionToIntersection< - InstanceType< - Traits[number] - > - > - > - ) & - - StaticMembers< - UnionToIntersection< - Traits[number] - > - > - ) -} diff --git a/src/legacy/util/class.ts b/src/legacy/util/class.ts deleted file mode 100644 index 518c960..0000000 --- a/src/legacy/util/class.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { AbstractClass } from "type-fest" - - -/** - * Represents the static members of a class. - * - * @template C - The type of the class for which static members are extracted. - * @typeparam The static members of the class. - */ -export type StaticMembers = Pick - - -/** - * Flattens the inheritance hierarchy of a given class by copying all properties - * from its superclass chain into a single object. - * - * @template C - The type of the class to be flattened, extending AbstractClass. - * @param C - The class to be flattened. - * @returns A new class with properties flattened from the entire inheritance hierarchy. - */ -export function flattenClass< - C extends AbstractClass ->(class_: C) { - const flattenedClass = class {} as unknown as C - - getInheritanceHierarchy(class_).forEach(current => { - copyProperties(current, flattenedClass) - }) - - copyProperty(class_, flattenedClass, "name") - copyProperty(class_.prototype, flattenedClass.prototype, "constructor") - - return flattenedClass -} - - -/** - * Retrieves the inheritance hierarchy of a given class, including itself. - * - * @param class_ - The class for which the inheritance hierarchy is retrieved. - * @returns An array representing the inheritance hierarchy, ordered from the furthest in the hierarchy to `class_` itself. - */ -export function getInheritanceHierarchy( - class_: AbstractClass -): AbstractClass[] { - const parent = Object.getPrototypeOf(class_) - - return isClass(parent) - ? [...getInheritanceHierarchy(parent), class_] - : [class_] -} - - -/** - * Checks if a given element appears to be a class based on its string representation. - * - * @param el - The element to check for being a class. - * @returns `true` if the element is likely a class; otherwise, `false`. - */ -export function isClass(el: { toString: () => string }) { - return Boolean(el.toString().match(/^class(?: [.\S]+)?(?: extends [.\S]+)? {[\s\S]*}$/)) -} - - -/** - * Copies properties from one class to another, including static and prototype properties. - * - * @param from - The source class to copy properties from. - * @param to - The destination class to copy properties to. - */ -export function copyProperties( - from: AbstractClass, - to: AbstractClass, - ignoreKeys: string[] = [], - ignorePrototypeKeys: string[] = [], -) { - Object.getOwnPropertyNames(from).forEach(name => { - if (name === "prototype" - || ignoreKeys.find(v => v === name) - ) - return - - // console.log(from, to, name, Object.getOwnPropertyDescriptor(from, name)) - - copyProperty(from, to, name) - }) - - Object.getOwnPropertyNames(from.prototype).forEach(name => { - if (ignorePrototypeKeys.find(v => v === name)) - return - - // console.log(from, to, name, Object.getOwnPropertyDescriptor(from, name)) - - copyProperty(from.prototype, to.prototype, name) - }) -} - - -export function copyProperty( - from: unknown, - to: unknown, - name: string, -) { - Object.defineProperty( - to, - name, - Object.getOwnPropertyDescriptor(from, name) || Object.create(null), - ) -} diff --git a/src/tests.ts b/src/tests.ts deleted file mode 100644 index bb49d1f..0000000 --- a/src/tests.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { expresses, extendsAndExpresses, trait } from "." - - -const Identifiable = () => - trait(Parent => { - abstract class Identifiable extends Parent { - abstract readonly id: ID - - equals(el: Identifiable) { - return this.id === el.id - } - - constructor(...args: any[]) { - super(...args) - console.log("Identified constructor") - } - } - - return Identifiable - }) - -const ImplementsIdentifiable = (defaultID: ID) => - trait(Parent => { - abstract class ImplementsIdentifiable extends extendsAndExpresses( - Parent, - [Identifiable()], - ) { - id: ID = defaultID - - constructor(...args: any[]) { - super(...args) - console.log("ImplementsIdentifiable constructor") - } - } - - return ImplementsIdentifiable - }) - - -const Permissible = trait(Parent => { - abstract class Permissible extends Parent { - static readonly defaultPermissions: string[] = [] - permissions: string[] = [] - - constructor(...args: any[]) { - super(...args) - console.log("Permissible constructor") - } - } - - return Permissible -}) - - -const UserProto = expresses( - // Identifiable(), - ImplementsIdentifiable(0n), - Permissible, -) - -class User extends UserProto { - constructor(id: bigint) { - super() - this.id = id - } -} - -const user1 = new User(1n) -console.log(user1) -console.log(user1.equals(user1)) diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 0000000..7ab75c7 --- /dev/null +++ b/src/util.ts @@ -0,0 +1,73 @@ +import { Effect, pipe } from "effect" +import { mapValues } from "lodash-es" +import { z } from "zod" + + +/** + * Removes default values from a ZodObject schema and returns a new schema. + * + * @param schema - The ZodObject schema to process. + * @returns A new ZodObject schema with default values removed. + */ +export const zodObjectRemoveDefaults = < + T extends z.ZodRawShape, + UnknownKeys extends z.UnknownKeysParam, + Catchall extends z.ZodTypeAny, + Output extends {}, + Input extends {}, +>( + schema: z.ZodObject< + T, + UnknownKeys, + Catchall, + Output, + Input + > +) => + schema.extend(zodShapeRemoveDefaults(schema.shape)) + +/** + * Removes default values from a ZodObject shape and returns a new shape. + * + * @param shape - The ZodObject shape to process. + * @returns A new shape with default values removed. + */ +export const zodShapeRemoveDefaults = < + Shape extends z.ZodRawShape +>( + shape: Shape +): { + [K in keyof Shape]: + Shape[K] extends z.ZodDefault + ? T + : Shape[K] +} => + mapValues(shape, el => + el instanceof z.ZodDefault + ? el.removeDefault() + : el + ) + + +/** + * Parses a value using a ZodType schema wrapped in an Effect monad. + * + * @param schema - The ZodType schema to use for parsing. + * @param args - The arguments to pass to the `safeParseAsync` method of the schema. + * @returns An Effect monad representing the parsing result. + */ +export const parseZodTypeEffect = < + Output, + Input, +>( + schema: z.ZodType, + ...args: Parameters +) => pipe( + Effect.promise(() => schema.safeParseAsync(...args)), + + Effect.flatMap(response => + response.success + ? Effect.succeed(response.data) + : Effect.fail(response.error) + ), +)