0.1.11 (#12)
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:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@thilawyn/thilalib",
|
"name": "@thilawyn/thilalib",
|
||||||
"version": "0.1.10",
|
"version": "0.1.11",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"files": [
|
"files": [
|
||||||
"./dist"
|
"./dist"
|
||||||
|
|||||||
@@ -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))
|
|
||||||
13
src/Schema/composeJsonifiable.ts
Normal file
13
src/Schema/composeJsonifiable.ts
Normal 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)
|
||||||
13
src/Schema/encodedAsPrismaJsonValue.ts
Normal file
13
src/Schema/encodedAsPrismaJsonValue.ts
Normal 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>
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
export * from "./Class"
|
export * from "./Class"
|
||||||
|
export * from "./composeJsonifiable"
|
||||||
export * from "./DateTime"
|
export * from "./DateTime"
|
||||||
export * from "./Jsonifiable"
|
export * from "./encodedAsPrismaJsonValue"
|
||||||
export * from "./Kind"
|
export * from "./Kind"
|
||||||
export * as MobX from "./MobX"
|
export * as MobX from "./MobX"
|
||||||
export * from "./MutableClass"
|
export * from "./MutableClass"
|
||||||
|
|||||||
51
src/Types/PrismaJson.ts
Normal file
51
src/Types/PrismaJson.ts
Normal 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 }
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
export * from "./CommonKeys"
|
export * from "./CommonKeys"
|
||||||
export * from "./Extend"
|
export * from "./Extend"
|
||||||
export * from "./Merge"
|
export * from "./Merge"
|
||||||
|
export * as PrismaJson from "./PrismaJson"
|
||||||
export * from "./StaticType"
|
export * from "./StaticType"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Schema as S } from "@effect/schema"
|
import { Schema as S } from "@effect/schema"
|
||||||
import { reaction, runInAction } from "mobx"
|
import { reaction, runInAction } from "mobx"
|
||||||
import type { Simplify } from "type-fest"
|
import type { Simplify } from "type-fest"
|
||||||
import { Jsonifiable, MutableTaggedClass } from "./Schema"
|
import { composeJsonifiable, MutableTaggedClass } from "./Schema"
|
||||||
import { ObservableClass } from "./Schema/MobX"
|
import { ObservableClass } from "./Schema/MobX"
|
||||||
import type { ExtendAll } from "./Types"
|
import type { ExtendAll } from "./Types"
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ class User extends MutableTaggedClass<User>()("User", {
|
|||||||
) {}
|
) {}
|
||||||
|
|
||||||
const JsonifiableUser = User.pipe(
|
const JsonifiableUser = User.pipe(
|
||||||
Jsonifiable(S.Struct({
|
composeJsonifiable(S.Struct({
|
||||||
...User.fields,
|
...User.fields,
|
||||||
id: S.BigInt,
|
id: S.BigInt,
|
||||||
}))
|
}))
|
||||||
|
|||||||
Reference in New Issue
Block a user