@suey/rxp-meta 0.2.3 → 0.3.0

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 (29) hide show
  1. package/dist/commonjs/index.js +18 -0
  2. package/dist/commonjs/src/base/InnerZustandStoreManager.js +35 -0
  3. package/dist/commonjs/src/base/index.js +17 -0
  4. package/dist/commonjs/src/base/rxpInnerStore.js +66 -0
  5. package/dist/commonjs/src/constants/index.js +25 -0
  6. package/dist/commonjs/src/extension/At.js +113 -0
  7. package/dist/commonjs/src/extension/ExtensionManager.js +115 -0
  8. package/dist/commonjs/src/extension/ExtensionManager.old.js +156 -0
  9. package/dist/commonjs/src/extension/declare.js +2 -0
  10. package/dist/commonjs/src/extension/index.js +5 -0
  11. package/dist/commonjs/src/metadata/MetadataManager.js +159 -0
  12. package/dist/commonjs/src/metadata/MetadataManager.old.js +171 -0
  13. package/dist/commonjs/src/metadata/declare.js +2 -0
  14. package/dist/commonjs/src/metadata/index.js +5 -0
  15. package/dist/esm/index.js +2 -0
  16. package/dist/esm/src/base/InnerZustandStoreManager.js +31 -0
  17. package/dist/esm/src/base/index.js +1 -0
  18. package/dist/esm/src/base/rxpInnerStore.js +62 -0
  19. package/dist/esm/src/constants/index.js +22 -0
  20. package/dist/esm/src/extension/At.js +109 -0
  21. package/dist/esm/src/extension/ExtensionManager.js +110 -0
  22. package/dist/esm/src/extension/ExtensionManager.old.js +152 -0
  23. package/dist/esm/src/extension/declare.js +1 -0
  24. package/dist/esm/src/extension/index.js +1 -0
  25. package/dist/esm/src/metadata/MetadataManager.js +155 -0
  26. package/dist/esm/src/metadata/MetadataManager.old.js +167 -0
  27. package/dist/esm/src/metadata/declare.js +1 -0
  28. package/dist/esm/src/metadata/index.js +1 -0
  29. package/package.json +1 -1
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MetadataManager = void 0;
4
+ const react_1 = require("react");
5
+ const index_1 = require("../base/index");
6
+ class MetadataManager {
7
+ rxpInnerStore = new index_1.RxpInnerStore();
8
+ metadataMap = new Map();
9
+ constructor() {
10
+ this.metadataMap.clear();
11
+ }
12
+ defineMetadata(metadataKey, metadata) {
13
+ this.metadataMap.set(metadataKey, metadata);
14
+ this.rxpInnerStore.update();
15
+ return () => {
16
+ this.delMetadata(metadataKey);
17
+ };
18
+ }
19
+ getMetadata(metadataKey) {
20
+ return (this.metadataMap.get(metadataKey)) ?? null;
21
+ }
22
+ getMetadataLatestInVector(metadataKey) {
23
+ return (this.metadataMap.get(metadataKey) ?? [])[this.metadataMap.get(metadataKey)?.length - 1] ?? null;
24
+ }
25
+ getMetadataOldestInVector(metadataKey) {
26
+ return (this.metadataMap.get(metadataKey) ?? [])[0] ?? null;
27
+ }
28
+ delMetadata(metadataKey) {
29
+ if (!this.hasMetadata(metadataKey))
30
+ return;
31
+ this.metadataMap.delete(metadataKey);
32
+ this.rxpInnerStore.update();
33
+ }
34
+ defineMetadataInSingle(metadataKey, metadata) {
35
+ this.metadataMap.set(metadataKey, metadata);
36
+ this.rxpInnerStore.update();
37
+ return () => {
38
+ this.delMetadata(metadataKey);
39
+ };
40
+ }
41
+ defineMetadataInVector(metadataKey, metadata) {
42
+ if (this.hasMetadata(metadataKey)) {
43
+ const vector = this.metadataMap.get(metadataKey);
44
+ if (!Array.isArray(vector))
45
+ throw new Error(`defineMetadataInVector: current metadata value is not an array`);
46
+ this.metadataMap.set(metadataKey, [...vector, metadata]);
47
+ this.rxpInnerStore.update();
48
+ }
49
+ else {
50
+ this.metadataMap.set(metadataKey, [metadata]);
51
+ this.rxpInnerStore.update();
52
+ }
53
+ return () => this.delMetadataInVector(metadataKey, metadata);
54
+ }
55
+ delMetadataInVector(metadataKey, metadata) {
56
+ if (!this.hasMetadata(metadataKey))
57
+ return;
58
+ let metadataIsDeleted = false;
59
+ const vector = this.metadataMap.get(metadataKey) ?? [];
60
+ if (!Array.isArray(vector))
61
+ throw new Error(`delMetadataInVector: current metadata value is not an array`);
62
+ if (vector.length === 0) {
63
+ this.metadataMap.delete(metadataKey);
64
+ this.rxpInnerStore.update();
65
+ return;
66
+ }
67
+ const newVector = vector.filter(v => {
68
+ if (metadataIsDeleted)
69
+ return true;
70
+ if (v === metadata) {
71
+ metadataIsDeleted = true;
72
+ return false;
73
+ }
74
+ return true;
75
+ });
76
+ if (metadataIsDeleted) {
77
+ if (newVector.length === 0) {
78
+ this.metadataMap.delete(metadataKey);
79
+ this.rxpInnerStore.update();
80
+ return;
81
+ }
82
+ this.metadataMap.set(metadataKey, newVector);
83
+ this.rxpInnerStore.update();
84
+ return;
85
+ }
86
+ }
87
+ useMetadata(metadataKey) {
88
+ const [_, setState] = (0, react_1.useState)({});
89
+ const normalState = (0, react_1.useRef)({
90
+ data: this.getMetadata(metadataKey),
91
+ unsubscribe: void 0,
92
+ });
93
+ (0, react_1.useEffect)(() => {
94
+ normalState.current.unsubscribe = this.rxpInnerStore.subscribe(() => {
95
+ const data = this.getMetadata(metadataKey);
96
+ if (data !== normalState.current.data) {
97
+ normalState.current.data = data;
98
+ setState(() => ({}));
99
+ }
100
+ });
101
+ const data = this.getMetadata(metadataKey);
102
+ if (data !== normalState.current.data) {
103
+ normalState.current.data = data;
104
+ setState(() => ({}));
105
+ }
106
+ return () => {
107
+ if (normalState.current.unsubscribe)
108
+ normalState.current.unsubscribe();
109
+ normalState.current.unsubscribe = void 0;
110
+ normalState.current.data = null;
111
+ };
112
+ }, []);
113
+ return normalState.current.data;
114
+ }
115
+ useOldestMetadataInVector(metadataKey) {
116
+ const metadata = this.useMetadata(metadataKey);
117
+ if (metadata && Array.isArray(metadata))
118
+ return metadata[0] ?? null;
119
+ return null;
120
+ }
121
+ useLatestMetadataInVector(metadataKey) {
122
+ const metadata = this.useMetadata(metadataKey);
123
+ if (metadata && Array.isArray(metadata))
124
+ return metadata[metadata.length - 1] ?? null;
125
+ return null;
126
+ }
127
+ useAllMetadata() {
128
+ this.rxpInnerStore.useValueToRenderReactComponent();
129
+ return this.metadataMap;
130
+ }
131
+ hasMetadata(metadataKey) {
132
+ return this.metadataMap.has(metadataKey);
133
+ }
134
+ hasMetadataInVector(metadataKey, metadata) {
135
+ const vec = this.metadataMap.get(metadataKey);
136
+ if (!Array.isArray(vec))
137
+ return false;
138
+ return vec.includes(metadata);
139
+ }
140
+ useFollowMetadata(metadataKey, metadata) {
141
+ (0, react_1.useEffect)(() => {
142
+ const destroy = this.defineMetadata(metadataKey, metadata);
143
+ return destroy;
144
+ }, [metadataKey, metadata]);
145
+ }
146
+ useFollowMetadataInVector(metadataKey, metadata) {
147
+ (0, react_1.useEffect)(() => {
148
+ const destroy = this.defineMetadataInVector(metadataKey, metadata);
149
+ return destroy;
150
+ }, [metadataKey, metadata]);
151
+ }
152
+ useFollowMetadataInSingle(metadataKey, metadata) {
153
+ (0, react_1.useEffect)(() => {
154
+ const destroy = this.defineMetadataInSingle(metadataKey, metadata);
155
+ return destroy;
156
+ }, [metadataKey, metadata]);
157
+ }
158
+ }
159
+ exports.MetadataManager = MetadataManager;
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MetadataManager = void 0;
4
+ const react_1 = require("react");
5
+ const InnerZustandStoreManager_1 = require("../base/InnerZustandStoreManager");
6
+ class MetadataManager extends InnerZustandStoreManager_1.InnerZustandStoreManager {
7
+ metadataMap = new Map();
8
+ defineMetadata(metadataKey, metadata) {
9
+ this.metadataMap.set(metadataKey, metadata);
10
+ super.updateStore();
11
+ return () => {
12
+ this.delMetadata(metadataKey);
13
+ };
14
+ }
15
+ getMetadata(metadataKey) {
16
+ return (this.metadataMap.get(metadataKey)) ?? null;
17
+ }
18
+ getMetadataLatestInVector(metadataKey) {
19
+ return (this.metadataMap.get(metadataKey) ?? [])[this.metadataMap.get(metadataKey)?.length - 1] ?? null;
20
+ }
21
+ getMetadataOldestInVector(metadataKey) {
22
+ return (this.metadataMap.get(metadataKey) ?? [])[0] ?? null;
23
+ }
24
+ delMetadata(metadataKey) {
25
+ if (!this.hasMetadata(metadataKey))
26
+ return;
27
+ this.metadataMap.delete(metadataKey);
28
+ super.updateStore();
29
+ }
30
+ defineMetadataInSingle(metadataKey, metadata) {
31
+ this.metadataMap.set(metadataKey, metadata);
32
+ super.updateStore();
33
+ return () => {
34
+ this.delMetadata(metadataKey);
35
+ };
36
+ }
37
+ defineMetadataInVector(metadataKey, metadata) {
38
+ let hasThisMetadata = false;
39
+ if (this.hasMetadata(metadataKey)) {
40
+ const vector = this.metadataMap.get(metadataKey);
41
+ if (!Array.isArray(vector))
42
+ throw new Error(`defineMetadataInVector: current metadata value is not an array`);
43
+ const newVector = vector.filter(v => {
44
+ const isThisMetadata = (v === metadata);
45
+ if (isThisMetadata)
46
+ hasThisMetadata = true;
47
+ return !isThisMetadata;
48
+ });
49
+ if (!hasThisMetadata) {
50
+ newVector.push(metadata);
51
+ this.metadataMap.set(metadataKey, newVector);
52
+ super.updateStore();
53
+ }
54
+ }
55
+ else {
56
+ this.metadataMap.set(metadataKey, [metadata]);
57
+ super.updateStore();
58
+ }
59
+ return () => this.delMetadataInVector(metadataKey, metadata);
60
+ }
61
+ delMetadataInVector(metadataKey, metadata) {
62
+ if (!this.hasMetadata(metadataKey))
63
+ return;
64
+ let hasThisMetadata = false;
65
+ const vector = this.metadataMap.get(metadataKey) ?? [];
66
+ if (!Array.isArray(vector))
67
+ throw new Error(`delMetadataInVector: current metadata value is not an array`);
68
+ if (vector.length === 0) {
69
+ this.metadataMap.delete(metadataKey);
70
+ super.updateStore();
71
+ return;
72
+ }
73
+ const fVector = vector.filter(v => {
74
+ const isThisMetadata = (v === metadata);
75
+ if (isThisMetadata)
76
+ hasThisMetadata = true;
77
+ return !isThisMetadata;
78
+ });
79
+ if (hasThisMetadata) {
80
+ if (fVector.length === 0) {
81
+ this.metadataMap.delete(metadataKey);
82
+ super.updateStore();
83
+ return;
84
+ }
85
+ this.metadataMap.set(metadataKey, fVector);
86
+ super.updateStore();
87
+ }
88
+ }
89
+ useMetadata(metadataKey) {
90
+ const [_, setState] = (0, react_1.useState)({});
91
+ const normalState = (0, react_1.useRef)({
92
+ isMounted: false,
93
+ data: this.getMetadata(metadataKey),
94
+ unsubscribe: void 0,
95
+ needSync: false
96
+ });
97
+ const refreshComponent = (0, react_1.useCallback)(() => {
98
+ if (!normalState.current.isMounted) {
99
+ normalState.current.needSync = true;
100
+ return;
101
+ }
102
+ setState(() => ({}));
103
+ }, []);
104
+ if (!normalState.current.isMounted || !normalState.current.unsubscribe) {
105
+ if (normalState.current.unsubscribe)
106
+ normalState.current.unsubscribe();
107
+ normalState.current.data = this.getMetadata(metadataKey);
108
+ normalState.current.unsubscribe = super.subscribe(() => {
109
+ const data = this.getMetadata(metadataKey);
110
+ if (data !== normalState.current.data) {
111
+ normalState.current.data = data;
112
+ refreshComponent();
113
+ }
114
+ });
115
+ }
116
+ (0, react_1.useLayoutEffect)(() => {
117
+ normalState.current.isMounted = true;
118
+ }, []);
119
+ (0, react_1.useEffect)(() => {
120
+ if (normalState.current.needSync)
121
+ setState(() => ({}));
122
+ return () => {
123
+ normalState.current.isMounted = false;
124
+ if (normalState.current.unsubscribe)
125
+ normalState.current.unsubscribe();
126
+ normalState.current.unsubscribe = void 0;
127
+ normalState.current.data = null;
128
+ normalState.current.needSync = false;
129
+ };
130
+ }, []);
131
+ return normalState.current.data;
132
+ }
133
+ useOldestMetadataInVector(metadataKey) {
134
+ const metadata = this.useMetadata(metadataKey);
135
+ if (metadata && Array.isArray(metadata))
136
+ return metadata[0] ?? null;
137
+ return null;
138
+ }
139
+ useLatestMetadataInVector(metadataKey) {
140
+ const metadata = this.useMetadata(metadataKey);
141
+ if (metadata && Array.isArray(metadata))
142
+ return metadata[metadata.length - 1] ?? null;
143
+ return null;
144
+ }
145
+ useAllMetadata() {
146
+ super.useStoreValueToRerenderComponent();
147
+ return this.metadataMap;
148
+ }
149
+ hasMetadata(metadataKey) {
150
+ return this.metadataMap.has(metadataKey);
151
+ }
152
+ useFollowMetadata(metadataKey, metadata) {
153
+ (0, react_1.useEffect)(() => {
154
+ const destroy = this.defineMetadata(metadataKey, metadata);
155
+ return destroy;
156
+ }, [metadataKey, metadata]);
157
+ }
158
+ useFollowMetadataInVector(metadataKey, metadata) {
159
+ (0, react_1.useEffect)(() => {
160
+ const destroy = this.defineMetadataInVector(metadataKey, metadata);
161
+ return destroy;
162
+ }, [metadataKey, metadata]);
163
+ }
164
+ useFollowMetadataInSingle(metadataKey, metadata) {
165
+ (0, react_1.useEffect)(() => {
166
+ const destroy = this.defineMetadataInSingle(metadataKey, metadata);
167
+ return destroy;
168
+ }, [metadataKey, metadata]);
169
+ }
170
+ }
171
+ exports.MetadataManager = MetadataManager;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MetadataManager = void 0;
4
+ var MetadataManager_1 = require("./MetadataManager");
5
+ Object.defineProperty(exports, "MetadataManager", { enumerable: true, get: function () { return MetadataManager_1.MetadataManager; } });
@@ -0,0 +1,2 @@
1
+ export * from './src/extension';
2
+ export * from './src/metadata';
@@ -0,0 +1,31 @@
1
+ import { create } from 'zustand';
2
+ import { immer } from 'zustand/middleware/immer';
3
+ export class InnerZustandStoreManager {
4
+ store = create()(immer(() => ({
5
+ value: {}
6
+ })));
7
+ listeners = new Set();
8
+ unsubscribeListeners = this.store.subscribe(() => {
9
+ this.listeners.forEach(listener => listener());
10
+ });
11
+ updateStore() {
12
+ this.store.setState(() => ({ value: {} }));
13
+ }
14
+ useStoreValueToRerenderComponent() {
15
+ return this.store(store => store.value);
16
+ }
17
+ unsubscribe(listener) {
18
+ this.listeners.delete(listener);
19
+ }
20
+ subscribe(listener) {
21
+ this.listeners.add(listener);
22
+ return () => this.unsubscribe(listener);
23
+ }
24
+ destroy() {
25
+ this.listeners.clear();
26
+ this.unsubscribeListeners();
27
+ }
28
+ getListenerCount() {
29
+ return this.listeners.size;
30
+ }
31
+ }
@@ -0,0 +1 @@
1
+ export * from './rxpInnerStore';
@@ -0,0 +1,62 @@
1
+ import { useCallback, useLayoutEffect, useRef, useState } from 'react';
2
+ export class RxpInnerStore {
3
+ store = {
4
+ value: {},
5
+ listeners: new Set(),
6
+ live: true,
7
+ };
8
+ triggerEffects = async () => {
9
+ if (!this.store.live)
10
+ return;
11
+ this.store.listeners.forEach(listener => {
12
+ if (typeof listener === 'function')
13
+ listener();
14
+ });
15
+ };
16
+ update() {
17
+ if (!this.store.live)
18
+ return;
19
+ this.store.value = {};
20
+ this.triggerEffects().catch(err => {
21
+ });
22
+ }
23
+ unsubscribe(listener) {
24
+ if (!this.store.live)
25
+ return false;
26
+ if (typeof listener !== 'function')
27
+ return false;
28
+ return this.store.listeners.delete(listener);
29
+ }
30
+ subscribe(listener) {
31
+ if (!this.store.live)
32
+ return () => { };
33
+ if (typeof listener !== 'function')
34
+ return () => { };
35
+ this.store.listeners.add(listener);
36
+ return () => this.unsubscribe(listener);
37
+ }
38
+ destroy() {
39
+ this.store.listeners.clear();
40
+ this.store.live = false;
41
+ }
42
+ revive() {
43
+ this.store.live = true;
44
+ }
45
+ getListenerCount() {
46
+ return this.store.listeners.size;
47
+ }
48
+ useValueToRenderReactComponent() {
49
+ const [_, setState] = useState({});
50
+ const destroySubscribe = useRef();
51
+ const refresh = useCallback(() => setState(() => ({})), []);
52
+ useLayoutEffect(() => {
53
+ destroySubscribe.current = this.subscribe(refresh);
54
+ return () => {
55
+ if (destroySubscribe.current)
56
+ destroySubscribe.current();
57
+ destroySubscribe.current = void 0;
58
+ };
59
+ }, []);
60
+ return [this.store.value];
61
+ }
62
+ }
@@ -0,0 +1,22 @@
1
+ export var ExtensionErrors;
2
+ (function (ExtensionErrors) {
3
+ ExtensionErrors["ExtensionNameIsRequired"] = "Extension name is required";
4
+ ExtensionErrors["ExtensionNameMustBeString"] = "Extension name must be string";
5
+ ExtensionErrors["ExtensionVersionIsRequired"] = "Extension version is required";
6
+ ExtensionErrors["ExtensionVersionMustBeString"] = "Extension version must be string";
7
+ ExtensionErrors["ExtensionOnActivatedIsRequired"] = "Extension onActivated is required";
8
+ ExtensionErrors["ExtensionOnActivatedMustBeFunction"] = "Extension onActivated must be function";
9
+ ExtensionErrors["ExtensionIsNotExist"] = "Extension is not exist";
10
+ })(ExtensionErrors || (ExtensionErrors = {}));
11
+ export var MetadataErrors;
12
+ (function (MetadataErrors) {
13
+ MetadataErrors["MetadataKeyIsRequired"] = "Metadata key is required";
14
+ MetadataErrors["MetadataKeyMustBeString"] = "Metadata key must be string";
15
+ MetadataErrors["MetadataKeyMustBeSymbol"] = "Metadata key must be symbol";
16
+ MetadataErrors["MetadataKeyMustBeNumber"] = "Metadata key must be number";
17
+ MetadataErrors["MetadataKeyMustBeBoolean"] = "Metadata key must be boolean";
18
+ MetadataErrors["MetadataKeyMustBeFunction"] = "Metadata key must be function";
19
+ MetadataErrors["MetadataKeyMustBeObject"] = "Metadata key must be object";
20
+ MetadataErrors["MetadataKeyMustBeArray"] = "Metadata key must be array";
21
+ })(MetadataErrors || (MetadataErrors = {}));
22
+ ;
@@ -0,0 +1,109 @@
1
+ import { InnerZustandStoreManager } from '../base/InnerZustandStoreManager';
2
+ import { ExtensionErrors } from '../constants';
3
+ export const ExtensionSymbolTag = Symbol('ExtensionSymbolTag');
4
+ export const ExtensionSymbolTagKey = Symbol('__TAG__');
5
+ export class ExtensionManager extends InnerZustandStoreManager {
6
+ defineExtension(define) {
7
+ if (!Reflect.has(define, 'name'))
8
+ throw new Error(ExtensionErrors.ExtensionNameIsRequired);
9
+ if (!(typeof define.name === 'string'))
10
+ throw new Error(ExtensionErrors.ExtensionNameMustBeString);
11
+ if (!Reflect.has(define, 'version'))
12
+ throw new Error(ExtensionErrors.ExtensionVersionIsRequired);
13
+ if (!(typeof define.version === 'string'))
14
+ throw new Error(ExtensionErrors.ExtensionVersionMustBeString);
15
+ if (!Reflect.has(define, 'onActivated'))
16
+ throw new Error(ExtensionErrors.ExtensionOnActivatedIsRequired);
17
+ if (typeof define.onActivated !== 'function')
18
+ throw new Error(ExtensionErrors.ExtensionOnActivatedMustBeFunction);
19
+ const name = define['name'];
20
+ const version = define['version'];
21
+ const extensionInnerInstance = {
22
+ name: name,
23
+ version: version,
24
+ isRegistered: false,
25
+ isUnregistered: false,
26
+ isActivated: false,
27
+ isDeactivated: false,
28
+ };
29
+ const that = this;
30
+ const onInstalled = function () {
31
+ };
32
+ const extension = {
33
+ get name() {
34
+ return extensionInnerInstance.name;
35
+ },
36
+ get version() {
37
+ return extensionInnerInstance.version;
38
+ },
39
+ get isInstalled() {
40
+ return extensionInnerInstance.isRegistered;
41
+ },
42
+ get isUninstalled() {
43
+ return extensionInnerInstance.isUnregistered;
44
+ },
45
+ get isActivated() {
46
+ return extensionInnerInstance.isActivated;
47
+ },
48
+ get isDeactivated() {
49
+ return extensionInnerInstance.isDeactivated;
50
+ },
51
+ meta: define['meta'] ?? void 0,
52
+ get onInstalled() {
53
+ return onInstalled;
54
+ },
55
+ get onUninstalled() {
56
+ return () => {
57
+ };
58
+ },
59
+ get onActivated() {
60
+ return () => {
61
+ return () => {
62
+ };
63
+ };
64
+ },
65
+ get onDeactivated() {
66
+ return () => {
67
+ };
68
+ }
69
+ };
70
+ Reflect.defineProperty(extension, ExtensionSymbolTagKey, {
71
+ enumerable: false,
72
+ writable: false,
73
+ value: ExtensionSymbolTag,
74
+ configurable: false
75
+ });
76
+ return extension;
77
+ }
78
+ isExtension(extension) {
79
+ if (typeof extension !== 'object' || extension === null)
80
+ return false;
81
+ if (!Reflect.has(extension, ExtensionSymbolTagKey))
82
+ return false;
83
+ const tag = Reflect.get(extension, ExtensionSymbolTagKey);
84
+ return tag === ExtensionSymbolTag;
85
+ }
86
+ registerExtension(extensionName) {
87
+ if (!(typeof extensionName === 'string'))
88
+ throw new Error(ExtensionErrors.ExtensionNameMustBeString);
89
+ if (!this.isExtension(extensionName))
90
+ throw new Error(ExtensionErrors.ExtensionIsNotExist);
91
+ const extension = this.getExtension(extensionName);
92
+ if (!extension)
93
+ throw new Error(ExtensionErrors.ExtensionIsNotExist);
94
+ extension.onInstalled?.();
95
+ }
96
+ unregisterExtension() {
97
+ }
98
+ activatedExtension() {
99
+ }
100
+ deactivatedExtension() {
101
+ }
102
+ getExtension(extensionName) {
103
+ }
104
+ getExtensions() {
105
+ }
106
+ useExtensionsList() {
107
+ }
108
+ }
109
+ 0;
@@ -0,0 +1,110 @@
1
+ import { useState } from 'react';
2
+ import { RxpInnerStore } from '../base/index';
3
+ const ExtensionSymbolTag = Symbol('ExtensionSymbolTag');
4
+ export class Extension {
5
+ __TAG__ = ExtensionSymbolTag;
6
+ isActivated = false;
7
+ name;
8
+ version;
9
+ meta;
10
+ onActivated;
11
+ onDeactivated;
12
+ constructor(options) {
13
+ const { name, version, meta, onActivated, onDeactivated } = options;
14
+ this.name = name;
15
+ this.version = version;
16
+ this.meta = meta;
17
+ this.onActivated = onActivated;
18
+ this.onDeactivated = onDeactivated;
19
+ }
20
+ getIsActivated() {
21
+ return this.isActivated;
22
+ }
23
+ async activated() {
24
+ await this.onActivated();
25
+ this.isActivated = true;
26
+ }
27
+ async deactivated() {
28
+ await this.onDeactivated?.();
29
+ this.isActivated = false;
30
+ }
31
+ static isExtension(extension) {
32
+ if (typeof extension !== 'object')
33
+ return false;
34
+ const hasTAG = Reflect.has(extension, '__TAG__');
35
+ if (!hasTAG)
36
+ return false;
37
+ const tag = Reflect.get(extension, '__TAG__');
38
+ return tag === ExtensionSymbolTag;
39
+ }
40
+ }
41
+ export class ExtensionManager {
42
+ rxpInnerStore = new RxpInnerStore();
43
+ extNameMapStore = new Map();
44
+ defineExtension(define) {
45
+ return new Extension(define);
46
+ }
47
+ isExtension(extension) {
48
+ return Extension.isExtension(extension);
49
+ }
50
+ hasExtension(extensionName) {
51
+ const has = this.extNameMapStore.has(extensionName);
52
+ const lifecycle = this.extNameMapStore.get(extensionName);
53
+ if (has && !lifecycle)
54
+ throw new Error(`数据状态异常`);
55
+ return has;
56
+ }
57
+ getExtension(extensionName) {
58
+ if (!this.hasExtension(extensionName))
59
+ return null;
60
+ return this.extNameMapStore.get(extensionName) ?? null;
61
+ }
62
+ registerExtension(extension) {
63
+ if (!this.isExtension(extension))
64
+ throw new Error(`参数非法, 不是一个有效的扩展`);
65
+ const name = extension.name;
66
+ if (this.hasExtension(name)) {
67
+ console.error(`试图重新注册一个已存在得扩展:应该先移除再注册`);
68
+ return;
69
+ }
70
+ this.extNameMapStore.set(name, extension);
71
+ this.rxpInnerStore.update();
72
+ }
73
+ async activatedExtension(name) {
74
+ const extension = this.extNameMapStore.get(name);
75
+ if (!extension)
76
+ throw new Error(`试图激活一个不存在得扩展`);
77
+ return extension.activated();
78
+ }
79
+ async deactivatedExtension(name) {
80
+ const extension = this.extNameMapStore.get(name);
81
+ if (!extension)
82
+ throw new Error(`试图去活一个不存在得扩展`);
83
+ return extension.deactivated();
84
+ }
85
+ async delExtension(name) {
86
+ const extension = this.extNameMapStore.get(name);
87
+ if (!extension)
88
+ throw new Error(`试图删除一个不存在得扩展`);
89
+ extension.deactivated();
90
+ this.extNameMapStore.delete(name);
91
+ this.rxpInnerStore.update();
92
+ }
93
+ useExtensionsList() {
94
+ const value = this.rxpInnerStore.useValueToRenderReactComponent();
95
+ const [statusState] = useState(() => ({
96
+ value: void 0
97
+ }));
98
+ const [normalState] = useState({
99
+ extensions: [],
100
+ });
101
+ if (statusState.value !== value) {
102
+ statusState.value = value;
103
+ normalState.extensions = [...this.extNameMapStore.values()];
104
+ }
105
+ return [normalState.extensions];
106
+ }
107
+ getExtensions() {
108
+ return [...this.extNameMapStore.values()];
109
+ }
110
+ }