@feng3d/reactivity 0.0.1 → 1.0.2

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.
Files changed (45) hide show
  1. package/README.md +124 -26
  2. package/dist/index.js +1018 -58
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.umd.cjs +1017 -57
  5. package/dist/index.umd.cjs.map +1 -1
  6. package/lib/Reactivity.d.ts +69 -0
  7. package/lib/Reactivity.d.ts.map +1 -0
  8. package/lib/arrayInstrumentations.d.ts +2 -0
  9. package/lib/arrayInstrumentations.d.ts.map +1 -0
  10. package/lib/baseHandlers.d.ts +5 -0
  11. package/lib/baseHandlers.d.ts.map +1 -0
  12. package/lib/batch.d.ts +23 -0
  13. package/lib/batch.d.ts.map +1 -0
  14. package/lib/collectionHandlers.d.ts +7 -0
  15. package/lib/collectionHandlers.d.ts.map +1 -0
  16. package/lib/computed.d.ts +94 -0
  17. package/lib/computed.d.ts.map +1 -0
  18. package/lib/effect.d.ts +52 -0
  19. package/lib/effect.d.ts.map +1 -0
  20. package/lib/index.d.ts +7 -18
  21. package/lib/index.d.ts.map +1 -1
  22. package/lib/property.d.ts +44 -0
  23. package/lib/property.d.ts.map +1 -0
  24. package/lib/reactive.d.ts +66 -0
  25. package/lib/reactive.d.ts.map +1 -0
  26. package/lib/ref.d.ts +41 -0
  27. package/lib/ref.d.ts.map +1 -0
  28. package/lib/shared/constants.d.ts +34 -0
  29. package/lib/shared/constants.d.ts.map +1 -0
  30. package/lib/shared/general.d.ts +36 -0
  31. package/lib/shared/general.d.ts.map +1 -0
  32. package/package.json +3 -2
  33. package/src/Reactivity.ts +126 -0
  34. package/src/arrayInstrumentations.ts +448 -0
  35. package/src/baseHandlers.ts +220 -0
  36. package/src/batch.ts +91 -0
  37. package/src/collectionHandlers.ts +298 -0
  38. package/src/computed.ts +201 -0
  39. package/src/effect.ts +108 -0
  40. package/src/index.ts +7 -200
  41. package/src/property.ts +223 -0
  42. package/src/reactive.ts +130 -0
  43. package/src/ref.ts +88 -0
  44. package/src/shared/constants.ts +41 -0
  45. package/src/shared/general.ts +109 -0
