给两处assert添加错误信息

This commit is contained in:
pqcqaq 2024-12-06 22:20:09 +08:00
parent c7e8d113de
commit 61c7e39867
4 changed files with 206 additions and 26 deletions

86
es/types/Page.d.ts vendored
View File

@ -37,32 +37,63 @@ type FeatureDef<IsList extends boolean, ED extends EntityDict & BaseEntityDict,
type DevideWidth = 'pc' | 'mobile';
export type CreateDataDef<ED extends EntityDict & BaseEntityDict, T extends keyof ED> = ED[T]['CreateSingle']['data'] | (() => ED[T]['CreateSingle']['data']);
interface ComponentOption<IsList extends boolean, ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED>, FrontCxt extends SyncContext<ED>, AD extends Record<string, Aspect<ED, Cxt>>, FD extends Record<string, Feature>, FormedData extends Record<string, any>, TData extends DataOption, TProperty extends DataOption, TMethod extends Record<string, Function>, EMethod extends Record<string, Function> = {}> {
/**
*
*/
isList?: IsList;
zombie?: true;
getTotal?: {
max: number;
deviceWidth?: DevideWidth | 'all';
} | number;
/**
*
*/
entity?: T | ((this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => T);
path?: string;
/**
* features
*/
features?: FeatureDef<IsList, ED, T, Cxt, FrontCxt, AD, FD, FormedData, TData, TProperty, TMethod, EMethod>[];
cascadeActions?: (this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => {
[K in keyof ED[T]['Schema']]?: ActionDef<ED, keyof ED>[];
};
/**
* actions
*/
actions?: ActionDef<ED, T>[] | ((this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => ActionDef<ED, T>[]);
/**
*
* list中list组件能够覆盖子组件的projection
*/
projection?: ED[T]['Selection']['data'] | ((this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => ED[T]['Selection']['data'] | undefined);
append?: boolean;
/**
*
*/
pagination?: Pick<Pagination, 'currentPage' | 'pageSize' | 'randomRange'> | Array<Pick<Pagination, 'currentPage' | 'pageSize' | 'randomRange'> & {
deviceWidth: DevideWidth;
}>;
/**
*
*/
filters?: Array<{
filter: NonNullable<ED[T]['Selection']['filter']> | ((this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => ED[T]['Selection']['filter'] | undefined);
'#name'?: string;
}>;
/**
*
*/
sorters?: Array<{
sorter: NonNullable<ED[T]['Selection']['sorter']>[number] | ((this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => ED[T]['Selection']['sorter'] | NonNullable<ED[T]['Selection']['sorter']>[number]);
'#name'?: string;
}>;
/**
*
* data中
* @param options
* @returns
*/
formData?: (options: {
data: IsList extends true ? RowWithActions<ED, T>[] : RowWithActions<ED, T>;
origin?: IsList extends true ? RowWithActions<ED, T>[] : RowWithActions<ED, T>;
@ -74,8 +105,17 @@ interface ComponentOption<IsList extends boolean, ED extends EntityDict & BaseEn
modified: boolean;
}) => FormedData;
ns?: T | T[];
/**
* State数据
*/
data?: ((this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => TData) | TData;
/**
* prop参数
*/
properties?: TProperty;
/**
*
*/
methods?: TMethod;
}
export type MiniprogramStyleMethods = {
@ -106,17 +146,63 @@ export type ComponentFullThisType<ED extends EntityDict & BaseEntityDict, T exte
oakLifetime: OakLifetime;
} & OakCommonComponentMethods<ED, T> & OakListComponentMethods<ED, T> & OakSingleComponentMethods<ED, T>;
export type OakComponentOption<IsList extends boolean, ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED>, FrontCxt extends SyncContext<ED>, AD extends Record<string, Aspect<ED, AsyncContext<ED>>>, FD extends Record<string, Feature>, FormedData extends Record<string, any>, TData extends Record<string, any>, TProperty extends DataOption, TMethod extends Record<string, Function>, EMethod extends Record<string, Function> = {}> = ComponentOption<IsList, ED, T, Cxt, FrontCxt, AD, FD, FormedData, TData, TProperty, TMethod, EMethod> & Partial<{
/**
*
*/
lifetimes: {
/**
*
* sync only
*/
created?(): void;
/**
*
* sync only
*/
attached?(): void;
/**
*
* async or sync
*/
ready?(): any;
/**
*
* sync only
*/
moved?(): void;
/**
*
* sync only
*/
detached?(): void;
/**
*
* sync only
* @param err
*/
error?(err: Error): void;
/**
*
* sync only
*/
show?(): void;
/**
*
* sync only
*/
hide?(): void;
/**
*
* sync only
* @param size
*/
resize?(size: WechatMiniprogram.Page.IResizeOption): void;
};
/**
* State或者Props的变化
*
* (prev, next) => void
*/
listeners: Record<string, (this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>, prev: Record<string, any>, next: Record<string, any>) => void>;
}> & Partial<{
wechatMp: {

86
lib/types/Page.d.ts vendored
View File

@ -37,32 +37,63 @@ type FeatureDef<IsList extends boolean, ED extends EntityDict & BaseEntityDict,
type DevideWidth = 'pc' | 'mobile';
export type CreateDataDef<ED extends EntityDict & BaseEntityDict, T extends keyof ED> = ED[T]['CreateSingle']['data'] | (() => ED[T]['CreateSingle']['data']);
interface ComponentOption<IsList extends boolean, ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED>, FrontCxt extends SyncContext<ED>, AD extends Record<string, Aspect<ED, Cxt>>, FD extends Record<string, Feature>, FormedData extends Record<string, any>, TData extends DataOption, TProperty extends DataOption, TMethod extends Record<string, Function>, EMethod extends Record<string, Function> = {}> {
/**
*
*/
isList?: IsList;
zombie?: true;
getTotal?: {
max: number;
deviceWidth?: DevideWidth | 'all';
} | number;
/**
*
*/
entity?: T | ((this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => T);
path?: string;
/**
* features
*/
features?: FeatureDef<IsList, ED, T, Cxt, FrontCxt, AD, FD, FormedData, TData, TProperty, TMethod, EMethod>[];
cascadeActions?: (this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => {
[K in keyof ED[T]['Schema']]?: ActionDef<ED, keyof ED>[];
};
/**
* actions
*/
actions?: ActionDef<ED, T>[] | ((this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => ActionDef<ED, T>[]);
/**
*
* list中list组件能够覆盖子组件的projection
*/
projection?: ED[T]['Selection']['data'] | ((this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => ED[T]['Selection']['data'] | undefined);
append?: boolean;
/**
*
*/
pagination?: Pick<Pagination, 'currentPage' | 'pageSize' | 'randomRange'> | Array<Pick<Pagination, 'currentPage' | 'pageSize' | 'randomRange'> & {
deviceWidth: DevideWidth;
}>;
/**
*
*/
filters?: Array<{
filter: NonNullable<ED[T]['Selection']['filter']> | ((this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => ED[T]['Selection']['filter'] | undefined);
'#name'?: string;
}>;
/**
*
*/
sorters?: Array<{
sorter: NonNullable<ED[T]['Selection']['sorter']>[number] | ((this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => ED[T]['Selection']['sorter'] | NonNullable<ED[T]['Selection']['sorter']>[number]);
'#name'?: string;
}>;
/**
*
* data中
* @param options
* @returns
*/
formData?: (options: {
data: IsList extends true ? RowWithActions<ED, T>[] : RowWithActions<ED, T>;
origin?: IsList extends true ? RowWithActions<ED, T>[] : RowWithActions<ED, T>;
@ -74,8 +105,17 @@ interface ComponentOption<IsList extends boolean, ED extends EntityDict & BaseEn
modified: boolean;
}) => FormedData;
ns?: T | T[];
/**
* State数据
*/
data?: ((this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>) => TData) | TData;
/**
* prop参数
*/
properties?: TProperty;
/**
*
*/
methods?: TMethod;
}
export type MiniprogramStyleMethods = {
@ -106,17 +146,63 @@ export type ComponentFullThisType<ED extends EntityDict & BaseEntityDict, T exte
oakLifetime: OakLifetime;
} & OakCommonComponentMethods<ED, T> & OakListComponentMethods<ED, T> & OakSingleComponentMethods<ED, T>;
export type OakComponentOption<IsList extends boolean, ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED>, FrontCxt extends SyncContext<ED>, AD extends Record<string, Aspect<ED, AsyncContext<ED>>>, FD extends Record<string, Feature>, FormedData extends Record<string, any>, TData extends Record<string, any>, TProperty extends DataOption, TMethod extends Record<string, Function>, EMethod extends Record<string, Function> = {}> = ComponentOption<IsList, ED, T, Cxt, FrontCxt, AD, FD, FormedData, TData, TProperty, TMethod, EMethod> & Partial<{
/**
*
*/
lifetimes: {
/**
*
* sync only
*/
created?(): void;
/**
*
* sync only
*/
attached?(): void;
/**
*
* async or sync
*/
ready?(): any;
/**
*
* sync only
*/
moved?(): void;
/**
*
* sync only
*/
detached?(): void;
/**
*
* sync only
* @param err
*/
error?(err: Error): void;
/**
*
* sync only
*/
show?(): void;
/**
*
* sync only
*/
hide?(): void;
/**
*
* sync only
* @param size
*/
resize?(size: WechatMiniprogram.Page.IResizeOption): void;
};
/**
* State或者Props的变化
*
* (prev, next) => void
*/
listeners: Record<string, (this: ComponentPublicThisType<ED, T, Cxt, FrontCxt, AD, FD, FormedData, IsList, TData, TProperty, TMethod, EMethod>, prev: Record<string, any>, next: Record<string, any>) => void>;
}> & Partial<{
wechatMp: {

View File

@ -250,6 +250,9 @@ class UpdateLogManager<ED extends EntityDict & BaseEntityDict, T extends keyof E
abstract class Node<ED extends EntityDict & BaseEntityDict> extends Feature {
private zombie: boolean = false;
/**
* 使
*/
private count: number = 0;
protected executing: boolean = false;
protected dirty?: boolean;
@ -2160,9 +2163,12 @@ export class RunningTree<ED extends EntityDict & BaseEntityDict> extends Feature
| VirtualNode<ED>
| undefined);
// 找到了之前的node需要检查是否需要重用
if (node) {
if (node.getCount()) {
assert(!isPage || zombie, '暂时在路由上可能回归的页面必须设置为zombie');
if (node.getCount()) { // 有组件正在使用
// 页面组件已经被销毁现在重新挂载提示需要zombie
assert(!isPage || zombie, '暂时在路由上可能回归的页面必须设置为zombie'); // 是页面并且不是zombie
// 这次非virtualNode
if (entity) {
if (node instanceof ListNode) {
if (isList && node.getEntity() === entity) {
@ -2187,8 +2193,8 @@ export class RunningTree<ED extends EntityDict & BaseEntityDict> extends Feature
}
}
else {
assert(node instanceof SingleNode);
assert(!isList && node.getEntity() === entity);
assert(node instanceof SingleNode, `节点[${path}]应为Virtual节点但现在是[${entity.toString()}]请检查oakPath是否重复`);
assert(!isList && node.getEntity() === entity, `节点${path}的entity为${node.getEntity().toString()},但现在为${entity.toString()}请检查oakPath是否重复`);
if (!node.getProjection() && projection) {
node.setProjection(projection);
if (id) {
@ -2202,8 +2208,10 @@ export class RunningTree<ED extends EntityDict & BaseEntityDict> extends Feature
}
}
}
// 上次不是virtualNode这次变成virtual了
else {
assert(false, '这种情况暂时不考虑跑出来再处理by Xc 20240717');
assert(false, `创建Virtual节点时发现path[${fullPath}]已经存在有效的结点请检查oakPath是否重复`);
// assert(false, '这种情况暂时不考虑跑出来再处理by Xc 20240717');
}
}
else {
@ -2321,26 +2329,28 @@ export class RunningTree<ED extends EntityDict & BaseEntityDict> extends Feature
destroyNode(path: string, isPage: boolean) {
const node = this.findNode(path);
if (node) {
// 如果node不存在说明父结点已经析构掉了无视即可
const cnt = node.decreaseCount();
if (cnt === 0) {
const zombie = node.isZombie();
if (!zombie) {
// 不是声明为zombie结点就析构
const childPath = path.slice(path.lastIndexOf('.') + 1);
const parent = node.getParent();
if (parent) {
parent.removeChild(childPath);
} else if (!parent) {
assert(this.root.hasOwnProperty(path));
unset(this.root, path);
}
node.destroy();
node.clearSubscribes();
}
}
// 如果node不存在说明父结点已经析构掉了无视即可
if (!node) {
return;
}
const cnt = node.decreaseCount();
if (cnt !== 0) {
return;
}
if (node.isZombie()) {
return;
}
// 不是声明为zombie结点就析构
const childPath = path.slice(path.lastIndexOf('.') + 1);
const parent = node.getParent();
if (parent) {
parent.removeChild(childPath);
} else if (!parent) {
assert(this.root.hasOwnProperty(path));
unset(this.root, path);
}
node.destroy();
node.clearSubscribes();
}
begin() {

View File

@ -730,8 +730,6 @@ export function destroyNode<
unset(this.state, ['oakFullpath', 'oakEntity']);
}
export function getFreshValue<
ED extends EntityDict & BaseEntityDict,
T extends keyof ED