Browse Source

Fix schema type checking

Add type parameter for custom schema validation.
master
TheoryOfNekomata 6 months ago
parent
commit
4eeb92741c
2 changed files with 17 additions and 18 deletions
  1. +5
    -5
      src/core.ts
  2. +12
    -13
      src/server.ts

+ 5
- 5
src/core.ts View File

@@ -37,20 +37,20 @@ interface ResourceFactory {
route(n: string): this;
}

export interface ResourceData {
export interface ResourceData<T extends BaseSchema> {
idAttr: string;
itemName?: string;
collectionName?: string;
routeName?: string;
newId(dataSource: DataSource): string | number | unknown;
schema: BaseSchema;
schema: T;
throws404OnDeletingNotFound: boolean;
checksSerializersOnDelete: boolean;
}

export type Resource = ResourceData & ResourceFactory;
export type Resource<T extends BaseSchema = any> = ResourceData<T> & ResourceFactory;

export interface ResourceWithDataSource extends Resource {
export interface ResourceWithDataSource<T extends BaseSchema = any> extends Resource<T> {
dataSource: DataSource;
}

@@ -62,7 +62,7 @@ interface IdParams {
generationStrategy: GenerationStrategy;
}

export const resource = <T extends BaseSchema>(schema: T): Resource => {
export const resource = <T extends BaseSchema>(schema: T): Resource<T> => {
let theIdAttr: string;
let theItemName: string;
let theCollectionName: string;


+ 12
- 13
src/server.ts View File

@@ -1,9 +1,8 @@
import {
application,
DataSource,
Resource,
resource,
valibot,
valibot as v,
dataSources,
serializers
} from '.';
@@ -49,11 +48,11 @@ const TEXT_SERIALIZER_PAIR = {
deserialize: <T>(str: string) => str as T
};

const Piano = resource(valibot.object(
const Piano = resource(v.object(
{
brand: valibot.string()
brand: v.string()
},
valibot.never()
v.never()
))
.name('Piano')
.id('id', {
@@ -62,15 +61,15 @@ const Piano = resource(valibot.object(

// TODO implement authentication and RBAC on each resource

const User = resource(valibot.object(
const User = resource(v.object(
{
firstName: valibot.string(),
middleName: valibot.string(),
lastName: valibot.string(),
bio: valibot.string(),
createdAt: valibot.date()
firstName: v.string(),
middleName: v.string(),
lastName: v.string(),
bio: v.string(),
createdAt: v.date()
},
valibot.never()
v.never()
))
.name('User')
.fullText('bio')
@@ -80,7 +79,7 @@ const User = resource(valibot.object(

const app = application({
name: 'piano-service',
dataSource: (resource: Resource) => new dataSources.jsonlFile.DataSource(resource),
dataSource: (resource) => new dataSources.jsonlFile.DataSource(resource),
})
.contentType('application/json', serializers.applicationJson)
.contentType('text/json', serializers.textJson)


Loading…
Cancel
Save