@apiquest/fracture 1.0.2 → 1.0.4
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 +119 -0
- package/bin/cli.js +2 -2
- package/dist/CollectionRunner.js +3 -3
- package/dist/ScriptEngine.js +4 -4
- package/dist/cli/plugin-commands.d.ts.map +1 -1
- package/dist/cli/plugin-commands.js +2 -1
- package/dist/cli/plugin-commands.js.map +1 -1
- package/package.json +55 -50
- package/src/CollectionAnalyzer.ts +102 -102
- package/src/CollectionRunner.ts +1423 -1423
- package/src/CollectionRunner.types.ts +9 -9
- package/src/CollectionValidator.ts +289 -289
- package/src/ConsoleReporter.ts +143 -143
- package/src/CookieJar.ts +258 -258
- package/src/DagScheduler.ts +439 -439
- package/src/Logger.ts +85 -85
- package/src/PluginLoader.ts +126 -126
- package/src/PluginManager.ts +208 -208
- package/src/PluginResolver.ts +154 -154
- package/src/QuestAPI.ts +764 -764
- package/src/QuestAPI.types.ts +33 -33
- package/src/QuestTestAPI.ts +164 -164
- package/src/RequestFilter.ts +224 -224
- package/src/ScriptEngine.ts +219 -219
- package/src/ScriptValidator.ts +428 -428
- package/src/TaskGraph.ts +598 -598
- package/src/TestCounter.ts +109 -109
- package/src/VariableResolver.ts +114 -114
- package/src/cli/index.ts +480 -480
- package/src/cli/plugin-commands.ts +342 -341
- package/src/cli/plugin-discovery.ts +44 -44
- package/src/index.ts +24 -24
- package/src/utils.ts +52 -52
- package/tsconfig.json +20 -20
- package/tsconfig.test.json +5 -5
- package/vitest.config.ts +22 -22
- package/dist/ExecutionTree.d.ts +0 -77
- package/dist/ExecutionTree.d.ts.map +0 -1
- package/dist/ExecutionTree.js +0 -265
- package/dist/ExecutionTree.js.map +0 -1
- package/dist/fracture/src/CollectionAnalyzer.d.ts +0 -17
- package/dist/fracture/src/CollectionAnalyzer.d.ts.map +0 -1
- package/dist/fracture/src/CollectionAnalyzer.js +0 -70
- package/dist/fracture/src/CollectionAnalyzer.js.map +0 -1
- package/dist/fracture/src/CollectionRunner.d.ts +0 -39
- package/dist/fracture/src/CollectionRunner.d.ts.map +0 -1
- package/dist/fracture/src/CollectionRunner.js +0 -802
- package/dist/fracture/src/CollectionRunner.js.map +0 -1
- package/dist/fracture/src/CollectionRunner.types.d.ts +0 -8
- package/dist/fracture/src/CollectionRunner.types.d.ts.map +0 -1
- package/dist/fracture/src/CollectionRunner.types.js +0 -2
- package/dist/fracture/src/CollectionRunner.types.js.map +0 -1
- package/dist/fracture/src/CollectionValidator.d.ts +0 -14
- package/dist/fracture/src/CollectionValidator.d.ts.map +0 -1
- package/dist/fracture/src/CollectionValidator.js +0 -145
- package/dist/fracture/src/CollectionValidator.js.map +0 -1
- package/dist/fracture/src/ConsoleReporter.d.ts +0 -24
- package/dist/fracture/src/ConsoleReporter.d.ts.map +0 -1
- package/dist/fracture/src/ConsoleReporter.js +0 -123
- package/dist/fracture/src/ConsoleReporter.js.map +0 -1
- package/dist/fracture/src/CookieJar.d.ts +0 -70
- package/dist/fracture/src/CookieJar.d.ts.map +0 -1
- package/dist/fracture/src/CookieJar.js +0 -233
- package/dist/fracture/src/CookieJar.js.map +0 -1
- package/dist/fracture/src/ExecutionTree.d.ts +0 -77
- package/dist/fracture/src/ExecutionTree.d.ts.map +0 -1
- package/dist/fracture/src/ExecutionTree.js +0 -258
- package/dist/fracture/src/ExecutionTree.js.map +0 -1
- package/dist/fracture/src/Logger.d.ts +0 -25
- package/dist/fracture/src/Logger.d.ts.map +0 -1
- package/dist/fracture/src/Logger.js +0 -78
- package/dist/fracture/src/Logger.js.map +0 -1
- package/dist/fracture/src/PluginLoader.d.ts +0 -23
- package/dist/fracture/src/PluginLoader.d.ts.map +0 -1
- package/dist/fracture/src/PluginLoader.js +0 -102
- package/dist/fracture/src/PluginLoader.js.map +0 -1
- package/dist/fracture/src/PluginManager.d.ts +0 -64
- package/dist/fracture/src/PluginManager.d.ts.map +0 -1
- package/dist/fracture/src/PluginManager.js +0 -162
- package/dist/fracture/src/PluginManager.js.map +0 -1
- package/dist/fracture/src/PluginResolver.d.ts +0 -35
- package/dist/fracture/src/PluginResolver.d.ts.map +0 -1
- package/dist/fracture/src/PluginResolver.js +0 -128
- package/dist/fracture/src/PluginResolver.js.map +0 -1
- package/dist/fracture/src/QuestAPI.d.ts +0 -9
- package/dist/fracture/src/QuestAPI.d.ts.map +0 -1
- package/dist/fracture/src/QuestAPI.js +0 -679
- package/dist/fracture/src/QuestAPI.js.map +0 -1
- package/dist/fracture/src/QuestAPI.types.d.ts +0 -35
- package/dist/fracture/src/QuestAPI.types.d.ts.map +0 -1
- package/dist/fracture/src/QuestAPI.types.js +0 -3
- package/dist/fracture/src/QuestAPI.types.js.map +0 -1
- package/dist/fracture/src/QuestTestAPI.d.ts +0 -12
- package/dist/fracture/src/QuestTestAPI.d.ts.map +0 -1
- package/dist/fracture/src/QuestTestAPI.js +0 -133
- package/dist/fracture/src/QuestTestAPI.js.map +0 -1
- package/dist/fracture/src/ScriptEngine.d.ts +0 -21
- package/dist/fracture/src/ScriptEngine.d.ts.map +0 -1
- package/dist/fracture/src/ScriptEngine.js +0 -183
- package/dist/fracture/src/ScriptEngine.js.map +0 -1
- package/dist/fracture/src/ScriptValidator.d.ts +0 -68
- package/dist/fracture/src/ScriptValidator.d.ts.map +0 -1
- package/dist/fracture/src/ScriptValidator.js +0 -351
- package/dist/fracture/src/ScriptValidator.js.map +0 -1
- package/dist/fracture/src/TestCounter.d.ts +0 -18
- package/dist/fracture/src/TestCounter.d.ts.map +0 -1
- package/dist/fracture/src/TestCounter.js +0 -82
- package/dist/fracture/src/TestCounter.js.map +0 -1
- package/dist/fracture/src/VariableResolver.d.ts +0 -20
- package/dist/fracture/src/VariableResolver.d.ts.map +0 -1
- package/dist/fracture/src/VariableResolver.js +0 -100
- package/dist/fracture/src/VariableResolver.js.map +0 -1
- package/dist/fracture/src/cli/index.d.ts +0 -3
- package/dist/fracture/src/cli/index.d.ts.map +0 -1
- package/dist/fracture/src/cli/index.js +0 -347
- package/dist/fracture/src/cli/index.js.map +0 -1
- package/dist/fracture/src/cli/plugin-commands.d.ts +0 -6
- package/dist/fracture/src/cli/plugin-commands.d.ts.map +0 -1
- package/dist/fracture/src/cli/plugin-commands.js +0 -263
- package/dist/fracture/src/cli/plugin-commands.js.map +0 -1
- package/dist/fracture/src/cli/plugin-discovery.d.ts +0 -11
- package/dist/fracture/src/cli/plugin-discovery.d.ts.map +0 -1
- package/dist/fracture/src/cli/plugin-discovery.js +0 -64
- package/dist/fracture/src/cli/plugin-discovery.js.map +0 -1
- package/dist/fracture/src/index.d.ts +0 -13
- package/dist/fracture/src/index.d.ts.map +0 -1
- package/dist/fracture/src/index.js +0 -17
- package/dist/fracture/src/index.js.map +0 -1
- package/dist/fracture/src/utils.d.ts +0 -28
- package/dist/fracture/src/utils.d.ts.map +0 -1
- package/dist/fracture/src/utils.js +0 -48
- package/dist/fracture/src/utils.js.map +0 -1
- package/dist/plugin-auth/src/apikey-auth.d.ts +0 -3
- package/dist/plugin-auth/src/apikey-auth.d.ts.map +0 -1
- package/dist/plugin-auth/src/apikey-auth.js +0 -73
- package/dist/plugin-auth/src/apikey-auth.js.map +0 -1
- package/dist/plugin-auth/src/basic-auth.d.ts +0 -3
- package/dist/plugin-auth/src/basic-auth.d.ts.map +0 -1
- package/dist/plugin-auth/src/basic-auth.js +0 -61
- package/dist/plugin-auth/src/basic-auth.js.map +0 -1
- package/dist/plugin-auth/src/bearer-auth.d.ts +0 -3
- package/dist/plugin-auth/src/bearer-auth.d.ts.map +0 -1
- package/dist/plugin-auth/src/bearer-auth.js +0 -49
- package/dist/plugin-auth/src/bearer-auth.js.map +0 -1
- package/dist/plugin-auth/src/helpers.d.ts +0 -3
- package/dist/plugin-auth/src/helpers.d.ts.map +0 -1
- package/dist/plugin-auth/src/helpers.js +0 -8
- package/dist/plugin-auth/src/helpers.js.map +0 -1
- package/dist/plugin-auth/src/index.d.ts +0 -10
- package/dist/plugin-auth/src/index.d.ts.map +0 -1
- package/dist/plugin-auth/src/index.js +0 -25
- package/dist/plugin-auth/src/index.js.map +0 -1
- package/dist/plugin-auth/src/oauth2-auth.d.ts +0 -35
- package/dist/plugin-auth/src/oauth2-auth.d.ts.map +0 -1
- package/dist/plugin-auth/src/oauth2-auth.js +0 -266
- package/dist/plugin-auth/src/oauth2-auth.js.map +0 -1
- package/dist/plugin-http/src/index.d.ts +0 -4
- package/dist/plugin-http/src/index.d.ts.map +0 -1
- package/dist/plugin-http/src/index.js +0 -266
- package/dist/plugin-http/src/index.js.map +0 -1
- package/dist/plugin-vault-file/src/index.d.ts +0 -67
- package/dist/plugin-vault-file/src/index.d.ts.map +0 -1
- package/dist/plugin-vault-file/src/index.js +0 -171
- package/dist/plugin-vault-file/src/index.js.map +0 -1
- package/dist/types.d.ts +0 -374
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -13
- package/dist/types.js.map +0 -1
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { LogLevel } from '@apiquest/types';
|
|
2
|
-
/**
|
|
3
|
-
* Logger implementation for Fracture
|
|
4
|
-
*
|
|
5
|
-
* Emits 'console' events for desktop integration and provides
|
|
6
|
-
* standard logging methods (error, warn, info, debug, trace).
|
|
7
|
-
*
|
|
8
|
-
* Desktop ConsolePanel listens to these events to display logs.
|
|
9
|
-
* CLI ConsoleReporter subscribes to these events to output to terminal.
|
|
10
|
-
*/
|
|
11
|
-
export class Logger {
|
|
12
|
-
level;
|
|
13
|
-
component;
|
|
14
|
-
emitter;
|
|
15
|
-
constructor(component, level = LogLevel.INFO, emitter) {
|
|
16
|
-
this.component = component;
|
|
17
|
-
this.level = level;
|
|
18
|
-
this.emitter = emitter;
|
|
19
|
-
}
|
|
20
|
-
setLevel(level) {
|
|
21
|
-
this.level = level;
|
|
22
|
-
}
|
|
23
|
-
error(message, ...args) {
|
|
24
|
-
this.log(LogLevel.ERROR, message, ...args);
|
|
25
|
-
}
|
|
26
|
-
warn(message, ...args) {
|
|
27
|
-
this.log(LogLevel.WARN, message, ...args);
|
|
28
|
-
}
|
|
29
|
-
info(message, ...args) {
|
|
30
|
-
this.log(LogLevel.INFO, message, ...args);
|
|
31
|
-
}
|
|
32
|
-
debug(message, ...args) {
|
|
33
|
-
this.log(LogLevel.DEBUG, message, ...args);
|
|
34
|
-
}
|
|
35
|
-
trace(message, ...args) {
|
|
36
|
-
this.log(LogLevel.TRACE, message, ...args);
|
|
37
|
-
}
|
|
38
|
-
log(level, message, ...args) {
|
|
39
|
-
// Skip if log level is more verbose than our threshold
|
|
40
|
-
// Lower number = less verbose (ERROR=0, WARN=1, INFO=2, DEBUG=3, TRACE=4)
|
|
41
|
-
if (level > this.level)
|
|
42
|
-
return;
|
|
43
|
-
const levelNames = ['error', 'warn', 'info', 'debug', 'trace'];
|
|
44
|
-
const levelName = levelNames[level];
|
|
45
|
-
const prefix = `[${this.component}]`;
|
|
46
|
-
const fullMessage = `${prefix} ${message}`;
|
|
47
|
-
// Format arguments
|
|
48
|
-
const formattedArgs = args.length > 0
|
|
49
|
-
? ' ' + args.map(a => {
|
|
50
|
-
if (a instanceof Error) {
|
|
51
|
-
return a.message;
|
|
52
|
-
}
|
|
53
|
-
if (typeof a === 'object' && a !== null) {
|
|
54
|
-
try {
|
|
55
|
-
return JSON.stringify(a);
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
return String(a);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return String(a);
|
|
62
|
-
}).join(' ')
|
|
63
|
-
: '';
|
|
64
|
-
const finalMessage = fullMessage + formattedArgs;
|
|
65
|
-
// Emit event for desktop integration
|
|
66
|
-
if (this.emitter !== null && this.emitter !== undefined) {
|
|
67
|
-
this.emitter.emit('console', {
|
|
68
|
-
level, // Emit LogLevel enum value
|
|
69
|
-
levelName, // Also emit string name for convenience
|
|
70
|
-
component: this.component,
|
|
71
|
-
message: finalMessage,
|
|
72
|
-
args,
|
|
73
|
-
timestamp: new Date().toISOString()
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=Logger.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../../src/Logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { ILogger } from '@apiquest/types';
|
|
2
|
-
import { PluginManager } from './PluginManager.js';
|
|
3
|
-
import type { ResolvedPlugin } from './PluginResolver.js';
|
|
4
|
-
import type { PluginRequirements } from './CollectionAnalyzer.js';
|
|
5
|
-
export declare class PluginLoader {
|
|
6
|
-
private logger;
|
|
7
|
-
private pluginManager;
|
|
8
|
-
private loadedPlugins;
|
|
9
|
-
constructor(pluginManager: PluginManager, logger?: ILogger);
|
|
10
|
-
/**
|
|
11
|
-
* Load only plugins needed by the collection
|
|
12
|
-
*/
|
|
13
|
-
loadRequiredPlugins(resolved: ResolvedPlugin[], requirements: PluginRequirements): Promise<void>;
|
|
14
|
-
/**
|
|
15
|
-
* Filter resolved plugins to only those needed by collection
|
|
16
|
-
*/
|
|
17
|
-
private filterNeededPlugins;
|
|
18
|
-
/**
|
|
19
|
-
* Dynamically import and register a single plugin
|
|
20
|
-
*/
|
|
21
|
-
private loadPlugin;
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=PluginLoader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PluginLoader.d.ts","sourceRoot":"","sources":["../../../src/PluginLoader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAsD,MAAM,iBAAiB,CAAC;AAGnG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGlE,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAA0B;gBAEnC,aAAa,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,OAAO;IAK1D;;OAEG;IACG,mBAAmB,CACvB,QAAQ,EAAE,cAAc,EAAE,EAC1B,YAAY,EAAE,kBAAkB,GAC/B,OAAO,CAAC,IAAI,CAAC;IAiBhB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoC3B;;OAEG;YACW,UAAU;CA4CzB"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
// Plugin Loader - Phase 2: Selectively loads ONLY plugins needed by collection
|
|
2
|
-
// Works with ResolvedPlugin[] from PluginResolver (Phase 1)
|
|
3
|
-
import { LogLevel } from '@apiquest/types';
|
|
4
|
-
import { Logger } from './Logger.js';
|
|
5
|
-
export class PluginLoader {
|
|
6
|
-
logger;
|
|
7
|
-
pluginManager;
|
|
8
|
-
loadedPlugins = new Set();
|
|
9
|
-
constructor(pluginManager, logger) {
|
|
10
|
-
this.pluginManager = pluginManager;
|
|
11
|
-
this.logger = logger instanceof Logger ? logger : new Logger('PluginLoader', LogLevel.INFO);
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Load only plugins needed by the collection
|
|
15
|
-
*/
|
|
16
|
-
async loadRequiredPlugins(resolved, requirements) {
|
|
17
|
-
const needed = this.filterNeededPlugins(resolved, requirements);
|
|
18
|
-
this.logger.info(`Loading ${needed.length} required plugins (${resolved.length} available)`);
|
|
19
|
-
const loadPromises = needed.map(plugin => this.loadPlugin(plugin).catch(err => {
|
|
20
|
-
this.logger.error(`Failed to load ${plugin.name}:`, err);
|
|
21
|
-
// Re-throw to fail execution
|
|
22
|
-
throw err;
|
|
23
|
-
}));
|
|
24
|
-
await Promise.all(loadPromises);
|
|
25
|
-
this.logger.debug('Required plugins loaded');
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Filter resolved plugins to only those needed by collection
|
|
29
|
-
*/
|
|
30
|
-
filterNeededPlugins(resolved, requirements) {
|
|
31
|
-
const needed = [];
|
|
32
|
-
for (const plugin of resolved) {
|
|
33
|
-
let isNeeded = false;
|
|
34
|
-
if (plugin.type === 'protocol') {
|
|
35
|
-
// Check if collection uses this protocol
|
|
36
|
-
if (plugin.protocols?.some(p => requirements.protocols.has(p)) === true) {
|
|
37
|
-
isNeeded = true;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
else if (plugin.type === 'auth') {
|
|
41
|
-
// Check if collection uses any of these auth types
|
|
42
|
-
if (plugin.authTypes?.some(a => requirements.authTypes.has(a)) === true) {
|
|
43
|
-
isNeeded = true;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
else if (plugin.type === 'value') {
|
|
47
|
-
// Check if collection uses this value provider
|
|
48
|
-
const provider = plugin.provider;
|
|
49
|
-
if (provider !== null && provider !== undefined && provider !== '' && requirements.valueProviders.has(provider)) {
|
|
50
|
-
isNeeded = true;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
if (isNeeded) {
|
|
54
|
-
this.logger.debug(`Plugin needed: ${plugin.name} v${plugin.version} (${plugin.type})`);
|
|
55
|
-
needed.push(plugin);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return needed;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Dynamically import and register a single plugin
|
|
62
|
-
*/
|
|
63
|
-
async loadPlugin(plugin) {
|
|
64
|
-
const { pathToFileURL } = await import('url');
|
|
65
|
-
// Skip if already loaded
|
|
66
|
-
if (this.loadedPlugins.has(plugin.name)) {
|
|
67
|
-
this.logger.debug(`Already loaded: ${plugin.name}`);
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
this.logger.debug(`Loading ${plugin.name} v${plugin.version} from ${plugin.path}`);
|
|
71
|
-
// Mark as loaded
|
|
72
|
-
this.loadedPlugins.add(plugin.name);
|
|
73
|
-
// Convert to file:// URL for Windows compatibility
|
|
74
|
-
const moduleUrl = pathToFileURL(plugin.entryPoint).href;
|
|
75
|
-
const pluginModule = await import(moduleUrl);
|
|
76
|
-
// Handle different export patterns
|
|
77
|
-
const defaultExport = pluginModule.default;
|
|
78
|
-
const namedExport = pluginModule[Object.keys(pluginModule)[0]];
|
|
79
|
-
const exported = defaultExport ?? namedExport;
|
|
80
|
-
if (exported === null || exported === undefined) {
|
|
81
|
-
throw new Error(`Plugin ${plugin.name} has no exports`);
|
|
82
|
-
}
|
|
83
|
-
// Register based on plugin type
|
|
84
|
-
if (plugin.type === 'protocol') {
|
|
85
|
-
this.pluginManager.registerPlugin(exported);
|
|
86
|
-
this.logger.debug(`Registered protocol plugin: ${plugin.protocols?.join(', ') ?? ''}`);
|
|
87
|
-
}
|
|
88
|
-
else if (plugin.type === 'auth') {
|
|
89
|
-
// Auth plugins might export array or single
|
|
90
|
-
const authArray = Array.isArray(exported) ? exported : [exported];
|
|
91
|
-
for (const authPlugin of authArray) {
|
|
92
|
-
this.pluginManager.registerAuthPlugin(authPlugin);
|
|
93
|
-
this.logger.debug(`Registered auth plugin: ${authPlugin.authTypes.join(', ')}`);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
else if (plugin.type === 'value') {
|
|
97
|
-
this.pluginManager.registerVariableProvider(exported);
|
|
98
|
-
this.logger.debug(`Registered value provider: ${plugin.provider ?? ''}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=PluginLoader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PluginLoader.js","sourceRoot":"","sources":["../../../src/PluginLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import type { IProtocolPlugin, IAuthPlugin, IValueProviderPlugin, Request, ExecutionContext, ProtocolResponse, RuntimeOptions } from '@apiquest/types';
|
|
2
|
-
import { LogLevel } from '@apiquest/types';
|
|
3
|
-
import { EventEmitter } from 'events';
|
|
4
|
-
export declare class PluginManager {
|
|
5
|
-
private plugins;
|
|
6
|
-
private authPlugins;
|
|
7
|
-
private variableProviders;
|
|
8
|
-
private logger;
|
|
9
|
-
private emitter?;
|
|
10
|
-
constructor(emitter?: EventEmitter, logLevel?: LogLevel);
|
|
11
|
-
setLogLevel(level: LogLevel): void;
|
|
12
|
-
/**
|
|
13
|
-
* Register a protocol plugin
|
|
14
|
-
*/
|
|
15
|
-
registerPlugin(plugin: IProtocolPlugin): void;
|
|
16
|
-
/**
|
|
17
|
-
* Register an auth plugin
|
|
18
|
-
*/
|
|
19
|
-
registerAuthPlugin(plugin: IAuthPlugin): void;
|
|
20
|
-
/**
|
|
21
|
-
* Register a variable provider plugin
|
|
22
|
-
*/
|
|
23
|
-
registerVariableProvider(plugin: IValueProviderPlugin): void;
|
|
24
|
-
/**
|
|
25
|
-
* Get plugin for a protocol
|
|
26
|
-
*/
|
|
27
|
-
getPlugin(protocol: string): IProtocolPlugin | undefined;
|
|
28
|
-
/**
|
|
29
|
-
* Get auth plugin for a type
|
|
30
|
-
*/
|
|
31
|
-
getAuthPlugin(type: string): IAuthPlugin | undefined;
|
|
32
|
-
/**
|
|
33
|
-
* Apply auth to request if auth is configured
|
|
34
|
-
*/
|
|
35
|
-
private applyAuth;
|
|
36
|
-
/**
|
|
37
|
-
* Execute request using appropriate plugin
|
|
38
|
-
* @param protocol - Protocol name from collection.protocol
|
|
39
|
-
* @param emitEvent - Optional callback for plugin events (e.g., WebSocket onMessage)
|
|
40
|
-
*/
|
|
41
|
-
execute(protocol: string, request: Request, context: ExecutionContext, options: RuntimeOptions, emitEvent?: (eventName: string, eventData: unknown) => Promise<void>): Promise<ProtocolResponse>;
|
|
42
|
-
/**
|
|
43
|
-
* Get all registered plugins
|
|
44
|
-
*/
|
|
45
|
-
getAllPlugins(): IProtocolPlugin[];
|
|
46
|
-
/**
|
|
47
|
-
* Get all registered auth plugins
|
|
48
|
-
*/
|
|
49
|
-
getAllAuthPlugins(): IAuthPlugin[];
|
|
50
|
-
/**
|
|
51
|
-
* Get variable provider plugin
|
|
52
|
-
*/
|
|
53
|
-
getVariableProvider(provider: string): IValueProviderPlugin | undefined;
|
|
54
|
-
/**
|
|
55
|
-
* Get all registered variable providers
|
|
56
|
-
*/
|
|
57
|
-
getAllVariableProviders(): IValueProviderPlugin[];
|
|
58
|
-
/**
|
|
59
|
-
* Resolve variable value using provider plugin
|
|
60
|
-
* Called when a variable has a provider specified
|
|
61
|
-
*/
|
|
62
|
-
resolveVariableProvider(provider: string, key: string, config?: Record<string, unknown>, context?: ExecutionContext): Promise<string | null>;
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=PluginManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PluginManager.d.ts","sourceRoot":"","sources":["../../../src/PluginManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAiB,MAAM,iBAAiB,CAAC;AACtK,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,WAAW,CAAuC;IAC1D,OAAO,CAAC,iBAAiB,CAAgD;IACzE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAe;gBAEnB,OAAO,CAAC,EAAE,YAAY,EAAE,QAAQ,GAAE,QAAwB;IAKtE,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAIlC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAQ7C;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAQ7C;;OAEG;IACH,wBAAwB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAK5D;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIxD;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIpD;;OAEG;YACW,SAAS;IAuBvB;;;;OAIG;IACG,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,cAAc,EACvB,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GACnE,OAAO,CAAC,gBAAgB,CAAC;IA+C5B;;OAEG;IACH,aAAa,IAAI,eAAe,EAAE;IAIlC;;OAEG;IACH,iBAAiB,IAAI,WAAW,EAAE;IAIlC;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAIvE;;OAEG;IACH,uBAAuB,IAAI,oBAAoB,EAAE;IAIjD;;;OAGG;IACG,uBAAuB,CAC3B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAc1B"}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
// Plugin Manager - Manages protocol, auth, and variable provider plugins
|
|
2
|
-
import { LogLevel } from '@apiquest/types';
|
|
3
|
-
import { Logger } from './Logger.js';
|
|
4
|
-
export class PluginManager {
|
|
5
|
-
plugins = new Map();
|
|
6
|
-
authPlugins = new Map();
|
|
7
|
-
variableProviders = new Map();
|
|
8
|
-
logger;
|
|
9
|
-
emitter;
|
|
10
|
-
constructor(emitter, logLevel = LogLevel.INFO) {
|
|
11
|
-
this.emitter = emitter;
|
|
12
|
-
this.logger = new Logger('PluginManager', logLevel, emitter);
|
|
13
|
-
}
|
|
14
|
-
setLogLevel(level) {
|
|
15
|
-
this.logger.setLevel(level);
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Register a protocol plugin
|
|
19
|
-
*/
|
|
20
|
-
registerPlugin(plugin) {
|
|
21
|
-
// Register plugin for each protocol it provides
|
|
22
|
-
for (const protocol of plugin.protocols) {
|
|
23
|
-
this.plugins.set(protocol, plugin);
|
|
24
|
-
this.logger.debug(`Registered protocol plugin: ${plugin.name} for protocol '${protocol}'`);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Register an auth plugin
|
|
29
|
-
*/
|
|
30
|
-
registerAuthPlugin(plugin) {
|
|
31
|
-
// Register plugin for each auth type it provides
|
|
32
|
-
for (const authType of plugin.authTypes) {
|
|
33
|
-
this.authPlugins.set(authType, plugin);
|
|
34
|
-
this.logger.debug(`Registered auth plugin: ${plugin.name} for type '${authType}'`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Register a variable provider plugin
|
|
39
|
-
*/
|
|
40
|
-
registerVariableProvider(plugin) {
|
|
41
|
-
this.variableProviders.set(plugin.provider, plugin);
|
|
42
|
-
this.logger.debug(`Registered vault provider: ${plugin.name} (${plugin.provider})`);
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Get plugin for a protocol
|
|
46
|
-
*/
|
|
47
|
-
getPlugin(protocol) {
|
|
48
|
-
return this.plugins.get(protocol);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Get auth plugin for a type
|
|
52
|
-
*/
|
|
53
|
-
getAuthPlugin(type) {
|
|
54
|
-
return this.authPlugins.get(type);
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Apply auth to request if auth is configured
|
|
58
|
-
*/
|
|
59
|
-
async applyAuth(request, auth, options) {
|
|
60
|
-
if (auth.type === 'none' || auth.type === 'inherit') {
|
|
61
|
-
return request;
|
|
62
|
-
}
|
|
63
|
-
const authPlugin = this.authPlugins.get(auth.type);
|
|
64
|
-
if (authPlugin === null || authPlugin === undefined) {
|
|
65
|
-
this.logger.error(`No auth plugin registered for type: ${auth.type}`);
|
|
66
|
-
throw new Error(`No auth plugin registered for type: ${auth.type}`);
|
|
67
|
-
}
|
|
68
|
-
this.logger.debug(`Applying auth: ${auth.type} (plugin: ${authPlugin.name})`);
|
|
69
|
-
try {
|
|
70
|
-
const pluginLogger = new Logger(`Auth:${authPlugin.name}`, this.logger['level'], this.emitter);
|
|
71
|
-
return await authPlugin.apply(request, auth, options, pluginLogger);
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
const errorMsg = error.message ?? 'Unknown error';
|
|
75
|
-
this.logger.error(`Auth plugin error (${auth.type}): ${errorMsg}`);
|
|
76
|
-
throw new Error(`Auth plugin error (${auth.type}): ${errorMsg}`);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Execute request using appropriate plugin
|
|
81
|
-
* @param protocol - Protocol name from collection.protocol
|
|
82
|
-
* @param emitEvent - Optional callback for plugin events (e.g., WebSocket onMessage)
|
|
83
|
-
*/
|
|
84
|
-
async execute(protocol, request, context, options, emitEvent) {
|
|
85
|
-
const plugin = this.plugins.get(protocol);
|
|
86
|
-
if (plugin === null || plugin === undefined) {
|
|
87
|
-
this.logger.error(`No plugin registered for protocol: ${protocol}`);
|
|
88
|
-
throw new Error(`No plugin registered for protocol: ${protocol}`);
|
|
89
|
-
}
|
|
90
|
-
this.logger.debug(`Executing request using ${protocol} plugin: ${plugin.name}`);
|
|
91
|
-
// Validate auth compatibility with protocol
|
|
92
|
-
if (request.auth !== null && request.auth !== undefined && request.auth.type !== 'none' && request.auth.type !== 'inherit') {
|
|
93
|
-
if (!plugin.supportedAuthTypes.includes(request.auth.type)) {
|
|
94
|
-
this.logger.error(`Protocol '${protocol}' does not support auth type '${request.auth.type}'`);
|
|
95
|
-
throw new Error(`Protocol '${protocol}' does not support auth type '${request.auth.type}'. ` +
|
|
96
|
-
`Supported types: ${plugin.supportedAuthTypes.join(', ')}`);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
// Apply auth if configured (should already be resolved)
|
|
100
|
-
let modifiedRequest = request;
|
|
101
|
-
if (request.auth !== null && request.auth !== undefined) {
|
|
102
|
-
modifiedRequest = await this.applyAuth(modifiedRequest, request.auth, options);
|
|
103
|
-
}
|
|
104
|
-
// Validate request
|
|
105
|
-
this.logger.trace('Validating request with plugin');
|
|
106
|
-
const validation = plugin.validate(modifiedRequest, options);
|
|
107
|
-
if (validation.valid === false) {
|
|
108
|
-
const errorMessages = validation.errors?.map(e => e.message).join(', ') ?? 'Unknown error';
|
|
109
|
-
this.logger.error(`Request validation failed: ${errorMessages}`);
|
|
110
|
-
throw new Error(`Request validation failed: ${errorMessages}`);
|
|
111
|
-
}
|
|
112
|
-
// Execute plugin with merged runtime options, event emitter, and logger
|
|
113
|
-
const pluginLogger = new Logger(`Protocol:${plugin.name}`, this.logger['level'], this.emitter);
|
|
114
|
-
const startTime = Date.now();
|
|
115
|
-
const response = await plugin.execute(modifiedRequest, context, options, emitEvent, pluginLogger);
|
|
116
|
-
const duration = Date.now() - startTime;
|
|
117
|
-
this.logger.debug(`Plugin execution completed in ${duration}ms (status: ${response.status})`);
|
|
118
|
-
return response;
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Get all registered plugins
|
|
122
|
-
*/
|
|
123
|
-
getAllPlugins() {
|
|
124
|
-
return Array.from(this.plugins.values());
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Get all registered auth plugins
|
|
128
|
-
*/
|
|
129
|
-
getAllAuthPlugins() {
|
|
130
|
-
return Array.from(this.authPlugins.values());
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Get variable provider plugin
|
|
134
|
-
*/
|
|
135
|
-
getVariableProvider(provider) {
|
|
136
|
-
return this.variableProviders.get(provider);
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Get all registered variable providers
|
|
140
|
-
*/
|
|
141
|
-
getAllVariableProviders() {
|
|
142
|
-
return Array.from(this.variableProviders.values());
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Resolve variable value using provider plugin
|
|
146
|
-
* Called when a variable has a provider specified
|
|
147
|
-
*/
|
|
148
|
-
async resolveVariableProvider(provider, key, config, context) {
|
|
149
|
-
const providerPlugin = this.variableProviders.get(provider);
|
|
150
|
-
if (providerPlugin === null || providerPlugin === undefined) {
|
|
151
|
-
throw new Error(`No variable provider plugin registered for: ${provider}`);
|
|
152
|
-
}
|
|
153
|
-
try {
|
|
154
|
-
return await providerPlugin.getValue(key, config, context);
|
|
155
|
-
}
|
|
156
|
-
catch (error) {
|
|
157
|
-
const errorMsg = error.message ?? 'Unknown error';
|
|
158
|
-
throw new Error(`Variable provider error (${provider}): ${errorMsg}`);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
//# sourceMappingURL=PluginManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PluginManager.js","sourceRoot":"","sources":["../../../src/PluginManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { ILogger } from '@apiquest/types';
|
|
2
|
-
export interface ResolvedPlugin {
|
|
3
|
-
name: string;
|
|
4
|
-
version: string;
|
|
5
|
-
type: 'protocol' | 'auth' | 'value';
|
|
6
|
-
path: string;
|
|
7
|
-
entryPoint: string;
|
|
8
|
-
protocols?: string[];
|
|
9
|
-
authTypes?: string[];
|
|
10
|
-
provider?: string;
|
|
11
|
-
}
|
|
12
|
-
export declare class PluginResolver {
|
|
13
|
-
private logger;
|
|
14
|
-
private resolved;
|
|
15
|
-
constructor(logger?: ILogger);
|
|
16
|
-
/**
|
|
17
|
-
* Scan multiple directories and resolve all available plugins
|
|
18
|
-
* This is fast - just file I/O, no module loading
|
|
19
|
-
*/
|
|
20
|
-
scanDirectories(dirs: string[]): Promise<ResolvedPlugin[]>;
|
|
21
|
-
/**
|
|
22
|
-
* Scan single directory for plugins
|
|
23
|
-
*/
|
|
24
|
-
private scanDirectory;
|
|
25
|
-
/**
|
|
26
|
-
* Resolve a single plugin - read metadata but don't load module
|
|
27
|
-
*/
|
|
28
|
-
private resolvePlugin;
|
|
29
|
-
/**
|
|
30
|
-
* Compare semantic versions
|
|
31
|
-
* Returns: 1 if a > b, -1 if a < b, 0 if equal
|
|
32
|
-
*/
|
|
33
|
-
private compareVersions;
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=PluginResolver.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PluginResolver.d.ts","sourceRoot":"","sources":["../../../src/PluginResolver.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,iBAAiB,CAAC;AAIlE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAA0C;gBAE9C,MAAM,CAAC,EAAE,OAAO;IAI5B;;;OAGG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAahE;;OAEG;YACW,aAAa;IA2B3B;;OAEG;YACW,aAAa;IAgE3B;;;OAGG;IACH,OAAO,CAAC,eAAe;CAcxB"}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
// Plugin Resolver - Discovers and resolves plugin metadata WITHOUT loading modules
|
|
2
|
-
// This is Phase 1: Fast directory scanning and version resolution
|
|
3
|
-
// Phase 2 (selective loading) happens in PluginLoader based on collection requirements
|
|
4
|
-
import { LogLevel } from '@apiquest/types';
|
|
5
|
-
import { Logger } from './Logger.js';
|
|
6
|
-
export class PluginResolver {
|
|
7
|
-
logger;
|
|
8
|
-
resolved = new Map();
|
|
9
|
-
constructor(logger) {
|
|
10
|
-
this.logger = logger instanceof Logger ? logger : new Logger('PluginResolver', LogLevel.INFO);
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Scan multiple directories and resolve all available plugins
|
|
14
|
-
* This is fast - just file I/O, no module loading
|
|
15
|
-
*/
|
|
16
|
-
async scanDirectories(dirs) {
|
|
17
|
-
const scanPromises = dirs.map(dir => this.scanDirectory(dir).catch(err => {
|
|
18
|
-
// Plugin scanning failed
|
|
19
|
-
this.logger.error('Plugin scanning failed:', err);
|
|
20
|
-
}));
|
|
21
|
-
await Promise.all(scanPromises);
|
|
22
|
-
return Array.from(this.resolved.values());
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Scan single directory for plugins
|
|
26
|
-
*/
|
|
27
|
-
async scanDirectory(pluginsDir) {
|
|
28
|
-
const { readdir, readFile, access } = await import('fs/promises');
|
|
29
|
-
const path = await import('path');
|
|
30
|
-
this.logger.debug(`Scanning plugins: ${pluginsDir}`);
|
|
31
|
-
// Check if directory exists
|
|
32
|
-
try {
|
|
33
|
-
await access(pluginsDir);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
this.logger.debug(`Plugins directory does not exist: ${pluginsDir}`);
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
const entries = await readdir(pluginsDir, { withFileTypes: true });
|
|
40
|
-
for (const entry of entries) {
|
|
41
|
-
// Only process plugin-* directories
|
|
42
|
-
if (!entry.isDirectory() || !entry.name.startsWith('plugin-')) {
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
const pluginPath = path.join(pluginsDir, entry.name);
|
|
46
|
-
await this.resolvePlugin(pluginPath);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Resolve a single plugin - read metadata but don't load module
|
|
51
|
-
*/
|
|
52
|
-
async resolvePlugin(pluginPath) {
|
|
53
|
-
const { readFile } = await import('fs/promises');
|
|
54
|
-
const path = await import('path');
|
|
55
|
-
const packageJsonPath = path.join(pluginPath, 'package.json');
|
|
56
|
-
try {
|
|
57
|
-
// Read package.json
|
|
58
|
-
const pkgContent = await readFile(packageJsonPath, 'utf-8');
|
|
59
|
-
const pkg = JSON.parse(pkgContent);
|
|
60
|
-
// Check if plugin is for fracture runtime
|
|
61
|
-
const runtime = pkg.apiquest?.runtime;
|
|
62
|
-
const runtimeArray = Array.isArray(runtime) ? runtime : [runtime];
|
|
63
|
-
if (pkg.apiquest === null || pkg.apiquest === undefined || !runtimeArray.includes('fracture')) {
|
|
64
|
-
this.logger.debug(`Skipping ${pkg.name} (runtime: ${runtime ?? 'undefined'})`);
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
// Extract metadata from package.json
|
|
68
|
-
const type = pkg.apiquest.type;
|
|
69
|
-
if (!['protocol', 'auth', 'value'].includes(type)) {
|
|
70
|
-
this.logger.warn(`Unknown plugin type: ${type} (${pkg.name})`);
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
// Resolve entry point
|
|
74
|
-
const entryPoint = pkg.main ?? 'dist/index.js';
|
|
75
|
-
const fullEntryPath = path.join(pluginPath, entryPoint);
|
|
76
|
-
// Extract capabilities from apiquest.capabilities.provides
|
|
77
|
-
const provides = pkg.apiquest.capabilities?.provides ?? {};
|
|
78
|
-
// Create resolved plugin info
|
|
79
|
-
const resolved = {
|
|
80
|
-
name: pkg.name,
|
|
81
|
-
version: pkg.version,
|
|
82
|
-
type: type,
|
|
83
|
-
path: pluginPath,
|
|
84
|
-
entryPoint: fullEntryPath,
|
|
85
|
-
protocols: provides.protocols,
|
|
86
|
-
authTypes: provides.authTypes,
|
|
87
|
-
provider: provides.provider,
|
|
88
|
-
};
|
|
89
|
-
// Check for version conflicts
|
|
90
|
-
const existing = this.resolved.get(pkg.name);
|
|
91
|
-
if (existing !== null && existing !== undefined) {
|
|
92
|
-
if (this.compareVersions(pkg.version, existing.version) > 0) {
|
|
93
|
-
this.logger.debug(`Upgrading ${pkg.name} from v${existing.version} to v${pkg.version}`);
|
|
94
|
-
this.resolved.set(pkg.name, resolved);
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
this.logger.debug(`Skipping ${pkg.name} v${pkg.version} (v${existing.version} already resolved)`);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
this.logger.debug(`Resolved ${pkg.name} v${pkg.version} (${type})`);
|
|
102
|
-
this.resolved.set(pkg.name, resolved);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
107
|
-
this.logger.error(`Failed to resolve plugin at ${pluginPath}:`, errorMsg);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Compare semantic versions
|
|
112
|
-
* Returns: 1 if a > b, -1 if a < b, 0 if equal
|
|
113
|
-
*/
|
|
114
|
-
compareVersions(a, b) {
|
|
115
|
-
const aParts = a.split('.').map(Number);
|
|
116
|
-
const bParts = b.split('.').map(Number);
|
|
117
|
-
for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
|
|
118
|
-
const aNum = aParts[i] ?? 0;
|
|
119
|
-
const bNum = bParts[i] ?? 0;
|
|
120
|
-
if (aNum > bNum)
|
|
121
|
-
return 1;
|
|
122
|
-
if (aNum < bNum)
|
|
123
|
-
return -1;
|
|
124
|
-
}
|
|
125
|
-
return 0;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
//# sourceMappingURL=PluginResolver.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PluginResolver.js","sourceRoot":"","sources":["../../../src/PluginResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { ExecutionContext, TestResult } from '@apiquest/types';
|
|
2
|
-
import { ScriptType } from '@apiquest/types';
|
|
3
|
-
/**
|
|
4
|
-
* Creates the complete quest API object
|
|
5
|
-
* Returns all quest.* methods and properties for script execution
|
|
6
|
-
*/
|
|
7
|
-
export declare function createQuestAPI(context: ExecutionContext, scriptType: ScriptType, tests: TestResult[], // Array to collect test results
|
|
8
|
-
emitAssertion: (test: TestResult) => void): Record<string, unknown>;
|
|
9
|
-
//# sourceMappingURL=QuestAPI.d.ts.map
|