Skip to content

Commit

Permalink
feat(core,data-source): 数据源支持mock
Browse files Browse the repository at this point in the history
  • Loading branch information
roymondchen committed Oct 2, 2023
1 parent 56dfacb commit 4c46a4e
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 19 deletions.
8 changes: 7 additions & 1 deletion packages/core/src/App.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ interface AppOptionsConfig {
jsEngine?: 'browser' | 'hippy';
designWidth?: number;
curPage?: Id;
useMock?: boolean;
transformStyle?: (style: Record<string, any>) => Record<string, any>;
request?: RequestFunction;
}
Expand All @@ -66,6 +67,7 @@ class App extends EventEmitter implements AppCore {

public page?: Page;

public useMock = false;
public platform = 'mobile';
public jsEngine = 'browser';
public designWidth = 375;
Expand All @@ -86,6 +88,10 @@ class App extends EventEmitter implements AppCore {
options.platform && (this.platform = options.platform);
options.jsEngine && (this.jsEngine = options.jsEngine);

if (typeof options.useMock === 'boolean') {
this.useMock = options.useMock;
}

if (typeof options.designWidth !== 'undefined') {
this.setDesignWidth(options.designWidth);
}
Expand Down Expand Up @@ -174,7 +180,7 @@ class App extends EventEmitter implements AppCore {
this.dataSourceManager.destroy();
}

this.dataSourceManager = createDataSourceManager(this);
this.dataSourceManager = createDataSourceManager(this, this.useMock);

this.codeDsl = config.codeBlocks;
this.setPage(curPage || this.page?.data?.id);
Expand Down
18 changes: 9 additions & 9 deletions packages/data-source/src/DataSourceManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,21 +43,21 @@ class DataSourceManager extends EventEmitter {

public data: DataSourceManagerData = {};

constructor({ app }: DataSourceManagerOptions) {
constructor({ app, useMock }: DataSourceManagerOptions) {
super();

this.app = app;

app.dsl?.dataSources?.forEach((config) => {
this.addDataSource(config);
this.addDataSource(config, useMock);
});
}

public get(id: string) {
return this.dataSourceMap.get(id);
}

public async addDataSource(config?: DataSourceSchema) {
public async addDataSource(config?: DataSourceSchema, useMock?: boolean) {
if (!config) return;

let ds: DataSource;
Expand All @@ -66,6 +66,7 @@ class DataSourceManager extends EventEmitter {
app: this.app,
schema: config as HttpDataSourceSchema,
request: this.app.request,
useMock,
});
} else {
// eslint-disable-next-line @typescript-eslint/naming-convention
Expand All @@ -74,13 +75,18 @@ class DataSourceManager extends EventEmitter {
ds = new DataSourceClass({
app: this.app,
schema: config,
useMock,
});
}

this.dataSourceMap.set(config.id, ds);

this.data[ds.id] = ds.data;

ds.on('change', () => {
this.setData(ds);
});

const beforeInit: ((...args: any[]) => any)[] = [];
const afterInit: ((...args: any[]) => any)[] = [];

Expand All @@ -103,12 +109,6 @@ class DataSourceManager extends EventEmitter {
for (const method of afterInit) {
await method({ params: {}, dataSource: ds, app: this.app });
}

this.setData(ds);

ds.on('change', () => {
this.setData(ds);
});
}

public setData(ds: DataSource) {
Expand Down
4 changes: 2 additions & 2 deletions packages/data-source/src/createDataSourceManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ import DataSourceManager from './DataSourceManager';
* @param httpDataSourceOptions http 数据源配置
* @returns DataSourceManager
*/
export const createDataSourceManager = (app: AppCore) => {
export const createDataSourceManager = (app: AppCore, useMock?: boolean) => {
const { dsl, platform } = app;
if (!dsl?.dataSources) return;

const dataSourceManager = new DataSourceManager({ app });
const dataSourceManager = new DataSourceManager({ app, useMock });

if (dsl.dataSources && dsl.dataSourceCondDeps && platform !== 'editor') {
getNodes(getDepNodeIds(dsl.dataSourceCondDeps), dsl.items).forEach((node) => {
Expand Down
12 changes: 11 additions & 1 deletion packages/data-source/src/data-sources/Base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
*/
import EventEmitter from 'events';

import type { AppCore, CodeBlockContent, DataSchema } from '@tmagic/schema';
import type { AppCore, CodeBlockContent, DataSchema, MockSchema } from '@tmagic/schema';
import { getDefaultValueFromFields } from '@tmagic/utils';

import type { DataSourceOptions } from '@data-source/types';
Expand All @@ -36,6 +36,8 @@ export default class DataSource extends EventEmitter {

public app: AppCore;

protected mockData?: MockSchema;

private fields: DataSchema[] = [];
private methods: CodeBlockContent[] = [];

Expand All @@ -47,7 +49,15 @@ export default class DataSource extends EventEmitter {
this.setFields(options.schema.fields);
this.setMethods(options.schema.methods || []);

if (typeof options.useMock === 'boolean' && options.useMock) {
this.mockData = options.schema.mocks?.find((mock) => mock.enable);
}

this.updateDefaultData();

if (this.mockData) {
this.setData(this.mockData.data);
}
}

public setFields(fields: DataSchema[]) {
Expand Down
10 changes: 6 additions & 4 deletions packages/data-source/src/data-sources/Http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,12 @@ export default class HttpDataSource extends DataSource {
await method({ options, params: {}, dataSource: this, app: this.app });
}

const res = await this.fetch?.({
...this.httpOptions,
...options,
});
const res = this.mockData
? this.mockData.data
: await this.fetch?.({
...this.httpOptions,
...options,
});

for (const method of this.afterRequest) {
await method({ res, options, params: {}, dataSource: this, app: this.app });
Expand Down
5 changes: 3 additions & 2 deletions packages/data-source/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type { AppCore, DataSourceSchema, HttpOptions, RequestFunction } from '@t
export interface DataSourceOptions {
schema: DataSourceSchema;
app: AppCore;
useMock?: boolean;
}

export interface HttpDataSourceSchema extends DataSourceSchema {
Expand All @@ -14,14 +15,14 @@ export interface HttpDataSourceSchema extends DataSourceSchema {
autoFetch?: boolean;
}

export interface HttpDataSourceOptions {
export interface HttpDataSourceOptions extends DataSourceOptions {
schema: HttpDataSourceSchema;
app: AppCore;
request?: RequestFunction;
}

export interface DataSourceManagerOptions {
app: AppCore;
useMock?: boolean;
}

export interface DataSourceManagerData {
Expand Down

0 comments on commit 4c46a4e

Please sign in to comment.