@viewfly/core 0.0.1-alpha.1 → 0.0.1-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,23 +1,25 @@
1
1
  import { Provider, ReflectiveInjector, AbstractType, Type, InjectionToken, InjectFlags, Injector } from '@tanbo/di';
2
- import { JSXProps, JSXElement, Props } from './jsx-element';
3
- export interface ComponentFactory {
4
- (context: Injector): Component;
2
+ import { Props, JSXElement, Key, JSXTypeof } from './jsx-element';
3
+ export declare class JSXComponent {
4
+ createInstance: (injector: Component) => Component;
5
+ constructor(createInstance: (injector: Component) => Component);
5
6
  }
6
- export type JSXTemplate = JSXElement | ComponentFactory | null | void;
7
- export interface ComponentSetup {
8
- (props: JSXProps<any>): () => JSXTemplate;
7
+ export type JSXTemplate = JSXElement | JSXComponent | null | void;
8
+ export interface ComponentSetup<T extends Props<any> = Props<any>> {
9
+ (props?: T): () => JSXTemplate;
9
10
  }
10
11
  /**
11
12
  * Viewfly 组件管理类,用于管理组件的生命周期,上下文等
12
13
  */
13
- export declare class Component extends ReflectiveInjector {
14
+ export declare class Component extends ReflectiveInjector implements JSXTypeof {
14
15
  setup: ComponentSetup;
15
- config: JSXProps<any> | null;
16
+ props: Props<any>;
17
+ key?: Key | undefined;
18
+ $$typeOf: ComponentSetup<Props<any>>;
16
19
  destroyCallbacks: LifeCycleCallback[];
17
20
  mountCallbacks: LifeCycleCallback[];
18
21
  propsChangedCallbacks: PropsChangedCallback<any>[];
19
22
  updatedCallbacks: LifeCycleCallback[];
20
- props: Props;
21
23
  get dirty(): boolean;
22
24
  get changed(): boolean;
23
25
  protected _dirty: boolean;
@@ -26,7 +28,8 @@ export declare class Component extends ReflectiveInjector {
26
28
  private updatedDestroyCallbacks;
27
29
  private propsChangedDestroyCallbacks;
28
30
  private isFirstRending;
29
- constructor(context: Injector, setup: ComponentSetup, config: JSXProps<any> | null);
31
+ constructor(context: Injector, setup: ComponentSetup, props: Props<any>, key?: Key | undefined);
32
+ is(target: JSXTypeof): boolean;
30
33
  addProvide<T>(providers: Provider<T> | Provider<T>[]): void;
31
34
  init(): {
32
35
  template: JSXTemplate;
@@ -35,7 +38,7 @@ export declare class Component extends ReflectiveInjector {
35
38
  markAsDirtied(): void;
36
39
  markAsChanged(): void;
37
40
  rendered(): void;
38
- invokePropsChangedHooks(newProps: JSXProps<any> | null): void;
41
+ invokePropsChangedHooks(newProps: Props<any>): void;
39
42
  destroy(): void;
40
43
  private invokeMountHooks;
41
44
  private invokeUpdatedHooks;
@@ -43,7 +46,7 @@ export declare class Component extends ReflectiveInjector {
43
46
  export interface LifeCycleCallback {
44
47
  (): void | (() => void);
45
48
  }
46
- export interface PropsChangedCallback<T extends JSXProps<any>> {
49
+ export interface PropsChangedCallback<T extends Props<any>> {
47
50
  (currentProps: T | null, oldProps: T | null): void | (() => void);
48
51
  }
49
52
  /**
@@ -94,7 +97,7 @@ export declare function onUpdated(callback: LifeCycleCallback): () => void;
94
97
  * }
95
98
  * ```
96
99
  */
97
- export declare function onPropsChanged<T extends JSXProps<any>>(callback: PropsChangedCallback<T>): () => void;
100
+ export declare function onPropsChanged<T extends Props<any>>(callback: PropsChangedCallback<T>): () => void;
98
101
  /**
99
102
  * 当组件销毁时调用回调函数
100
103
  * @param callback
@@ -103,13 +106,13 @@ export declare function onDestroy(callback: () => void): void;
103
106
  export interface RefListener<T> {
104
107
  (current: T): void | (() => void);
105
108
  }
106
- export declare class Ref<T> {
109
+ export declare class Ref<T extends object> {
107
110
  private callback;
108
- private component;
109
- private unListenFn;
110
- constructor(callback: RefListener<T>, component: Component);
111
- update(value: T): void;
112
- unListen(): void;
111
+ private unBindMap;
112
+ private targetCaches;
113
+ constructor(callback: RefListener<T>);
114
+ bind(value: T): void;
115
+ unBind(value: T): void;
113
116
  }
114
117
  /**
115
118
  * 用于节点渲染完成时获取 DOM 节点
@@ -132,7 +135,7 @@ export declare class Ref<T> {
132
135
  * }
133
136
  * ```
134
137
  */
135
- export declare function useRef<T>(callback: RefListener<T>): Ref<T>;
138
+ export declare function useRef<T extends object>(callback: RefListener<T>): Ref<T>;
136
139
  declare const depsKey: unique symbol;
137
140
  /**
138
141
  * 组件状态实例,直接调用可以获取最新的状态,通过 set 方法可以更新状态
@@ -144,10 +147,10 @@ export interface Signal<T> {
144
147
  */
145
148
  (): T;
146
149
  /**
147
- * 更新组件状态的方法,可以传入最新的值,或者传入一个函数,并返回最新的值
150
+ * 更新组件状态的方法,可以传入最新的值
148
151
  * @param newState
149
152
  */
150
- set(newState: T | ((oldState: T) => T)): void;
153
+ set(newState: T): void;
151
154
  [depsKey]: Set<LifeCycleCallback>;
152
155
  }
153
156
  /**
@@ -174,14 +177,35 @@ export interface Signal<T> {
174
177
  * }
175
178
  */
176
179
  export declare function useSignal<T>(state: T): Signal<T>;
180
+ /**
181
+ * 使用派生值,Viewfly 会收集回调函数内同步执行时访问的 Signal,
182
+ * 并在你获取 useDerived 函数返回的 Signal 的值时,自动计算最新的值。
183
+ *
184
+ * @param callback
185
+ * @param isContinue 可选的停止函数,在每次值更新后调用,当返回值为 false 时,将不再监听依赖的变化
186
+ */
187
+ export declare function useDerived<T>(callback: () => T, isContinue?: (data: T) => unknown): Signal<T>;
188
+ export interface EffectCallback<T, U> {
189
+ (newValue: T, oldValue: U): void | (() => void);
190
+ }
177
191
  /**
178
192
  * 监听状态变化,当任意一个状态发生变更时,触发回调。
179
193
  * useEffect 会返回一个取消监听的函数,调用此函数,可以取消监听。
180
194
  * 当在组件中调用时,组件销毁时会自动取消监听。
181
- * @param deps 依赖的状态 Signal,可以是一个 Signal,只可以一个数包含 Signal 的数组
195
+ * @param deps 依赖的状态 Signal,可以是一个 Signal,只可以一个数包含 Signal 的数组,或者是一个求值函数
182
196
  * @param effect 状态变更后的回调函数
183
197
  */
184
- export declare function useEffect(deps: Signal<any> | Signal<any>[], effect: LifeCycleCallback): () => void;
198
+ export declare function useEffect<T>(deps: Signal<T>, effect: EffectCallback<T, T>): () => void;
199
+ export declare function useEffect<T>(deps: [Signal<T>], effect: EffectCallback<[T], [T]>): () => void;
200
+ export declare function useEffect<T, T1>(deps: [Signal<T>, Signal<T1>], effect: EffectCallback<[T, T1], [T, T1]>): () => void;
201
+ export declare function useEffect<T, T1, T2>(deps: [Signal<T>, Signal<T1>, Signal<T2>], effect: EffectCallback<[T, T1, T2], [T, T1, T2]>): () => void;
202
+ export declare function useEffect<T, T1, T2, T3>(deps: [Signal<T>, Signal<T1>, Signal<T2>, Signal<T3>], effect: EffectCallback<[T, T1, T2, T3], [T, T1, T2, T3]>): () => void;
203
+ export declare function useEffect<T, T1, T2, T3, T4>(deps: [Signal<T>, Signal<T1>, Signal<T2>, Signal<T3>, Signal<T4>], effect: EffectCallback<[T, T1, T2, T3, T4], [T, T1, T2, T3, T4]>): () => void;
204
+ export declare function useEffect<T, T1, T2, T3, T4, T5>(deps: [Signal<T>, Signal<T1>, Signal<T2>, Signal<T3>, Signal<T4>, Signal<T5>], effect: EffectCallback<[T, T1, T2, T3, T4, T5], [T, T1, T2, T3, T4, T5]>): () => void;
205
+ export declare function useEffect<T, T1, T2, T3, T4, T5, T6>(deps: [Signal<T>, Signal<T1>, Signal<T2>, Signal<T3>, Signal<T4>, Signal<T5>, Signal<T6>], effect: EffectCallback<[T, T1, T2, T3, T4, T5, T6], [T, T1, T2, T3, T4, T5, T6]>): () => void;
206
+ export declare function useEffect<T, T1, T2, T3, T4, T5, T6, T7>(deps: [Signal<T>, Signal<T1>, Signal<T2>, Signal<T3>, Signal<T4>, Signal<T5>, Signal<T6>, Signal<T7>], effect: EffectCallback<[T, T1, T2, T3, T4, T5, T6, T7], [T, T1, T2, T3, T4, T5, T6, T7]>): () => void;
207
+ export declare function useEffect<T>(deps: () => T, effect: EffectCallback<T, T>): () => void;
208
+ export declare function useEffect<T = any>(deps: Signal<any>[], effect: EffectCallback<T[], T[]>): () => void;
185
209
  /**
186
210
  * 通过 IoC 容器当前组件提供上下文共享数据的方法
187
211
  * @param provider
@@ -1,39 +1,31 @@
1
- import { ComponentFactory, ComponentSetup } from './component';
2
- export type JSXChildNode = JSXElement | ComponentFactory | string | number | boolean | null | undefined;
3
- export interface JSXProps<T = JSXChildNode | JSXChildNode[]> {
1
+ import { JSXComponent, ComponentSetup } from './component';
2
+ export type JSXChildNode = JSXElement | JSXComponent | string | number | boolean | null | undefined | JSXChildNode[];
3
+ export interface Props<T = JSXChildNode | JSXChildNode[]> {
4
4
  children?: T;
5
5
  [key: string]: any;
6
6
  [key: symbol]: any;
7
7
  }
8
- export declare function Fragment(props: Props | null): () => JSXFragment;
9
- export declare class JSXFragment {
10
- props: Props | null;
11
- constructor(props: Props | null);
8
+ export declare const Fragment: () => never;
9
+ export type Key = number | string;
10
+ export declare function jsx<T extends JSXChildNode>(name: string, config: Props<T>, key?: Key): JSXElement;
11
+ export declare function jsx<T extends JSXChildNode>(setup: ComponentSetup, config: Props<T>, key?: Key): JSXComponent;
12
+ export declare function jsxs<T extends JSXChildNode[]>(name: string, config: Props<T>, key?: Key): JSXElement;
13
+ export declare function jsxs<T extends JSXChildNode[]>(setup: ComponentSetup, config: Props<T>, key?: Key): JSXComponent;
14
+ export interface JSXTypeof {
15
+ $$typeOf: string | ComponentSetup;
16
+ is(target: JSXTypeof): boolean;
12
17
  }
13
- export declare function jsx<T extends JSXChildNode>(name: string, config: JSXProps<T> | null): JSXElement;
14
- export declare function jsx<T extends JSXChildNode>(setup: ComponentSetup, config: JSXProps<T> | null): ComponentFactory;
15
- export declare function jsxs<T extends JSXChildNode[]>(name: string, config: JSXProps<T> | null): JSXElement;
16
- export declare function jsxs<T extends JSXChildNode[]>(setup: ComponentSetup, config: JSXProps<T> | null): ComponentFactory;
17
- export interface VElementListeners {
18
- [listenKey: string]: <T extends Event>(ev: T) => any;
19
- }
20
- export declare class JSXText {
18
+ export declare class JSXText implements JSXTypeof {
21
19
  text: string;
20
+ $$typeOf: string;
22
21
  constructor(text: string);
22
+ is(target: JSXTypeof): boolean;
23
23
  }
24
- export type VNode = JSXElement | ComponentFactory | JSXText;
25
- export declare class Props {
26
- attrs: Map<string, any>;
27
- styles: Map<string, string | number>;
28
- classes: Set<string>;
29
- listeners: VElementListeners;
30
- children: VNode[];
31
- constructor(props: JSXProps<JSXChildNode> | JSXProps<JSXChildNode[]> | null);
32
- static classToArray(config: unknown): string[];
33
- }
34
- export declare class JSXElement {
24
+ export declare class JSXElement implements JSXTypeof {
35
25
  name: string;
36
- config: JSXProps<any> | null;
37
- props: Props;
38
- constructor(name: string, config: JSXProps<any> | null);
26
+ props: Props<any>;
27
+ key?: Key | undefined;
28
+ $$typeOf: string;
29
+ constructor(name: string, props: Props<any>, key?: Key | undefined);
30
+ is(target: JSXTypeof): boolean;
39
31
  }
@@ -1,10 +1,11 @@
1
1
  import { Subject } from '@tanbo/stream';
2
+ import { NullInjector } from '@tanbo/di';
2
3
  import { Component, ComponentSetup } from './component';
3
4
  /**
4
5
  * Viewfly 根组件,用于实现组件状态更新事件通知
5
6
  */
6
7
  export declare class RootComponent extends Component {
7
8
  changeEmitter: Subject<void>;
8
- constructor(factory: ComponentSetup);
9
+ constructor(factory: ComponentSetup, parentInjector?: NullInjector);
9
10
  markAsChanged(): void;
10
11
  }
@@ -1,5 +1,6 @@
1
1
  import 'reflect-metadata';
2
2
  export * from '@tanbo/di';
3
+ export * from './_utils/make-error';
3
4
  export * from './foundation/_api';
4
5
  export * from './model/_api';
5
6
  export * from './viewfly';
@@ -1,7 +1,7 @@
1
- import { Provider, ReflectiveInjector } from '@tanbo/di';
1
+ import { Injector, Provider, ReflectiveInjector } from '@tanbo/di';
2
2
  import { NativeNode } from './foundation/_api';
3
- import { ComponentFactory, JSXElement } from './model/_api';
4
- export type RootNode = JSXElement | ComponentFactory;
3
+ import { JSXComponent, JSXElement } from './model/_api';
4
+ export type RootNode = JSXElement | JSXComponent;
5
5
  /**
6
6
  * Viewfly 配置项
7
7
  */
@@ -14,6 +14,8 @@ export interface Config {
14
14
  autoUpdate?: boolean;
15
15
  /** 根节点 */
16
16
  root: RootNode;
17
+ /** 根组件的上下文 */
18
+ context?: Injector;
17
19
  }
18
20
  /**
19
21
  * Viewfly 核心类,用于启动一个 Viewfly 应用
@@ -27,7 +29,7 @@ export declare class Viewfly extends ReflectiveInjector {
27
29
  /**
28
30
  * 启动 Viewfly
29
31
  */
30
- start(): void;
32
+ run(): void;
31
33
  /**
32
34
  * 销毁 Viewfly 实例
33
35
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viewfly/core",
3
- "version": "0.0.1-alpha.1",
3
+ "version": "0.0.1-alpha.10",
4
4
  "description": "Viewfly is a simple and easy-to-use JavaScript framework with an intuitive development experience.",
5
5
  "main": "./bundles/index.js",
6
6
  "module": "./bundles/index.esm.js",
@@ -16,7 +16,8 @@
16
16
  "keywords": [],
17
17
  "dependencies": {
18
18
  "@tanbo/di": "^1.1.4",
19
- "@tanbo/stream": "^1.1.9"
19
+ "@tanbo/stream": "^1.1.9",
20
+ "reflect-metadata": "^0.1.13"
20
21
  },
21
22
  "devDependencies": {
22
23
  "@rollup/plugin-commonjs": "^23.0.2",
@@ -36,5 +37,5 @@
36
37
  "bugs": {
37
38
  "url": "https://github.com/viewfly/viewfly.git/issues"
38
39
  },
39
- "gitHead": "abca65615d81e3a6617d5fe588cdf38142a3523a"
40
+ "gitHead": "6e542df7602aec6a451b2db9a89928ad8bb9f05a"
40
41
  }