Commit f831f1ac authored by nanahira's avatar nanahira

workaround for removed prototype thing

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