feat: assets.components support reference field (#1355)

* feat: 资产包协议兼容低代码组件物料
This commit is contained in:
wangwei 2022-12-13 10:31:44 +08:00 committed by GitHub
parent de3443a9dc
commit f9dcbaf618
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 118 additions and 12 deletions

View File

@ -18,6 +18,7 @@ import { globalLocale } from './intl';
import Preference from './utils/preference'; import Preference from './utils/preference';
import { obx } from './utils'; import { obx } from './utils';
import { AssetsJson, AssetLoader } from '@alilc/lowcode-utils'; import { AssetsJson, AssetLoader } from '@alilc/lowcode-utils';
import { assetsTransform } from './utils/assets-transform';
EventEmitter.defaultMaxListeners = 100; EventEmitter.defaultMaxListeners = 100;
@ -124,7 +125,8 @@ export class Editor extends (EventEmitter as any) implements IEditor {
); );
} }
} }
this.context.set('assets', assets); const innerAssets = assetsTransform(assets);
this.context.set('assets', innerAssets);
this.notifyGot('assets'); this.notifyGot('assets');
} }
@ -145,7 +147,7 @@ export class Editor extends (EventEmitter as any) implements IEditor {
const x = this.context.get(keyOrType); const x = this.context.get(keyOrType);
if (x !== undefined) { if (x !== undefined) {
fn(x); fn(x);
return () => {}; return () => { };
} else { } else {
this.setWait(keyOrType, fn); this.setWait(keyOrType, fn);
return () => { return () => {
@ -169,7 +171,7 @@ export class Editor extends (EventEmitter as any) implements IEditor {
const { hooks = [], lifeCycles } = this.config; const { hooks = [], lifeCycles } = this.config;
this.emit('editor.beforeInit'); this.emit('editor.beforeInit');
const init = (lifeCycles && lifeCycles.init) || ((): void => {}); const init = (lifeCycles && lifeCycles.init) || ((): void => { });
try { try {
await init(this); await init(this);
@ -231,11 +233,11 @@ export class Editor extends (EventEmitter as any) implements IEditor {
/* eslint-disable */ /* eslint-disable */
private waits = new Map< private waits = new Map<
KeyType, KeyType,
Array<{ Array<{
once?: boolean; once?: boolean;
resolve: (data: any) => void; resolve: (data: any) => void;
}> }>
>(); >();
/* eslint-enable */ /* eslint-enable */

View File

@ -0,0 +1,26 @@
import { AssetsJson, ComponentDescription } from '@alilc/lowcode-types';
export function assetsTransform(assets: AssetsJson) {
const { components, packages } = assets;
const packageMaps = (packages || []).reduce((acc, cur) => {
const key = (cur.id || cur.package) as string;
acc[key] = cur;
return acc;
}, {} as any);
components.forEach((componentDesc) => {
let { devMode, schema, reference } = componentDesc as ComponentDescription;
if ((devMode as string) === 'lowcode') {
devMode = 'lowCode';
} else if (devMode === 'proCode') {
devMode = 'proCode';
}
if (devMode) {
(componentDesc as ComponentDescription).devMode = devMode;
}
if (devMode === 'lowCode' && !schema && reference) {
(componentDesc as ComponentDescription).schema = packageMaps[reference.id as string].schema;
}
});
return assets;
}

View File

@ -1,5 +1,7 @@
import { Snippet, ComponentMetadata } from './metadata'; import { Snippet, ComponentMetadata } from './metadata';
import { I18nData } from './i18n'; import { I18nData } from './i18n';
import { Reference } from './npm';
import { EitherOr } from './utils';
export interface AssetItem { export interface AssetItem {
type: AssetType; type: AssetType;
@ -103,11 +105,15 @@ export interface ComponentSort {
* external * external
* *
*/ */
export interface Package { export type Package = EitherOr<{
/** /**
* * npm
*/ */
package: string; package: string;
/**
*
*/
id: string;
/** /**
* *
*/ */
@ -142,7 +148,7 @@ export interface Package {
* window[exportName] Object * window[exportName] Object
*/ */
exportName?: string; exportName?: string;
} }, 'package', 'id'>;
/** /**
* *
@ -208,6 +214,10 @@ export interface ComponentDescription extends ComponentMetadata {
* @todo @jinchan * @todo @jinchan
*/ */
keywords: string[]; keywords: string[];
/**
* npm
*/
reference?: Reference;
} }
/** /**

View File

@ -1,4 +1,4 @@
import { EitherOr } from './utils';
/** /**
* npm * npm
*/ */
@ -33,6 +33,40 @@ export interface NpmInfo {
main?: string; main?: string;
} }
/**
* Npm
*/
export type Reference = EitherOr<{
/**
* id
*/
id: string;
/**
*
*/
package: string;
/**
*
*/
exportName: string;
/**
* exportName
*/
subName: string;
/**
*
*/
main?: string;
/**
*
*/
destructuring?: boolean;
/**
*
*/
version: string;
}, 'package', 'id'>;
export interface LowCodeComponentType { export interface LowCodeComponentType {
/** /**
* *

View File

@ -15,3 +15,37 @@ export type ExternalUtils = {
export type UtilItem = InternalUtils | ExternalUtils; export type UtilItem = InternalUtils | ExternalUtils;
export type UtilsMap = UtilItem[]; export type UtilsMap = UtilItem[];
type FilterOptional<T> = Pick<
T,
Exclude<
{
[K in keyof T]: T extends Record<K, T[K]> ? K : never;
}[keyof T],
undefined
>
>;
type FilterNotOptional<T> = Pick<
T,
Exclude<
{
[K in keyof T]: T extends Record<K, T[K]> ? never : K;
}[keyof T],
undefined
>
>;
type PartialEither<T, K extends keyof any> = { [P in Exclude<keyof FilterOptional<T>, K>]-?: T[P] } &
{ [P in Exclude<keyof FilterNotOptional<T>, K>]?: T[P] } &
{ [P in Extract<keyof T, K>]?: undefined };
type Object = {
[name: string]: any;
};
export type EitherOr<O extends Object, L extends string, R extends string> =
(
PartialEither<Pick<O, L | R>, L> |
PartialEither<Pick<O, L | R>, R>
) & Omit<O, L | R>;