@kanian77/choux 0.2.1 → 0.2.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.
- package/README.md +85 -53
- package/bun.lock +5 -3
- package/dist/core/ChouxModule.d.ts +1 -1
- package/dist/core/ChouxModule.d.ts.map +1 -1
- package/dist/core/ChouxModule.js +1 -1
- package/dist/core/ChouxModule.js.map +1 -1
- package/dist/core/HookRegistry.js +121 -59
- package/dist/core/HookRegistry.js.map +1 -1
- package/dist/core/HookRegistry.spec.js +28 -19
- package/dist/core/HookRegistry.spec.js.map +1 -1
- package/dist/core/Plugin.d.ts +1 -6
- package/dist/core/Plugin.d.ts.map +1 -1
- package/dist/core/Plugin.js +1 -2
- package/dist/core/Plugin.js.map +1 -1
- package/dist/core/PluginManager.d.ts +8 -4
- package/dist/core/PluginManager.d.ts.map +1 -1
- package/dist/core/PluginManager.js +168 -55
- package/dist/core/PluginManager.js.map +1 -1
- package/dist/core/PluginManager.spec.js +42 -31
- package/dist/core/PluginManager.spec.js.map +1 -1
- package/dist/decorators/enableHooksDecorator.d.ts.map +1 -1
- package/dist/decorators/enableHooksDecorator.js +4 -1
- package/dist/decorators/enableHooksDecorator.js.map +1 -1
- package/dist/decorators/hookDecorator.d.ts +5 -1
- package/dist/decorators/hookDecorator.d.ts.map +1 -1
- package/dist/decorators/hookDecorator.js +46 -9
- package/dist/decorators/hookDecorator.js.map +1 -1
- package/dist/decorators/hookDecorator.spec.js +107 -25
- package/dist/decorators/hookDecorator.spec.js.map +1 -1
- package/dist/lib/functions/index.d.ts +3 -2
- package/dist/lib/functions/index.d.ts.map +1 -1
- package/dist/lib/functions/index.js +3 -2
- package/dist/lib/functions/index.js.map +1 -1
- package/dist/lib/functions/registerHookHandler.d.ts.map +1 -1
- package/dist/lib/functions/registerHookHandler.js +1 -1
- package/dist/lib/functions/registerHookHandler.js.map +1 -1
- package/dist/lib/functions/registerHooksForInstance.d.ts.map +1 -1
- package/dist/lib/functions/registerHooksForInstance.js +2 -2
- package/dist/lib/functions/registerHooksForInstance.js.map +1 -1
- package/dist/lib/functions/registerInstanceHooks.d.ts.map +1 -1
- package/dist/lib/functions/registerInstanceHooks.js +19 -10
- package/dist/lib/functions/registerInstanceHooks.js.map +1 -1
- package/dist/lib/functions/registerStaticHooks.d.ts +2 -0
- package/dist/lib/functions/registerStaticHooks.d.ts.map +1 -0
- package/dist/lib/functions/registerStaticHooks.js +36 -0
- package/dist/lib/functions/registerStaticHooks.js.map +1 -0
- package/dist/lib/test-related/plugins/plugin-a/module.d.ts +5 -2
- package/dist/lib/test-related/plugins/plugin-a/module.d.ts.map +1 -1
- package/dist/lib/test-related/plugins/plugin-a/module.js +156 -77
- package/dist/lib/test-related/plugins/plugin-a/module.js.map +1 -1
- package/dist/lib/test-related/plugins/plugin-b/module.d.ts +5 -2
- package/dist/lib/test-related/plugins/plugin-b/module.d.ts.map +1 -1
- package/dist/lib/test-related/plugins/plugin-b/module.js +158 -77
- package/dist/lib/test-related/plugins/plugin-b/module.js.map +1 -1
- package/dist/lib/test-related/services.d.ts +17 -0
- package/dist/lib/test-related/services.d.ts.map +1 -0
- package/dist/lib/test-related/services.js +104 -0
- package/dist/lib/test-related/services.js.map +1 -0
- package/dist/lib/types/IHookMetadata.d.ts +6 -0
- package/dist/lib/types/IHookMetadata.d.ts.map +1 -0
- package/dist/lib/types/IHookMetadata.js +2 -0
- package/dist/lib/types/IHookMetadata.js.map +1 -0
- package/dist/lib/types/IHookRegistry.js +1 -0
- package/dist/lib/types/IPluginManager.d.ts +3 -1
- package/dist/lib/types/IPluginManager.d.ts.map +1 -1
- package/dist/lib/types/IPluginManager.js +1 -0
- package/dist/lib/types/LoadedPlugin.d.ts +2 -2
- package/dist/lib/types/LoadedPlugin.d.ts.map +1 -1
- package/dist/lib/types/LoadedPlugin.js +1 -0
- package/dist/lib/types/PluginMetadata.js +1 -0
- package/dist/lib/types/PluginModule.d.ts +10 -0
- package/dist/lib/types/PluginModule.d.ts.map +1 -0
- package/dist/lib/types/PluginModule.js +14 -0
- package/dist/lib/types/PluginModule.js.map +1 -0
- package/dist/lib/types/index.d.ts +1 -1
- package/dist/lib/types/index.d.ts.map +1 -1
- package/dist/lib/types/index.js +1 -1
- package/dist/lib/types/index.js.map +1 -1
- package/package.json +2 -2
- package/tsconfig.json +15 -9
- package/dist/core/PluginLoader.d.ts +0 -13
- package/dist/core/PluginLoader.d.ts.map +0 -1
- package/dist/core/PluginLoader.js +0 -147
- package/dist/core/PluginLoader.js.map +0 -1
- package/dist/core/PluginLoader.spec.d.ts +0 -2
- package/dist/core/PluginLoader.spec.d.ts.map +0 -1
- package/dist/core/PluginLoader.spec.js +0 -114
- package/dist/core/PluginLoader.spec.js.map +0 -1
- package/dist/example-plugin/module.d.ts +0 -20
- package/dist/example-plugin/module.d.ts.map +0 -1
- package/dist/example-plugin/module.js +0 -90
- package/dist/example-plugin/module.js.map +0 -1
- package/dist/example-plugin/services.d.ts +0 -9
- package/dist/example-plugin/services.d.ts.map +0 -1
- package/dist/example-plugin/services.js +0 -29
- package/dist/example-plugin/services.js.map +0 -1
- package/dist/example-plugin/tokens.d.ts +0 -2
- package/dist/example-plugin/tokens.d.ts.map +0 -1
- package/dist/example-plugin/tokens.js +0 -2
- package/dist/example-plugin/tokens.js.map +0 -1
- package/dist/lib/types/HookMetadata.d.ts +0 -5
- package/dist/lib/types/HookMetadata.d.ts.map +0 -1
- package/dist/lib/types/HookMetadata.js +0 -1
- package/dist/lib/types/HookMetadata.js.map +0 -1
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import type { IHookRegistry, IPluginManager, LoadedPlugin } from '../lib/types';
|
|
2
|
-
import {
|
|
2
|
+
import { PluginModule } from '../lib/types/PluginModule';
|
|
3
3
|
export declare class PluginManager implements IPluginManager {
|
|
4
4
|
private readonly hkRegistry;
|
|
5
|
-
private
|
|
6
|
-
constructor(
|
|
7
|
-
|
|
5
|
+
private loadedPlugins;
|
|
6
|
+
constructor();
|
|
7
|
+
initializePlugin(pluginModule: PluginModule): Promise<LoadedPlugin>;
|
|
8
|
+
initializePlugins(pluginModules: PluginModule[]): Promise<void>;
|
|
9
|
+
loadPluginModule(pluginModule: PluginModule): Promise<LoadedPlugin>;
|
|
10
|
+
private initializeLoadedPlugin;
|
|
8
11
|
shutdown(): Promise<void>;
|
|
12
|
+
unloadPlugin(pluginName: string): Promise<void>;
|
|
9
13
|
getPlugin(name: string): LoadedPlugin | undefined;
|
|
10
14
|
getAllPlugins(): LoadedPlugin[];
|
|
11
15
|
get hookRegistry(): IHookRegistry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PluginManager.d.ts","sourceRoot":"","sources":["../../src/core/PluginManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"PluginManager.d.ts","sourceRoot":"","sources":["../../src/core/PluginManager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAKzD,qBACa,aAAc,YAAW,cAAc;IAElD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,aAAa,CAAwC;;IAIvD,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAOnE,iBAAiB,CAAC,aAAa,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/D,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;YA8B3D,sBAAsB;IAY9B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAazB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBrD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIjD,aAAa,IAAI,YAAY,EAAE;IAI/B,IAAI,YAAY,IAAI,aAAa,CAEhC;CACF"}
|
|
@@ -1,63 +1,176 @@
|
|
|
1
|
-
var
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
+
var _, done = false;
|
|
7
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
+
var context = {};
|
|
9
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
+
if (kind === "accessor") {
|
|
14
|
+
if (result === void 0) continue;
|
|
15
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
+
}
|
|
20
|
+
else if (_ = accept(result)) {
|
|
21
|
+
if (kind === "field") initializers.unshift(_);
|
|
22
|
+
else descriptor[key] = _;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
+
done = true;
|
|
6
27
|
};
|
|
7
|
-
var
|
|
8
|
-
|
|
28
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
+
var useValue = arguments.length > 2;
|
|
30
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
+
}
|
|
33
|
+
return useValue ? value : void 0;
|
|
34
|
+
};
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
9
43
|
};
|
|
10
|
-
var
|
|
11
|
-
|
|
44
|
+
var __setFunctionName = (this && this.__setFunctionName) || function (f, name, prefix) {
|
|
45
|
+
if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
|
|
46
|
+
return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
|
|
12
47
|
};
|
|
13
|
-
import { Service, Inject } from '@kanian77/
|
|
48
|
+
import { Service, Inject, bootstrap, inject } from '@kanian77/tject';
|
|
14
49
|
import { LIFECYCLE_HOOKS } from './HookRegistry';
|
|
15
50
|
import { PLUGIN_MANAGER_TOKEN, HOOK_REGISTRY_TOKEN } from '../lib/types/tokens';
|
|
16
|
-
import { PluginLoader } from './PluginLoader';
|
|
17
51
|
// Removed local interface IPluginManager, now imported from lib/types
|
|
18
|
-
let PluginManager =
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
52
|
+
let PluginManager = (() => {
|
|
53
|
+
let _classDecorators = [Service({ token: PLUGIN_MANAGER_TOKEN })];
|
|
54
|
+
let _classDescriptor;
|
|
55
|
+
let _classExtraInitializers = [];
|
|
56
|
+
let _classThis;
|
|
57
|
+
let _hkRegistry_decorators;
|
|
58
|
+
let _hkRegistry_initializers = [];
|
|
59
|
+
let _hkRegistry_extraInitializers = [];
|
|
60
|
+
var PluginManager = _classThis = class {
|
|
61
|
+
constructor() {
|
|
62
|
+
Object.defineProperty(this, "hkRegistry", {
|
|
63
|
+
enumerable: true,
|
|
64
|
+
configurable: true,
|
|
65
|
+
writable: true,
|
|
66
|
+
value: __runInitializers(this, _hkRegistry_initializers, void 0)
|
|
67
|
+
});
|
|
68
|
+
Object.defineProperty(this, "loadedPlugins", {
|
|
69
|
+
enumerable: true,
|
|
70
|
+
configurable: true,
|
|
71
|
+
writable: true,
|
|
72
|
+
value: (__runInitializers(this, _hkRegistry_extraInitializers), new Map())
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
initializePlugin(pluginModule) {
|
|
76
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
+
yield this.hkRegistry.trigger(LIFECYCLE_HOOKS.APPLICATION_START);
|
|
78
|
+
const plugin = yield this.loadPluginModule(pluginModule);
|
|
79
|
+
return plugin;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
initializePlugins(pluginModules) {
|
|
83
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
yield this.hkRegistry.trigger(LIFECYCLE_HOOKS.APPLICATION_START);
|
|
85
|
+
const plugins = yield Promise.all(pluginModules.map((module) => this.initializePlugin(module)));
|
|
86
|
+
console.log(`Loaded ${plugins.length} plugins:`);
|
|
87
|
+
plugins.forEach((plugin) => {
|
|
88
|
+
console.log(` - ${plugin.metadata.name} v${plugin.metadata.version}`);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
loadPluginModule(pluginModule) {
|
|
93
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
94
|
+
const hookRegistry = inject(HOOK_REGISTRY_TOKEN);
|
|
95
|
+
bootstrap(pluginModule);
|
|
96
|
+
const pluginInstance = inject(pluginModule.token);
|
|
97
|
+
yield hookRegistry.trigger(LIFECYCLE_HOOKS.BEFORE_PLUGIN_LOAD, pluginInstance.metadata);
|
|
98
|
+
if (!pluginInstance.metadata) {
|
|
99
|
+
throw new Error(`Plugin ${pluginInstance} must have metadata property`);
|
|
100
|
+
}
|
|
101
|
+
// Call plugin's onLoad lifecycle method
|
|
102
|
+
if (pluginInstance.onLoad) {
|
|
103
|
+
yield pluginInstance.onLoad();
|
|
104
|
+
}
|
|
105
|
+
const loadedPlugin = {
|
|
106
|
+
plugin: pluginInstance,
|
|
107
|
+
metadata: pluginInstance.metadata,
|
|
108
|
+
};
|
|
109
|
+
this.loadedPlugins.set(pluginInstance.metadata.name, loadedPlugin);
|
|
110
|
+
yield hookRegistry.trigger(LIFECYCLE_HOOKS.AFTER_PLUGIN_LOAD, loadedPlugin);
|
|
111
|
+
yield this.initializeLoadedPlugin(loadedPlugin);
|
|
112
|
+
return loadedPlugin;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
initializeLoadedPlugin(loaded) {
|
|
116
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
117
|
+
const hookRegistry = inject(HOOK_REGISTRY_TOKEN);
|
|
118
|
+
yield hookRegistry.trigger(LIFECYCLE_HOOKS.BEFORE_PLUGIN_INIT, loaded);
|
|
119
|
+
// Call plugin's onInit lifecycle method
|
|
120
|
+
if (loaded.plugin.onInit) {
|
|
121
|
+
yield loaded.plugin.onInit();
|
|
122
|
+
}
|
|
123
|
+
yield hookRegistry.trigger(LIFECYCLE_HOOKS.AFTER_PLUGIN_INIT, loaded);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
shutdown() {
|
|
127
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
128
|
+
yield this.hkRegistry.trigger(LIFECYCLE_HOOKS.APPLICATION_SHUTDOWN);
|
|
129
|
+
const plugins = this.getAllPlugins();
|
|
130
|
+
// Unload in reverse dependency order
|
|
131
|
+
for (const plugin of plugins.reverse()) {
|
|
132
|
+
yield this.unloadPlugin(plugin.metadata.name);
|
|
133
|
+
}
|
|
134
|
+
this.hkRegistry.clear();
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
unloadPlugin(pluginName) {
|
|
138
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
139
|
+
const loaded = this.loadedPlugins.get(pluginName);
|
|
140
|
+
if (!loaded) {
|
|
141
|
+
throw new Error(`Plugin ${pluginName} is not loaded`);
|
|
142
|
+
}
|
|
143
|
+
const hookRegistry = inject(HOOK_REGISTRY_TOKEN);
|
|
144
|
+
yield hookRegistry.trigger(LIFECYCLE_HOOKS.BEFORE_PLUGIN_DESTROY, loaded);
|
|
145
|
+
// Call plugin's onDestroy lifecycle method
|
|
146
|
+
if (loaded.plugin.onDestroy) {
|
|
147
|
+
yield loaded.plugin.onDestroy();
|
|
148
|
+
}
|
|
149
|
+
this.loadedPlugins.delete(pluginName);
|
|
150
|
+
yield hookRegistry.trigger(LIFECYCLE_HOOKS.AFTER_PLUGIN_DESTROY, loaded);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
getPlugin(name) {
|
|
154
|
+
return this.loadedPlugins.get(name);
|
|
155
|
+
}
|
|
156
|
+
getAllPlugins() {
|
|
157
|
+
return Array.from(this.loadedPlugins.values());
|
|
158
|
+
}
|
|
159
|
+
get hookRegistry() {
|
|
160
|
+
return this.hkRegistry;
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
__setFunctionName(_classThis, "PluginManager");
|
|
164
|
+
(() => {
|
|
165
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
|
|
166
|
+
_hkRegistry_decorators = [Inject({ token: HOOK_REGISTRY_TOKEN })];
|
|
167
|
+
__esDecorate(null, null, _hkRegistry_decorators, { kind: "field", name: "hkRegistry", static: false, private: false, access: { has: obj => "hkRegistry" in obj, get: obj => obj.hkRegistry, set: (obj, value) => { obj.hkRegistry = value; } }, metadata: _metadata }, _hkRegistry_initializers, _hkRegistry_extraInitializers);
|
|
168
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
169
|
+
PluginManager = _classThis = _classDescriptor.value;
|
|
170
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
171
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
172
|
+
})();
|
|
173
|
+
return PluginManager = _classThis;
|
|
174
|
+
})();
|
|
62
175
|
export { PluginManager };
|
|
63
176
|
//# sourceMappingURL=PluginManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PluginManager.js","sourceRoot":"","sources":["../../src/core/PluginManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PluginManager.js","sourceRoot":"","sources":["../../src/core/PluginManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,50 +1,61 @@
|
|
|
1
|
-
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { describe, it, expect, beforeAll, } from 'bun:test';
|
|
11
|
+
import { PluginManager } from './PluginManager';
|
|
2
12
|
import { resolve } from 'path';
|
|
3
|
-
import { inject } from '@kanian77/
|
|
4
|
-
import { PLUGIN_MANAGER_TOKEN } from '../lib/types/tokens';
|
|
13
|
+
import { bootstrap, inject, Module } from '@kanian77/tject';
|
|
14
|
+
import { HOOK_REGISTRY_TOKEN, PLUGIN_MANAGER_TOKEN } from '../lib/types/tokens';
|
|
15
|
+
import { HookRegistry } from './HookRegistry';
|
|
16
|
+
import { PluginAModule } from '../lib/test-related/plugins/plugin-a/module';
|
|
17
|
+
import { PluginBModule } from '../lib/test-related/plugins/plugin-b/module';
|
|
5
18
|
describe('PluginManager', () => {
|
|
6
19
|
let manager;
|
|
7
20
|
const pluginsDir = resolve('src/lib/test-related/plugins');
|
|
8
|
-
|
|
21
|
+
beforeAll(() => {
|
|
22
|
+
const TestModule = new Module({
|
|
23
|
+
providers: [
|
|
24
|
+
{
|
|
25
|
+
provide: HOOK_REGISTRY_TOKEN,
|
|
26
|
+
useClass: HookRegistry,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
provide: PLUGIN_MANAGER_TOKEN,
|
|
30
|
+
useClass: PluginManager,
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
});
|
|
34
|
+
bootstrap(TestModule);
|
|
9
35
|
manager = inject(PLUGIN_MANAGER_TOKEN);
|
|
10
36
|
});
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
});
|
|
14
|
-
it('initialize loads plugins and prints info', async () => {
|
|
15
|
-
let logOutput = '';
|
|
16
|
-
const origLog = console.log;
|
|
17
|
-
console.log = (msg) => {
|
|
18
|
-
logOutput += msg + '\n';
|
|
19
|
-
};
|
|
20
|
-
await manager.initialize(pluginsDir);
|
|
21
|
-
expect(logOutput).toContain('Loaded 2 plugins:');
|
|
22
|
-
expect(logOutput).toContain('plugin-a');
|
|
23
|
-
expect(logOutput).toContain('plugin-b');
|
|
24
|
-
console.log = origLog;
|
|
25
|
-
});
|
|
26
|
-
it('getPlugin returns correct plugin', async () => {
|
|
27
|
-
await manager.initialize(pluginsDir);
|
|
37
|
+
it('getPlugin returns correct plugin', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
38
|
+
yield manager.initializePlugins([PluginAModule, PluginBModule]);
|
|
28
39
|
const pluginA = manager.getPlugin('pluginA');
|
|
29
40
|
expect(pluginA).toBeDefined();
|
|
30
|
-
expect(pluginA
|
|
41
|
+
expect(pluginA === null || pluginA === void 0 ? void 0 : pluginA.metadata.name).toBe('pluginA');
|
|
31
42
|
const pluginB = manager.getPlugin('pluginB');
|
|
32
43
|
expect(pluginB).toBeDefined();
|
|
33
|
-
expect(pluginB
|
|
34
|
-
});
|
|
35
|
-
it('getAllPlugins returns all loaded plugins',
|
|
36
|
-
|
|
44
|
+
expect(pluginB === null || pluginB === void 0 ? void 0 : pluginB.metadata.name).toBe('pluginB');
|
|
45
|
+
}));
|
|
46
|
+
it('getAllPlugins returns all loaded plugins', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
47
|
+
yield manager.initializePlugins([PluginAModule, PluginBModule]);
|
|
37
48
|
const all = manager.getAllPlugins();
|
|
38
49
|
expect(all.length).toBe(2);
|
|
39
50
|
expect(all.map((p) => p.metadata.name).sort()).toEqual([
|
|
40
51
|
'pluginA',
|
|
41
52
|
'pluginB',
|
|
42
53
|
]);
|
|
43
|
-
});
|
|
44
|
-
it('shutdown unloads all plugins and clears registry',
|
|
45
|
-
|
|
46
|
-
|
|
54
|
+
}));
|
|
55
|
+
it('shutdown unloads all plugins and clears registry', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
56
|
+
yield manager.initializePlugins([PluginAModule, PluginBModule]);
|
|
57
|
+
yield manager.shutdown();
|
|
47
58
|
expect(manager.getAllPlugins()).toEqual([]);
|
|
48
|
-
});
|
|
59
|
+
}));
|
|
49
60
|
});
|
|
50
61
|
//# sourceMappingURL=PluginManager.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PluginManager.spec.js","sourceRoot":"","sources":["../../src/core/PluginManager.spec.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"PluginManager.spec.js","sourceRoot":"","sources":["../../src/core/PluginManager.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enableHooksDecorator.d.ts","sourceRoot":"","sources":["../../src/decorators/enableHooksDecorator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"enableHooksDecorator.d.ts","sourceRoot":"","sources":["../../src/decorators/enableHooksDecorator.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;CAAE,eACnD,CAAC,MAWf,CAAC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { registerInstanceHooks } from '../lib/functions/registerInstanceHooks';
|
|
2
|
+
import { registerStaticHooks } from '../lib/functions/registerStaticHooks';
|
|
2
3
|
export const EnableHooks = (constructor) => {
|
|
3
|
-
|
|
4
|
+
const WrappedClass = class extends constructor {
|
|
4
5
|
constructor(...args) {
|
|
5
6
|
super(...args);
|
|
6
7
|
registerInstanceHooks(this);
|
|
8
|
+
registerStaticHooks(WrappedClass);
|
|
7
9
|
}
|
|
8
10
|
};
|
|
11
|
+
return WrappedClass;
|
|
9
12
|
};
|
|
10
13
|
//# sourceMappingURL=enableHooksDecorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enableHooksDecorator.js","sourceRoot":"","sources":["../../src/decorators/enableHooksDecorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"enableHooksDecorator.js","sourceRoot":"","sources":["../../src/decorators/enableHooksDecorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,WAAc,EACd,EAAE;IACF,MAAM,YAAY,GAAG,KAAM,SAAQ,WAAW;QAC5C,YAAY,GAAG,IAAW;YACxB,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YACf,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC5B,mBAAmB,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC;KACG,CAAC;IAEP,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC"}
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @Hook decorator
|
|
3
|
+
* Attaches metadata to a class to register a method as a hook handler.
|
|
4
|
+
*/
|
|
5
|
+
export declare function Hook(hookName: string): <T extends (...args: any[]) => any>(target: T, context: ClassMethodDecoratorContext<any, T>) => T | void;
|
|
2
6
|
//# sourceMappingURL=hookDecorator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hookDecorator.d.ts","sourceRoot":"","sources":["../../src/decorators/hookDecorator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hookDecorator.d.ts","sourceRoot":"","sources":["../../src/decorators/hookDecorator.ts"],"names":[],"mappings":"AAqCA;;;GAGG;AACH,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,IAClB,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,UACxC,CAAC,WACA,2BAA2B,CAAC,GAAG,EAAE,CAAC,CAAC,KAC3C,CAAC,GAAG,IAAI,CAwBZ"}
|
|
@@ -1,15 +1,52 @@
|
|
|
1
|
+
// File: src/decorators/hookDecorator.ts (or wherever you have it)
|
|
1
2
|
import { HOOK_METADATA_KEY } from '../lib/types';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Helper function to idempotently add metadata to a class constructor.
|
|
5
|
+
*/
|
|
6
|
+
function addHookMetadata(ctor, hookName, methodName, isStatic = false) {
|
|
7
|
+
if (!Object.hasOwnProperty.call(ctor, HOOK_METADATA_KEY)) {
|
|
8
|
+
const parentMetadata = ctor[HOOK_METADATA_KEY];
|
|
9
|
+
ctor[HOOK_METADATA_KEY] = parentMetadata ? [...parentMetadata] : [];
|
|
10
|
+
}
|
|
11
|
+
const metadata = ctor[HOOK_METADATA_KEY];
|
|
12
|
+
// Prevent duplicates
|
|
13
|
+
const exists = metadata.some((m) => m.hookName === hookName &&
|
|
14
|
+
m.methodName === methodName &&
|
|
15
|
+
m.isStatic === isStatic);
|
|
16
|
+
if (!exists) {
|
|
17
|
+
metadata.push({
|
|
9
18
|
hookName,
|
|
10
|
-
methodName
|
|
19
|
+
methodName,
|
|
20
|
+
isStatic,
|
|
11
21
|
});
|
|
12
|
-
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* @Hook decorator
|
|
26
|
+
* Attaches metadata to a class to register a method as a hook handler.
|
|
27
|
+
*/
|
|
28
|
+
export function Hook(hookName) {
|
|
29
|
+
return function (target, context) {
|
|
30
|
+
if (context.kind !== 'method') {
|
|
31
|
+
throw new Error('@Hook decorator can only be applied to methods.');
|
|
32
|
+
}
|
|
33
|
+
const methodNameStr = context.name.toString();
|
|
34
|
+
if (context.static) {
|
|
35
|
+
// For static methods, initializer runs ONCE on class definition
|
|
36
|
+
context.addInitializer(function () {
|
|
37
|
+
// 'this' is the class constructor
|
|
38
|
+
addHookMetadata(this, hookName, methodNameStr, true);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// For instance methods, initializer runs PER INSTANCE creation
|
|
43
|
+
context.addInitializer(function () {
|
|
44
|
+
// 'this' is the class instance, get constructor from it
|
|
45
|
+
addHookMetadata(this.constructor, hookName, methodNameStr);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// We are not changing the method, so return void
|
|
49
|
+
return;
|
|
13
50
|
};
|
|
14
51
|
}
|
|
15
52
|
//# sourceMappingURL=hookDecorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hookDecorator.js","sourceRoot":"","sources":["../../src/decorators/hookDecorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"hookDecorator.js","sourceRoot":"","sources":["../../src/decorators/hookDecorator.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,OAAO,EAAE,iBAAiB,EAAiB,MAAM,cAAc,CAAC;AAEhE;;GAEG;AACH,SAAS,eAAe,CACtB,IAAS,EACT,QAAgB,EAChB,UAAkB,EAClB,WAAoB,KAAK;IAEzB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;QACzD,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/C,IAAI,CAAC,iBAAiB,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,QAAQ,GAAoB,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE1D,qBAAqB;IACrB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,QAAQ,KAAK,QAAQ;QACvB,CAAC,CAAC,UAAU,KAAK,UAAU;QAC3B,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC1B,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC;YACZ,QAAQ;YACR,UAAU;YACV,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,QAAgB;IACnC,OAAO,UACL,MAAS,EACT,OAA4C;QAE5C,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAE9C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,gEAAgE;YAChE,OAAO,CAAC,cAAc,CAAC;gBACrB,kCAAkC;gBAClC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,+DAA+D;YAC/D,OAAO,CAAC,cAAc,CAAC;gBACrB,wDAAwD;gBACxD,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;QACL,CAAC;QAED,iDAAiD;QACjD,OAAO;IACT,CAAC,CAAC;AACJ,CAAC"}
|