From 44c913a05a00ca479f0184b37fb1f48c098239e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Sun, 28 Jan 2024 18:00:39 +0100 Subject: [PATCH] Project setup --- .drone.jsonnet | 110 +++++++++++++++++++++++++++++++++ .gitignore | 1 - LICENSE | 2 +- bun.lockb | Bin 0 -> 155617 bytes package.json | 44 ++++++++++++++ rollup.config.ts | 34 +++++++++++ src/expresses.ts | 84 ++++++++++++++++++++++++++ src/index.ts | 2 + src/tests.ts | 131 ++++++++++++++++++++++++++++++++++++++++ src/trait.ts | 117 +++++++++++++++++++++++++++++++++++ src/util/class.ts | 66 ++++++++++++++++++++ src/util/index.ts | 3 + src/util/inheritance.ts | 40 ++++++++++++ src/util/trait.ts | 16 +++++ tsconfig.json | 24 ++++++++ 15 files changed, 672 insertions(+), 2 deletions(-) create mode 100644 .drone.jsonnet create mode 100755 bun.lockb create mode 100644 package.json create mode 100644 rollup.config.ts create mode 100644 src/expresses.ts create mode 100644 src/index.ts create mode 100644 src/tests.ts create mode 100644 src/trait.ts create mode 100644 src/util/class.ts create mode 100644 src/util/index.ts create mode 100644 src/util/inheritance.ts create mode 100644 src/util/trait.ts create mode 100644 tsconfig.json diff --git a/.drone.jsonnet b/.drone.jsonnet new file mode 100644 index 0000000..fefec26 --- /dev/null +++ b/.drone.jsonnet @@ -0,0 +1,110 @@ +local bun_image = "oven/bun:1"; +local node_image = "node:20"; + + +local install_step = { + name: "install", + image: bun_image, + commands: ["bun install --frozen-lockfile"], +}; + +local lint_step = { + name: "lint", + image: bun_image, + commands: ["bun lint:tsc"], +}; + +local build_step = { + name: "build", + image: bun_image, + commands: ["bun run build"], +}; + +local pack_step = { + name: "pack", + image: node_image, + commands: ["npm pack --dry-run"], +}; + +local publish_step = { + name: "publish", + image: node_image, + + environment: { + NPM_TOKEN: { from_secret: "npm_token" } + }, + + commands: [ + "npm set @thilawyn:registry https://git.jvalver.de/api/packages/thilawyn/npm/", + "npm config set -- //git.jvalver.de/api/packages/thilawyn/npm/:_authToken $NPM_TOKEN", + "npm publish", + ], +}; + + +[ + // Lint the whole project when not in master, not in a PR nor on a tag + { + kind: "pipeline", + type: "docker", + name: "lint", + + trigger: { + ref: { + exclude: [ + "refs/heads/master", + "refs/pull/**", + "refs/tags/**", + ] + } + }, + + steps: [ + install_step, + lint_step, + ], + }, + + // Build the package without publishing for pull requests + { + kind: "pipeline", + type: "docker", + name: "build", + + trigger: { + ref: { + include: ["refs/pull/**"] + } + }, + + steps: [ + install_step, + lint_step, + build_step, + pack_step, + ], + }, + + // Build and publish the package for master and tags + { + kind: "pipeline", + type: "docker", + name: "build-publish", + + trigger: { + ref: { + include: [ + "refs/heads/master", + "refs/tags/**", + ] + } + }, + + steps: [ + install_step, + lint_step, + build_step, + publish_step, + ], + }, +] diff --git a/.gitignore b/.gitignore index ceaea36..745264f 100644 --- a/.gitignore +++ b/.gitignore @@ -129,4 +129,3 @@ dist .yarn/build-state.yml .yarn/install-state.gz .pnp.* - diff --git a/LICENSE b/LICENSE index fe6b51e..46959f5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Thilawyn +Copyright (c) 2023 Thilawyn Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..ebdb9ccf3f92f0376007c22f3ccf9964879d9ea1 GIT binary patch literal 155617 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 d_#I)`JLNls&Rr1flD@(30 !/^[./]/.test(id), + + plugins: [ + nodeResolve(), + ts(), + + cleanup({ + comments: "jsdoc", + extensions: ["ts"], + }), + ], +}) diff --git a/src/expresses.ts b/src/expresses.ts new file mode 100644 index 0000000..5784e56 --- /dev/null +++ b/src/expresses.ts @@ -0,0 +1,84 @@ +import { AbstractClass, Opaque } from "type-fest" +import { Trait, TraitApplierSuperTag } from "." +import { ClassesInstances, ClassesStaticMembers, MergeInheritanceTree, MergeInheritanceTreeWithoutOverriding, StaticMembers, TraitsClasses } from "./util" + + +/** + * 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 Opaque, + ) as unknown as ( + AbstractClass< + MergeInheritanceTreeWithoutOverriding<[ + InstanceType, + ...ClassesInstances< + TraitsClasses + >, + ]>, + + ConstructorParameters + > & + + MergeInheritanceTree<[ + StaticMembers, + ...ClassesStaticMembers< + TraitsClasses + >, + ]> + ) +} + +/** + * 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/index.ts b/src/index.ts new file mode 100644 index 0000000..ae86066 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,2 @@ +export * from "./expresses" +export * from "./trait" diff --git a/src/tests.ts b/src/tests.ts new file mode 100644 index 0000000..cff84f8 --- /dev/null +++ b/src/tests.ts @@ -0,0 +1,131 @@ +import { AbstractClass } from "type-fest" +import { expresses, extendsAndExpresses, trait } from "." +import { ClassesInstances, MergeInheritanceTree } from "./util" + + +const Identifiable = () => + trait(Super => { + abstract class Identifiable extends Super { + 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(Super => { + abstract class ImplementsIdentifiable extends extendsAndExpresses( + Super, + Identifiable(), + ) { + id: ID = defaultID + + constructor(...args: any[]) { + super(...args) + console.log("ImplementsIdentifiable constructor") + } + } + + return ImplementsIdentifiable + }) + + +const Permissible = trait(Super => { + abstract class Permissible extends Super { + 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)) + + +const Test1 = trait(Super => { + abstract class Test1 extends Super { + declare static name: string + declare static testValue: ( + { _tag: "type1", value: string } | + { _tag: "type2", value: number } + ) + + abstract name: string + + declare createdAt: Date + declare readonly status: ( + { _tag: "awaitingPayment" } | + { _tag: "active", activeSince: Date, expiresAt?: Date } | + { _tag: "expired", expiredSince: Date } + ) + } + + return Test1 +}) + +const Test2 = trait(Super => { + abstract class Test2 extends Super { + declare readonly status: { _tag: "active", activeSince: Date, expiresAt?: Date } + } + + return Test2 +}) + +const Test3 = trait(Super => { + abstract class Test3 extends Super { + declare static testValue: { _tag: "type2", value: number } + declare lol: 10n + } + + return Test3 +}) + +const TestObjectProto = expresses(Test1, Test2, Test3) +TestObjectProto.testValue + + +interface Gneugneu { + ahi: string + get adolf(): string +} + +class GneugneuImpl implements Gneugneu { + ahi: string = "" + get adolf(): string { + throw new Error("Method not implemented.") + } + +} + +abstract class Issou extends GneugneuImpl implements Gneugneu { +} diff --git a/src/trait.ts b/src/trait.ts new file mode 100644 index 0000000..21fd00c --- /dev/null +++ b/src/trait.ts @@ -0,0 +1,117 @@ +import { AbstractClass, AbstractConstructor, Opaque } from "type-fest" + + +/** + * Represents a trait that can be applied to a class. + * @template C - The abstract class type. + */ +export type Trait< + C extends AbstractClass +> = Opaque< + TraitApplier, + "@thilawyn/thilatrait/Trait" +> + +export type TraitApplierSuperTag = "@thilawyn/thilatrait/Super" + +/** + * Represents the function signature for applying a trait to a parent class. + * @template C - The abstract class type. + */ +export type TraitApplier< + C extends AbstractClass +> = ( + (Super: Opaque, TraitApplierSuperTag>) => Opaque +) + +/** + * 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(Super => { + * abstract class Permissible extends Super { + * 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(Super => { + * abstract class Identifiable extends Super { + * 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(Super => { + * abstract class ImplementsIdentifiable extends extendsAndExpresses( + * Super, + * Identifiable(), + * ) { + * id: ID = defaultID + * + * // Optional + * constructor(...args: any[]) { + * super(...args) + * } + * } + * + * return ImplementsIdentifiable + * }) + * ``` + */ +export function trait< + C extends AbstractClass +>( + applier: TraitApplier +) { + return applier as Trait +} + +/** + * Returns the class type of a trait. + * @template T - The trait type. + */ +export type TraitClass = ( + T extends Trait + ? C + : never +) + +/** + * Returns the instance type of a trait. + * @template T - The trait type. + */ +export type TraitInstance = ( + T extends Trait + ? InstanceType + : never +) diff --git a/src/util/class.ts b/src/util/class.ts new file mode 100644 index 0000000..325aba5 --- /dev/null +++ b/src/util/class.ts @@ -0,0 +1,66 @@ +import { AbstractClass } from "type-fest" + + +/** + * Represents an array of instances corresponding to the provided classes. + * @template Classes - An array of classes extending AbstractClass. + */ +export type ClassesInstances[]> = ( + Classes extends [infer Class, ...infer Rest] + ? Class extends AbstractClass + ? Rest extends AbstractClass[] + ? [InstanceType, ...ClassesInstances] + : never + : never + : [] +) + +/** + * Represents an intersection of instances of the provided classes. + * @template Classes - An array of classes extending AbstractClass. + */ +export type ClassesInstancesIntersection[]> = ( + Classes extends [infer Class, ...infer Rest] + ? Class extends AbstractClass + ? Rest extends AbstractClass[] + ? InstanceType & ClassesInstancesIntersection + : never + : never + : {} +) + +/** + * Represents the static members of a class. + * @template Class - A class extending AbstractClass. + */ +export type StaticMembers> = ( + Omit +) + +/** + * Represents an array of static members corresponding to the provided classes. + * @template Classes - An array of classes extending AbstractClass. + */ +export type ClassesStaticMembers[]> = ( + Classes extends [infer Class, ...infer Rest] + ? Class extends AbstractClass + ? Rest extends AbstractClass[] + ? [StaticMembers, ...ClassesStaticMembers] + : never + : never + : [] +) + +/** + * Represents an intersection of static members of the provided classes. + * @template Classes - An array of classes extending AbstractClass. + */ +export type ClassesStaticMembersIntersection[]> = ( + Classes extends [infer Class, ...infer Rest] + ? Class extends AbstractClass + ? Rest extends AbstractClass[] + ? StaticMembers & ClassesStaticMembersIntersection + : never + : never + : {} +) diff --git a/src/util/index.ts b/src/util/index.ts new file mode 100644 index 0000000..c5faea6 --- /dev/null +++ b/src/util/index.ts @@ -0,0 +1,3 @@ +export * from "./class" +export * from "./inheritance" +export * from "./trait" diff --git a/src/util/inheritance.ts b/src/util/inheritance.ts new file mode 100644 index 0000000..a179d78 --- /dev/null +++ b/src/util/inheritance.ts @@ -0,0 +1,40 @@ +/** + * Represents the common keys between two types. + * @template A - The first type. + * @template B - The second type. + */ +export type CommonKeys = Extract + +/** + * Merges an inheritance tree defined by an array of types, considering overrides. + * @template T - An array of types representing the inheritance tree. + */ +export type MergeInheritanceTree = ( + T extends [infer Super, infer Self, ...infer Rest] + ? Pick> extends Pick> + ? MergeInheritanceTree<[ + Omit> & Self, + ...Rest, + ]> + : never + : T extends [infer Self] + ? Self + : void +) + +/** + * Merges an inheritance tree defined by an array of types without allowing overrides. + * @template T - An array of types representing the inheritance tree. + */ +export type MergeInheritanceTreeWithoutOverriding = ( + T extends [infer Super, infer Self, ...infer Rest] + ? Pick> extends Pick> + ? MergeInheritanceTreeWithoutOverriding<[ + Super & Self, + ...Rest, + ]> + : never + : T extends [infer Self] + ? Self + : void +) diff --git a/src/util/trait.ts b/src/util/trait.ts new file mode 100644 index 0000000..149599d --- /dev/null +++ b/src/util/trait.ts @@ -0,0 +1,16 @@ +import { Trait, TraitClass } from ".." + + +/** + * Represents an array of classes corresponding to the provided traits. + * @template Traits - An array of traits extending Trait. + */ +export type TraitsClasses[]> = ( + Traits extends [infer T, ...infer Rest] + ? T extends Trait + ? Rest extends Trait[] + ? [TraitClass, ...TraitsClasses] + : never + : never + : [] +) diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..5470793 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "lib": ["ESNext"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + // "allowImportingTsExtensions": true, + // "noEmit": true, + "declaration": true, + "composite": true, + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "types": [ + "bun-types" + ] + }, + "include": ["src"] +}