diff --git a/bun.lockb b/bun.lockb index 7e6b681..cae4041 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 946a334..2e38b31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thilawyn/traitify-ts", - "version": "0.1.19", + "version": "0.1.20", "type": "module", "publishConfig": { "registry": "https://git.jvalver.de/api/packages/thilawyn/npm/" @@ -29,16 +29,19 @@ "clean:node": "rm -rf node_modules" }, "dependencies": { - "lodash-es": "^4.17.21", - "type-fest": "^4.14.0" + "remeda": "^1.61.0", + "type-fest": "^4.18.0" }, "devDependencies": { - "@types/lodash-es": "^4.17.12", "bun-types": "latest", - "npm-check-updates": "^16.14.17", + "npm-check-updates": "^16.14.20", "npm-sort": "^0.0.4", "tsup": "^8.0.2", - "tsx": "^4.7.1", - "typescript": "^5.4.3" + "tsx": "^4.7.3", + "typescript": "^5.4.5" + }, + "optionalDependencies": { + "@effect/schema": "^0.66.12", + "effect": "^3.1.0" } } diff --git a/src/TraitExpression.ts b/src/TraitExpression.ts index 44367d0..b7a8f80 100644 --- a/src/TraitExpression.ts +++ b/src/TraitExpression.ts @@ -13,14 +13,13 @@ export class TraitExpression< readonly traits: Traits, ) {} + get extends(): ( AbstractClass< InstanceType & // Keep the instance of the superclass outside of any kind of type manipulation // as it can accidentely remove abstract properties Simplify< - Extend< - TraitTuple.MapImplInstance - > + Extend> >, ConstructorParameters @@ -39,16 +38,20 @@ export class TraitExpression< ) as any } - staticImplements(target: StaticImplements, context: any) {} + + staticImplements(_target: StaticImplements, _context: any) {} + + get staticImplementsStage2() { + return (_target: StaticImplements) => {} + } + subtrait< This extends TraitExpression >( this: This ) { - return new TraitBuilder< - This, - + return new TraitBuilder> >, @@ -77,7 +80,7 @@ export namespace TraitExpression { const nullSuperclassSymbol = Symbol() export class NullSuperclass { static readonly [nullSuperclassSymbol]: true - constructor(...args: any[]) {} + constructor(..._args: any[]) {} } export type Superclass = ( diff --git a/src/TraitExpressionBuilder.ts b/src/TraitExpressionBuilder.ts index 60335c9..c563268 100644 --- a/src/TraitExpressionBuilder.ts +++ b/src/TraitExpressionBuilder.ts @@ -1,4 +1,4 @@ -import { uniq } from "lodash-es" +import { unique } from "remeda" import { AbstractClass, IsEqual } from "type-fest" import { Trait, TraitTuple } from "./Trait" import { TraitExpression } from "./TraitExpression" @@ -36,7 +36,7 @@ export class TraitExpressionBuilder< ]) as readonly Trait[] as TraitExpressionBuilder.SpreadSupertraits } - static traitsUniq< + static traitsUnique< const T extends readonly Trait< TraitExpression< typeof TraitExpression.NullSuperclass, @@ -49,7 +49,7 @@ export class TraitExpressionBuilder< >( traits: T ) { - return uniq(traits) as readonly Trait[] as TraitExpressionBuilder.TraitsUniq + return unique(traits) as readonly Trait[] as TraitExpressionBuilder.TraitsUnique } @@ -83,7 +83,7 @@ export class TraitExpressionBuilder< return new this.constructor( this.expressionSuperclass, - this.constructor.traitsUniq([ + this.constructor.traitsUnique([ ...this.expressionTraits, ...this.constructor.spreadSupertraits(traits), ]), @@ -109,7 +109,7 @@ export class TraitExpressionBuilder< return new this.constructor( this.expressionSuperclass, - this.constructor.traitsUniq([ + this.constructor.traitsUnique([ ...this.constructor.spreadSupertraits(traits), ...this.expressionTraits, ]), @@ -154,14 +154,14 @@ export namespace TraitExpressionBuilder { : readonly [] ) - export type TraitsUniq = ( + export type TraitsUnique = ( Traits extends readonly [ ...infer Rest, infer El extends Trait, ] ? IsTraitInTupleFromRight extends true - ? TraitsUniq - : readonly [...TraitsUniq, El] + ? TraitsUnique + : readonly [...TraitsUnique, El] : readonly [] ) type IsTraitInTupleFromRight = ( @@ -176,7 +176,7 @@ export namespace TraitExpressionBuilder { Traits extends readonly Trait[], T extends readonly Trait[], > = ( - TraitExpressionBuilder.TraitsUniq, ]> @@ -186,7 +186,7 @@ export namespace TraitExpressionBuilder { Traits extends readonly Trait[], T extends readonly Trait[], > = ( - TraitExpressionBuilder.TraitsUniq, ...Traits, ]> diff --git a/src/effect.ts b/src/effect.ts new file mode 100644 index 0000000..53736ea --- /dev/null +++ b/src/effect.ts @@ -0,0 +1,39 @@ +import { Schema as S } from "@effect/schema" +import { Simplify } from "type-fest" +import { Trait, TraitTuple } from "./Trait" +import { TraitExpression } from "./TraitExpression" +import { Extend } from "./util" + + +export function extendsEffectSchemaExpression< + Fields extends S.Struct.Fields, + A, I, R, C, + Inherited extends object, + Proto, + + const Traits extends readonly Trait[], +>( + expression: TraitExpression< + S.Class, + Traits + > +) { + return (): ( + S.Class< + Self, + Fields, + A, I, R, C, + Simplify< + Extend<[ + Inherited, + ...TraitTuple.MapImplInstance + ]> + >, + Proto + > & + + Simplify< + Extend> + > + ) => expression.extends as any +} diff --git a/src/lib.ts b/src/lib.ts index a96aa6a..32077ec 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -2,3 +2,4 @@ export { Trait, TraitClass, TraitConcreteClass, TraitInstance, TraitStaticMember export { ImplStatic, TraitBuilder, implStaticInstantiableThis, implStaticThis, trait } from "./TraitBuilder" export { Implements, StaticImplements, TraitExpression, TraitExpressionClass, TraitExpressionConcreteClass, TraitExpressionInstance, TraitExpressionStaticMembers } from "./TraitExpression" export { TraitExpressionBuilder, expression } from "./TraitExpressionBuilder" +export { extendsEffectSchemaExpression } from "./effect" diff --git a/tsup.config.ts b/tsup.config.ts index 2f051ef..3f59156 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from "tsup" export default defineConfig({ - entry: ["src/lib.ts"], + entry: ["./src/lib.ts"], format: ["esm", "cjs"], dts: true, splitting: false,