@zhin.js/dependency 1.0.1

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.
@@ -0,0 +1,42 @@
1
+ import { EventEmitter } from 'events';
2
+ export declare const isBun: boolean;
3
+ export declare const isCommonJS: boolean;
4
+ export declare class Dependency<P extends Dependency = Dependency<any>> extends EventEmitter {
5
+ #private;
6
+ readonly name: string;
7
+ get filePath(): string;
8
+ parent: P | null;
9
+ children: P[];
10
+ started: boolean;
11
+ mounted: boolean;
12
+ disposed: boolean;
13
+ reloading: boolean;
14
+ private static importedModules;
15
+ constructor(filePath: string);
16
+ addMountHook(hook: () => void | Promise<void>): void;
17
+ addDisposeHook(hook: () => void | Promise<void>): void;
18
+ start(): Promise<void>;
19
+ mount(): Promise<void>;
20
+ emit(event: string, ...args: any[]): boolean;
21
+ emitAsync(event: string, ...args: any[]): Promise<void>;
22
+ dispatchAsync(event: string, ...args: any[]): Promise<void>;
23
+ broadcastAsync(event: string, ...args: any[]): Promise<void>;
24
+ dispose(): Promise<void>;
25
+ stop(): Promise<void>;
26
+ reload(): Promise<Dependency>;
27
+ private removeModuleCache;
28
+ dispatch(event: string, ...args: any[]): void;
29
+ broadcast(event: string, ...args: any[]): void;
30
+ private getRelativePathFromParent;
31
+ importChild(importPath: string): Promise<Dependency>;
32
+ private resolveFilePath;
33
+ private resolveImportPath;
34
+ getRoot(): Dependency;
35
+ getPath(): Dependency[];
36
+ getDepth(): number;
37
+ isRoot(): boolean;
38
+ toString(): string;
39
+ printTree(indent?: string, isLast?: boolean, isRoot?: boolean): string;
40
+ toJSON(): object;
41
+ }
42
+ //# sourceMappingURL=dependency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency.d.ts","sourceRoot":"","sources":["../src/dependency.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAKtC,eAAO,MAAM,KAAK,SAAyB,CAAA;AAC3C,eAAO,MAAM,UAAU,SAAuC,CAAA;AAM9D,qBAAa,UAAU,CAAC,CAAC,SAAS,UAAU,GAAC,UAAU,CAAC,GAAG,CAAC,CAAE,SAAQ,YAAY;;IAEhF,SAAgB,IAAI,EAAE,MAAM,CAAC;IAM7B,IAAI,QAAQ,IAAI,MAAM,CAErB;IAGM,MAAM,EAAE,CAAC,GAAG,IAAI,CAAQ;IAGxB,QAAQ,EAAE,CAAC,EAAE,CAAM;IAG1B,OAAO,EAAE,OAAO,CAAS;IAGzB,OAAO,EAAE,OAAO,CAAS;IAGzB,QAAQ,EAAE,OAAO,CAAS;IAG1B,SAAS,EAAE,OAAO,CAAS;IAG3B,OAAO,CAAC,MAAM,CAAC,eAAe,CAA0B;gBAM5C,QAAQ,EAAE,MAAM;IAU5B,YAAY,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAOpD,cAAc,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAOhD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiDtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO;IAStC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvD,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBrB,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;IAgEnC,OAAO,CAAC,iBAAiB;IAkBzB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAK7C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAc9C,OAAO,CAAC,yBAAyB;IAyB3B,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAe1D,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,IAAI,UAAU;IAWrB,OAAO,IAAI,UAAU,EAAE;IAavB,QAAQ,IAAI,MAAM;IAalB,MAAM,IAAI,OAAO;IAOjB,QAAQ,IAAI,MAAM;IAOlB,SAAS,CAAC,MAAM,GAAE,MAAW,EAAE,MAAM,GAAE,OAAc,EAAE,MAAM,GAAE,OAAe,GAAG,MAAM;IAqBvF,MAAM,IAAI,MAAM;CAgBjB"}
@@ -0,0 +1,295 @@
1
+ import * as path from 'path';
2
+ import { EventEmitter } from 'events';
3
+ import fs from 'fs';
4
+ import { pathToFileURL } from 'url';
5
+ export const isBun = typeof Bun !== 'undefined';
6
+ export const isCommonJS = !import.meta?.url?.startsWith('file:');
7
+ export class Dependency extends EventEmitter {
8
+ name;
9
+ #filePath;
10
+ get filePath() {
11
+ return this.#filePath;
12
+ }
13
+ parent = null;
14
+ children = [];
15
+ started = false;
16
+ mounted = false;
17
+ disposed = false;
18
+ reloading = false;
19
+ static importedModules = new Set();
20
+ constructor(filePath) {
21
+ super();
22
+ this.#filePath = filePath;
23
+ const basename = path.basename(filePath);
24
+ this.name = path.basename(basename, path.extname(basename));
25
+ }
26
+ addMountHook(hook) {
27
+ this.on('self.mounted', hook);
28
+ }
29
+ addDisposeHook(hook) {
30
+ this.on('self.dispose', hook);
31
+ }
32
+ async start() {
33
+ if (this.started) {
34
+ return;
35
+ }
36
+ this.dispatch('before-start', this);
37
+ this.#filePath = this.resolveFilePath(this.#filePath);
38
+ if (Dependency.importedModules.has(this.#filePath)) {
39
+ this.started = true;
40
+ return;
41
+ }
42
+ Dependency.importedModules.add(this.#filePath);
43
+ const { setCurrentDependency } = await import('./hook-registry.js');
44
+ setCurrentDependency(this);
45
+ try {
46
+ const fileUrl = pathToFileURL(this.#filePath).href;
47
+ const importUrl = `${fileUrl}?t=${Date.now()}`;
48
+ await import(importUrl);
49
+ if (this.#filePath.endsWith('.js')) {
50
+ let tsPath = this.#filePath.replace(/\.js$/, '.ts');
51
+ if (fs.existsSync(tsPath)) {
52
+ this.#filePath = tsPath;
53
+ }
54
+ }
55
+ }
56
+ catch (error) {
57
+ console.warn(`Failed to import module: ${this.#filePath}`, error);
58
+ this.dispatch('error', this, error);
59
+ }
60
+ finally {
61
+ setCurrentDependency(null);
62
+ this.started = true;
63
+ }
64
+ this.dispatch('after-start', this);
65
+ await this.mount();
66
+ }
67
+ async mount() {
68
+ if (this.mounted) {
69
+ return;
70
+ }
71
+ await this.dispatchAsync('before-mount', this);
72
+ await this.emitAsync('self.mounted', this);
73
+ this.mounted = true;
74
+ this.disposed = false;
75
+ await this.dispatchAsync('after-mount', this);
76
+ await this.dispatchAsync('mounted', this);
77
+ }
78
+ emit(event, ...args) {
79
+ const beforeListeners = this.listeners(`before-${event}`);
80
+ beforeListeners.forEach(listener => listener(...args));
81
+ const listeners = this.listeners(event);
82
+ listeners.forEach(listener => listener(...args));
83
+ const afterListeners = this.listeners(`after-${event}`);
84
+ afterListeners.forEach(listener => listener(...args));
85
+ return true;
86
+ }
87
+ async emitAsync(event, ...args) {
88
+ const beforeListeners = this.listeners(`before-${event}`);
89
+ await Promise.allSettled(beforeListeners.map(listener => listener(...args)));
90
+ const listeners = this.listeners(event);
91
+ await Promise.allSettled(listeners.map(listener => listener(...args)));
92
+ const afterListeners = this.listeners(`after-${event}`);
93
+ await Promise.allSettled(afterListeners.map(listener => listener(...args)));
94
+ }
95
+ async dispatchAsync(event, ...args) {
96
+ if (this.parent)
97
+ await this.parent.dispatchAsync(event, ...args);
98
+ else
99
+ await this.broadcastAsync(event, ...args);
100
+ }
101
+ async broadcastAsync(event, ...args) {
102
+ this.emitAsync(event, ...args);
103
+ for (const child of this.children) {
104
+ await child.broadcastAsync(event, ...args);
105
+ }
106
+ }
107
+ async dispose() {
108
+ if (!this.mounted || this.disposed) {
109
+ return;
110
+ }
111
+ await this.emitAsync('dispose', this);
112
+ await this.emitAsync('self.dispose', this);
113
+ this.mounted = false;
114
+ this.disposed = true;
115
+ }
116
+ async stop() {
117
+ if (!this.started) {
118
+ return;
119
+ }
120
+ await this.dispose();
121
+ for (let i = this.children.length - 1; i >= 0; i--) {
122
+ await this.children[i].stop();
123
+ }
124
+ this.started = false;
125
+ }
126
+ async reload() {
127
+ if (this.reloading) {
128
+ return this;
129
+ }
130
+ this.reloading = true;
131
+ try {
132
+ this.dispatch('before-reload', this);
133
+ const savedChildren = [...this.children];
134
+ await this.dispose();
135
+ const parent = this.parent;
136
+ const indexInParent = parent?.children.indexOf(this) ?? -1;
137
+ if (indexInParent && indexInParent !== -1) {
138
+ parent?.children.splice(indexInParent, 1);
139
+ }
140
+ const absolutePath = this.resolveFilePath(this.#filePath);
141
+ Dependency.importedModules.delete(absolutePath);
142
+ const jsPath = absolutePath.replace(/\.ts$/, '.js');
143
+ Dependency.importedModules.delete(jsPath);
144
+ this.removeModuleCache(absolutePath);
145
+ const relativePath = this.getRelativePathFromParent(parent);
146
+ const newNode = await parent?.importChild(relativePath) || new this.constructor(this.#filePath);
147
+ if (!parent)
148
+ await newNode.start();
149
+ newNode.children = savedChildren;
150
+ for (const child of savedChildren) {
151
+ child.parent = newNode;
152
+ }
153
+ newNode.dispatch('after-reload', newNode);
154
+ newNode.dispatch('reloaded', newNode);
155
+ return newNode;
156
+ }
157
+ catch (error) {
158
+ this.dispatch('error', this, error);
159
+ this.dispatch('reload.error', this, error);
160
+ return this;
161
+ }
162
+ finally {
163
+ this.reloading = false;
164
+ }
165
+ }
166
+ removeModuleCache(filePath) {
167
+ if (typeof require !== 'undefined' && require.cache) {
168
+ if (require.cache[filePath]) {
169
+ delete require.cache[filePath];
170
+ }
171
+ }
172
+ if (typeof import.meta.cache !== 'undefined') {
173
+ if (import.meta.cache[filePath]) {
174
+ delete import.meta.cache[filePath];
175
+ }
176
+ }
177
+ }
178
+ dispatch(event, ...args) {
179
+ if (this.parent)
180
+ return this.parent.dispatch(event, ...args);
181
+ return this.broadcast(event, ...args);
182
+ }
183
+ broadcast(event, ...args) {
184
+ if (event === 'error' && this.listenerCount('error') === 0) {
185
+ const [, error] = args;
186
+ console.error(`[${this.name}] Unhandled error:`, error);
187
+ }
188
+ else {
189
+ this.emit(event, ...args);
190
+ }
191
+ this.children.forEach(child => child.broadcast(event, ...args));
192
+ }
193
+ getRelativePathFromParent(parent) {
194
+ if (!parent) {
195
+ return this.#filePath;
196
+ }
197
+ const parentDir = path.dirname(parent.#filePath);
198
+ const currentPath = this.#filePath;
199
+ let relativePath = path.relative(parentDir, currentPath);
200
+ if (!relativePath.startsWith('.')) {
201
+ relativePath = './' + relativePath;
202
+ }
203
+ if (relativePath.endsWith('.js')) {
204
+ relativePath = relativePath.slice(0, -3);
205
+ }
206
+ return relativePath;
207
+ }
208
+ async importChild(importPath) {
209
+ const absolutePath = this.resolveImportPath(this.#filePath, importPath);
210
+ const child = new this.constructor(absolutePath);
211
+ child.parent = this;
212
+ this.children.push(child);
213
+ await child.start();
214
+ return child;
215
+ }
216
+ resolveFilePath(filePath) {
217
+ if (path.isAbsolute(filePath)) {
218
+ return filePath;
219
+ }
220
+ return path.resolve(process.cwd(), filePath);
221
+ }
222
+ resolveImportPath(currentFile, importPath) {
223
+ const currentDir = path.dirname(this.resolveFilePath(currentFile));
224
+ if (importPath.startsWith('.')) {
225
+ let resolved = path.resolve(currentDir, importPath);
226
+ if (!path.extname(resolved)) {
227
+ const currentExt = path.extname(currentFile);
228
+ if (currentExt === '.ts') {
229
+ resolved = resolved + '.ts';
230
+ }
231
+ else {
232
+ resolved = resolved + '.js';
233
+ }
234
+ }
235
+ return resolved;
236
+ }
237
+ return importPath;
238
+ }
239
+ getRoot() {
240
+ let current = this;
241
+ while (current.parent) {
242
+ current = current.parent;
243
+ }
244
+ return current;
245
+ }
246
+ getPath() {
247
+ const path = [];
248
+ let current = this;
249
+ while (current) {
250
+ path.unshift(current);
251
+ current = current.parent;
252
+ }
253
+ return path;
254
+ }
255
+ getDepth() {
256
+ let depth = 0;
257
+ let current = this.parent;
258
+ while (current) {
259
+ depth++;
260
+ current = current.parent;
261
+ }
262
+ return depth;
263
+ }
264
+ isRoot() {
265
+ return this.parent === null;
266
+ }
267
+ toString() {
268
+ return `Dependency { name: "${this.name}", filePath: "${this.#filePath}", children: ${this.children.length} }`;
269
+ }
270
+ printTree(indent = '', isLast = true, isRoot = false) {
271
+ const prefix = isRoot ? '' : indent + (isLast ? '└── ' : '├── ');
272
+ const events = this.eventNames().filter(e => typeof e === 'string' &&
273
+ !['before-start', 'after-start', 'before-mount', 'after-mount', 'mounted', 'before-dispose', 'after-dispose', 'disposed', 'before-reload', 'after-reload', 'reloaded', 'error', 'fileChange', 'reload.error'].includes(e));
274
+ const totalListeners = events.reduce((sum, event) => sum + this.listenerCount(event), 0);
275
+ let result = prefix + `${this.name} (${totalListeners} listeners)\n`;
276
+ const childIndent = isRoot ? '' : indent + (isLast ? ' ' : '│ ');
277
+ this.children.forEach((child, index) => {
278
+ const childIsLast = index === this.children.length - 1;
279
+ result += child.printTree(childIndent, childIsLast, false);
280
+ });
281
+ return result;
282
+ }
283
+ toJSON() {
284
+ const events = this.eventNames().filter(e => typeof e === 'string' &&
285
+ !['before-start', 'after-start', 'before-mount', 'after-mount', 'mounted', 'before-dispose', 'after-dispose', 'disposed', 'before-reload', 'after-reload', 'reloaded', 'error', 'fileChange', 'reload.error'].includes(e));
286
+ const listeners = Object.fromEntries(events.map(event => [event.toString(), this.listenerCount(event)]));
287
+ return {
288
+ name: this.name,
289
+ filePath: this.#filePath,
290
+ listeners,
291
+ children: this.children.map(child => child.toJSON()),
292
+ };
293
+ }
294
+ }
295
+ //# sourceMappingURL=dependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency.js","sourceRoot":"","sources":["../src/dependency.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { Dependency } from './dependency.js';
2
+ export declare function setCurrentDependency(dep: Dependency | null): void;
3
+ export type HookFunction<T extends any[] = any[]> = (...args: T) => any;
4
+ export interface Hooks {
5
+ addListener: (event: string, listener: () => void) => () => void;
6
+ onMount: (hook: () => void | Promise<void>) => void;
7
+ onDispose: (hook: () => void | Promise<void>) => void;
8
+ importModule: (path: string) => Promise<void>;
9
+ }
10
+ export interface HookConfig<T extends any[] = any[]> {
11
+ name: string;
12
+ handler: (dependency: Dependency, ...args: T) => any;
13
+ description?: string;
14
+ }
15
+ declare class HookRegistry {
16
+ private hooks;
17
+ private currentDependencyGetter;
18
+ setCurrentDependencyGetter(getter: () => Dependency | null): void;
19
+ getCurrentDependency(): Dependency | null;
20
+ registerHook<T extends any[] = any[]>(config: HookConfig<T>): void;
21
+ unregisterHook(name: string): boolean;
22
+ has(name: string): boolean;
23
+ get(name: string): HookConfig | undefined;
24
+ getAllHookNames(): string[];
25
+ useHook<K extends keyof Hooks>(name: K): Hooks[K];
26
+ useHook<T extends any[] = any[]>(name: string): HookFunction<T>;
27
+ clear(): void;
28
+ }
29
+ export declare const hookRegistry: HookRegistry;
30
+ export declare function registerHook<T extends any[] = any[]>(config: HookConfig<T>): void;
31
+ export declare function unregisterHook(name: string): boolean;
32
+ export declare function useHook<K extends keyof Hooks>(name: K): Hooks[K];
33
+ export declare function useHook<T extends any[] = any[]>(name: string): HookFunction<T>;
34
+ export declare function hasHook(name: string): boolean;
35
+ export declare function getAllHooks(): string[];
36
+ export {};
37
+ //# sourceMappingURL=hook-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-registry.d.ts","sourceRoot":"","sources":["../src/hook-registry.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAU7C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAMjE;AAYD,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC;AAiBxE,MAAM,WAAW,KAAK;IACpB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IACjE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IACpD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IACtD,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;AAKD,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAKD,cAAM,YAAY;IAChB,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,uBAAuB,CAA0C;IAKzE,0BAA0B,CAAC,MAAM,EAAE,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI;IAOjE,oBAAoB,IAAI,UAAU,GAAG,IAAI;IAOzC,YAAY,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAUlE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAOrC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAO1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAOzC,eAAe,IAAI,MAAM,EAAE;IAO3B,OAAO,CAAC,CAAC,SAAS,MAAM,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC;IAqB/D,KAAK,IAAI,IAAI;CAGd;AAKD,eAAO,MAAM,YAAY,cAAqB,CAAC;AAqB/C,wBAAgB,YAAY,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAEjF;AAKD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAcD,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAClE,wBAAgB,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;AAQhF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7C;AAKD,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAEtC"}
@@ -0,0 +1,75 @@
1
+ const dependencyStack = [];
2
+ export function setCurrentDependency(dep) {
3
+ if (dep) {
4
+ dependencyStack.push(dep);
5
+ }
6
+ else if (dependencyStack.length > 0) {
7
+ dependencyStack.pop();
8
+ }
9
+ }
10
+ function getCurrentDependency() {
11
+ return dependencyStack.length > 0 ? dependencyStack[dependencyStack.length - 1] : null;
12
+ }
13
+ class HookRegistry {
14
+ hooks = new Map();
15
+ currentDependencyGetter = null;
16
+ setCurrentDependencyGetter(getter) {
17
+ this.currentDependencyGetter = getter;
18
+ }
19
+ getCurrentDependency() {
20
+ return this.currentDependencyGetter?.() || null;
21
+ }
22
+ registerHook(config) {
23
+ if (this.hooks.has(config.name)) {
24
+ console.warn(`Hook "${config.name}" is already registered. Overwriting...`);
25
+ }
26
+ this.hooks.set(config.name, config);
27
+ }
28
+ unregisterHook(name) {
29
+ return this.hooks.delete(name);
30
+ }
31
+ has(name) {
32
+ return this.hooks.has(name);
33
+ }
34
+ get(name) {
35
+ return this.hooks.get(name);
36
+ }
37
+ getAllHookNames() {
38
+ return Array.from(this.hooks.keys());
39
+ }
40
+ useHook(name) {
41
+ return (...args) => {
42
+ const config = this.hooks.get(name);
43
+ if (!config) {
44
+ throw new Error(`Hook "${name}" is not registered. Please registerHook it first using registerHook().`);
45
+ }
46
+ const currentDep = this.getCurrentDependency();
47
+ if (!currentDep) {
48
+ console.warn(`No current dependency context for hook "${name}".`);
49
+ return;
50
+ }
51
+ return config.handler(currentDep, ...args);
52
+ };
53
+ }
54
+ clear() {
55
+ this.hooks.clear();
56
+ }
57
+ }
58
+ export const hookRegistry = new HookRegistry();
59
+ hookRegistry.setCurrentDependencyGetter(getCurrentDependency);
60
+ export function registerHook(config) {
61
+ hookRegistry.registerHook(config);
62
+ }
63
+ export function unregisterHook(name) {
64
+ return hookRegistry.unregisterHook(name);
65
+ }
66
+ export function useHook(name) {
67
+ return hookRegistry.useHook(name);
68
+ }
69
+ export function hasHook(name) {
70
+ return hookRegistry.has(name);
71
+ }
72
+ export function getAllHooks() {
73
+ return hookRegistry.getAllHookNames();
74
+ }
75
+ //# sourceMappingURL=hook-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-registry.js","sourceRoot":"","sources":["../src/hook-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function addListener(event: string, listener: () => void): () => void;
2
+ export declare function onMount(hook: () => void | Promise<void>): void;
3
+ export declare function onDispose(hook: () => void | Promise<void>): void;
4
+ export declare function importModule(importPath: string): Promise<void>;
5
+ export { registerHook, unregisterHook, useHook, hasHook, getAllHooks } from './hook-registry.js';
6
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AA8DA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAE3E;AAMD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAE9D;AAMD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAEhE;AAMD,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAID,OAAO,EACL,YAAY,EACZ,cAAc,EACd,OAAO,EACP,OAAO,EACP,WAAW,EACZ,MAAM,oBAAoB,CAAC"}
package/dist/hooks.js ADDED
@@ -0,0 +1,44 @@
1
+ import { registerHook, useHook } from './hook-registry.js';
2
+ registerHook({
3
+ name: 'addListener',
4
+ handler: (dep, event, listener) => {
5
+ dep.on(event, listener);
6
+ return () => dep.off(event, listener);
7
+ },
8
+ description: 'Add an event listener to the current dependency'
9
+ });
10
+ registerHook({
11
+ name: 'onMount',
12
+ handler: (dep, hook) => {
13
+ dep.addMountHook(hook);
14
+ },
15
+ description: 'registerHook a mount hook for the current dependency'
16
+ });
17
+ registerHook({
18
+ name: 'onDispose',
19
+ handler: (dep, hook) => {
20
+ dep.addDisposeHook(hook);
21
+ },
22
+ description: 'registerHook a dispose hook for the current dependency'
23
+ });
24
+ registerHook({
25
+ name: 'importModule',
26
+ handler: async (dep, importPath) => {
27
+ await dep.importChild(importPath);
28
+ },
29
+ description: 'Import a module and create a child dependency'
30
+ });
31
+ export function addListener(event, listener) {
32
+ return useHook('addListener')(event, listener);
33
+ }
34
+ export function onMount(hook) {
35
+ return useHook('onMount')(hook);
36
+ }
37
+ export function onDispose(hook) {
38
+ return useHook('onDispose')(hook);
39
+ }
40
+ export async function importModule(importPath) {
41
+ return useHook('importModule')(importPath);
42
+ }
43
+ export { registerHook, unregisterHook, useHook, hasHook, getAllHooks } from './hook-registry.js';
44
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAS3D,YAAY,CAAC;IACX,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,CAAC,GAAe,EAAE,KAAa,EAAE,QAAoB,EAAE,EAAE;QAChE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IACD,WAAW,EAAE,iDAAiD;CAC/D,CAAC,CAAC;AAMH,YAAY,CAAC;IACX,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,CAAC,GAAe,EAAE,IAAgC,EAAE,EAAE;QAC7D,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,WAAW,EAAE,sDAAsD;CACpE,CAAC,CAAC;AAMH,YAAY,CAAC;IACX,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,CAAC,GAAe,EAAE,IAAgC,EAAE,EAAE;QAC7D,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,WAAW,EAAE,wDAAwD;CACtE,CAAC,CAAC;AAMH,YAAY,CAAC;IACX,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,KAAK,EAAE,GAAe,EAAE,UAAkB,EAAE,EAAE;QACrD,MAAM,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IACD,WAAW,EAAE,+CAA+C;CAC7D,CAAC,CAAC;AASH,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,QAAoB;IAC7D,OAAO,OAAO,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;AAMD,MAAM,UAAU,OAAO,CAAC,IAAgC;IACtD,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAMD,MAAM,UAAU,SAAS,CAAC,IAAgC;IACxD,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAAkB;IACnD,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,CAAC;AAC7C,CAAC;AAID,OAAO,EACL,YAAY,EACZ,cAAc,EACd,OAAO,EACP,OAAO,EACP,WAAW,EACZ,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './dependency.js';
2
+ export * from './hooks.js';
3
+ export type { HookFunction, HookConfig, Hooks } from './hook-registry.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from './dependency.js';
2
+ export * from './hooks.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type Constructor<T> = {
2
+ new (...args: any[]): T;
3
+ };
4
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,CAAC,CAAC,IAAG;IACxB,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;CAC3B,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}