/* * Tencent is pleased to support the open source community by making TMagicEditor available. * * Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import EventEmitter from 'events'; import type { AppCore, CodeBlockContent, DataSchema } from '@tmagic/schema'; import { getDefaultValueFromFields } from '@tmagic/utils'; import type { DataSourceOptions } from '@data-source/types'; /** * 静态数据源 */ export default class DataSource extends EventEmitter { public isInit = false; public data: Record = {}; /** @tmagic/core 实例 */ public app: AppCore; protected mockData?: Record; #type = 'base'; #id: string; /** 数据源自定义字段配置 */ #fields: DataSchema[] = []; /** 数据源自定义方法配置 */ #methods: CodeBlockContent[] = []; constructor(options: DataSourceOptions) { super(); this.app = options.app; this.#id = options.schema.id; this.setFields(options.schema.fields); this.setMethods(options.schema.methods || []); const defaultData = this.getDefaultData(); if (this.app.platform === 'editor') { this.mockData = options.schema.mocks?.find((mock) => mock.useInEditor)?.data || defaultData; } else if (typeof options.useMock === 'boolean' && options.useMock) { this.mockData = options.schema.mocks?.find((mock) => mock.enable)?.data; } this.setData(this.mockData || defaultData); } public get id() { return this.#id; } public get type() { return this.#type; } public get fields() { return this.#fields; } public get methods() { return this.#methods; } public setFields(fields: DataSchema[]) { this.#fields = fields; } public setMethods(methods: CodeBlockContent[]) { this.#methods = methods; } public setData(data: Record) { // todo: 校验数据,看是否符合 schema this.data = data; this.emit('change'); } public getDefaultData() { return getDefaultValueFromFields(this.#fields); } public async init() { this.isInit = true; } public destroy() { this.data = {}; this.#fields = []; this.removeAllListeners(); } }