@mediaproc/cli 0.8.4 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +25 -13
- package/dist/cli.js.map +1 -1
- package/dist/commands/add.d.ts +1 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +56 -131
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/help.js +1 -1
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/history.js +1 -1
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/list.d.ts +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +3 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/plugins.d.ts +1 -1
- package/dist/commands/plugins.d.ts.map +1 -1
- package/dist/commands/plugins.js +1 -1
- package/dist/commands/plugins.js.map +1 -1
- package/dist/commands/remove.d.ts +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +14 -47
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/update.d.ts +2 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +121 -142
- package/dist/commands/update.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/history-manager.d.ts.map +1 -0
- package/dist/{history-manager.js → utils/history-manager.js} +1 -1
- package/dist/utils/history-manager.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/package-manager.d.ts +37 -0
- package/dist/utils/package-manager.d.ts.map +1 -0
- package/dist/utils/package-manager.js +195 -0
- package/dist/utils/package-manager.js.map +1 -0
- package/dist/utils/plugin-helpers.d.ts +39 -0
- package/dist/utils/plugin-helpers.d.ts.map +1 -0
- package/dist/utils/plugin-helpers.js +156 -0
- package/dist/utils/plugin-helpers.js.map +1 -0
- package/dist/utils/plugins/api.d.ts +106 -0
- package/dist/utils/plugins/api.d.ts.map +1 -0
- package/dist/utils/plugins/api.js +20 -0
- package/dist/utils/plugins/api.js.map +1 -0
- package/dist/utils/plugins/index.d.ts +4 -0
- package/dist/utils/plugins/index.d.ts.map +1 -0
- package/dist/utils/plugins/index.js +7 -0
- package/dist/utils/plugins/index.js.map +1 -0
- package/dist/utils/plugins/manager.d.ts +88 -0
- package/dist/utils/plugins/manager.d.ts.map +1 -0
- package/dist/utils/plugins/manager.js +267 -0
- package/dist/utils/plugins/manager.js.map +1 -0
- package/dist/{plugin-registry.d.ts → utils/plugins/registry.d.ts} +22 -1
- package/dist/utils/plugins/registry.d.ts.map +1 -0
- package/dist/{plugin-registry.js → utils/plugins/registry.js} +105 -7
- package/dist/utils/plugins/registry.js.map +1 -0
- package/package.json +4 -18
- package/dist/commands/delete.d.ts +0 -7
- package/dist/commands/delete.d.ts.map +0 -1
- package/dist/commands/delete.js +0 -250
- package/dist/commands/delete.js.map +0 -1
- package/dist/commands/stats.d.ts +0 -3
- package/dist/commands/stats.d.ts.map +0 -1
- package/dist/commands/stats.js +0 -157
- package/dist/commands/stats.js.map +0 -1
- package/dist/history-manager.d.ts.map +0 -1
- package/dist/history-manager.js.map +0 -1
- package/dist/plugin-api.d.ts +0 -44
- package/dist/plugin-api.d.ts.map +0 -1
- package/dist/plugin-api.js +0 -2
- package/dist/plugin-api.js.map +0 -1
- package/dist/plugin-manager.d.ts +0 -42
- package/dist/plugin-manager.d.ts.map +0 -1
- package/dist/plugin-manager.js +0 -113
- package/dist/plugin-manager.js.map +0 -1
- package/dist/plugin-registry.d.ts.map +0 -1
- package/dist/plugin-registry.js.map +0 -1
- /package/dist/{history-manager.d.ts → utils/history-manager.d.ts} +0 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import type { MediaProcPlugin } from '../../types.js';
|
|
3
|
+
import { PluginType, PluginStatus, type PluginLoadResult } from './api.js';
|
|
4
|
+
/**
|
|
5
|
+
* Enhanced Plugin Manager with concurrent loading protection and better error handling
|
|
6
|
+
*/
|
|
7
|
+
export declare class PluginManager {
|
|
8
|
+
private plugins;
|
|
9
|
+
private loadingPlugins;
|
|
10
|
+
private failedPlugins;
|
|
11
|
+
private readonly pluginPrefix;
|
|
12
|
+
private readonly officialPlugins;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a plugin is official (@mediaproc/* package)
|
|
15
|
+
*/
|
|
16
|
+
isOfficialPlugin(pluginName: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Get the plugin prefix
|
|
19
|
+
*/
|
|
20
|
+
getPluginPrefix(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Get plugin type
|
|
23
|
+
*/
|
|
24
|
+
getPluginType(pluginName: string): PluginType;
|
|
25
|
+
/**
|
|
26
|
+
* Get plugin status
|
|
27
|
+
*/
|
|
28
|
+
getPluginStatus(pluginName: string): PluginStatus;
|
|
29
|
+
/**
|
|
30
|
+
* Load a specific plugin and register its commands
|
|
31
|
+
*/
|
|
32
|
+
loadPlugin(pluginName: string, program: Command, isBuiltIn?: boolean): Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Load multiple plugins concurrently (with error tolerance)
|
|
35
|
+
*/
|
|
36
|
+
loadPlugins(pluginNames: string[], program: Command, options?: {
|
|
37
|
+
throwOnError?: boolean;
|
|
38
|
+
}): Promise<PluginLoadResult[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Get list of loaded plugins (currently in memory)
|
|
41
|
+
*/
|
|
42
|
+
getLoadedPlugins(): string[];
|
|
43
|
+
/**
|
|
44
|
+
* Get official plugins list
|
|
45
|
+
*/
|
|
46
|
+
getOfficialPlugins(): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Get plugin instance
|
|
49
|
+
*/
|
|
50
|
+
getPlugin(pluginName: string): MediaProcPlugin | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Get all plugin instances
|
|
53
|
+
*/
|
|
54
|
+
getAllPlugins(): Map<string, MediaProcPlugin>;
|
|
55
|
+
/**
|
|
56
|
+
* Get failed plugins with error messages
|
|
57
|
+
*/
|
|
58
|
+
getFailedPlugins(): Map<string, string>;
|
|
59
|
+
/**
|
|
60
|
+
* Unload a plugin (remove from registry)
|
|
61
|
+
* Properly cleans up all references to prevent memory leaks
|
|
62
|
+
*/
|
|
63
|
+
unloadPlugin(pluginName: string): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Reload a plugin (unload then load again)
|
|
66
|
+
* Useful after updating a plugin to refresh its code
|
|
67
|
+
*/
|
|
68
|
+
reloadPlugin(pluginName: string, program: Command): Promise<boolean>;
|
|
69
|
+
/**
|
|
70
|
+
* Check if any plugins are currently loading
|
|
71
|
+
*/
|
|
72
|
+
hasLoadingPlugins(): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Get count of loaded plugins
|
|
75
|
+
*/
|
|
76
|
+
getLoadedCount(): number;
|
|
77
|
+
/**
|
|
78
|
+
* Clear all plugins (useful for testing)
|
|
79
|
+
*/
|
|
80
|
+
clear(): void;
|
|
81
|
+
}
|
|
82
|
+
export declare const pluginManager: PluginManager;
|
|
83
|
+
/**
|
|
84
|
+
* Get the plugin name for a given command name.
|
|
85
|
+
* Checks loaded plugins for a command match, otherwise returns 'core'.
|
|
86
|
+
*/
|
|
87
|
+
export declare function getPluginNameForCommand(commandName: string): string;
|
|
88
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/utils/plugins/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE3E;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;IAG9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAW9B;IAEF;;OAEG;IACH,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU;IAU7C;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY;IAajD;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAqD3F;;OAEG;IACG,WAAW,CACf,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GACvC,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAyB9B;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAI5B;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI1D;;OAEG;IACH,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAI7C;;OAEG;IACH,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAIvC;;;OAGG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAwBzC;;;OAGG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB1E;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;CAKd;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAwBnE"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { PluginType, PluginStatus } from './api.js';
|
|
2
|
+
/**
|
|
3
|
+
* Enhanced Plugin Manager with concurrent loading protection and better error handling
|
|
4
|
+
*/
|
|
5
|
+
export class PluginManager {
|
|
6
|
+
plugins = new Map();
|
|
7
|
+
loadingPlugins = new Set();
|
|
8
|
+
failedPlugins = new Map();
|
|
9
|
+
pluginPrefix = '@mediaproc/';
|
|
10
|
+
// Official plugins (recommended, but installed on-demand)
|
|
11
|
+
officialPlugins = [
|
|
12
|
+
'@mediaproc/image',
|
|
13
|
+
'@mediaproc/video',
|
|
14
|
+
'@mediaproc/audio',
|
|
15
|
+
'@mediaproc/document',
|
|
16
|
+
'@mediaproc/animation',
|
|
17
|
+
'@mediaproc/3d',
|
|
18
|
+
'@mediaproc/stream',
|
|
19
|
+
'@mediaproc/ai',
|
|
20
|
+
'@mediaproc/metadata',
|
|
21
|
+
'@mediaproc/pipeline',
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* Check if a plugin is official (@mediaproc/* package)
|
|
25
|
+
*/
|
|
26
|
+
isOfficialPlugin(pluginName) {
|
|
27
|
+
return this.officialPlugins.includes(pluginName) || pluginName.startsWith(this.pluginPrefix);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the plugin prefix
|
|
31
|
+
*/
|
|
32
|
+
getPluginPrefix() {
|
|
33
|
+
return this.pluginPrefix;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get plugin type
|
|
37
|
+
*/
|
|
38
|
+
getPluginType(pluginName) {
|
|
39
|
+
if (pluginName.startsWith('@mediaproc/')) {
|
|
40
|
+
return PluginType.OFFICIAL;
|
|
41
|
+
}
|
|
42
|
+
if (pluginName.startsWith('mediaproc-')) {
|
|
43
|
+
return PluginType.COMMUNITY;
|
|
44
|
+
}
|
|
45
|
+
return PluginType.THIRD_PARTY;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get plugin status
|
|
49
|
+
*/
|
|
50
|
+
getPluginStatus(pluginName) {
|
|
51
|
+
if (this.plugins.has(pluginName)) {
|
|
52
|
+
return PluginStatus.LOADED;
|
|
53
|
+
}
|
|
54
|
+
if (this.loadingPlugins.has(pluginName)) {
|
|
55
|
+
return PluginStatus.LOADING;
|
|
56
|
+
}
|
|
57
|
+
if (this.failedPlugins.has(pluginName)) {
|
|
58
|
+
return PluginStatus.ERROR;
|
|
59
|
+
}
|
|
60
|
+
return PluginStatus.NOT_INSTALLED;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Load a specific plugin and register its commands
|
|
64
|
+
*/
|
|
65
|
+
async loadPlugin(pluginName, program, isBuiltIn = false) {
|
|
66
|
+
// Skip if already loaded
|
|
67
|
+
if (this.plugins.has(pluginName)) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
// Prevent concurrent loading of same plugin
|
|
71
|
+
if (this.loadingPlugins.has(pluginName)) {
|
|
72
|
+
throw new Error(`Plugin ${pluginName} is already being loaded`);
|
|
73
|
+
}
|
|
74
|
+
// Clear any previous failure state
|
|
75
|
+
this.failedPlugins.delete(pluginName);
|
|
76
|
+
this.loadingPlugins.add(pluginName);
|
|
77
|
+
try {
|
|
78
|
+
// Dynamic import of the plugin
|
|
79
|
+
const plugin = await import(pluginName);
|
|
80
|
+
// Validate plugin structure
|
|
81
|
+
if (!plugin.name || !plugin.version) {
|
|
82
|
+
this.loadingPlugins.delete(pluginName);
|
|
83
|
+
const error = `Plugin ${pluginName} missing required exports (name, version)`;
|
|
84
|
+
this.failedPlugins.set(pluginName, error);
|
|
85
|
+
throw new Error(error);
|
|
86
|
+
}
|
|
87
|
+
if (typeof plugin.register !== 'function') {
|
|
88
|
+
this.loadingPlugins.delete(pluginName);
|
|
89
|
+
const error = `Plugin ${pluginName} does not export a register() function`;
|
|
90
|
+
this.failedPlugins.set(pluginName, error);
|
|
91
|
+
throw new Error(error);
|
|
92
|
+
}
|
|
93
|
+
// Register plugin commands with the CLI
|
|
94
|
+
await plugin.register(program);
|
|
95
|
+
// Store plugin instance
|
|
96
|
+
this.plugins.set(pluginName, {
|
|
97
|
+
...plugin,
|
|
98
|
+
isBuiltIn
|
|
99
|
+
});
|
|
100
|
+
this.loadingPlugins.delete(pluginName);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
this.loadingPlugins.delete(pluginName);
|
|
105
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
106
|
+
this.failedPlugins.set(pluginName, errorMessage);
|
|
107
|
+
throw new Error(`Failed to load plugin ${pluginName}: ${errorMessage}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Load multiple plugins concurrently (with error tolerance)
|
|
112
|
+
*/
|
|
113
|
+
async loadPlugins(pluginNames, program, options = {}) {
|
|
114
|
+
const results = await Promise.allSettled(pluginNames.map(name => this.loadPlugin(name, program)));
|
|
115
|
+
return results.map((result, index) => {
|
|
116
|
+
const pluginName = pluginNames[index];
|
|
117
|
+
if (result.status === 'fulfilled' && result.value) {
|
|
118
|
+
return {
|
|
119
|
+
success: true,
|
|
120
|
+
plugin: this.plugins.get(pluginName)
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
const error = result.status === 'rejected' ? result.reason?.message : 'Unknown error';
|
|
125
|
+
if (options.throwOnError) {
|
|
126
|
+
throw new Error(error);
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
success: false,
|
|
130
|
+
error
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get list of loaded plugins (currently in memory)
|
|
137
|
+
*/
|
|
138
|
+
getLoadedPlugins() {
|
|
139
|
+
return Array.from(this.plugins.keys());
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get official plugins list
|
|
143
|
+
*/
|
|
144
|
+
getOfficialPlugins() {
|
|
145
|
+
return [...this.officialPlugins];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get plugin instance
|
|
149
|
+
*/
|
|
150
|
+
getPlugin(pluginName) {
|
|
151
|
+
return this.plugins.get(pluginName);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get all plugin instances
|
|
155
|
+
*/
|
|
156
|
+
getAllPlugins() {
|
|
157
|
+
return new Map(this.plugins);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get failed plugins with error messages
|
|
161
|
+
*/
|
|
162
|
+
getFailedPlugins() {
|
|
163
|
+
return new Map(this.failedPlugins);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Unload a plugin (remove from registry)
|
|
167
|
+
* Properly cleans up all references to prevent memory leaks
|
|
168
|
+
*/
|
|
169
|
+
unloadPlugin(pluginName) {
|
|
170
|
+
if (this.plugins.has(pluginName)) {
|
|
171
|
+
// Get plugin instance for cleanup
|
|
172
|
+
const plugin = this.plugins.get(pluginName);
|
|
173
|
+
// Call cleanup if plugin provides it
|
|
174
|
+
if (plugin && typeof plugin.cleanup === 'function') {
|
|
175
|
+
try {
|
|
176
|
+
plugin.cleanup();
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
console.warn(`Warning: Plugin ${pluginName} cleanup failed:`, error);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Remove from all tracking structures
|
|
183
|
+
this.plugins.delete(pluginName);
|
|
184
|
+
this.failedPlugins.delete(pluginName);
|
|
185
|
+
this.loadingPlugins.delete(pluginName);
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Reload a plugin (unload then load again)
|
|
192
|
+
* Useful after updating a plugin to refresh its code
|
|
193
|
+
*/
|
|
194
|
+
async reloadPlugin(pluginName, program) {
|
|
195
|
+
// Unload first (this will clean up resources)
|
|
196
|
+
this.unloadPlugin(pluginName);
|
|
197
|
+
// Clear Node.js module cache to force fresh import
|
|
198
|
+
// This is important when reloading after an update
|
|
199
|
+
try {
|
|
200
|
+
// Try CommonJS cache clearing
|
|
201
|
+
if (typeof require !== 'undefined' && require.cache) {
|
|
202
|
+
const moduleId = require.resolve(pluginName);
|
|
203
|
+
if (moduleId && require.cache[moduleId]) {
|
|
204
|
+
delete require.cache[moduleId];
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
// Module may be ES module or not in cache - continue anyway
|
|
210
|
+
}
|
|
211
|
+
// Add a small delay to ensure file system has released handles
|
|
212
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
213
|
+
// Load fresh version with cache-busting query parameter
|
|
214
|
+
return await this.loadPlugin(pluginName, program);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Check if any plugins are currently loading
|
|
218
|
+
*/
|
|
219
|
+
hasLoadingPlugins() {
|
|
220
|
+
return this.loadingPlugins.size > 0;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get count of loaded plugins
|
|
224
|
+
*/
|
|
225
|
+
getLoadedCount() {
|
|
226
|
+
return this.plugins.size;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Clear all plugins (useful for testing)
|
|
230
|
+
*/
|
|
231
|
+
clear() {
|
|
232
|
+
this.plugins.clear();
|
|
233
|
+
this.loadingPlugins.clear();
|
|
234
|
+
this.failedPlugins.clear();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Export a singleton PluginManager instance
|
|
238
|
+
export const pluginManager = new PluginManager();
|
|
239
|
+
/**
|
|
240
|
+
* Get the plugin name for a given command name.
|
|
241
|
+
* Checks loaded plugins for a command match, otherwise returns 'core'.
|
|
242
|
+
*/
|
|
243
|
+
export function getPluginNameForCommand(commandName) {
|
|
244
|
+
const allPlugins = pluginManager.getAllPlugins();
|
|
245
|
+
for (const [pluginName, plugin] of allPlugins.entries()) {
|
|
246
|
+
// If plugin has a 'commands' array property (non-standard, but some plugins may add it)
|
|
247
|
+
if (plugin && plugin.commands && Array.isArray(plugin.commands)) {
|
|
248
|
+
if (plugin.commands.includes(commandName)) {
|
|
249
|
+
return pluginName;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// If plugin has a 'getCommands' method (non-standard, but some plugins may add it)
|
|
253
|
+
if (plugin && typeof plugin.getCommands === 'function') {
|
|
254
|
+
try {
|
|
255
|
+
const cmds = plugin.getCommands();
|
|
256
|
+
if (Array.isArray(cmds) && cmds.includes(commandName)) {
|
|
257
|
+
return pluginName;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
// Ignore errors from getCommands
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return 'core';
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/utils/plugins/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,8 @@ export interface PluginRegistryEntry {
|
|
|
11
11
|
type: 'official' | 'community';
|
|
12
12
|
dependencies?: string[];
|
|
13
13
|
systemRequirements?: string[];
|
|
14
|
+
keywords?: string[];
|
|
15
|
+
documentation?: string;
|
|
14
16
|
}
|
|
15
17
|
export declare const PLUGIN_REGISTRY: Record<string, PluginRegistryEntry>;
|
|
16
18
|
/**
|
|
@@ -19,18 +21,37 @@ export declare const PLUGIN_REGISTRY: Record<string, PluginRegistryEntry>;
|
|
|
19
21
|
* 1. Official: @mediaproc/<name> (e.g., @mediaproc/image)
|
|
20
22
|
* 2. Community: mediaproc-<name> (e.g., mediaproc-super-filters)
|
|
21
23
|
* 3. Third-party: any npm package (e.g., my-custom-mediaproc-plugin)
|
|
24
|
+
* @throws {Error} If plugin name is empty or invalid
|
|
22
25
|
*/
|
|
23
26
|
export declare function resolvePluginPackage(shortName: string): string;
|
|
24
27
|
/**
|
|
25
28
|
* Detect plugin type from package name
|
|
29
|
+
* @param packageName - Full package name
|
|
30
|
+
* @returns Plugin type: official, community, or third-party
|
|
26
31
|
*/
|
|
27
32
|
export declare function detectPluginType(packageName: string): 'official' | 'community' | 'third-party';
|
|
28
33
|
/**
|
|
29
34
|
* Get all available plugins grouped by category
|
|
30
35
|
*/
|
|
31
36
|
export declare function getPluginsByCategory(): Record<string, PluginRegistryEntry[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Get all plugins (unique by package)
|
|
39
|
+
*/
|
|
40
|
+
export declare function getAllPlugins(): PluginRegistryEntry[];
|
|
41
|
+
/**
|
|
42
|
+
* Search plugins by keyword
|
|
43
|
+
*/
|
|
44
|
+
export declare function searchPlugins(keyword: string): PluginRegistryEntry[];
|
|
45
|
+
/**
|
|
46
|
+
* Get plugin entry by package name
|
|
47
|
+
*/
|
|
48
|
+
export declare function getPluginEntry(packageName: string): PluginRegistryEntry | undefined;
|
|
32
49
|
/**
|
|
33
50
|
* Check if a plugin exists in registry
|
|
34
51
|
*/
|
|
35
52
|
export declare function isValidPlugin(name: string): boolean;
|
|
36
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Get plugin category
|
|
55
|
+
*/
|
|
56
|
+
export declare function getPluginCategory(packageName: string): string | undefined;
|
|
57
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/utils/plugins/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,cAAc,CAAC;IAC/C,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAqL/D,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA8B9D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,CAc9F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAiB5E;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,mBAAmB,EAAE,CAYrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAmBpE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAOnF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGzE"}
|
|
@@ -12,6 +12,8 @@ export const PLUGIN_REGISTRY = {
|
|
|
12
12
|
category: 'core',
|
|
13
13
|
type: 'official',
|
|
14
14
|
systemRequirements: ['Sharp (auto-installed)'],
|
|
15
|
+
keywords: ['image', 'photo', 'resize', 'convert', 'filter', 'compress'],
|
|
16
|
+
documentation: 'https://docs.mediaproc.io/plugins/image'
|
|
15
17
|
},
|
|
16
18
|
'video': {
|
|
17
19
|
name: 'video',
|
|
@@ -20,6 +22,8 @@ export const PLUGIN_REGISTRY = {
|
|
|
20
22
|
category: 'core',
|
|
21
23
|
type: 'official',
|
|
22
24
|
systemRequirements: ['FFmpeg'],
|
|
25
|
+
keywords: ['video', 'movie', 'transcode', 'compress', 'extract', 'trim'],
|
|
26
|
+
documentation: 'https://docs.mediaproc.io/plugins/video'
|
|
23
27
|
},
|
|
24
28
|
'audio': {
|
|
25
29
|
name: 'audio',
|
|
@@ -28,6 +32,8 @@ export const PLUGIN_REGISTRY = {
|
|
|
28
32
|
category: 'core',
|
|
29
33
|
type: 'official',
|
|
30
34
|
systemRequirements: ['FFmpeg'],
|
|
35
|
+
keywords: ['audio', 'music', 'sound', 'convert', 'normalize', 'extract'],
|
|
36
|
+
documentation: 'https://docs.mediaproc.io/plugins/audio'
|
|
31
37
|
},
|
|
32
38
|
// Document Media (Very Important)
|
|
33
39
|
'document': {
|
|
@@ -37,6 +43,8 @@ export const PLUGIN_REGISTRY = {
|
|
|
37
43
|
category: 'core',
|
|
38
44
|
type: 'official',
|
|
39
45
|
systemRequirements: ['Ghostscript', 'Tesseract OCR', 'Poppler'],
|
|
46
|
+
keywords: ['pdf', 'document', 'docx', 'ocr', 'compress'],
|
|
47
|
+
documentation: 'https://docs.mediaproc.io/plugins/document'
|
|
40
48
|
},
|
|
41
49
|
'doc': {
|
|
42
50
|
name: 'doc',
|
|
@@ -44,6 +52,7 @@ export const PLUGIN_REGISTRY = {
|
|
|
44
52
|
description: 'Alias for document plugin',
|
|
45
53
|
category: 'core',
|
|
46
54
|
type: 'official',
|
|
55
|
+
keywords: ['pdf', 'document', 'alias']
|
|
47
56
|
},
|
|
48
57
|
// Animation & Motion Media
|
|
49
58
|
'animation': {
|
|
@@ -53,6 +62,8 @@ export const PLUGIN_REGISTRY = {
|
|
|
53
62
|
category: 'core',
|
|
54
63
|
type: 'official',
|
|
55
64
|
systemRequirements: ['FFmpeg'],
|
|
65
|
+
keywords: ['gif', 'animation', 'webp', 'lottie', 'animated'],
|
|
66
|
+
documentation: 'https://docs.mediaproc.io/plugins/animation'
|
|
56
67
|
},
|
|
57
68
|
'anim': {
|
|
58
69
|
name: 'anim',
|
|
@@ -60,6 +71,7 @@ export const PLUGIN_REGISTRY = {
|
|
|
60
71
|
description: 'Alias for animation plugin',
|
|
61
72
|
category: 'core',
|
|
62
73
|
type: 'official',
|
|
74
|
+
keywords: ['animation', 'alias']
|
|
63
75
|
},
|
|
64
76
|
// 3D & Spatial Media (Advanced)
|
|
65
77
|
'3d': {
|
|
@@ -69,6 +81,8 @@ export const PLUGIN_REGISTRY = {
|
|
|
69
81
|
category: 'advanced',
|
|
70
82
|
type: 'official',
|
|
71
83
|
systemRequirements: ['gltf-transform'],
|
|
84
|
+
keywords: ['3d', 'model', 'gltf', 'glb', 'texture', 'ar', 'vr'],
|
|
85
|
+
documentation: 'https://docs.mediaproc.io/plugins/3d'
|
|
72
86
|
},
|
|
73
87
|
'spatial': {
|
|
74
88
|
name: 'spatial',
|
|
@@ -76,6 +90,7 @@ export const PLUGIN_REGISTRY = {
|
|
|
76
90
|
description: 'Alias for 3d plugin',
|
|
77
91
|
category: 'advanced',
|
|
78
92
|
type: 'official',
|
|
93
|
+
keywords: ['3d', 'spatial', 'alias']
|
|
79
94
|
},
|
|
80
95
|
// Metadata-only Processing (Underrated but Powerful)
|
|
81
96
|
'metadata': {
|
|
@@ -85,6 +100,8 @@ export const PLUGIN_REGISTRY = {
|
|
|
85
100
|
category: 'core',
|
|
86
101
|
type: 'official',
|
|
87
102
|
systemRequirements: ['ExifTool'],
|
|
103
|
+
keywords: ['metadata', 'exif', 'inspect', 'compliance'],
|
|
104
|
+
documentation: 'https://docs.mediaproc.io/plugins/metadata'
|
|
88
105
|
},
|
|
89
106
|
'meta': {
|
|
90
107
|
name: 'meta',
|
|
@@ -92,6 +109,7 @@ export const PLUGIN_REGISTRY = {
|
|
|
92
109
|
description: 'Alias for metadata plugin',
|
|
93
110
|
category: 'core',
|
|
94
111
|
type: 'official',
|
|
112
|
+
keywords: ['metadata', 'alias']
|
|
95
113
|
},
|
|
96
114
|
'inspect': {
|
|
97
115
|
name: 'inspect',
|
|
@@ -99,6 +117,7 @@ export const PLUGIN_REGISTRY = {
|
|
|
99
117
|
description: 'Alias for metadata plugin',
|
|
100
118
|
category: 'core',
|
|
101
119
|
type: 'official',
|
|
120
|
+
keywords: ['inspect', 'metadata', 'alias']
|
|
102
121
|
},
|
|
103
122
|
// Streaming & Packaging Media (Advanced, Industry-Relevant)
|
|
104
123
|
'stream': {
|
|
@@ -108,6 +127,8 @@ export const PLUGIN_REGISTRY = {
|
|
|
108
127
|
category: 'advanced',
|
|
109
128
|
type: 'official',
|
|
110
129
|
systemRequirements: ['FFmpeg', 'Shaka Packager (optional)'],
|
|
130
|
+
keywords: ['stream', 'hls', 'dash', 'manifest', 'packaging'],
|
|
131
|
+
documentation: 'https://docs.mediaproc.io/plugins/stream'
|
|
111
132
|
},
|
|
112
133
|
'streaming': {
|
|
113
134
|
name: 'streaming',
|
|
@@ -115,6 +136,7 @@ export const PLUGIN_REGISTRY = {
|
|
|
115
136
|
description: 'Alias for stream plugin',
|
|
116
137
|
category: 'advanced',
|
|
117
138
|
type: 'official',
|
|
139
|
+
keywords: ['streaming', 'alias']
|
|
118
140
|
},
|
|
119
141
|
// AI-Assisted Media (Future-Proof)
|
|
120
142
|
'ai': {
|
|
@@ -124,6 +146,8 @@ export const PLUGIN_REGISTRY = {
|
|
|
124
146
|
category: 'future-proof',
|
|
125
147
|
type: 'official',
|
|
126
148
|
systemRequirements: ['TensorFlow/ONNX Runtime (optional)', 'Whisper (optional)'],
|
|
149
|
+
keywords: ['ai', 'ml', 'caption', 'detection', 'blur', 'transcribe'],
|
|
150
|
+
documentation: 'https://docs.mediaproc.io/plugins/ai'
|
|
127
151
|
},
|
|
128
152
|
'ml': {
|
|
129
153
|
name: 'ml',
|
|
@@ -131,6 +155,7 @@ export const PLUGIN_REGISTRY = {
|
|
|
131
155
|
description: 'Alias for ai plugin',
|
|
132
156
|
category: 'future-proof',
|
|
133
157
|
type: 'official',
|
|
158
|
+
keywords: ['ml', 'ai', 'alias']
|
|
134
159
|
},
|
|
135
160
|
// Media Pipelines (Highest Level)
|
|
136
161
|
'pipeline': {
|
|
@@ -140,6 +165,8 @@ export const PLUGIN_REGISTRY = {
|
|
|
140
165
|
category: 'advanced',
|
|
141
166
|
type: 'official',
|
|
142
167
|
dependencies: ['Can use any installed plugins'],
|
|
168
|
+
keywords: ['pipeline', 'workflow', 'batch', 'yaml'],
|
|
169
|
+
documentation: 'https://docs.mediaproc.io/plugins/pipeline'
|
|
143
170
|
},
|
|
144
171
|
};
|
|
145
172
|
/**
|
|
@@ -148,29 +175,48 @@ export const PLUGIN_REGISTRY = {
|
|
|
148
175
|
* 1. Official: @mediaproc/<name> (e.g., @mediaproc/image)
|
|
149
176
|
* 2. Community: mediaproc-<name> (e.g., mediaproc-super-filters)
|
|
150
177
|
* 3. Third-party: any npm package (e.g., my-custom-mediaproc-plugin)
|
|
178
|
+
* @throws {Error} If plugin name is empty or invalid
|
|
151
179
|
*/
|
|
152
180
|
export function resolvePluginPackage(shortName) {
|
|
181
|
+
// Validate input
|
|
182
|
+
if (!shortName || typeof shortName !== 'string') {
|
|
183
|
+
throw new Error('Plugin name cannot be empty');
|
|
184
|
+
}
|
|
185
|
+
const trimmed = shortName.trim();
|
|
186
|
+
if (!trimmed) {
|
|
187
|
+
throw new Error('Plugin name cannot be empty');
|
|
188
|
+
}
|
|
189
|
+
// Validate characters (basic npm package name validation)
|
|
190
|
+
if (!/^[@\w\-./]+$/.test(trimmed)) {
|
|
191
|
+
throw new Error(`Invalid plugin name: ${trimmed}`);
|
|
192
|
+
}
|
|
153
193
|
// Already a full package name - return as-is
|
|
154
|
-
if (
|
|
155
|
-
return
|
|
194
|
+
if (trimmed.includes('/') || trimmed.startsWith('mediaproc-')) {
|
|
195
|
+
return trimmed;
|
|
156
196
|
}
|
|
157
197
|
// Look up in official registry first
|
|
158
|
-
const entry = PLUGIN_REGISTRY[
|
|
198
|
+
const entry = PLUGIN_REGISTRY[trimmed.toLowerCase()];
|
|
159
199
|
if (entry) {
|
|
160
200
|
return entry.package;
|
|
161
201
|
}
|
|
162
202
|
// Not in registry - could be community or third-party
|
|
163
203
|
// Assume community format: mediaproc-<name>
|
|
164
|
-
return `mediaproc-${
|
|
204
|
+
return `mediaproc-${trimmed}`;
|
|
165
205
|
}
|
|
166
206
|
/**
|
|
167
207
|
* Detect plugin type from package name
|
|
208
|
+
* @param packageName - Full package name
|
|
209
|
+
* @returns Plugin type: official, community, or third-party
|
|
168
210
|
*/
|
|
169
211
|
export function detectPluginType(packageName) {
|
|
170
|
-
if (packageName
|
|
212
|
+
if (!packageName || typeof packageName !== 'string') {
|
|
213
|
+
return 'third-party';
|
|
214
|
+
}
|
|
215
|
+
const trimmed = packageName.trim();
|
|
216
|
+
if (trimmed.startsWith('@mediaproc/')) {
|
|
171
217
|
return 'official';
|
|
172
218
|
}
|
|
173
|
-
if (
|
|
219
|
+
if (trimmed.startsWith('mediaproc-')) {
|
|
174
220
|
return 'community';
|
|
175
221
|
}
|
|
176
222
|
return 'third-party';
|
|
@@ -193,10 +239,62 @@ export function getPluginsByCategory() {
|
|
|
193
239
|
}
|
|
194
240
|
return grouped;
|
|
195
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* Get all plugins (unique by package)
|
|
244
|
+
*/
|
|
245
|
+
export function getAllPlugins() {
|
|
246
|
+
const seen = new Set();
|
|
247
|
+
const plugins = [];
|
|
248
|
+
for (const entry of Object.values(PLUGIN_REGISTRY)) {
|
|
249
|
+
if (!seen.has(entry.package)) {
|
|
250
|
+
plugins.push(entry);
|
|
251
|
+
seen.add(entry.package);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return plugins;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Search plugins by keyword
|
|
258
|
+
*/
|
|
259
|
+
export function searchPlugins(keyword) {
|
|
260
|
+
const lowerKeyword = keyword.toLowerCase();
|
|
261
|
+
const seen = new Set();
|
|
262
|
+
const results = [];
|
|
263
|
+
for (const entry of Object.values(PLUGIN_REGISTRY)) {
|
|
264
|
+
if (seen.has(entry.package))
|
|
265
|
+
continue;
|
|
266
|
+
const matchesName = entry.name.toLowerCase().includes(lowerKeyword);
|
|
267
|
+
const matchesDescription = entry.description.toLowerCase().includes(lowerKeyword);
|
|
268
|
+
const matchesKeywords = entry.keywords?.some(k => k.toLowerCase().includes(lowerKeyword));
|
|
269
|
+
if (matchesName || matchesDescription || matchesKeywords) {
|
|
270
|
+
results.push(entry);
|
|
271
|
+
seen.add(entry.package);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return results;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Get plugin entry by package name
|
|
278
|
+
*/
|
|
279
|
+
export function getPluginEntry(packageName) {
|
|
280
|
+
for (const entry of Object.values(PLUGIN_REGISTRY)) {
|
|
281
|
+
if (entry.package === packageName) {
|
|
282
|
+
return entry;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return undefined;
|
|
286
|
+
}
|
|
196
287
|
/**
|
|
197
288
|
* Check if a plugin exists in registry
|
|
198
289
|
*/
|
|
199
290
|
export function isValidPlugin(name) {
|
|
200
291
|
return name.startsWith('@mediaproc/') || name.toLowerCase() in PLUGIN_REGISTRY;
|
|
201
292
|
}
|
|
202
|
-
|
|
293
|
+
/**
|
|
294
|
+
* Get plugin category
|
|
295
|
+
*/
|
|
296
|
+
export function getPluginCategory(packageName) {
|
|
297
|
+
const entry = getPluginEntry(packageName);
|
|
298
|
+
return entry?.category;
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=registry.js.map
|