@@ -0,0 +1,66 @@
1
+ import { Computed } from './computed';
2
+ import { Ref } from './ref';
3
+ import { Target } from './shared/general';
4
+ /**
5
+ * 创建或者获取响应式对象的代理对象。
6
+ *
7
+ * @param target 被响应式的对象。
8
+ * @returns 响应式代理对象。
9
+ *
10
+ * 注意:
11
+ *
12
+ * 扩大被反应式的对象的类型范围,只有`Object.isExtensible`不通过的对象不被响应化。Float32Array等都允许被响应化。
13
+ */
14
+ export declare function reactive<T extends object>(target: T): Reactive<T>;
15
+ export declare const reactiveMap: WeakMap<Target, any>;
16
+ /**
17
+ * 判断一个对象是否为响应式对象。
18
+ *
19
+ * @param value 对象。
20
+ * @returns
21
+ */
22
+ export declare function isReactive(value: unknown): boolean;
23
+ /**
24
+ * 转换为响应式对象。
25
+ *
26
+ * @param value 对象。
27
+ * @returns
28
+ */
29
+ export declare const toReactive: <T>(value: T) => T;
30
+ /**
31
+ * 判断一个对象是否为代理对象。
32
+ *
33
+ * @param value 对象。
34
+ * @returns
35
+ */
36
+ export declare function isProxy(value: any): boolean;
37
+ export type Reactive<T> = UnwrapRefSimple<T>;
38
+ /**
39
+ * 原始类型
40
+ */
41
+ type Primitive = string | number | boolean | bigint | symbol | undefined | null;
42
+ /**
43
+ * 内置类型
44
+ */
45
+ export type Builtin = Primitive | Function | Date | Error | RegExp;
46
+ /**
47
+ * 用于扩展不被 unwrap 的类型。
48
+ *
49
+ * ``` ts
50
+ * declare module '@vue/reactivity' {
51
+ * export interface RefUnwrapBailTypes {
52
+ * runtimeDOMBailTypes: Node | Window
53
+ * }
54
+ * }
55
+ * ```
56
+ */
57
+ export interface RefUnwrapBailTypes {
58
+ }
59
+ /**
60
+ * 解包类型。
61
+ */
62
+ export type UnwrapRefSimple<T> = T extends Builtin | Ref | RefUnwrapBailTypes[keyof RefUnwrapBailTypes] ? T : T extends Ref<infer TT> ? TT : T extends Computed<infer TT> ? TT : T extends object ? {
63
+ [K in keyof T]: UnwrapRefSimple<T[K]>;
64
+ } : T;
65
+ export {};
66
+ //# sourceMappingURL=reactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../src/reactive.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAA2B,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnE;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAiCjE;AACD,eAAO,MAAM,WAAW,sBAA6B,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGlD;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,oBAQtB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAG3C;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;AAE7C;;GAEG;AACH,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAChF;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnE;;;;;;;;;;GAUG;AACH,MAAM,WAAW,kBAAkB;CAAI;AAEvC;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IACzB,CAAC,SACC,OAAO,GACP,GAAG,GACH,kBAAkB,CAAC,MAAM,kBAAkB,CAAC,GAC5C,CAAC,GACH,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAC5B,CAAC,SAAS,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GACjC,CAAC,SAAS,MAAM,GAAG;KACd,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACxC,GACD,CAAC,CAAC"}
package/lib/ref.d.ts ADDED
@@ -0,0 +1,41 @@
1
+ import { Reactivity } from './Reactivity';
2
+ import { ReactiveFlags } from './shared/constants';
3
+ /**
4
+ * 创建一个引用,该引用的值可以被响应式系统追踪和更新。
5
+ *
6
+ * @param value 引用的值。
7
+ * @returns 包含 value 属性的对象,用于获取和设置引用的值。
8
+ */
9
+ export declare function ref<T>(value?: T): Ref<T>;
10
+ /**
11
+ * 判断一个对象是否为引用。
12
+ * @param r 引用。
13
+ */
14
+ export declare function isRef<T>(r: Ref<T> | unknown): r is Ref<T>;
15
+ export interface RefReactivity<T = any> extends Ref<T> {
16
+ }
17
+ /**
18
+ * 引用反应式节点。
19
+ *
20
+ * 当使用 ref 函数时,会创建一个 RefReactivity 对象。
21
+ */
22
+ export declare class RefReactivity<T = any> extends Reactivity<T> implements Ref<T> {
23
+ readonly [ReactiveFlags.IS_REF] = true;
24
+ get value(): T;
25
+ set value(v: T);
26
+ /**
27
+ * 原始值。
28
+ *
29
+ * 用于比较值是否发生变化。
30
+ */
31
+ private _rawValue;
32
+ constructor(value: T);
33
+ }
34
+ export interface Ref<T = any, S = T> {
35
+ get value(): T;
36
+ set value(_: S);
37
+ [RefSymbol]: true;
38
+ }
39
+ declare const RefSymbol: unique symbol;
40
+ export {};
41
+ //# sourceMappingURL=ref.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../src/ref.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAQxC;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;AAM3D,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,GAAG,CAAC,CAAC,CAAC;CAAI;AAE1D;;;;GAIG;AACH,qBAAa,aAAa,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAE,YAAW,GAAG,CAAC,CAAC,CAAC;IAEvE,SAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ;IAE9C,IAAI,KAAK,IAOI,CAAC,CAFb;IAED,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,EAcb;IAED;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAI;gBAET,KAAK,EAAE,CAAC;CAMvB;AAED,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;IAE/B,IAAI,KAAK,IAAI,CAAC,CAAA;IACd,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,EAAC;IACf,CAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CACpB;AACD,OAAO,CAAC,MAAM,SAAS,EAAE,OAAO,MAAM,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 响应式标志枚举,用于标识响应式对象的特殊属性或状态
3
+ */
4
+ export declare enum ReactiveFlags {
5
+ IS_REACTIVE = "__v_isReactive",
6
+ RAW = "__v_raw",
7
+ IS_REF = "__v_isRef"
8
+ }
9
+ export declare enum TargetType {
10
+ INVALID = 0,
11
+ COMMON = 1,
12
+ COLLECTION = 2
13
+ }
14
+ /**
15
+ * 跟踪操作类型枚举,用于标识在响应式系统中对对象属性进行的操作类型
16
+ */
17
+ export declare enum TrackOpTypes {
18
+ GET = "get",
19
+ HAS = "has",
20
+ ITERATE = "iterate"
21
+ }
22
+ /**
23
+ * 触发操作类型枚举,用于标识在响应式系统中对对象属性进行的修改操作类型
24
+ */
25
+ export declare enum TriggerOpTypes {
26
+ SET = "set",
27
+ ADD = "add",
28
+ DELETE = "delete",
29
+ CLEAR = "clear"
30
+ }
31
+ export declare const ITERATE_KEY: unique symbol;
32
+ export declare const MAP_KEY_ITERATE_KEY: unique symbol;
33
+ export declare const ARRAY_ITERATE_KEY: unique symbol;
34
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,aAAa;IAErB,WAAW,mBAAmB;IAC9B,GAAG,YAAY;IACf,MAAM,cAAc;CACvB;AAED,oBAAY,UAAU;IAElB,OAAO,IAAI;IACX,MAAM,IAAI;IACV,UAAU,IAAI;CACjB;AAED;;GAEG;AACH,oBAAY,YAAY;IAEpB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,OAAO,YAAY;CACtB;AAED;;GAEG;AACH,oBAAY,cAAc;IAEtB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,KAAK,UAAU;CAClB;AAED,eAAO,MAAM,WAAW,EAAE,OAAO,MAAgD,CAAC;AAClF,eAAO,MAAM,mBAAmB,EAAE,OAAO,MAAkD,CAAC;AAC5F,eAAO,MAAM,iBAAiB,EAAE,OAAO,MAA+C,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { ReactiveFlags, TargetType } from './constants';
2
+ export {};
3
+ declare global {
4
+ /**
5
+ * 是否为开发模式。
6
+ */
7
+ var __DEV__: boolean;
8
+ }
9
+ export declare const isObject: (val: unknown) => val is Record<any, any>;
10
+ export declare const isArray: typeof Array.isArray;
11
+ export declare const isSymbol: (val: unknown) => val is symbol;
12
+ export declare const isString: (val: unknown) => val is string;
13
+ export declare const isIntegerKey: (key: unknown) => boolean;
14
+ export declare const isMap: (val: unknown) => val is Map<any, any>;
15
+ export declare const hasOwn: (val: object, key: string | symbol) => key is never;
16
+ export declare const hasChanged: (value: any, oldValue: any) => boolean;
17
+ export declare function getTargetType(value: Target): TargetType;
18
+ export declare const toRawType: (value: unknown) => string;
19
+ export interface Target {
20
+ [ReactiveFlags.IS_REACTIVE]?: boolean;
21
+ [ReactiveFlags.RAW]?: any;
22
+ }
23
+ /**
24
+ * 将一个响应式对象转换为原始对象。
25
+ * @param observed 响应式对象。
26
+ * @returns 原始对象。
27
+ */
28
+ export declare function toRaw<T>(observed: T): T;
29
+ export declare function warn(msg: string, ...args: any[]): void;
30
+ /**
31
+ * 创建一个映射,并返回一个用于检查键是否存在于该映射中的函数。
32
+ * 重要提示:所有调用此函数的地方都必须以 \/\*#\_\_PURE\_\_\*\/ 作为前缀,
33
+ * 以便在必要时 Rollup 可以进行 tree-shaking。
34
+ */
35
+ export declare function makeMap(str: string): (key: string) => boolean;
36
+ //# sourceMappingURL=general.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../../src/shared/general.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAG,CAAC;AACX,OAAO,CAAC,MAAM,CACd;IACI;;OAEG;IACH,IAAI,OAAO,EAAE,OAAO,CAAC;CACxB;AAGD,eAAO,MAAM,QAAQ,QAAS,OAAO,4BAAqE,CAAC;AAE3G,eAAO,MAAM,OAAO,EAAE,OAAO,KAAK,CAAC,OAAuB,CAAC;AAC3D,eAAO,MAAM,QAAQ,QAAS,OAAO,kBAA2C,CAAC;AACjF,eAAO,MAAM,QAAQ,QAAS,OAAO,kBAA2C,CAAC;AACjF,eAAO,MAAM,YAAY,QAAS,OAAO,KAAG,OAIA,CAAC;AAC7C,eAAO,MAAM,KAAK,QAAS,OAAO,yBACM,CAAC;AAGzC,eAAO,MAAM,MAAM,QACV,MAAM,OACN,MAAM,GAAG,MAAM,iBACoD,CAAC;AAG7E,eAAO,MAAM,UAAU,UAAW,GAAG,YAAY,GAAG,KAAG,OACxB,CAAC;AAmBhC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,cAK1C;AAKD,eAAO,MAAM,SAAS,UAAW,OAAO,KAAG,MAGP,CAAC;AAErC,MAAM,WAAW,MAAM;IAEnB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAA;IACrC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAA;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAKvC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAGtD;AAED;;;;GAIG;AAGH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAU7D"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@feng3d/reactivity",
3
3
  "type": "module",
