From 78762b920e0315b16b43a5f3f67a5bb02d52c849 Mon Sep 17 00:00:00 2001 From: roymondchen Date: Fri, 1 Dec 2023 15:26:36 +0800 Subject: [PATCH] =?UTF-8?q?fix(data-source):=20=E6=95=B0=E6=8D=AE=E6=BA=90?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/data-source/src/DataSourceManager.ts | 62 +++++++++---------- packages/data-source/src/data-sources/Base.ts | 16 +++-- packages/data-source/src/data-sources/Http.ts | 4 +- packages/data-source/src/types.ts | 3 +- 4 files changed, 45 insertions(+), 40 deletions(-) diff --git a/packages/data-source/src/DataSourceManager.ts b/packages/data-source/src/DataSourceManager.ts index dd674a26..3a2ac332 100644 --- a/packages/data-source/src/DataSourceManager.ts +++ b/packages/data-source/src/DataSourceManager.ts @@ -29,7 +29,7 @@ import type { DataSourceManagerData, DataSourceManagerOptions } from './types'; class DataSourceManager extends EventEmitter { private static dataSourceClassMap = new Map(); - public static registe(type: string, dataSource: typeof DataSource) { + public static registe(type: string, dataSource: T) { DataSourceManager.dataSourceClassMap.set(type, dataSource); } @@ -57,39 +57,37 @@ class DataSourceManager extends EventEmitter { app.dsl?.dataSources?.forEach((config) => { this.addDataSource(config); }); + + Promise.all(Array.from(this.dataSourceMap).map(async ([, ds]) => this.init(ds))); } - public async init() { - await Promise.all( - Array.from(this.dataSourceMap).map(async ([, ds]) => { - if (ds.isInit) { - return; - } + public async init(ds: DataSource) { + if (ds.isInit) { + return; + } - const beforeInit: ((...args: any[]) => any)[] = []; - const afterInit: ((...args: any[]) => any)[] = []; + const beforeInit: ((...args: any[]) => any)[] = []; + const afterInit: ((...args: any[]) => any)[] = []; - ds.methods.forEach((method) => { - if (typeof method.content !== 'function') return; - if (method.timing === 'beforeInit') { - beforeInit.push(method.content); - } - if (method.timing === 'afterInit') { - afterInit.push(method.content); - } - }); + ds.methods.forEach((method) => { + if (typeof method.content !== 'function') return; + if (method.timing === 'beforeInit') { + beforeInit.push(method.content); + } + if (method.timing === 'afterInit') { + afterInit.push(method.content); + } + }); - for (const method of beforeInit) { - await method({ params: {}, dataSource: ds, app: this.app }); - } + for (const method of beforeInit) { + await method({ params: {}, dataSource: ds, app: this.app }); + } - await ds.init(); + await ds.init(); - for (const method of afterInit) { - await method({ params: {}, dataSource: ds, app: this.app }); - } - }), - ); + for (const method of afterInit) { + await method({ params: {}, dataSource: ds, app: this.app }); + } } public get(id: string) { @@ -117,8 +115,6 @@ class DataSourceManager extends EventEmitter { ds.on('change', () => { this.setData(ds); }); - - this.init(); } public setData(ds: DataSource) { @@ -134,7 +130,7 @@ class DataSourceManager extends EventEmitter { public updateSchema(schemas: DataSourceSchema[]) { schemas.forEach((schema) => { - const ds = this.dataSourceMap.get(schema.id); + const ds = this.get(schema.id); if (!ds) { return; } @@ -142,6 +138,10 @@ class DataSourceManager extends EventEmitter { this.removeDataSource(schema.id); this.addDataSource(schema); + const newDs = this.get(schema.id); + if (newDs) { + this.init(newDs); + } }); } @@ -239,6 +239,6 @@ class DataSourceManager extends EventEmitter { } } -DataSourceManager.registe('http', HttpDataSource); +DataSourceManager.registe('http', HttpDataSource as any); export default DataSourceManager; diff --git a/packages/data-source/src/data-sources/Base.ts b/packages/data-source/src/data-sources/Base.ts index d651b897..d89a8b76 100644 --- a/packages/data-source/src/data-sources/Base.ts +++ b/packages/data-source/src/data-sources/Base.ts @@ -17,7 +17,7 @@ */ import EventEmitter from 'events'; -import type { AppCore, CodeBlockContent, DataSchema } from '@tmagic/schema'; +import type { AppCore, CodeBlockContent, DataSchema, DataSourceSchema } from '@tmagic/schema'; import { getDefaultValueFromFields } from '@tmagic/utils'; import type { DataSourceOptions } from '@data-source/types'; @@ -25,7 +25,7 @@ import type { DataSourceOptions } from '@data-source/types'; /** * 静态数据源 */ -export default class DataSource extends EventEmitter { +export default class DataSource extends EventEmitter { public isInit = false; public data: Record = {}; @@ -37,17 +37,21 @@ export default class DataSource extends EventEmitter { #type = 'base'; #id: string; + #schema: T; /** 数据源自定义字段配置 */ #fields: DataSchema[] = []; /** 数据源自定义方法配置 */ #methods: CodeBlockContent[] = []; - constructor(options: DataSourceOptions) { + constructor(options: DataSourceOptions) { super(); - this.app = options.app; this.#id = options.schema.id; + this.#schema = options.schema; + + this.app = options.app; + this.setFields(options.schema.fields); this.setMethods(options.schema.methods || []); @@ -77,6 +81,10 @@ export default class DataSource extends EventEmitter { return this.#type; } + public get schema() { + return this.#schema; + } + public get fields() { return this.#fields; } diff --git a/packages/data-source/src/data-sources/Http.ts b/packages/data-source/src/data-sources/Http.ts index d76c710b..c6b2a48b 100644 --- a/packages/data-source/src/data-sources/Http.ts +++ b/packages/data-source/src/data-sources/Http.ts @@ -66,14 +66,13 @@ const webRequest = async (options: HttpOptions) => { * Http 数据源 * @description 通过 http 请求获取数据 */ -export default class HttpDataSource extends DataSource { +export default class HttpDataSource extends DataSource { /** 是否正在发起请求 */ public isLoading = false; public error?: { msg?: string; code?: string | number; }; - public schema: HttpDataSourceSchema; /** 请求配置 */ public httpOptions: HttpOptions; @@ -91,7 +90,6 @@ export default class HttpDataSource extends DataSource { super(options); - this.schema = options.schema; this.httpOptions = httpOptions; if (typeof options.request === 'function') { diff --git a/packages/data-source/src/types.ts b/packages/data-source/src/types.ts index 1eb992ac..676681d2 100644 --- a/packages/data-source/src/types.ts +++ b/packages/data-source/src/types.ts @@ -2,7 +2,7 @@ import type { AppCore, DataSourceSchema, HttpOptions, RequestFunction } from '@t import HttpDataSource from './data-sources/Http'; -export interface DataSourceOptions { +export interface DataSourceOptions { schema: T; app: AppCore; initialData?: Record; @@ -12,7 +12,6 @@ export interface DataSourceOptions { } export interface HttpDataSourceSchema extends DataSourceSchema { - type: 'http'; options: HttpOptions; responseOptions?: { dataPath?: string;