Browse Source

Add datasource types

pull/6295/head
mohamedsalem401 1 year ago
parent
commit
5717612ec4
  1. 28
      packages/core/src/data_sources/model/DataSource.ts
  2. 20
      packages/core/src/data_sources/types.ts

28
packages/core/src/data_sources/model/DataSource.ts

@ -31,14 +31,16 @@
import { AddOptions, collectionEvents, CombinedModelConstructorOptions, Model, RemoveOptions } from '../../common';
import EditorModel from '../../editor/model/Editor';
import { DataRecordProps, DataSourceProps, DataSourceTransformers } from '../types';
import { DataSourceProps } from '../types';
import { DataSourceTransformers, DataSourceType, SingleRecordType } from '../types';
import DataRecord from './DataRecord';
import DataRecords from './DataRecords';
import DataSources from './DataSources';
interface DataSourceOptions extends CombinedModelConstructorOptions<{ em: EditorModel }, DataSource> {}
type Record<DS extends DataSourceType> = SingleRecordType<DS['records']>;
export default class DataSource<DS extends DataSourceProps = DataSourceProps> extends Model<DS> {
export default class DataSource<DS extends DataSourceType = DataSourceType> extends Model<DS> {
transformers: DataSourceTransformers;
/**
@ -64,8 +66,12 @@ export default class DataSource<DS extends DataSourceProps = DataSourceProps> ex
* @param {DataSourceOptions} opts - Options to initialize the data source.
* @name constructor
*/
constructor(props: DS, opts: DataSourceOptions) {
super(props, opts);
constructor(props: DataSourceProps<DS>, opts: DataSourceOptions) {
const pr = {
...props,
records: [],
} as unknown as DS;
super(pr, opts);
const { records, transformers } = props;
this.transformers = transformers || {};
@ -84,7 +90,7 @@ export default class DataSource<DS extends DataSourceProps = DataSourceProps> ex
* @name records
*/
get records() {
return this.attributes.records as NonNullable<DS['_records']>;
return this.attributes.records as NonNullable<DS['records']>;
}
/**
@ -117,7 +123,7 @@ export default class DataSource<DS extends DataSourceProps = DataSourceProps> ex
* @returns {DataRecord} The added data record.
* @name addRecord
*/
addRecord<T extends DataRecordProps = DataRecordProps>(record: T, opts?: AddOptions) {
addRecord(record: Record<DS>, opts?: AddOptions) {
return this.records.add(record, opts);
}
@ -128,8 +134,8 @@ export default class DataSource<DS extends DataSourceProps = DataSourceProps> ex
* @returns {DataRecord | undefined} The data record, or `undefined` if no record is found with the given ID.
* @name getRecord
*/
getRecord<T extends DataRecordProps = DataRecordProps>(id: string | number) {
return this.records.get(id) as DataRecord<T> | undefined;
getRecord(id: string | number) {
return this.records.get(id) as Record<DS> | undefined;
}
/**
@ -139,8 +145,8 @@ export default class DataSource<DS extends DataSourceProps = DataSourceProps> ex
* @returns {Array<DataRecord | undefined>} An array of data records.
* @name getRecords
*/
getRecords<T extends DataRecordProps = DataRecordProps>() {
return [...this.records.models].map((record) => this.getRecord<T>(record.id)!);
getRecords() {
return [...this.records.models].map((record) => this.getRecord(record.id)!);
}
/**
@ -167,7 +173,7 @@ export default class DataSource<DS extends DataSourceProps = DataSourceProps> ex
* @returns {Array<DataRecord>} An array of the added data records.
* @name setRecords
*/
setRecords<T extends DataRecordProps = DataRecordProps>(records: T[]) {
setRecords(records: Record<DS>[]) {
this.records.reset([], { silent: true });
records.forEach((record) => {

20
packages/core/src/data_sources/types.ts

@ -1,4 +1,4 @@
import { ObjectAny } from '../common';
import { Collection, ObjectAny } from '../common';
import ComponentDataVariable from './model/ComponentDataVariable';
import DataRecord from './model/DataRecord';
import DataRecords from './model/DataRecords';
@ -24,17 +24,12 @@ export interface DataVariableListener {
event: string;
}
export interface DataSourceProps<DR extends DataRecordProps = DataRecordProps> {
interface BaseDataSource {
/**
* DataSource id.
*/
id: string;
/**
* DataSource records.
*/
records?: DataRecords<DR> | DataRecord<DR>[] | DR[];
/**
* DataSource validation and transformation factories.
*/
@ -44,10 +39,15 @@ export interface DataSourceProps<DR extends DataRecordProps = DataRecordProps> {
* If true will store the data source in the GrapesJS project.json file.
*/
skipFromStorage?: boolean;
// for TS
_records?: DataRecords<DR>;
}
export interface DataSourceType<DR extends DataRecordProps = DataRecordProps> extends BaseDataSource {
records: DataRecords<DR>;
}
export interface DataSourceProps<DS extends DataSourceType = DataSourceType> extends BaseDataSource {
records?: DataRecords<ExtractRecordType<DS>> | DataRecord<ExtractRecordType<DS>>[] | ExtractRecordType<DS>[];
}
export type ExtractRecordType<T> = T extends { records: DataRecords<infer DR> } ? DR : never;
export type SingleRecordType<T> = T extends Collection<infer U> ? U : never;
export interface DataSourceTransformers {
onRecordSetValue?: (args: { id: string | number; key: string; value: any }) => any;

Loading…
Cancel
Save