Commit 985258a9 authored by nanahira's avatar nanahira

catchup

parent 8935d657
......@@ -22,8 +22,11 @@
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^3.4.1",
"prettier": "^2.4.1",
"schemastery": "^1.0.0",
"schemastery": "^2.0.0",
"typescript": "^4.5.2"
},
"peerDependencies": {
"schemastery": "^2.0.0"
}
},
"node_modules/@babel/code-frame": {
......@@ -1538,9 +1541,9 @@
}
},
"node_modules/schemastery": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/schemastery/-/schemastery-1.0.0.tgz",
"integrity": "sha512-TwjfFcstdU1rSkV9/dATEk8YFLa1OOxCuGT2mMepZxpMAATQdVm7Fw2tRr4tEsrqAitP+X1/8P5Vv51OUBClAw==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/schemastery/-/schemastery-2.0.0.tgz",
"integrity": "sha512-g628Fvc8cY3Laoyz+v45qZGiClwhTj0MsiGF+tSVlUh+hqYf6kVkTaWdIHNGhfj11h9QzRrs0A4wfvQZuHg3iA==",
"dev": true
},
"node_modules/semver": {
......@@ -2929,9 +2932,9 @@
}
},
"schemastery": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/schemastery/-/schemastery-1.0.0.tgz",
"integrity": "sha512-TwjfFcstdU1rSkV9/dATEk8YFLa1OOxCuGT2mMepZxpMAATQdVm7Fw2tRr4tEsrqAitP+X1/8P5Vv51OUBClAw==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/schemastery/-/schemastery-2.0.0.tgz",
"integrity": "sha512-g628Fvc8cY3Laoyz+v45qZGiClwhTj0MsiGF+tSVlUh+hqYf6kVkTaWdIHNGhfj11h9QzRrs0A4wfvQZuHg3iA==",
"dev": true
},
"semver": {
......
......@@ -29,11 +29,11 @@
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^3.4.1",
"prettier": "^2.4.1",
"schemastery": "^1.0.0",
"schemastery": "^2.0.0",
"typescript": "^4.5.2"
},
"peerDependencies": {
"schemastery": "^1.0.0"
"schemastery": "^2.0.0"
},
"dependencies": {
"lodash": "^4.17.21",
......
......@@ -9,7 +9,7 @@ import {
} from '../utility/transformer';
import Schema from 'schemastery';
export function DefineSchema(options: SchemaOptions = {}): PropertyDecorator {
export function SchemaProperty(options: SchemaOptions = {}): PropertyDecorator {
return (obj, key) => {
const nativeType = Reflect.getMetadata('design:type', obj, key);
const nativeTypeString = getStringFromNativeType(nativeType);
......@@ -46,3 +46,6 @@ export function DefineSchema(options: SchemaOptions = {}): PropertyDecorator {
return Metadata.set('SchemaMeta', options, 'SchemaMetaKey')(obj, key);
};
}
// for backward compatibility
export const DefineSchema = SchemaProperty;
......@@ -28,51 +28,36 @@ function getBasePropertySchemaFromOptions(options: SchemaOptions) {
case 'boolean':
return Schema.boolean();
case 'object':
return Schema.object({}, true);
return Schema.object({}).default({});
default:
return Schema.any();
}
}
function applyOptionsToSchema(schema: Schema, options: SchemaClassOptions) {
if (options.required != undefined) {
schema.meta.required = options.required;
}
if (options.hidden != undefined) {
schema.meta.hidden = options.hidden;
}
if (options.default != undefined) {
schema.meta.default = options.default;
}
if (options.comment != undefined) {
schema.meta.comment = options.comment;
}
if (options.allowUnknown != undefined) {
schema.flag = options.allowUnknown;
}
if (options.desc != undefined) {
schema.desc = options.desc;
if (options.desc) {
schema.meta.description = options.desc;
}
Object.assign(schema.meta, options);
}
function getPropertySchemaFromOptions<PT>(options: SchemaOptions): Schema<PT> {
let schema = getBasePropertySchemaFromOptions(options);
if (options.dict) {
schema = Schema.dict(schema);
schema = Schema.dict(schema).default({});
}
if (options.array) {
schema = Schema.array(schema);
schema = Schema.array(schema).default([]);
}
applyOptionsToSchema(schema, options);
return schema;
}
function schemasFromDict<T>(dict: SchemaOptionsDict<T>): Schema<T> {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
return Schema.object<T>(
_.mapValues(dict, (opt) => getPropertySchemaFromOptions(opt)),
);
function schemasFromDict<T>(dict: SchemaOptionsDict<T>) {
const schemaDict: {
[P in keyof SchemaOptionsDict<T>]: Schema<SchemaOptionsDict<T>[P]>;
} = _.mapValues(dict, (opt) => getPropertySchemaFromOptions(opt));
return Schema.object(schemaDict);
}
function schemaOptionsFromClass<T>(cl: ClassType<T>): SchemaOptionsDict<T> {
......@@ -89,11 +74,11 @@ function schemaOptionsFromClass<T>(cl: ClassType<T>): SchemaOptionsDict<T> {
return result;
}
export function schemaFromClass<T>(cl: ClassType<T>): Schema<T> {
export function schemaFromClass<T>(cl: ClassType<T>): Schema<Partial<T>, T> {
let schema: Schema;
const optionsDict = schemaOptionsFromClass(cl);
if (!optionsDict) {
schema = Schema.object({}, true);
schema = Schema.object({});
} else {
schema = schemasFromDict<T>(optionsDict);
}
......@@ -106,22 +91,18 @@ export function schemaFromClass<T>(cl: ClassType<T>): Schema<T> {
const schemaFields: (keyof Schema.Base)[] = [
'type',
'desc',
'key',
'flag',
'value',
'alt',
'sDict',
'inner',
'list',
'dict',
'callback',
'value',
'meta',
];
function applySchemaForClass<T>(
originalClass: ClassType<T>,
instance: T,
originalObject: any,
originalObject: Partial<T>,
) {
const schema = schemaFromClass(originalClass);
const newRawObject = new schema(originalObject);
......@@ -148,7 +129,7 @@ export function SchemaClass<T>(originalClass: ClassType<T>) {
const instance = new originalClass(...args);
const originalObject = args[0];
return applySchemaForClass(originalClass, instance, originalObject);
} as unknown) as ClassType<T> & Schema<T>;
} as unknown) as ClassType<T> & Schema<Partial<T>, T>;
Object.defineProperty(newClass, 'name', {
value: originalClass.name,
});
......
......@@ -11,13 +11,9 @@ export type SchemaType =
| 'never'
| { new (...args: any[]): any };
export interface SchemaClassOptions {
export interface SchemaClassOptions extends Schema.Meta<any> {
desc?: string;
required?: boolean;
hidden?: boolean;
allowUnknown?: boolean;
comment?: string;
default?: any;
allowUnknown?: boolean; // for backward compatibility
}
export interface SchemaOptions extends SchemaClassOptions {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment