0.1.11 (#12)
All checks were successful
Publish / publish (push) Successful in 15s
Lint / lint (push) Successful in 11s

Co-authored-by: Julien Valverdé <julien.valverde@mailo.com>
Reviewed-on: #12
This commit was merged in pull request #12.
This commit is contained in:
Julien Valverdé
2024-08-20 22:17:43 +02:00
parent cfb3d20d44
commit 95db23b2be
8 changed files with 83 additions and 17 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "@thilawyn/thilalib",
"version": "0.1.10",
"version": "0.1.11",
"type": "module",
"files": [
"./dist"

View File

@@ -1,13 +0,0 @@
import { Schema } from "@effect/schema"
import type { Jsonifiable as TJsonifiable } from "type-fest"
export const Jsonifiable = <
JsonifiableA,
JsonifiableI extends TJsonifiable,
JsonifiableR,
>(
jsonifiable: Schema.Schema<JsonifiableA, JsonifiableI, JsonifiableR>
) =>
<A, R>(schema: Schema.Schema<A, JsonifiableA, R>) =>
jsonifiable.pipe(Schema.compose(schema))

View File

@@ -0,0 +1,13 @@
import { Schema } from "@effect/schema"
import type { JsonValue } from "type-fest"
export const composeJsonifiable = <
JsonifiableA,
JsonifiableI extends JsonValue,
JsonifiableR,
>(
jsonifiableSchema: Schema.Schema<JsonifiableA, JsonifiableI, JsonifiableR>
) =>
<A, R>(decodedSchema: Schema.Schema<A, JsonifiableA, R>) =>
Schema.compose(jsonifiableSchema, decodedSchema)

View File

@@ -0,0 +1,13 @@
import type { Schema } from "@effect/schema"
import type { JsonValue } from "type-fest"
import type { PrismaJson } from "../Types"
/**
* Takes a schema of which the encoded value satisfies type-fest's `JsonValue` and returns the same schema with Prisma's `JsonValue` as its encoded type instead.
* This allows you use to use jsonifiable schemas to strongly type `Json` database fields in Prisma.
*
* This is needed because Prisma's `JsonValue` is poorly implemented and does not work well with some types, such as readonly arrays.
*/
export const encodedAsPrismaJsonValue = <A, E extends JsonValue, R>(schema: Schema.Schema<A, E, R>) =>
schema as unknown as Schema.Schema<A, PrismaJson.JsonValue, R>

View File

@@ -1,6 +1,7 @@
export * from "./Class"
export * from "./composeJsonifiable"
export * from "./DateTime"
export * from "./Jsonifiable"
export * from "./encodedAsPrismaJsonValue"
export * from "./Kind"
export * as MobX from "./MobX"
export * from "./MutableClass"

51
src/Types/PrismaJson.ts Normal file
View File

@@ -0,0 +1,51 @@
/**
* `@prisma/client`'s Json types
* @module
*/
/**
* From https://github.com/sindresorhus/type-fest/
* Matches a JSON object.
* This type can be useful to enforce some input to be JSON-compatible or as a super-type to be extended from.
*/
export type JsonObject = {[Key in string]?: JsonValue}
/**
* From https://github.com/sindresorhus/type-fest/
* Matches a JSON array.
*/
export interface JsonArray extends Array<JsonValue> {}
/**
* From https://github.com/sindresorhus/type-fest/
* Matches any valid JSON value.
*/
export type JsonValue = string | number | boolean | JsonObject | JsonArray | null
/**
* Matches a JSON object.
* Unlike `JsonObject`, this type allows undefined and read-only properties.
*/
export type InputJsonObject = {readonly [Key in string]?: InputJsonValue | null}
/**
* Matches a JSON array.
* Unlike `JsonArray`, readonly arrays are assignable to this type.
*/
export interface InputJsonArray extends ReadonlyArray<InputJsonValue | null> {}
/**
* Matches any valid value that can be used as an input for operations like
* create and update as the value of a JSON field. Unlike `JsonValue`, this
* type allows read-only arrays and read-only object properties and disallows
* `null` at the top level.
*
* `null` cannot be used as the value of a JSON field because its meaning
* would be ambiguous. Use `Prisma.JsonNull` to store the JSON null value or
* `Prisma.DbNull` to clear the JSON value and set the field to the database
* NULL value instead.
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-by-null-values
*/
export type InputJsonValue = string | number | boolean | InputJsonObject | InputJsonArray | { toJSON(): unknown }

View File

@@ -1,4 +1,5 @@
export * from "./CommonKeys"
export * from "./Extend"
export * from "./Merge"
export * as PrismaJson from "./PrismaJson"
export * from "./StaticType"

View File

@@ -1,7 +1,7 @@
import { Schema as S } from "@effect/schema"
import { reaction, runInAction } from "mobx"
import type { Simplify } from "type-fest"
import { Jsonifiable, MutableTaggedClass } from "./Schema"
import { composeJsonifiable, MutableTaggedClass } from "./Schema"
import { ObservableClass } from "./Schema/MobX"
import type { ExtendAll } from "./Types"
@@ -26,7 +26,7 @@ class User extends MutableTaggedClass<User>()("User", {
) {}
const JsonifiableUser = User.pipe(
Jsonifiable(S.Struct({
composeJsonifiable(S.Struct({
...User.fields,
id: S.BigInt,
}))