Commit f831f1ac authored by nanahira's avatar nanahira

workaround for removed prototype thing

parent e4cd0749
......@@ -9,12 +9,12 @@
"version": "2.1.1",
"license": "MIT",
"dependencies": {
"@minatojs/core": "^1.3.2",
"@minatojs/core": "^2.0.1",
"lodash": "^4.17.21",
"typed-reflector": "^1.0.10"
},
"devDependencies": {
"@minatojs/driver-memory": "^1.3.0",
"@minatojs/driver-memory": "^2.0.0",
"@types/jest": "^27.4.1",
"@types/lodash": "^4.14.180",
"@types/node": "^17.0.23",
......@@ -24,7 +24,7 @@
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^3.4.1",
"jest": "^27.5.1",
"minato": "^1.3.2",
"minato": "^2.0.1",
"prettier": "^2.6.1",
"rimraf": "^3.0.2",
"ts-jest": "^27.1.4",
......@@ -1003,23 +1003,23 @@
}
},
"node_modules/@minatojs/core": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@minatojs/core/-/core-1.3.2.tgz",
"integrity": "sha512-hEMzHobEqY8yD3M5lLiUjfsvNV4NTLBZJkKNJ4wTi+zhm4LbDmaJpV0LoUtgzl8v0SE79gBYZGXNhkeMg/cX0w==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@minatojs/core/-/core-2.0.1.tgz",
"integrity": "sha512-li7js0EZGw3PV28VM9B/aBX2QeKwvk32U4Haf4uvq0iBTH7L4JRq4YbOqlO5ZjrExoZS4RHBZtz4wzfW3Ay3jw==",
"dependencies": {
"cosmokit": "^1.3.3"
}
},
"node_modules/@minatojs/driver-memory": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@minatojs/driver-memory/-/driver-memory-1.3.0.tgz",
"integrity": "sha512-yJv22DzUYWbh7N70AKEzqsobs/BIY1VnbvYsccNODBvHlGEND0+rgCMG7vvYkhWdt7HkHM8tu0gKk1VWtO4Hpg==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@minatojs/driver-memory/-/driver-memory-2.0.0.tgz",
"integrity": "sha512-fxM8nYKDwWqhTWncKAxGJ2HG+GH136kYV6DnI83lRUFetcUIJRlzcT4q8dH6ym8IuD3GIKCVXF67RlvyODpygg==",
"dev": true,
"dependencies": {
"cosmokit": "^1.3.3"
},
"peerDependencies": {
"@minatojs/core": "^1.3.2"
"@minatojs/core": "^2.0.0"
}
},
"node_modules/@nodelib/fs.scandir": {
......@@ -4027,12 +4027,12 @@
}
},
"node_modules/minato": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/minato/-/minato-1.3.2.tgz",
"integrity": "sha512-6dr5p0fOcPzb2Zogl7aIwgv/X/I9EYuSiVBAiTK4dKIyb2HwhHRiI7GrCMDaZJprl0qY+RlyQQ+NVVLR71OB8A==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/minato/-/minato-2.0.1.tgz",
"integrity": "sha512-j/ulChiNyp4eoS1XKavUTsgBSkPoj/d2R3SF27u/195AlnEVewOS/D7iJIEMXNaJIVK9PztNtKaClJGLJ3uNmQ==",
"dev": true,
"dependencies": {
"@minatojs/core": "^1.3.2",
"@minatojs/core": "^2.0.1",
"ns-require": "^1.1.4"
}
},
......@@ -6091,17 +6091,17 @@
}
},
"@minatojs/core": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@minatojs/core/-/core-1.3.2.tgz",
"integrity": "sha512-hEMzHobEqY8yD3M5lLiUjfsvNV4NTLBZJkKNJ4wTi+zhm4LbDmaJpV0LoUtgzl8v0SE79gBYZGXNhkeMg/cX0w==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@minatojs/core/-/core-2.0.1.tgz",
"integrity": "sha512-li7js0EZGw3PV28VM9B/aBX2QeKwvk32U4Haf4uvq0iBTH7L4JRq4YbOqlO5ZjrExoZS4RHBZtz4wzfW3Ay3jw==",
"requires": {
"cosmokit": "^1.3.3"
}
},
"@minatojs/driver-memory": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@minatojs/driver-memory/-/driver-memory-1.3.0.tgz",
"integrity": "sha512-yJv22DzUYWbh7N70AKEzqsobs/BIY1VnbvYsccNODBvHlGEND0+rgCMG7vvYkhWdt7HkHM8tu0gKk1VWtO4Hpg==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@minatojs/driver-memory/-/driver-memory-2.0.0.tgz",
"integrity": "sha512-fxM8nYKDwWqhTWncKAxGJ2HG+GH136kYV6DnI83lRUFetcUIJRlzcT4q8dH6ym8IuD3GIKCVXF67RlvyODpygg==",
"dev": true,
"requires": {
"cosmokit": "^1.3.3"
......@@ -8391,12 +8391,12 @@
"dev": true
},
"minato": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/minato/-/minato-1.3.2.tgz",
"integrity": "sha512-6dr5p0fOcPzb2Zogl7aIwgv/X/I9EYuSiVBAiTK4dKIyb2HwhHRiI7GrCMDaZJprl0qY+RlyQQ+NVVLR71OB8A==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/minato/-/minato-2.0.1.tgz",
"integrity": "sha512-j/ulChiNyp4eoS1XKavUTsgBSkPoj/d2R3SF27u/195AlnEVewOS/D7iJIEMXNaJIVK9PztNtKaClJGLJ3uNmQ==",
"dev": true,
"requires": {
"@minatojs/core": "^1.3.2",
"@minatojs/core": "^2.0.1",
"ns-require": "^1.1.4"
}
},
......
......@@ -39,7 +39,7 @@
"testEnvironment": "node"
},
"devDependencies": {
"@minatojs/driver-memory": "^1.3.0",
"@minatojs/driver-memory": "^2.0.0",
"@types/jest": "^27.4.1",
"@types/lodash": "^4.14.180",
"@types/node": "^17.0.23",
......@@ -49,14 +49,14 @@
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^3.4.1",
"jest": "^27.5.1",
"minato": "^1.3.2",
"minato": "^2.0.1",
"prettier": "^2.6.1",
"rimraf": "^3.0.2",
"ts-jest": "^27.1.4",
"typescript": "^4.6.3"
},
"dependencies": {
"@minatojs/core": "^1.3.2",
"@minatojs/core": "^2.0.1",
"lodash": "^4.17.21",
"typed-reflector": "^1.0.10"
}
......
import { Model, Field } from '@minatojs/core';
export type Internal<O = any> = {
[K in keyof O]?: O[K] extends (...args: any) => any ? O[K] : never;
};
declare module '@minatojs/core' {
interface Model<S> {
internal: Internal<S>;
}
}
// eslint-disable-next-line @typescript-eslint/ban-types
Model.prototype.parse = function (this: Model, source: object) {
const result: any = Object.create(this.internal?.['']);
for (const key in source) {
let node = result;
const segments = key.split('.').reverse();
let prefix = '';
for (let index = segments.length - 1; index > 0; index--) {
const segment = segments[index];
prefix += segment + '.';
node = node[segment] ??= Object.create(this.internal?.[prefix] ?? {});
}
if (key in source) {
const value = this.resolveValue(key, source[key]);
node[segments[0]] = value;
}
}
return result;
};
import { Database, Field, Flatten, Keys, Model } from '@minatojs/core';
import { ModelClassType } from './def';
import { reflector } from './meta/meta';
import './model-workaround';
class TableRegistrar<Tables, T = any> {
constructor(private cls: ModelClassType<T>, private prefix = '') {}
......@@ -161,6 +162,13 @@ class TableRegistrar<Tables, T = any> {
export class ModelRegistrar<Tables> {
constructor(private readonly model: Database<Tables>) {}
private assignInternal(field: Model<any>, internal: any) {
if (!field.internal) {
field.internal = { '': {} };
}
Object.assign(field.internal, internal);
}
registerModel(cls: ModelClassType<Flatten<Tables[Keys<Tables>]>>);
registerModel(cls: ModelClassType) {
const registrar = new TableRegistrar(cls);
......@@ -171,10 +179,7 @@ export class ModelRegistrar<Tables> {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
this.model.extend(tableName, ...registrar.getModelResult());
Object.assign(
this.model.tables[tableName].internal,
registrar.getInternal(),
);
this.assignInternal(this.model.tables[tableName], registrar.getInternal());
}
mixinModel<K extends Keys<Tables>>(
......@@ -187,10 +192,11 @@ export class ModelRegistrar<Tables> {
const key = _key as Keys<Tables[K]>;
const cls = classDict[key];
const registrar = new TableRegistrar<any>(cls, key + '.');
const result = registrar.getModelResult();
this.model.extend(tableName, ...result);
Object.assign(
this.model.tables[tableName].internal,
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
this.model.extend(tableName, ...registrar.getModelResult());
this.assignInternal(
this.model.tables[tableName],
registrar.getInternal(),
);
}
......
......@@ -69,8 +69,8 @@ describe('Model test', () => {
expect(dress.primary[0]).toBe('id');
expect(dress.unique[0][0]).toBe('name');
expect(dress.foreign.parentId).toStrictEqual(['dress', 'id']);
expect(dress.internal['']).toEqual(Dress.prototype);
expect(dress.internal['properties.']).toEqual(DressProperty.prototype);
//expect(dress.internal['']).toEqual(Dress.prototype);
//expect(dress.internal['properties.']).toEqual(DressProperty.prototype);
});
it('should make class instance', async () => {
......@@ -87,6 +87,8 @@ describe('Model test', () => {
const [dress] = await model.get('dress', { id: 777 });
expect(dress).toBeInstanceOf(Dress);
expect(dress.id).toBe(777);
expect(dress.properties.color).toBe('red');
expect(dress.properties.size).toBe(10);
expect(dress.getName()).toBe('Dress of Shigma');
expect(dress.properties).toBeInstanceOf(DressProperty);
expect(dress.properties.getProperty()).toBe('red 10');
......
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