nocobase/packages/core/database/src/collection-importer.ts
ChengLei Shao 261d4c4137
refactor: establish a sound testing system (#3179)
* chore: use vitest to replace jest

* chore: support vitest

* feat: vitest 1.0

* fix: test

* chore: yarn.lock

* chore: github actions

* fix: test

* fix: test

* fix: test

* fix: test

* fix: jest.fn

* fix: require

* fix: test

* fix: build

* fix: test

* fix: test

* fix: test

* fix: test

* fix: test

* fix: test

* fix: test

* fix: dynamic import

* fix: bug

* chore: yarn run test command

* chore: package.json

* chore: package.json

* chore: vite 5

* fix: fix variable test

* fix: import json

* feat: initEnv

* fix: env.APP_ENV_PATH

* chore: get package json

* fix: remove GlobalThmeProvider

* chore: update snap

* chore: test env

* chore: test env

* chore: import module

* chore: jest

* fix: load package json

* chore: test

* fix: bug

* chore: test

* chore: test

* chore: test

* chore: test

* chore: test

* fix: import file in windows

* chore: import module with absolute file path

* fix: test error

* test: update snapshot

* chore: update yarn.lock

* fix: front-end tests do not include utils folder

* refactor: use vitest-dom

* fix: fix build

* fix: test error

* fix: change to vitest.config.mts

* fix: types error

* fix: types error

* fix: types error

* fix: error

* fix: test

* chore: test

* fix: test package

* feat: update dependencies

* refactor: test

* fix: error

* fix: error

* fix: __dirname is not defined in ES module scope

* fix: allow only

* fix: error

* fix: error

* fix: error

* fix: create-app

* fix: install-deps

* feat: update docs

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
Co-authored-by: dream2023 <1098626505@qq.com>
Co-authored-by: Zeke Zhang <958414905@qq.com>
2023-12-21 20:39:11 +08:00

46 lines
1.2 KiB
TypeScript

import { importModule } from '@nocobase/utils';
import { existsSync } from 'fs';
import { readdir } from 'fs/promises';
import { cloneDeep, isPlainObject } from 'lodash';
import path from 'path';
export type ImportFileExtension = 'js' | 'ts' | 'json';
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() {
if (!existsSync(this.directory)) {
return [];
}
const files = await readdir(this.directory, {
encoding: 'utf-8',
});
const modules = files
.filter((fileName) => {
if (fileName.endsWith('.d.ts')) {
return false;
}
const ext = path.parse(fileName).ext.replace('.', '');
return this.extensions.has(ext);
})
.map(async (fileName) => {
const mod = await importModule(path.join(this.directory, fileName));
return typeof mod === 'function' ? mod() : mod;
});
return (await Promise.all(modules)).filter((module) => isPlainObject(module)).map((module) => cloneDeep(module));
}
}