4
- "version": "0.0.1",
4
+ "version": "1.0.2",
5
5
  "description": "反应式",
6
6
  "homepage": "https://feng3d.com/reactivity",
7
7
  "main": "./dist/index.umd.cjs",
@@ -17,6 +17,7 @@
17
17
  }
18
18
  },
19
19
  "scripts": {
20
+ "dev": "cd examples && npm run dev",
20
21
  "clean": "rimraf \"{lib,dist,public}\"",
21
22
  "build": "vite build",
22
23
  "test": "vitest",
@@ -25,7 +26,7 @@
25
26
  "watch": "tsc -w",
26
27
  "lint": "eslint --ext .js --ext .ts src test --ignore-path .gitignore --max-warnings 0",
27
28
  "lintfix": "npm run lint -- --fix",
28
- "docs": "typedoc",
29
+ "docs": "typedoc && cd examples && vite build --outDir ../public",
29
30
  "upload_oss": "npm run docs && feng3d-cli oss_upload_dir",
30
31
  "release": "npm run clean && npm run lint && npm run build && npm run docs && npm run types && npm publish",
31
32
  "prepublishOnly": "node scripts/prepublish.js",
@@ -0,0 +1,126 @@
1
+ import { type ComputedReactivity } from './computed';
2
+
3
+ /**
4
+ * 反应式节点。
5
+ *
6
+ * 拥有节点值以及被捕捉与触发的能力。
7
+ *
8
+ * 用于被 computed effect 等构建的节点所继承。
9
+ */
10
+ export class Reactivity<T = any>
11
+ {
12
+ /**
13
+ * 获取当前节点值。
14
+ *
15
+ * 取值时将会建立与父节点的依赖关系。
16
+ */
17
+ get value(): T
18
+ {
19
+ this.track();
20
+
21
+ return this._value;
22
+ }
23
+ /**
24
+ * @private
25
+ */
26
+ _value: T;
27
+
28
+ /**
29
+ * 父反应节点。
30
+ *
31
+ * 记录了哪些节点调用了当前节点。
32
+ *
33
+ * 当前节点失效时,会通知并移除所有父节点。
34
+ *
35
+ * @private
36
+ */
37
+ _parents = new Map<ComputedReactivity, number>();
38
+
39
+ /**
40
+ * 捕捉。
41
+ *
42
+ * 建立与父节点的依赖关系。
43
+ */
44
+ track()
45
+ {
46
+ if (!_shouldTrack) return;
47
+
48
+ // 连接父节点和子节点。
49
+ const parent = Reactivity.activeReactivity;
50
+ if (parent)
51
+ {
52
+ this._parents.set(parent, parent._version);
53
+ }
54
+ }
55
+
56
+ /**
57
+ * 触发。
58
+ *
59
+ * 冒泡到所有父节点,设置失效子节点字典。
60
+ */
61
+ trigger()
62
+ {
63
+ // 冒泡到所有父节点,设置失效子节点字典。
64
+ this._parents.forEach((version, parent) =>
65
+ {
66
+ if (parent._version !== version) return;
67
+
68
+ parent.trigger();
69
+ // 失效时添加子节点到父节点中。
70
+ parent._children.set(this, this._value);
71
+ });
72
+
73
+ //
74
+ this._parents.clear();
75
+ }
76
+
77
+ /**
78
+ * 当前正在执行的反应式节点。
79
+ *
80
+ * @internal
81
+ */
82
+ static activeReactivity: ComputedReactivity;
83
+ }
84
+
85
+ /**
86
+ * 反应式节点链。
87
+ */
88
+ export type ReactivityLink = { node: Reactivity, value: any, next: ReactivityLink };
89
+
90
+ /**
91
+ * 强制跟踪。
92
+ *
93
+ * @param fn 强制跟踪的函数。
94
+ */
95
+ export function forceTrack<T>(fn: () => T): T
96
+ {
97
+ const preShouldTrack = _shouldTrack;
98
+ _shouldTrack = true;
99
+ const result = fn();
100
+ _shouldTrack = preShouldTrack;
101
+
102
+ return result;
103
+ }
104
+
105
+ /**
106
+ * 不跟踪。
107
+ *
108
+ * @param fn 不跟踪的函数。
109
+ */
110
+ export function noTrack<T>(fn: () => T): T
111
+ {
112
+ const preShouldTrack = _shouldTrack;
113
+ _shouldTrack = false;
114
+ const result = fn();
115
+ _shouldTrack = preShouldTrack;
116
+
117
+ return result;
118
+ }
119
+
120
+ /**
121
+ * 是否应该跟踪的标志
122
+ * 控制是否进行依赖跟踪
123
+ *
124
+ * @private
125
+ */
126
+ let _shouldTrack = true;