Commit 985258a9 authored by nanahira's avatar nanahira

catchup

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