diff --git a/.gitea/workflows/publish.yaml b/.gitea/workflows/publish.yaml index a666946..6b885ef 100644 --- a/.gitea/workflows/publish.yaml +++ b/.gitea/workflows/publish.yaml @@ -23,6 +23,6 @@ jobs: run: npm run build - name: Publish run: | - npm config set @thilawyn:registry https://git.jvalver.de/api/packages/thilawyn/npm/ + npm config set @thilawyn:registry https://git.valverde.cloud/api/packages/thilawyn/npm/ npm config set -- //git.jvalver.de/api/packages/thilawyn/npm/:_authToken "${{ vars.NODE_AUTH_TOKEN }}" npm publish diff --git a/bun.lockb b/bun.lockb index 520463a..dc82173 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 65f6d22..50c1715 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thilawyn/thilalib", - "version": "0.1.5", + "version": "0.1.6", "type": "module", "files": [ "./dist" @@ -17,24 +17,34 @@ "default": "./dist/index.cjs" } }, - "./effect/schema": { + "./Types": { "import": { - "types": "./dist/effect/schema/index.d.ts", - "default": "./dist/effect/schema/index.js" + "types": "./dist/Types/index.d.ts", + "default": "./dist/Types/index.js" }, "require": { - "types": "./dist/effect/schema/index.d.cts", - "default": "./dist/effect/schema/index.cjs" + "types": "./dist/Types/index.d.cts", + "default": "./dist/Types/index.cjs" } }, - "./effect/schema/class": { + "./Schema": { "import": { - "types": "./dist/effect/schema/class/index.d.ts", - "default": "./dist/effect/schema/class/index.js" + "types": "./dist/Schema/index.d.ts", + "default": "./dist/Schema/index.js" }, "require": { - "types": "./dist/effect/schema/class/index.d.cts", - "default": "./dist/effect/schema/class/index.cjs" + "types": "./dist/Schema/index.d.cts", + "default": "./dist/Schema/index.cjs" + } + }, + "./Schema/MobX": { + "import": { + "types": "./dist/Schema/MobX/index.d.ts", + "default": "./dist/Schema/MobX/index.js" + }, + "require": { + "types": "./dist/Schema/MobX/index.d.cts", + "default": "./dist/Schema/MobX/index.cjs" } } }, @@ -46,16 +56,16 @@ "clean:node": "rm -rf node_modules" }, "dependencies": { - "remeda": "^2.2.2", - "type-fest": "^4.21.0" + "remeda": "^2.6.0", + "type-fest": "^4.23.0" }, "devDependencies": { - "bun-types": "^1.1.17", + "bun-types": "^1.1.21", "npm-check-updates": "^16.14.20", "npm-sort": "^0.0.4", - "tsup": "^8.1.0", - "tsx": "^4.16.0", - "typescript": "^5.5.3" + "tsup": "^8.2.3", + "tsx": "^4.16.2", + "typescript": "^5.5.4" }, "optionalDependencies": { "@effect/schema": "*", diff --git a/src/Schema/Class.ts b/src/Schema/Class.ts new file mode 100644 index 0000000..eb3eb78 --- /dev/null +++ b/src/Schema/Class.ts @@ -0,0 +1,17 @@ +import { Schema } from "@effect/schema" +import type { HasFields } from "./util" + + +export const Class = Schema.Class as (identifier: string) => + ( + fieldsOr: Fields | HasFields, + annotations?: Schema.Annotations.Schema, + ) => Schema.Class< + Self, + Fields, + Schema.Struct.Encoded, + Schema.Struct.Context, + Schema.Struct.Constructor, + {}, + {} + > diff --git a/src/Schema/Jsonifiable.ts b/src/Schema/Jsonifiable.ts new file mode 100644 index 0000000..3a006cd --- /dev/null +++ b/src/Schema/Jsonifiable.ts @@ -0,0 +1,13 @@ +import { Schema } from "@effect/schema" +import type { Jsonifiable as TJsonifiable } from "type-fest" + + +export const Jsonifiable = < + JsonifiableA, + JsonifiableI extends TJsonifiable, + JsonifiableR, +>( + jsonifiable: Schema.Schema +) => + (schema: Schema.Schema) => + jsonifiable.pipe(Schema.compose(schema)) diff --git a/src/Schema/Kind.ts b/src/Schema/Kind.ts new file mode 100644 index 0000000..5f4b88b --- /dev/null +++ b/src/Schema/Kind.ts @@ -0,0 +1,8 @@ +import { Schema } from "@effect/schema" + + +export const Kind = (kind: Kind) => + Schema.withConstructorDefault( + Schema.propertySignature(Schema.Literal(kind)), + () => kind, + ) diff --git a/src/Schema/MobX/ObservableClass.ts b/src/Schema/MobX/ObservableClass.ts new file mode 100644 index 0000000..3be882a --- /dev/null +++ b/src/Schema/MobX/ObservableClass.ts @@ -0,0 +1,26 @@ +import { Schema } from "@effect/schema" +import { makeObservable, observable, type CreateObservableOptions } from "mobx" +import { mapValues } from "remeda" + + +interface ObservableClassSelf { + new(...args: any[]): Schema.Struct.Type + readonly fields: { readonly [K in keyof Schema.Struct.Fields]: Schema.Struct.Fields[K] } +} + +export const ObservableClass = ( + self: Self, + options?: Omit, +) => + class Observable extends self { + declare ["constructor"]: typeof Observable + + constructor(...args: any[]) { + super(...args) + + makeObservable(this, + mapValues(this.constructor.fields, () => observable), + options, + ) + } + } as Self diff --git a/src/Schema/MobX/index.ts b/src/Schema/MobX/index.ts new file mode 100644 index 0000000..ceef0ba --- /dev/null +++ b/src/Schema/MobX/index.ts @@ -0,0 +1 @@ +export * from "./ObservableClass" diff --git a/src/Schema/MutableClass.ts b/src/Schema/MutableClass.ts new file mode 100644 index 0000000..72715ee --- /dev/null +++ b/src/Schema/MutableClass.ts @@ -0,0 +1,54 @@ +import { Schema } from "@effect/schema" +import type { Mutable } from "effect/Types" +import type { StaticType } from "../Types" +import type { HasFields } from "./util" + + +export interface IMutableClass< + Self, + Fields extends Schema.Struct.Fields, + I, R, C, + Inherited, + Proto, +> +extends Omit< + StaticType>, + "extend" +> +{ + new( + ...args: ConstructorParameters> + ): Omit< + InstanceType>, + keyof Fields + > & + Mutable> + + extend(identifier: string): ( + fields: newFields | HasFields, + annotations?: Schema.Annotations.Schema, + ) => IMutableClass< + Extended, + Fields & newFields, + I & Schema.Struct.Encoded, + R | Schema.Struct.Context, + C & Schema.Struct.Constructor, + Self, + Proto + > +} + + +export const MutableClass = Schema.Class as (identifier: string) => + ( + fieldsOr: Fields | HasFields, + annotations?: Schema.Annotations.Schema, + ) => IMutableClass< + Self, + Fields, + Schema.Struct.Encoded, + Schema.Struct.Context, + Schema.Struct.Constructor, + {}, + {} + > diff --git a/src/Schema/MutableTaggedClass.ts b/src/Schema/MutableTaggedClass.ts new file mode 100644 index 0000000..16fc4f7 --- /dev/null +++ b/src/Schema/MutableTaggedClass.ts @@ -0,0 +1,37 @@ +import { Schema } from "@effect/schema" +import type { IMutableClass } from "./MutableClass" +import type { HasFields } from "./util" + + +export interface IMutableTaggedClass< + Self, + Tag, + Fields extends Schema.Struct.Fields, +> +extends IMutableClass< + Self, + Fields, + Schema.Struct.Encoded, + Schema.Struct.Context, + Schema.Struct.Constructor>, + {}, + {} +> +{ + readonly _tag: Tag +} + + +export const MutableTaggedClass = Schema.TaggedClass as (identifier?: string) => + < + Tag extends string, + Fields extends Schema.Struct.Fields, + >( + tag: Tag, + fieldsOr: Fields | HasFields, + annotations?: Schema.Annotations.Schema, + ) => IMutableTaggedClass< + Self, + Tag, + { readonly _tag: Schema.PropertySignature<":", Tag, never, ":", Tag, true, never> } & Fields + > diff --git a/src/Schema/Tag.ts b/src/Schema/Tag.ts new file mode 100644 index 0000000..2181b7a --- /dev/null +++ b/src/Schema/Tag.ts @@ -0,0 +1,8 @@ +import { Schema } from "@effect/schema" + + +export const Tag = (tag: Tag) => + Schema.withConstructorDefault( + Schema.propertySignature(Schema.Literal(tag)), + () => tag, + ) diff --git a/src/Schema/TaggedClass.ts b/src/Schema/TaggedClass.ts new file mode 100644 index 0000000..29f38da --- /dev/null +++ b/src/Schema/TaggedClass.ts @@ -0,0 +1,17 @@ +import { Schema } from "@effect/schema" +import type { HasFields } from "./util" + + +export const TaggedClass = Schema.TaggedClass as (identifier?: string) => + < + Tag extends string, + Fields extends Schema.Struct.Fields, + >( + tag: Tag, + fieldsOr: Fields | HasFields, + annotations?: Schema.Annotations.Schema, + ) => Schema.TaggedClass< + Self, + Tag, + { readonly _tag: Schema.PropertySignature<":", Tag, never, ":", Tag, true, never> } & Fields + > diff --git a/src/Schema/index.ts b/src/Schema/index.ts new file mode 100644 index 0000000..e3fa60a --- /dev/null +++ b/src/Schema/index.ts @@ -0,0 +1,8 @@ +export * from "./Class" +export * from "./Jsonifiable" +export * from "./Kind" +export * as MobX from "./MobX" +export * from "./MutableClass" +export * from "./MutableTaggedClass" +export * from "./Tag" +export * from "./TaggedClass" diff --git a/src/Schema/util.ts b/src/Schema/util.ts new file mode 100644 index 0000000..bace57e --- /dev/null +++ b/src/Schema/util.ts @@ -0,0 +1,6 @@ +import { Schema } from "@effect/schema" + + +export type HasFields = + | { readonly fields: Fields } + | { readonly from: HasFields } diff --git a/src/StaticType.ts b/src/Types/StaticType.ts similarity index 100% rename from src/StaticType.ts rename to src/Types/StaticType.ts diff --git a/src/Types/index.ts b/src/Types/index.ts new file mode 100644 index 0000000..fc3cf1c --- /dev/null +++ b/src/Types/index.ts @@ -0,0 +1 @@ +export * from "./StaticType" diff --git a/src/effect/schema/Jsonifiable.ts b/src/effect/schema/Jsonifiable.ts deleted file mode 100644 index e426a20..0000000 --- a/src/effect/schema/Jsonifiable.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Schema as S } from "@effect/schema" -import type * as TF from "type-fest" - - -// export function Jsonifiable< -// A, I, R, -// JsonifiableA extends I, JsonifiableI extends TF.Jsonifiable, JsonifiableR, -// >( -// schema: S.Schema, -// jsonifiable: S.Schema, -// ) { -// return jsonifiable.pipe(S.compose(schema)) -// } - -// export function Jsonifiable( -// schema: S.Schema -// ) { -// return < -// JsonifiableA extends I, -// JsonifiableI extends TF.Jsonifiable, -// JsonifiableR, -// >( -// jsonifiable: S.Schema -// ) => -// jsonifiable.pipe(S.compose(schema)) -// } - -export function Jsonifiable< - JsonifiableA, - JsonifiableI extends TF.Jsonifiable, - JsonifiableR, ->( - jsonifiable: S.Schema -) { - return ( - schema: S.Schema - ) => - jsonifiable.pipe(S.compose(schema)) -} diff --git a/src/effect/schema/Kind.ts b/src/effect/schema/Kind.ts deleted file mode 100644 index 3f6748a..0000000 --- a/src/effect/schema/Kind.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Schema as S } from "@effect/schema" - - -export function Kind(kind: Kind) { - return S.withConstructorDefault( - S.propertySignature(S.Literal(kind)), - () => kind, - ) -} diff --git a/src/effect/schema/Tag.ts b/src/effect/schema/Tag.ts deleted file mode 100644 index 9570122..0000000 --- a/src/effect/schema/Tag.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Schema as S } from "@effect/schema" - - -export function Tag(tag: Tag) { - return S.withConstructorDefault( - S.propertySignature(S.Literal(tag)), - () => tag, - ) -} diff --git a/src/effect/schema/class/Class.ts b/src/effect/schema/class/Class.ts deleted file mode 100644 index e93331e..0000000 --- a/src/effect/schema/class/Class.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Schema as S } from "@effect/schema" -import type { HasFields } from "./util" - - -export const Class = S.Class as (identifier: string) => - ( - fieldsOr: Fields | HasFields, - annotations?: S.Annotations.Schema, - ) => S.Class< - Self, - Fields, - S.Struct.Encoded, - S.Struct.Context, - S.Struct.Constructor, - {}, - {} - > diff --git a/src/effect/schema/class/MobXObservable.ts b/src/effect/schema/class/MobXObservable.ts deleted file mode 100644 index f967df0..0000000 --- a/src/effect/schema/class/MobXObservable.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Schema as S } from "@effect/schema" -import { makeObservable, observable, type CreateObservableOptions } from "mobx" -import { mapValues } from "remeda" - - -interface MobXObservableA { - new(...args: any[]): S.Struct.Type - readonly fields: { readonly [K in keyof S.Struct.Fields]: S.Struct.Fields[K] } -} - -export function MobXObservable( - self: A, - options?: Omit, -) { - return class MobXObservable extends self { - declare ["constructor"]: typeof MobXObservable - - constructor(...args: any[]) { - super(...args) - - makeObservable(this, - mapValues(this.constructor.fields, () => observable), - options, - ) - } - } as A -} diff --git a/src/effect/schema/class/MutableClass.ts b/src/effect/schema/class/MutableClass.ts deleted file mode 100644 index beccf6f..0000000 --- a/src/effect/schema/class/MutableClass.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Schema as S } from "@effect/schema" -import type { Mutable } from "effect/Types" -import type { StaticType } from "../../../StaticType" -import type { HasFields } from "./util" - - -export interface IMutableClass< - Self, - Fields extends S.Struct.Fields, - I, R, C, - Inherited, - Proto, -> -extends Omit< - StaticType>, - "extend" -> -{ - new( - ...args: ConstructorParameters> - ): Omit< - InstanceType>, - keyof Fields - > & - Mutable> - - extend(identifier: string): ( - fields: newFields | HasFields, - annotations?: S.Annotations.Schema, - ) => IMutableClass< - Extended, - Fields & newFields, - I & S.Struct.Encoded, - R | S.Struct.Context, - C & S.Struct.Constructor, - Self, - Proto - > -} - - -export const MutableClass = S.Class as (identifier: string) => - ( - fieldsOr: Fields | HasFields, - annotations?: S.Annotations.Schema, - ) => IMutableClass< - Self, - Fields, - S.Struct.Encoded, - S.Struct.Context, - S.Struct.Constructor, - {}, - {} - > diff --git a/src/effect/schema/class/MutableTaggedClass.ts b/src/effect/schema/class/MutableTaggedClass.ts deleted file mode 100644 index abc2f1c..0000000 --- a/src/effect/schema/class/MutableTaggedClass.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Schema as S } from "@effect/schema" -import type { IMutableClass } from "./MutableClass" -import type { HasFields } from "./util" - - -export interface IMutableTaggedClass< - Self, - Tag, - Fields extends S.Struct.Fields, -> -extends IMutableClass< - Self, - Fields, - S.Struct.Encoded, - S.Struct.Context, - S.Struct.Constructor>, - {}, - {} -> -{ - readonly _tag: Tag -} - - -export const MutableTaggedClass = S.TaggedClass as (identifier?: string) => - < - Tag extends string, - Fields extends S.Struct.Fields, - >( - tag: Tag, - fieldsOr: Fields | HasFields, - annotations?: S.Annotations.Schema, - ) => IMutableTaggedClass< - Self, - Tag, - { readonly _tag: S.PropertySignature<":", Tag, never, ":", Tag, true, never> } & Fields - > diff --git a/src/effect/schema/class/TaggedClass.ts b/src/effect/schema/class/TaggedClass.ts deleted file mode 100644 index 9e08eb2..0000000 --- a/src/effect/schema/class/TaggedClass.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Schema as S } from "@effect/schema" -import type { HasFields } from "./util" - - -export const TaggedClass = S.TaggedClass as (identifier?: string) => - < - Tag extends string, - Fields extends S.Struct.Fields, - >( - tag: Tag, - fieldsOr: Fields | HasFields, - annotations?: S.Annotations.Schema, - ) => S.TaggedClass< - Self, - Tag, - { readonly _tag: S.PropertySignature<":", Tag, never, ":", Tag, true, never> } & Fields - > diff --git a/src/effect/schema/class/index.ts b/src/effect/schema/class/index.ts deleted file mode 100644 index 3bc9960..0000000 --- a/src/effect/schema/class/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { Class } from "./Class" -export { MobXObservable } from "./MobXObservable" -export { MutableClass } from "./MutableClass" -export type { IMutableClass } from "./MutableClass" -export { MutableTaggedClass } from "./MutableTaggedClass" -export type { IMutableTaggedClass } from "./MutableTaggedClass" -export { TaggedClass } from "./TaggedClass" diff --git a/src/effect/schema/class/util.ts b/src/effect/schema/class/util.ts deleted file mode 100644 index 8b089cf..0000000 --- a/src/effect/schema/class/util.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Schema as S } from "@effect/schema" - - -export type HasFields = ( - | { readonly fields: Fields } - | { readonly from: HasFields } -) diff --git a/src/effect/schema/index.ts b/src/effect/schema/index.ts deleted file mode 100644 index e4b52a0..0000000 --- a/src/effect/schema/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { Jsonifiable } from "./Jsonifiable" -export { Kind } from "./Kind" -export { Tag } from "./Tag" diff --git a/src/index.ts b/src/index.ts index 70ad017..05f2af0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,2 @@ -export type { StaticType } from "./StaticType" +export * as Schema from "./Schema" +export * as Types from "./Types" diff --git a/src/effect/schema/tests.ts b/src/tests.ts similarity index 86% rename from src/effect/schema/tests.ts rename to src/tests.ts index 0e9f692..b61ccba 100644 --- a/src/effect/schema/tests.ts +++ b/src/tests.ts @@ -1,14 +1,14 @@ import { Schema as S } from "@effect/schema" import { reaction, runInAction } from "mobx" -import { Jsonifiable } from "./Jsonifiable" -import { MobXObservable, MutableTaggedClass } from "./class" +import { Jsonifiable, MutableTaggedClass } from "./Schema" +import { ObservableClass } from "./Schema/MobX" class User extends MutableTaggedClass()("User", { id: S.BigIntFromSelf, role: S.Union(S.Literal("BasicUser"), S.Literal("Admin")), }).pipe( - MobXObservable + ObservableClass ) {} const JsonifiableUser = User.pipe( diff --git a/tsup.config.ts b/tsup.config.ts index 5f0ff92..e8f8d60 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -4,8 +4,9 @@ import { defineConfig } from "tsup" export default defineConfig({ entry: [ "./src/index.ts", - "./src/effect/schema/index.ts", - "./src/effect/schema/class/index.ts", + "./src/Types/index.ts", + "./src/Schema/index.ts", + "./src/Schema/MobX/index.ts", ], format: ["esm", "cjs"], skipNodeModulesBundle: true,