@devisfuture/electron-modular 1.2.17 → 1.2.19
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 +29 -3
- package/dist/index.d.ts +213 -28
- package/dist/index.js +2 -28
- package/package.json +7 -3
- package/dist/@core/bootstrap/bootstrap.d.ts +0 -2
- package/dist/@core/bootstrap/bootstrap.js +0 -41
- package/dist/@core/bootstrap/initialize-ipc/handlers.d.ts +0 -3
- package/dist/@core/bootstrap/initialize-ipc/handlers.js +0 -47
- package/dist/@core/bootstrap/initialize-ipc/window-creator.d.ts +0 -3
- package/dist/@core/bootstrap/initialize-ipc/window-creator.js +0 -28
- package/dist/@core/bootstrap/initialize-ipc/window-event-listeners.d.ts +0 -3
- package/dist/@core/bootstrap/initialize-ipc/window-event-listeners.js +0 -61
- package/dist/@core/bootstrap/initialize-ipc/window-instance-creator.d.ts +0 -3
- package/dist/@core/bootstrap/initialize-ipc/window-instance-creator.js +0 -10
- package/dist/@core/bootstrap/initialize-module.d.ts +0 -3
- package/dist/@core/bootstrap/initialize-module.js +0 -20
- package/dist/@core/bootstrap/instantiate-module.d.ts +0 -2
- package/dist/@core/bootstrap/instantiate-module.js +0 -9
- package/dist/@core/bootstrap/register-imports.d.ts +0 -3
- package/dist/@core/bootstrap/register-imports.js +0 -16
- package/dist/@core/bootstrap/register-ipc-handlers.d.ts +0 -3
- package/dist/@core/bootstrap/register-ipc-handlers.js +0 -9
- package/dist/@core/bootstrap/register-lazy-module.d.ts +0 -3
- package/dist/@core/bootstrap/register-lazy-module.js +0 -48
- package/dist/@core/bootstrap/register-providers.d.ts +0 -3
- package/dist/@core/bootstrap/register-providers.js +0 -21
- package/dist/@core/bootstrap/register-windows.d.ts +0 -3
- package/dist/@core/bootstrap/register-windows.js +0 -15
- package/dist/@core/bootstrap/settings.d.ts +0 -11
- package/dist/@core/bootstrap/settings.js +0 -13
- package/dist/@core/bootstrap/validate-lazy-constraints.d.ts +0 -3
- package/dist/@core/bootstrap/validate-lazy-constraints.js +0 -18
- package/dist/@core/container.d.ts +0 -26
- package/dist/@core/container.js +0 -154
- package/dist/@core/control-window/cache.d.ts +0 -1
- package/dist/@core/control-window/cache.js +0 -1
- package/dist/@core/control-window/create.d.ts +0 -3
- package/dist/@core/control-window/create.js +0 -62
- package/dist/@core/control-window/destroy.d.ts +0 -1
- package/dist/@core/control-window/destroy.js +0 -9
- package/dist/@core/control-window/receive.d.ts +0 -2
- package/dist/@core/control-window/receive.js +0 -8
- package/dist/@core/control-window/types.d.ts +0 -14
- package/dist/@core/control-window/types.js +0 -1
- package/dist/@core/decorators/inject.d.ts +0 -6
- package/dist/@core/decorators/inject.js +0 -15
- package/dist/@core/decorators/injectable.d.ts +0 -2
- package/dist/@core/decorators/injectable.js +0 -6
- package/dist/@core/decorators/ipc-handler.d.ts +0 -2
- package/dist/@core/decorators/ipc-handler.js +0 -6
- package/dist/@core/decorators/rg-module.d.ts +0 -3
- package/dist/@core/decorators/rg-module.js +0 -6
- package/dist/@core/decorators/window-manager.d.ts +0 -3
- package/dist/@core/decorators/window-manager.js +0 -6
- package/dist/@core/errors/index.d.ts +0 -34
- package/dist/@core/errors/index.js +0 -56
- package/dist/@core/types/constructor.d.ts +0 -1
- package/dist/@core/types/constructor.js +0 -1
- package/dist/@core/types/index.d.ts +0 -8
- package/dist/@core/types/index.js +0 -1
- package/dist/@core/types/ipc-handler.d.ts +0 -7
- package/dist/@core/types/ipc-handler.js +0 -1
- package/dist/@core/types/lazy.d.ts +0 -11
- package/dist/@core/types/lazy.js +0 -1
- package/dist/@core/types/module-metadata.d.ts +0 -12
- package/dist/@core/types/module-metadata.js +0 -1
- package/dist/@core/types/provider.d.ts +0 -21
- package/dist/@core/types/provider.js +0 -1
- package/dist/@core/types/window-factory.d.ts +0 -6
- package/dist/@core/types/window-factory.js +0 -1
- package/dist/@core/types/window-manager.d.ts +0 -10
- package/dist/@core/types/window-manager.js +0 -1
- package/dist/@core/types/window-metadata.d.ts +0 -6
- package/dist/@core/types/window-metadata.js +0 -1
- package/dist/@core/utils/dependency-tokens.d.ts +0 -4
- package/dist/@core/utils/dependency-tokens.js +0 -23
- package/dist/config.d.ts +0 -4
- package/dist/config.js +0 -4
- package/dist/reflect-metadata.d.ts +0 -11
- package/dist/reflect-metadata.js +0 -66
package/README.md
CHANGED
|
@@ -725,6 +725,8 @@ These constraints guarantee clear module boundaries: lazy modules are activated
|
|
|
725
725
|
|
|
726
726
|
#### Example: valid lazy module
|
|
727
727
|
|
|
728
|
+
The Main Process
|
|
729
|
+
|
|
728
730
|
```typescript
|
|
729
731
|
@RgModule({
|
|
730
732
|
imports: [DatabaseCoreModule], // eager module
|
|
@@ -732,15 +734,39 @@ These constraints guarantee clear module boundaries: lazy modules are activated
|
|
|
732
734
|
ipc: [AnalyticsIpc],
|
|
733
735
|
lazy: {
|
|
734
736
|
enabled: true,
|
|
735
|
-
trigger: "analytics
|
|
737
|
+
trigger: "init-analytics-lazy",
|
|
736
738
|
},
|
|
737
739
|
})
|
|
738
740
|
export class AnalyticsModule {}
|
|
739
741
|
|
|
740
742
|
await bootstrapModules([AppModule, AnalyticsModule]);
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
The Renderer process in React
|
|
746
|
+
|
|
747
|
+
```typescript
|
|
748
|
+
import { useEffect, useCallback } from "react";
|
|
749
|
+
|
|
750
|
+
....
|
|
741
751
|
|
|
742
|
-
|
|
743
|
-
|
|
752
|
+
export const App = () => {
|
|
753
|
+
|
|
754
|
+
const initAnalyticsModule = useCallback(async () => {
|
|
755
|
+
const { initialized, name, error } = await window.electron.invoke("init-analytics-lazy");
|
|
756
|
+
|
|
757
|
+
if (initialized && error === undefined) {
|
|
758
|
+
console.log('Success!', 'Module:', name);
|
|
759
|
+
} else {
|
|
760
|
+
console.log('Error!', 'Module:', name, error.message);
|
|
761
|
+
}
|
|
762
|
+
}, []);
|
|
763
|
+
|
|
764
|
+
useEffect(() => {
|
|
765
|
+
initAnalyticsModule();
|
|
766
|
+
}, [initAnalyticsModule]);
|
|
767
|
+
|
|
768
|
+
return <>Home</>;
|
|
769
|
+
};
|
|
744
770
|
```
|
|
745
771
|
|
|
746
772
|
#### Example: invalid (lazy + exports)
|
package/dist/index.d.ts
CHANGED
|
@@ -1,28 +1,213 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
1
|
+
import { BrowserWindowConstructorOptions, BrowserWindow } from 'electron';
|
|
2
|
+
|
|
3
|
+
declare global {
|
|
4
|
+
namespace Reflect {
|
|
5
|
+
function defineMetadata(metadataKey: unknown, metadataValue: unknown, target: object, propertyKey?: PropertyKey): void;
|
|
6
|
+
function getOwnMetadata(metadataKey: unknown, target: object, propertyKey?: PropertyKey): unknown;
|
|
7
|
+
function getMetadata(metadataKey: unknown, target: object, propertyKey?: PropertyKey): unknown;
|
|
8
|
+
function hasOwnMetadata(metadataKey: unknown, target: object, propertyKey?: PropertyKey): boolean;
|
|
9
|
+
function hasMetadata(metadataKey: unknown, target: object, propertyKey?: PropertyKey): boolean;
|
|
10
|
+
function metadata(metadataKey: unknown, metadataValue: unknown): ClassDecorator & PropertyDecorator;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type Constructor<T = any> = new (...args: any[]) => T;
|
|
15
|
+
|
|
16
|
+
type TParamsRoute = {
|
|
17
|
+
[key: string]: string;
|
|
18
|
+
};
|
|
19
|
+
type TParamsCreateWindow<N = string> = {
|
|
20
|
+
hash?: N;
|
|
21
|
+
isCache?: boolean;
|
|
22
|
+
paramsRoute?: TParamsRoute;
|
|
23
|
+
options?: BrowserWindowConstructorOptions;
|
|
24
|
+
loadURL?: string;
|
|
25
|
+
};
|
|
26
|
+
type TCache = {
|
|
27
|
+
[key in string]: BrowserWindow;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
type TWindowCreate = (options?: TParamsCreateWindow) => Promise<BrowserWindow | undefined>;
|
|
31
|
+
type TWindowFactory = {
|
|
32
|
+
create: TWindowCreate;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type TParamOnInit<N = string> = {
|
|
36
|
+
getWindow: (name?: N) => TWindowFactory;
|
|
37
|
+
};
|
|
38
|
+
type TIpcHandlerInterface = {
|
|
39
|
+
onInit?: (data: TParamOnInit) => void | Promise<void>;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
type TProviderToken<T = any> = Constructor<T> | string | symbol;
|
|
43
|
+
type TClassProvider<T = any> = {
|
|
44
|
+
provide: TProviderToken<T>;
|
|
45
|
+
useClass: Constructor<T>;
|
|
46
|
+
inject?: TProviderToken[];
|
|
47
|
+
};
|
|
48
|
+
type TFactoryProvider<T = any> = {
|
|
49
|
+
provide: TProviderToken<T>;
|
|
50
|
+
useFactory: (...args: any[]) => T;
|
|
51
|
+
inject?: TProviderToken[];
|
|
52
|
+
};
|
|
53
|
+
type TValueProvider<T = any> = {
|
|
54
|
+
provide: TProviderToken<T>;
|
|
55
|
+
useValue: T;
|
|
56
|
+
};
|
|
57
|
+
type TExistingProvider<T = any> = {
|
|
58
|
+
provide: TProviderToken<T>;
|
|
59
|
+
useExisting: TProviderToken<T>;
|
|
60
|
+
};
|
|
61
|
+
type TProvider<T = any> = Constructor<T> | TClassProvider<T> | TFactoryProvider<T> | TValueProvider<T> | TExistingProvider<T>;
|
|
62
|
+
|
|
63
|
+
type TLazyConfig = {
|
|
64
|
+
enabled: true;
|
|
65
|
+
trigger: string;
|
|
66
|
+
};
|
|
67
|
+
type TLazyModuleResponse = {
|
|
68
|
+
initialized: boolean;
|
|
69
|
+
name: string;
|
|
70
|
+
error?: {
|
|
71
|
+
message: string;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
type RgModuleMetadata = {
|
|
76
|
+
imports?: Constructor[];
|
|
77
|
+
ipc?: (new (...args: any[]) => TIpcHandlerInterface)[];
|
|
78
|
+
windows?: Constructor[];
|
|
79
|
+
providers?: TProvider[];
|
|
80
|
+
exports?: TProviderToken[];
|
|
81
|
+
lazy?: TLazyConfig;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
declare class Container {
|
|
85
|
+
private readonly modules;
|
|
86
|
+
private readonly moduleMetadata;
|
|
87
|
+
private readonly instances;
|
|
88
|
+
private readonly resolutionCache;
|
|
89
|
+
addModule(moduleClass: Constructor, metadata: Pick<RgModuleMetadata, "exports" | "providers">): boolean;
|
|
90
|
+
setModuleMetadata(moduleClass: Constructor, metadata: RgModuleMetadata): void;
|
|
91
|
+
hasModule(moduleClass: Constructor): boolean;
|
|
92
|
+
private getCacheKey;
|
|
93
|
+
addProvider(moduleClass: Constructor, provider: TProviderToken, instance?: unknown): void;
|
|
94
|
+
getProvider<T = unknown>(moduleClass: Constructor, token: TProviderToken): T | undefined;
|
|
95
|
+
getModuleExports(moduleClass: Constructor): Set<TProviderToken>;
|
|
96
|
+
getModuleMetadata(moduleClass: Constructor): RgModuleMetadata | undefined;
|
|
97
|
+
registerInstance(token: TProviderToken, instance: unknown): void;
|
|
98
|
+
resolve<T>(moduleClass: Constructor, token: TProviderToken): Promise<T | undefined>;
|
|
99
|
+
private resolveFromImports;
|
|
100
|
+
private instantiateProvider;
|
|
101
|
+
private instantiateFactoryProvider;
|
|
102
|
+
private instantiateClassProvider;
|
|
103
|
+
private instantiateClassConstructor;
|
|
104
|
+
private resolveDependencies;
|
|
105
|
+
}
|
|
106
|
+
declare const container: Container;
|
|
107
|
+
|
|
108
|
+
declare const bootstrapModules: (modulesClass: Constructor[]) => Promise<void>;
|
|
109
|
+
|
|
110
|
+
declare const initializeModule: (moduleClass: Constructor, metadata: RgModuleMetadata) => Promise<void>;
|
|
111
|
+
|
|
112
|
+
declare const instantiateModule: (moduleClass: Constructor) => Promise<unknown>;
|
|
113
|
+
|
|
114
|
+
declare const registerImports: (moduleClass: Constructor, metadata: RgModuleMetadata) => Promise<void>;
|
|
115
|
+
|
|
116
|
+
declare const registerIpcHandlers: (moduleClass: Constructor, metadata: RgModuleMetadata) => Promise<void>;
|
|
117
|
+
|
|
118
|
+
declare const registerProviders: (moduleClass: Constructor, metadata: RgModuleMetadata) => Promise<void>;
|
|
119
|
+
|
|
120
|
+
declare const registerWindows: (moduleClass: Constructor, metadata: RgModuleMetadata) => Promise<void>;
|
|
121
|
+
|
|
122
|
+
declare const registerLazyModule: (moduleClass: Constructor, metadata: RgModuleMetadata) => void;
|
|
123
|
+
|
|
124
|
+
type TFolderSettings = {
|
|
125
|
+
distRenderer: string;
|
|
126
|
+
distMain: string;
|
|
127
|
+
};
|
|
128
|
+
type TSettings = {
|
|
129
|
+
cspConnectSources?: string[];
|
|
130
|
+
localhostPort: string;
|
|
131
|
+
folders: TFolderSettings;
|
|
132
|
+
};
|
|
133
|
+
declare const initSettings: (options: TSettings) => void;
|
|
134
|
+
declare const getSettings: () => TSettings;
|
|
135
|
+
|
|
136
|
+
declare const initializeIpcHandlers: (moduleClass: Constructor, metadata: RgModuleMetadata) => Promise<void>;
|
|
137
|
+
|
|
138
|
+
declare const createWindowWithParams: <W extends TParamsCreateWindow>(baseMetadata: W, params?: W) => BrowserWindow;
|
|
139
|
+
|
|
140
|
+
type WindowManagerOptions = TParamsCreateWindow & {
|
|
141
|
+
options: BrowserWindowConstructorOptions;
|
|
142
|
+
};
|
|
143
|
+
type TWindowEventHandler = (...args: any[]) => void;
|
|
144
|
+
type TWindowManagerWithHandlers = {
|
|
145
|
+
[key: `on${string}`]: TWindowEventHandler | undefined;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
declare const attachWindowEventListeners: (win: BrowserWindow, inst: TWindowManagerWithHandlers) => void;
|
|
149
|
+
|
|
150
|
+
declare const createWindowInstance: <T extends TWindowManagerWithHandlers>(moduleClass: Constructor, windowClass: Constructor<T>) => Promise<T | undefined>;
|
|
151
|
+
|
|
152
|
+
declare const cacheWindows: Map<string, Electron.CrossProcessExports.BrowserWindow>;
|
|
153
|
+
|
|
154
|
+
declare const createWindow: <N extends string>({ hash, options, isCache, loadURL, }: TParamsCreateWindow<N>) => BrowserWindow;
|
|
155
|
+
|
|
156
|
+
declare const destroyWindows: () => void;
|
|
157
|
+
|
|
158
|
+
declare const getWindow: <N extends string>(name: N) => BrowserWindow | undefined;
|
|
159
|
+
|
|
160
|
+
type TInjectTokensMetadata = Record<number, TProviderToken>;
|
|
161
|
+
declare const Inject: (token: TProviderToken) => ParameterDecorator;
|
|
162
|
+
declare const getInjectedTokens: (target: Function) => TInjectTokensMetadata;
|
|
163
|
+
|
|
164
|
+
declare const Injectable: () => ClassDecorator;
|
|
165
|
+
|
|
166
|
+
declare const IpcHandler: () => ClassDecorator;
|
|
167
|
+
|
|
168
|
+
declare const RgModule: (options: RgModuleMetadata) => ClassDecorator;
|
|
169
|
+
|
|
170
|
+
declare const WindowManager: <P extends string>(options: TParamsCreateWindow<P>) => ClassDecorator;
|
|
171
|
+
|
|
172
|
+
type TMetadataWindow = {
|
|
173
|
+
metadata: TParamsCreateWindow;
|
|
174
|
+
windowClass: Constructor;
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
declare const getDependencyTokens: (target: Constructor) => TProviderToken[];
|
|
178
|
+
|
|
179
|
+
declare class BaseError extends Error {
|
|
180
|
+
constructor(msg: string, name: string);
|
|
181
|
+
}
|
|
182
|
+
declare class ModuleNotRegisteredError extends BaseError {
|
|
183
|
+
constructor(m: string);
|
|
184
|
+
}
|
|
185
|
+
declare class ProviderNotFoundError extends BaseError {
|
|
186
|
+
constructor(t: string, m: string);
|
|
187
|
+
}
|
|
188
|
+
declare class ModuleDecoratorMissingError extends BaseError {
|
|
189
|
+
constructor(m: string);
|
|
190
|
+
}
|
|
191
|
+
declare class InvalidProviderError extends BaseError {
|
|
192
|
+
constructor(m: string);
|
|
193
|
+
}
|
|
194
|
+
declare class SettingsNotInitializedError extends BaseError {
|
|
195
|
+
constructor();
|
|
196
|
+
}
|
|
197
|
+
declare class InvalidLazyTriggerError extends BaseError {
|
|
198
|
+
constructor(moduleName: string);
|
|
199
|
+
}
|
|
200
|
+
declare class DuplicateLazyTriggerError extends BaseError {
|
|
201
|
+
constructor(trigger: string, firstModule: string, secondModule: string);
|
|
202
|
+
}
|
|
203
|
+
declare class LazyModuleExportsNotAllowedError extends BaseError {
|
|
204
|
+
constructor(moduleName: string);
|
|
205
|
+
}
|
|
206
|
+
declare class LazyModuleCannotImportLazyModuleError extends BaseError {
|
|
207
|
+
constructor(moduleName: string, importedModuleName: string);
|
|
208
|
+
}
|
|
209
|
+
declare class EagerModuleCannotImportLazyModuleError extends BaseError {
|
|
210
|
+
constructor(moduleName: string, importedModuleName: string);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export { type Constructor, Container, DuplicateLazyTriggerError, EagerModuleCannotImportLazyModuleError, Inject, Injectable, InvalidLazyTriggerError, InvalidProviderError, IpcHandler, LazyModuleCannotImportLazyModuleError, LazyModuleExportsNotAllowedError, ModuleDecoratorMissingError, ModuleNotRegisteredError, ProviderNotFoundError, RgModule, type RgModuleMetadata, SettingsNotInitializedError, type TCache, type TClassProvider, type TExistingProvider, type TFactoryProvider, type TFolderSettings, type TIpcHandlerInterface, type TLazyConfig, type TLazyModuleResponse, type TMetadataWindow, type TParamOnInit, type TParamsCreateWindow, type TParamsRoute, type TProvider, type TProviderToken, type TSettings, type TValueProvider, type TWindowCreate, type TWindowFactory, type TWindowManagerWithHandlers, WindowManager, type WindowManagerOptions, attachWindowEventListeners, bootstrapModules, cacheWindows, container, createWindow, createWindowInstance, createWindowWithParams, destroyWindows, getDependencyTokens, getInjectedTokens, getSettings, getWindow, initSettings, initializeIpcHandlers, initializeModule, instantiateModule, registerImports, registerIpcHandlers, registerLazyModule, registerProviders, registerWindows };
|
package/dist/index.js
CHANGED
|
@@ -1,28 +1,2 @@
|
|
|
1
|
-
import "./reflect-metadata.js";
|
|
2
|
-
export
|
|
3
|
-
export * from "./@core/bootstrap/bootstrap.js";
|
|
4
|
-
export * from "./@core/bootstrap/initialize-module.js";
|
|
5
|
-
export * from "./@core/bootstrap/instantiate-module.js";
|
|
6
|
-
export * from "./@core/bootstrap/register-imports.js";
|
|
7
|
-
export * from "./@core/bootstrap/register-ipc-handlers.js";
|
|
8
|
-
export * from "./@core/bootstrap/register-providers.js";
|
|
9
|
-
export * from "./@core/bootstrap/register-windows.js";
|
|
10
|
-
export * from "./@core/bootstrap/register-lazy-module.js";
|
|
11
|
-
export * from "./@core/bootstrap/settings.js";
|
|
12
|
-
export * from "./@core/bootstrap/initialize-ipc/handlers.js";
|
|
13
|
-
export * from "./@core/bootstrap/initialize-ipc/window-creator.js";
|
|
14
|
-
export * from "./@core/bootstrap/initialize-ipc/window-event-listeners.js";
|
|
15
|
-
export * from "./@core/bootstrap/initialize-ipc/window-instance-creator.js";
|
|
16
|
-
export * from "./@core/control-window/cache.js";
|
|
17
|
-
export * from "./@core/control-window/create.js";
|
|
18
|
-
export * from "./@core/control-window/destroy.js";
|
|
19
|
-
export * from "./@core/control-window/receive.js";
|
|
20
|
-
export * from "./@core/control-window/types.js";
|
|
21
|
-
export * from "./@core/decorators/inject.js";
|
|
22
|
-
export * from "./@core/decorators/injectable.js";
|
|
23
|
-
export * from "./@core/decorators/ipc-handler.js";
|
|
24
|
-
export * from "./@core/decorators/rg-module.js";
|
|
25
|
-
export * from "./@core/decorators/window-manager.js";
|
|
26
|
-
export * from "./@core/types/index.js";
|
|
27
|
-
export * from "./@core/utils/dependency-tokens.js";
|
|
28
|
-
export * from "./@core/errors/index.js";
|
|
1
|
+
import {app,BrowserWindow,ipcMain,session}from'electron';import _ from'path';var b=new WeakMap,ee=(o,e)=>{let t=b.get(o);t===void 0&&(t=new Map,b.set(o,t));let r=t.get(e);return r===void 0&&(r=new Map,t.set(e,r)),r},D=(o,e)=>b.get(o)?.get(e);Reflect.defineMetadata===void 0&&(Reflect.defineMetadata=(o,e,t,r)=>{ee(t,r).set(o,e);});Reflect.getOwnMetadata===void 0&&(Reflect.getOwnMetadata=(o,e,t)=>D(e,t)?.get(o));Reflect.getMetadata===void 0&&(Reflect.getMetadata=(o,e,t)=>{let r=e;for(;r!==null;){let n=Reflect.getOwnMetadata(o,r,t);if(n!==void 0)return n;r=Object.getPrototypeOf(r);}});Reflect.hasOwnMetadata===void 0&&(Reflect.hasOwnMetadata=(o,e,t)=>D(e,t)?.has(o)??false);Reflect.hasMetadata===void 0&&(Reflect.hasMetadata=(o,e,t)=>{let r=e;for(;r!==null;){if(Reflect.hasOwnMetadata(o,r,t))return true;r=Object.getPrototypeOf(r);}return false});Reflect.metadata===void 0&&(Reflect.metadata=(o,e)=>(t,r)=>{Reflect.defineMetadata(o,e,t,r);});var I="RgInjectTokens",me=o=>(e,t,r)=>{if(t!==void 0)return;let n=Reflect.getMetadata(I,e)??{};n[r]=o,Reflect.defineMetadata(I,n,e);},S=o=>Reflect.getMetadata(I,o)??{};var z=new WeakMap,l=o=>{let e=z.get(o);if(e!==void 0)return e;let t=Reflect.getMetadata("design:paramtypes",o)??[],r=S(o),n=Object.keys(r).map(Number),s=Math.max(t.length-1,...n,-1);if(s<0)return z.set(o,t),t;let a=Array.from({length:s+1},(d,c)=>r[c]??t[c]);return z.set(o,a),a};var p=class extends Error{constructor(e,t){super(e),this.name=t;}},y=class extends p{constructor(e){super(`Module "${e}" is not registered in the container.`,"ModuleNotRegisteredError");}},g=class extends p{constructor(e,t){super(`Provider not found for token "${e}" in module "${t}" or its imports.`,"ProviderNotFoundError");}},w=class extends p{constructor(e){super(`Module ${e} does not have the @RgModule decorator`,"ModuleDecoratorMissingError");}},M=class extends p{constructor(e){super(`Invalid provider definition registered in module ${e}`,"InvalidProviderError");}},T=class extends p{constructor(){super("App settings cache has not been initialized.","SettingsNotInitializedError");}},f=class extends p{constructor(e){super(`Invalid lazy trigger in module "${e}". "lazy.trigger" must be a non-empty string.`,"InvalidLazyTriggerError");}},P=class extends p{constructor(e,t,r){super(`Duplicate lazy trigger "${e}" detected in modules "${t}" and "${r}". Each lazy module must use a unique trigger.`,"DuplicateLazyTriggerError");}},v=class extends p{constructor(e){super(`Invalid lazy module "${e}". Lazy modules cannot declare exports.`,"LazyModuleExportsNotAllowedError");}},h=class extends p{constructor(e,t){super(`Invalid lazy module "${e}". It cannot import lazy module "${t}". Lazy modules can only import eager modules.`,"LazyModuleCannotImportLazyModuleError");}},x=class extends p{constructor(e,t){super(`Invalid eager module "${e}". It cannot import lazy module "${t}". Eager modules must import only eager modules.`,"EagerModuleCannotImportLazyModuleError");}};var E=class{modules=new Map;moduleMetadata=new Map;instances=new Map;resolutionCache=new Map;addModule(e,t){return this.modules.has(e)?false:(this.modules.set(e,{providers:new Map,exports:new Set(t.exports??[])}),true)}setModuleMetadata(e,t){this.moduleMetadata.set(e,t);}hasModule(e){return this.modules.has(e)}getCacheKey(e,t){let r=typeof t=="string"||typeof t=="symbol"?String(t):t.name;return `${e.name}:${r}`}addProvider(e,t,r){let n=this.modules.get(e);if(!n)throw new y(e.name);n.providers.set(t,r??t);}getProvider(e,t){let r=this.modules.get(e);if(r)return r.providers.get(t)}getModuleExports(e){return this.modules.get(e)?.exports??new Set}getModuleMetadata(e){return this.moduleMetadata.get(e)}registerInstance(e,t){this.instances.set(e,t);}async resolve(e,t){let r=this.getCacheKey(e,t);if(this.resolutionCache.has(r))return this.resolutionCache.get(r);if(this.instances.has(t)){let a=this.instances.get(t);return this.resolutionCache.set(r,a),a}let n=this.getProvider(e,t);if(!n){let a=await this.resolveFromImports(e,t);if(a!==void 0)return this.resolutionCache.set(r,a),a;if(t!==e)throw new g(String(t),e.name);return}let s=await this.instantiateProvider(e,t,n);return s!==void 0&&this.resolutionCache.set(r,s),s}async resolveFromImports(e,t){let r=this.getModuleMetadata(e);if(r?.imports){for(let n of r.imports)if(this.getModuleExports(n).has(t)&&this.getProvider(n,t)!==void 0)return this.resolve(n,t)}}async instantiateProvider(e,t,r){let n=typeof r=="object"&&r!==null&&"provide"in r;if(n&&"useFactory"in r&&typeof r.useFactory=="function")return this.instantiateFactoryProvider(e,t,r);if(n&&"useClass"in r&&typeof r.useClass=="function")return this.instantiateClassProvider(e,t,r);if(n&&"useValue"in r){let s=r.useValue;return this.instances.set(t,s),s}if(n&&"useExisting"in r){let s=await this.resolve(e,r.useExisting);return s!==void 0&&this.instances.set(t,s),s}return typeof r=="function"?this.instantiateClassConstructor(e,t,r):r}async instantiateFactoryProvider(e,t,r){let n=r.inject??[],s=await this.resolveDependencies(e,n),a=r.useFactory(...s);return this.instances.set(t,a),a}async instantiateClassProvider(e,t,r){let n=r.inject??l(r.useClass),s=await this.resolveDependencies(e,n),a=new r.useClass(...s);return this.instances.set(t,a),a}async instantiateClassConstructor(e,t,r){let n=l(r),s=await this.resolveDependencies(e,n),a=new r(...s);return this.instances.set(t,a),a}async resolveDependencies(e,t){return Promise.all(t.map(r=>this.resolve(e,r)))}},i=new E;var j=async o=>{let e=l(o),t=await Promise.all(e.map(n=>i.resolve(o,n))),r=new o(...t);return i.registerInstance(o,r),r};var te=o=>typeof o=="object"&&o!==null&&"provide"in o,K=async(o,e)=>{if(e.providers)for(let t of e.providers){if(typeof t=="function"){i.addProvider(o,t);continue}if(te(t)){i.addProvider(o,t.provide,t);continue}throw new M(o.name)}};var L=async(o,e)=>{if(e.imports)for(let t of e.imports){let r=Reflect.getMetadata("RgModule",t);if(r?.lazy?.enabled&&!e.lazy?.enabled)throw new x(o.name,t.name);r&&await m(t,r);}};var $=async(o,e)=>{if(e.windows)for(let t of e.windows){let r=Reflect.getMetadata("WindowManager",t);r?.hash&&i.addProvider(o,r.hash,{metadata:r,windowClass:t});}};var F=async(o,e)=>{if(e.ipc)for(let t of e.ipc)i.addProvider(o,t);};var W=(o,e)=>{if(e.lazy?.enabled){if((e.exports?.length??0)>0)throw new v(o.name);if(e.imports?.length){for(let t of e.imports)if(Reflect.getMetadata("RgModule",t)?.lazy?.enabled)throw new h(o.name,t.name)}}};var m=async(o,e)=>{W(o,e);let t=i.addModule(o,e);i.setModuleMetadata(o,e),t&&await Promise.all([K(o,e),L(o,e),$(o,e),F(o,e)]);};var C=new Map;var H=o=>{let e=C.get(o);if(!(!e||typeof e=="boolean"||e.isDestroyed()))return e};var A="settings",N=new Map,Ge=o=>{N.set(A,o);},B=()=>{let o=N.get(A);if(!o)throw new T;return o};var ne=(o,e)=>{let r=`default-src 'self'; connect-src 'self'${o.length>0?` ${o.join(" ")}`:""}; img-src * data:; style-src 'self' 'unsafe-inline'; script-src 'self' ${e?"'unsafe-inline'":""};`.replace(/\s{2,}/g," ").trim();session.defaultSession.webRequest.onHeadersReceived((n,s)=>{s({responseHeaders:{...n.responseHeaders,"Content-Security-Policy":[r]}});});},Y=({hash:o,options:e,isCache:t,loadURL:r})=>{let n=B(),s=process.env.NODE_ENV==="development",a=_.join(app.getAppPath(),`/${n.folders.distRenderer}/index.html`),d=_.join(app.getAppPath(),s?".":"..",`/${n.folders.distMain}/preload.cjs`);if(n.localhostPort||console.warn('Warning: You have to add an environment variable for example called "process.env.LOCALHOST_ELECTRON_SERVER_PORT"!'),o&&t){let u=H(o);if(u)return u.show(),u}let c=new BrowserWindow({...e,webPreferences:{preload:d,contextIsolation:true,nodeIntegration:false,...e?.webPreferences}});return t&&!r&&n.cspConnectSources&&ne(n.cspConnectSources,s),r?c.loadURL(r):s?c.loadURL(`http://localhost:${n.localhostPort}${o?`#${o}`:""}`):o&&c.loadFile(a,{hash:o}),o&&t&&(C.set(o,c),c.on("close",u=>{u.preventDefault(),c.hide();})),c};var Z=o=>typeof o=="object"&&o!==null&&!Array.isArray(o)&&Object.prototype.toString.call(o)==="[object Object]",O=(o,e)=>{let t={...o};for(let[r,n]of Object.entries(e))if(Z(n)){let s=t[r];t[r]=Z(s)?O(s,n):O({},n);}else t[r]=n;return t},q=(o,e)=>{let t=e!==void 0?O(o,e):o;return Y(t)};var G=async(o,e)=>{if(!e)return;let t=l(e),r=await Promise.all(t.map(n=>i.resolve(o,n)));return new e(...r)};var k=new WeakMap,se=o=>{let e=new Set,t=Object.getPrototypeOf(o);for(;t&&t!==Object.prototype;)Object.getOwnPropertyNames(t).forEach(r=>r!=="constructor"&&e.add(r)),t=Object.getPrototypeOf(t);return Array.from(e)},ae=o=>o.replace(/^(onWindow|onWebContents|on)/,"").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z])([A-Z][a-z])/g,"$1-$2").toLowerCase(),J=(o,e,t,r,n)=>{let s=[];for(let a of r){if(!n(a))continue;let d=t[a];if(typeof d!="function")continue;let c=ae(a),u=(...X)=>{d.length<=1?d.apply(t,[e]):d.apply(t,[...X,e]);};o.on(c,u),s.push(()=>{o.off?o.off(c,u):o.removeListener&&o.removeListener(c,u);});}return s},Q=(o,e)=>{let t=k.get(o);if(t?.instance===e)return;t&&t.cleanup.forEach(d=>d());let r=se(e).filter(d=>d.startsWith("on")),n=d=>d.startsWith("onWebContents"),s=J(o,o,e,r,d=>!n(d)),a=J(o.webContents,o,e,r,n);k.set(o,{instance:e,cleanup:[...s,...a]}),o.once("closed",()=>{let d=k.get(o);d&&(d.cleanup.forEach(c=>c()),k.delete(o));});};var ie=(o,e)=>!e?.metadata?.options||!e.metadata.hash||!e.windowClass?{create:async()=>{}}:{create:async t=>{let r=q(e.metadata,t),n=await G(o,e.windowClass);if(r&&n)return Q(r,n),r}},de=o=>e=>{if(!e)return {create:async()=>{}};let t=i.getProvider(o,e);return ie(o,t)},R=async(o,e)=>{if(!e.ipc)return;let t=de(o);for(let r of e.ipc){let n=await i.resolve(o,r);n?.onInit&&await n.onInit({getWindow:t});}};var pe=(o,e)=>{let t=e.lazy?.trigger;if(typeof t!="string"||t.trim().length===0)throw new f(o.name);return t.trim()},U=(o,e)=>{let t=pe(o,e),r=null;ipcMain.handle(t,async()=>r||(r=(async()=>{try{return await m(o,e),await j(o),await i.resolve(o,o),e.windows?.length&&!e.ipc?.length&&console.warn(`Warning: Window(s) declared in module "${o.name}" but no IPC handlers found to manage them.`),await R(o,e),{initialized:!0,name:t}}catch(n){return r=null,{initialized:false,name:t,error:{message:n instanceof Error?n.message:String(n)}}}})(),r));};var ue=(o,e)=>{let t=e.lazy?.trigger;if(typeof t!="string"||t.trim().length===0)throw new f(o.name);return t.trim()},Rt=async o=>{let e=new Map;for(let t of o){let r=Reflect.getMetadata("RgModule",t);if(!r)throw new w(t.name);if(W(t,r),r.lazy?.enabled){let n=ue(t,r),s=e.get(n);if(s)throw new P(n,s,t.name);e.set(n,t.name),U(t,r);continue}await m(t,r),await j(t),await i.resolve(t,t),r.windows?.length&&!r.ipc?.length&&console.warn(`Warning: Window(s) declared in module "${t.name}" but no IPC handlers found to manage them.`),await R(t,r);}};var zt=()=>{let o=BrowserWindow.getAllWindows();for(let e of o)e.isDestroyed()||e.destroy();};var Dt=()=>o=>{Reflect.defineMetadata("Injectable",true,o);};var Lt=()=>o=>{Reflect.defineMetadata("IpcHandler",true,o);};var Ht=o=>e=>{Reflect.defineMetadata("RgModule",o,e);};var Bt=o=>e=>{Reflect.defineMetadata("WindowManager",o,e);};
|
|
2
|
+
export{E as Container,P as DuplicateLazyTriggerError,x as EagerModuleCannotImportLazyModuleError,me as Inject,Dt as Injectable,f as InvalidLazyTriggerError,M as InvalidProviderError,Lt as IpcHandler,h as LazyModuleCannotImportLazyModuleError,v as LazyModuleExportsNotAllowedError,w as ModuleDecoratorMissingError,y as ModuleNotRegisteredError,g as ProviderNotFoundError,Ht as RgModule,T as SettingsNotInitializedError,Bt as WindowManager,Q as attachWindowEventListeners,Rt as bootstrapModules,C as cacheWindows,i as container,Y as createWindow,G as createWindowInstance,q as createWindowWithParams,zt as destroyWindows,l as getDependencyTokens,S as getInjectedTokens,B as getSettings,H as getWindow,Ge as initSettings,R as initializeIpcHandlers,m as initializeModule,j as instantiateModule,L as registerImports,F as registerIpcHandlers,U as registerLazyModule,K as registerProviders,$ as registerWindows};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devisfuture/electron-modular",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.19",
|
|
4
4
|
"description": "Core module system, DI container, IPC handlers, and window utilities for Electron main process.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,9 +22,12 @@
|
|
|
22
22
|
"publishConfig": {
|
|
23
23
|
"access": "public"
|
|
24
24
|
},
|
|
25
|
-
"sideEffects":
|
|
25
|
+
"sideEffects": [
|
|
26
|
+
"./src/reflect-metadata.ts",
|
|
27
|
+
"./dist/index.js"
|
|
28
|
+
],
|
|
26
29
|
"scripts": {
|
|
27
|
-
"build": "
|
|
30
|
+
"build": "tsup",
|
|
28
31
|
"test": "vitest run",
|
|
29
32
|
"test:watch": "vitest",
|
|
30
33
|
"test:ui": "vitest --ui",
|
|
@@ -42,6 +45,7 @@
|
|
|
42
45
|
"@vitest/ui": "^2.1.9",
|
|
43
46
|
"electron": "^36.4.0",
|
|
44
47
|
"reflect-metadata": "^0.2.2",
|
|
48
|
+
"tsup": "^8.5.0",
|
|
45
49
|
"typescript": "^5.7.2",
|
|
46
50
|
"vitest": "^2.1.8"
|
|
47
51
|
},
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { ModuleDecoratorMissingError, DuplicateLazyTriggerError, InvalidLazyTriggerError, } from "../errors/index.js";
|
|
2
|
-
import { instantiateModule } from "./instantiate-module.js";
|
|
3
|
-
import { initializeModule } from "./initialize-module.js";
|
|
4
|
-
import { container } from "../container.js";
|
|
5
|
-
import { initializeIpcHandlers } from "./initialize-ipc/handlers.js";
|
|
6
|
-
import { registerLazyModule } from "./register-lazy-module.js";
|
|
7
|
-
import { validateLazyConstraints } from "./validate-lazy-constraints.js";
|
|
8
|
-
const getValidLazyTrigger = (moduleClass, metadata) => {
|
|
9
|
-
const trigger = metadata.lazy?.trigger;
|
|
10
|
-
if (typeof trigger !== "string" || trigger.trim().length === 0) {
|
|
11
|
-
throw new InvalidLazyTriggerError(moduleClass.name);
|
|
12
|
-
}
|
|
13
|
-
return trigger.trim();
|
|
14
|
-
};
|
|
15
|
-
export const bootstrapModules = async (modulesClass) => {
|
|
16
|
-
const lazyTriggerRegistry = new Map();
|
|
17
|
-
for (const moduleClass of modulesClass) {
|
|
18
|
-
const metadata = Reflect.getMetadata("RgModule", moduleClass);
|
|
19
|
-
if (!metadata) {
|
|
20
|
-
throw new ModuleDecoratorMissingError(moduleClass.name);
|
|
21
|
-
}
|
|
22
|
-
validateLazyConstraints(moduleClass, metadata);
|
|
23
|
-
if (metadata.lazy?.enabled) {
|
|
24
|
-
const trigger = getValidLazyTrigger(moduleClass, metadata);
|
|
25
|
-
const existingModule = lazyTriggerRegistry.get(trigger);
|
|
26
|
-
if (existingModule) {
|
|
27
|
-
throw new DuplicateLazyTriggerError(trigger, existingModule, moduleClass.name);
|
|
28
|
-
}
|
|
29
|
-
lazyTriggerRegistry.set(trigger, moduleClass.name);
|
|
30
|
-
registerLazyModule(moduleClass, metadata);
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
await initializeModule(moduleClass, metadata);
|
|
34
|
-
await instantiateModule(moduleClass);
|
|
35
|
-
await container.resolve(moduleClass, moduleClass);
|
|
36
|
-
if (metadata.windows?.length && !metadata.ipc?.length) {
|
|
37
|
-
console.warn(`Warning: Window(s) declared in module "${moduleClass.name}" but no IPC handlers found to manage them.`);
|
|
38
|
-
}
|
|
39
|
-
await initializeIpcHandlers(moduleClass, metadata);
|
|
40
|
-
}
|
|
41
|
-
};
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { container } from "../../container.js";
|
|
2
|
-
import { createWindowWithParams } from "./window-creator.js";
|
|
3
|
-
import { createWindowInstance } from "./window-instance-creator.js";
|
|
4
|
-
import { attachWindowEventListeners } from "./window-event-listeners.js";
|
|
5
|
-
const createWindowFactory = (moduleClass, windowMetadata) => {
|
|
6
|
-
if (!windowMetadata?.metadata?.options ||
|
|
7
|
-
!windowMetadata.metadata.hash ||
|
|
8
|
-
!windowMetadata.windowClass) {
|
|
9
|
-
return {
|
|
10
|
-
create: async () => undefined,
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
return {
|
|
14
|
-
create: async (params) => {
|
|
15
|
-
const browserWindow = createWindowWithParams(windowMetadata.metadata, params);
|
|
16
|
-
const windowInstance = await createWindowInstance(moduleClass, windowMetadata.windowClass);
|
|
17
|
-
if (browserWindow && windowInstance) {
|
|
18
|
-
attachWindowEventListeners(browserWindow, windowInstance);
|
|
19
|
-
return browserWindow;
|
|
20
|
-
}
|
|
21
|
-
return undefined;
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
|
-
const createGetWindowFunction = (moduleClass) => {
|
|
26
|
-
return (name) => {
|
|
27
|
-
if (!name) {
|
|
28
|
-
return {
|
|
29
|
-
create: async () => undefined,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
const windowMetadata = container.getProvider(moduleClass, name);
|
|
33
|
-
return createWindowFactory(moduleClass, windowMetadata);
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
export const initializeIpcHandlers = async (moduleClass, metadata) => {
|
|
37
|
-
if (!metadata.ipc) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
const getWindow = createGetWindowFunction(moduleClass);
|
|
41
|
-
for (const ipcClass of metadata.ipc) {
|
|
42
|
-
const ipcInstance = await container.resolve(moduleClass, ipcClass);
|
|
43
|
-
if (ipcInstance?.onInit) {
|
|
44
|
-
await ipcInstance.onInit({ getWindow });
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
};
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { createWindow } from "../../control-window/create.js";
|
|
2
|
-
const isPlainObject = (value) => {
|
|
3
|
-
return (typeof value === "object" &&
|
|
4
|
-
value !== null &&
|
|
5
|
-
!Array.isArray(value) &&
|
|
6
|
-
Object.prototype.toString.call(value) === "[object Object]");
|
|
7
|
-
};
|
|
8
|
-
const mergeDeep = (target, source) => {
|
|
9
|
-
const output = { ...target };
|
|
10
|
-
for (const [key, value] of Object.entries(source)) {
|
|
11
|
-
if (isPlainObject(value)) {
|
|
12
|
-
const current = output[key];
|
|
13
|
-
output[key] = isPlainObject(current)
|
|
14
|
-
? mergeDeep(current, value)
|
|
15
|
-
: mergeDeep({}, value);
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
output[key] = value;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
return output;
|
|
22
|
-
};
|
|
23
|
-
export const createWindowWithParams = (baseMetadata, params) => {
|
|
24
|
-
const mergedSettings = params !== undefined
|
|
25
|
-
? mergeDeep(baseMetadata, params)
|
|
26
|
-
: baseMetadata;
|
|
27
|
-
return createWindow(mergedSettings);
|
|
28
|
-
};
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
const windowListeners = new WeakMap();
|
|
2
|
-
const getPrototypeMethodNames = (instance) => {
|
|
3
|
-
const names = new Set();
|
|
4
|
-
let proto = Object.getPrototypeOf(instance);
|
|
5
|
-
while (proto && proto !== Object.prototype) {
|
|
6
|
-
Object.getOwnPropertyNames(proto).forEach((n) => n !== "constructor" && names.add(n));
|
|
7
|
-
proto = Object.getPrototypeOf(proto);
|
|
8
|
-
}
|
|
9
|
-
return Array.from(names);
|
|
10
|
-
};
|
|
11
|
-
const toEventName = (h) => {
|
|
12
|
-
const c = h.replace(/^(onWindow|onWebContents|on)/, "");
|
|
13
|
-
return c
|
|
14
|
-
.replace(/([a-z0-9])([A-Z])/g, "$1-$2")
|
|
15
|
-
.replace(/([A-Z])([A-Z][a-z])/g, "$1-$2")
|
|
16
|
-
.toLowerCase();
|
|
17
|
-
};
|
|
18
|
-
const attachHandlersToEmitter = (emitter, win, inst, names, filter) => {
|
|
19
|
-
const cleanups = [];
|
|
20
|
-
for (const name of names) {
|
|
21
|
-
if (!filter(name))
|
|
22
|
-
continue;
|
|
23
|
-
const h = inst[name];
|
|
24
|
-
if (typeof h !== "function")
|
|
25
|
-
continue;
|
|
26
|
-
const evt = toEventName(name);
|
|
27
|
-
const listener = (...args) => {
|
|
28
|
-
h.length <= 1 ? h.apply(inst, [win]) : h.apply(inst, [...args, win]);
|
|
29
|
-
};
|
|
30
|
-
emitter.on(evt, listener);
|
|
31
|
-
cleanups.push(() => {
|
|
32
|
-
emitter.off
|
|
33
|
-
? emitter.off(evt, listener)
|
|
34
|
-
: emitter.removeListener &&
|
|
35
|
-
emitter.removeListener(evt, listener);
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
return cleanups;
|
|
39
|
-
};
|
|
40
|
-
export const attachWindowEventListeners = (win, inst) => {
|
|
41
|
-
const entry = windowListeners.get(win);
|
|
42
|
-
if (entry?.instance === inst)
|
|
43
|
-
return;
|
|
44
|
-
if (entry)
|
|
45
|
-
entry.cleanup.forEach((c) => c());
|
|
46
|
-
const names = getPrototypeMethodNames(inst).filter((n) => n.startsWith("on"));
|
|
47
|
-
const isWebContents = (n) => n.startsWith("onWebContents");
|
|
48
|
-
const winCleanups = attachHandlersToEmitter(win, win, inst, names, (n) => !isWebContents(n));
|
|
49
|
-
const webCleanups = attachHandlersToEmitter(win.webContents, win, inst, names, isWebContents);
|
|
50
|
-
windowListeners.set(win, {
|
|
51
|
-
instance: inst,
|
|
52
|
-
cleanup: [...winCleanups, ...webCleanups],
|
|
53
|
-
});
|
|
54
|
-
win.once("closed", () => {
|
|
55
|
-
const e = windowListeners.get(win);
|
|
56
|
-
if (e) {
|
|
57
|
-
e.cleanup.forEach((c) => c());
|
|
58
|
-
windowListeners.delete(win);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import type { Constructor } from "../../types/constructor.js";
|
|
2
|
-
import type { TWindowManagerWithHandlers } from "../../types/window-manager.js";
|
|
3
|
-
export declare const createWindowInstance: <T extends TWindowManagerWithHandlers>(moduleClass: Constructor, windowClass: Constructor<T>) => Promise<T | undefined>;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { container } from "../../container.js";
|
|
2
|
-
import { getDependencyTokens } from "../../utils/dependency-tokens.js";
|
|
3
|
-
export const createWindowInstance = async (moduleClass, windowClass) => {
|
|
4
|
-
if (!windowClass) {
|
|
5
|
-
return undefined;
|
|
6
|
-
}
|
|
7
|
-
const dependenciesTypes = getDependencyTokens(windowClass);
|
|
8
|
-
const resolvedDependencies = await Promise.all(dependenciesTypes.map((depType) => container.resolve(moduleClass, depType)));
|
|
9
|
-
return new windowClass(...resolvedDependencies);
|
|
10
|
-
};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { container } from "../container.js";
|
|
2
|
-
import { registerProviders } from "./register-providers.js";
|
|
3
|
-
import { registerImports } from "./register-imports.js";
|
|
4
|
-
import { registerWindows } from "./register-windows.js";
|
|
5
|
-
import { registerIpcHandlers } from "./register-ipc-handlers.js";
|
|
6
|
-
import { validateLazyConstraints } from "./validate-lazy-constraints.js";
|
|
7
|
-
export const initializeModule = async (moduleClass, metadata) => {
|
|
8
|
-
validateLazyConstraints(moduleClass, metadata);
|
|
9
|
-
const isNewModule = container.addModule(moduleClass, metadata);
|
|
10
|
-
container.setModuleMetadata(moduleClass, metadata);
|
|
11
|
-
if (!isNewModule) {
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
await Promise.all([
|
|
15
|
-
registerProviders(moduleClass, metadata),
|
|
16
|
-
registerImports(moduleClass, metadata),
|
|
17
|
-
registerWindows(moduleClass, metadata),
|
|
18
|
-
registerIpcHandlers(moduleClass, metadata),
|
|
19
|
-
]);
|
|
20
|
-
};
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { container } from "../container.js";
|
|
2
|
-
import { getDependencyTokens } from "../utils/dependency-tokens.js";
|
|
3
|
-
export const instantiateModule = async (moduleClass) => {
|
|
4
|
-
const dependencies = getDependencyTokens(moduleClass);
|
|
5
|
-
const resolvedDependencies = await Promise.all(dependencies.map((dependency) => container.resolve(moduleClass, dependency)));
|
|
6
|
-
const instance = new moduleClass(...resolvedDependencies);
|
|
7
|
-
container.registerInstance(moduleClass, instance);
|
|
8
|
-
return instance;
|
|
9
|
-
};
|