tachybase_todo/packages/database-next/src/collection-importer.ts

51 lines
1.1 KiB
TypeScript
Raw Normal View History

feat: database next (#130) * FIX: database test with sqlite * more types * filter test * split filter parser * filter test * filter test: hasMany * define inverse association for belongsTo & hasMany * chore: console.log * repository count method * chore: Collection * repository filter & appends & fields & expect * repository: sort option * chore: test * add: test * find & findAndCount * chore: test * database-next: update guard * database-next: update guard associationKeysToBeUpdate * chore: comment * update-guard OneToOne Association * has one repository * support through table value * belongs to many repository * has many repository * has many repository find * fix: has many find and count * clean code * add count method * chore: multiple relation * chore: single relation * repository find * relation repository builder * repository count * repository count test * fix test * close db afterEach test * sort with associations * repository update * has many repository: destroy * belongs to many repository: destroy * add transaction decorator * belongs to many with transaction * has many with transaction * clean types * clean types * clean types * repository transaction * fix test * single relation repository with transaction * single relation repository with transaction * fix: test * fix: option parser fields append * fix: typo * fix: string type * fix: import * collection field methods * cleanup * collection sync * fix: import * fix: test * collection update field * collection update options * database hook * database test * database event test * update database event * add async emmit mixin * async model event * database import * fix: model hook type * fix: collection event * recall model.init on collection update * skip redefine collection test * skip collection model update * add model hook class * global model event support * chore * chore * change utils import * add field types * database import * more import test * test case * fix: through model init... * bugfix * fix * update database import * collection sync by foreachModel * fix collection model sync * update * add field types * custom operator * sqlite array field * postgresql array field * array query escape * mysql array operators * date operators * array field sqlite fix * association operator * date operator empty & notEmpty * fix: fields import * fix array field nested association * filter parse prepare * fix test * string field empty * add date operator test * field option types * fix typo * fix: operator name conflict * rename function Co-authored-by: Chareice <chareice@live.com>
2021-12-06 21:12:54 +08:00
import * as fs from 'fs';
import path from 'path';
import lodash from 'lodash';
export type ImportFileExtension = 'js' | 'ts' | 'json';
async function requireModule(module: any) {
if (typeof module === 'string') {
module = require(module);
}
if (typeof module !== 'object') {
return module;
}
return module.__esModule ? module.default : module;
}
export class ImporterReader {
directory: string;
extensions: Set<string>;
constructor(directory: string, extensions?: ImportFileExtension[]) {
this.directory = directory;
if (!extensions) {
extensions = ['js', 'ts', 'json'];
}
this.extensions = new Set(extensions);
}
async read() {
const modules = (
await fs.promises.readdir(this.directory, {
encoding: 'utf-8',
})
)
.filter((fileName) =>
this.extensions.has(path.parse(fileName).ext.replace('.', '')),
)
.map(
async (fileName) =>
await requireModule(path.join(this.directory, fileName)),
);
return (await Promise.all(modules)).filter((module) =>
lodash.isPlainObject(module),
);
}
}