@apiquest/fracture 1.0.4 → 1.0.6
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 +90 -2
- package/dist/CollectionRunner.d.ts +3 -0
- package/dist/CollectionRunner.d.ts.map +1 -1
- package/dist/CollectionRunner.js +249 -154
- package/dist/CollectionRunner.js.map +1 -1
- package/dist/CollectionValidator.d.ts.map +1 -1
- package/dist/CollectionValidator.js +11 -0
- package/dist/CollectionValidator.js.map +1 -1
- package/dist/ConsoleReporter.d.ts.map +1 -1
- package/dist/ConsoleReporter.js +9 -6
- package/dist/ConsoleReporter.js.map +1 -1
- package/dist/DagScheduler.d.ts.map +1 -1
- package/dist/DagScheduler.js +11 -0
- package/dist/DagScheduler.js.map +1 -1
- package/dist/LibraryLoader.d.ts +49 -0
- package/dist/LibraryLoader.d.ts.map +1 -0
- package/dist/LibraryLoader.js +198 -0
- package/dist/LibraryLoader.js.map +1 -0
- package/dist/PluginLoader.d.ts.map +1 -1
- package/dist/PluginLoader.js +9 -6
- package/dist/PluginLoader.js.map +1 -1
- package/dist/PluginManager.d.ts.map +1 -1
- package/dist/PluginManager.js +11 -7
- package/dist/PluginManager.js.map +1 -1
- package/dist/PluginResolver.d.ts +1 -1
- package/dist/PluginResolver.d.ts.map +1 -1
- package/dist/PluginResolver.js +1 -1
- package/dist/PluginResolver.js.map +1 -1
- package/dist/QuestAPI.d.ts.map +1 -1
- package/dist/QuestAPI.js +114 -217
- package/dist/QuestAPI.js.map +1 -1
- package/dist/ScriptEngine.d.ts +2 -1
- package/dist/ScriptEngine.d.ts.map +1 -1
- package/dist/ScriptEngine.js +15 -8
- package/dist/ScriptEngine.js.map +1 -1
- package/dist/TaskGraph.d.ts +2 -1
- package/dist/TaskGraph.d.ts.map +1 -1
- package/dist/TaskGraph.js +28 -26
- package/dist/TaskGraph.js.map +1 -1
- package/dist/VariableResolver.d.ts +1 -1
- package/dist/VariableResolver.js +10 -10
- package/dist/VariableResolver.js.map +1 -1
- package/dist/cli/index.js +35 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/plugin-commands.d.ts.map +1 -1
- package/dist/cli/plugin-commands.js +47 -81
- package/dist/cli/plugin-commands.js.map +1 -1
- package/dist/cli/plugin-installer.d.ts +48 -0
- package/dist/cli/plugin-installer.d.ts.map +1 -0
- package/dist/cli/plugin-installer.js +136 -0
- package/dist/cli/plugin-installer.js.map +1 -0
- package/dist/cli/plugin-registry.d.ts +17 -0
- package/dist/cli/plugin-registry.d.ts.map +1 -0
- package/dist/cli/plugin-registry.js +77 -0
- package/dist/cli/plugin-registry.js.map +1 -0
- package/package.json +1 -1
- package/tsconfig.json +1 -0
- package/tsconfig.test.json +3 -0
- package/dist/QuestAPI.types.d.ts +0 -35
- package/dist/QuestAPI.types.d.ts.map +0 -1
- package/dist/QuestAPI.types.js +0 -3
- package/dist/QuestAPI.types.js.map +0 -1
- package/src/CollectionAnalyzer.ts +0 -102
- package/src/CollectionRunner.ts +0 -1423
- package/src/CollectionRunner.types.ts +0 -9
- package/src/CollectionValidator.ts +0 -289
- package/src/ConsoleReporter.ts +0 -143
- package/src/CookieJar.ts +0 -258
- package/src/DagScheduler.ts +0 -439
- package/src/Logger.ts +0 -85
- package/src/PluginLoader.ts +0 -126
- package/src/PluginManager.ts +0 -208
- package/src/PluginResolver.ts +0 -154
- package/src/QuestAPI.ts +0 -764
- package/src/QuestAPI.types.ts +0 -33
- package/src/QuestTestAPI.ts +0 -164
- package/src/RequestFilter.ts +0 -224
- package/src/ScriptEngine.ts +0 -219
- package/src/ScriptValidator.ts +0 -428
- package/src/TaskGraph.ts +0 -598
- package/src/TestCounter.ts +0 -109
- package/src/VariableResolver.ts +0 -114
- package/src/cli/index.ts +0 -480
- package/src/cli/plugin-commands.ts +0 -342
- package/src/cli/plugin-discovery.ts +0 -44
- package/src/index.ts +0 -24
- package/src/utils.ts +0 -52
|
@@ -3,6 +3,7 @@ import { promisify } from 'util';
|
|
|
3
3
|
import { readdir, readFile, access } from 'fs/promises';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
import { execSync } from 'child_process';
|
|
6
|
+
import { fetchAvailablePlugins } from './plugin-registry.js';
|
|
6
7
|
const execAsync = promisify(exec);
|
|
7
8
|
/**
|
|
8
9
|
* Add plugin management commands to the CLI program
|
|
@@ -17,19 +18,24 @@ export function addPluginCommands(program) {
|
|
|
17
18
|
.description('Install a plugin')
|
|
18
19
|
.argument('<names...>', 'Plugin name(s) to install')
|
|
19
20
|
.action(async (names) => {
|
|
21
|
+
let hasErrors = false;
|
|
20
22
|
for (const name of names) {
|
|
21
23
|
const packageName = name.startsWith('@') ? name : `@apiquest/plugin-${name}`;
|
|
22
24
|
console.log(`Installing ${packageName}...`);
|
|
23
25
|
try {
|
|
24
26
|
// Use npm to install globally
|
|
25
27
|
await execAsync(`npm install -g ${packageName}`);
|
|
26
|
-
console.log(
|
|
28
|
+
console.log(`${packageName} installed`);
|
|
27
29
|
}
|
|
28
30
|
catch (error) {
|
|
31
|
+
hasErrors = true;
|
|
29
32
|
const err = error;
|
|
30
|
-
console.error(
|
|
33
|
+
console.error(`Failed to install ${packageName}:`, err.message ?? String(error));
|
|
31
34
|
}
|
|
32
35
|
}
|
|
36
|
+
if (hasErrors) {
|
|
37
|
+
process.exit(4);
|
|
38
|
+
}
|
|
33
39
|
});
|
|
34
40
|
// quest plugin list
|
|
35
41
|
pluginCommand
|
|
@@ -61,16 +67,20 @@ export function addPluginCommands(program) {
|
|
|
61
67
|
}
|
|
62
68
|
for (const plugin of plugins) {
|
|
63
69
|
console.log(` - ${plugin.name}@${plugin.version}`);
|
|
64
|
-
if (plugin.type !== undefined) {
|
|
65
|
-
console.log(` Type: ${plugin.type}`);
|
|
70
|
+
if (plugin.apiquest?.type !== undefined) {
|
|
71
|
+
console.log(` Type: ${plugin.apiquest.type}`);
|
|
66
72
|
}
|
|
67
|
-
|
|
68
|
-
|
|
73
|
+
const runtime = plugin.apiquest?.runtime;
|
|
74
|
+
if (runtime !== undefined) {
|
|
75
|
+
const runtimeArray = Array.isArray(runtime) ? runtime : [runtime];
|
|
76
|
+
if (runtimeArray.length > 0) {
|
|
77
|
+
console.log(` Runtime: ${runtimeArray.join(', ')}`);
|
|
78
|
+
}
|
|
69
79
|
}
|
|
70
80
|
if (plugin.description !== undefined) {
|
|
71
81
|
console.log(` Description: ${plugin.description}`);
|
|
72
82
|
}
|
|
73
|
-
printCapabilities(plugin.provides, ' ');
|
|
83
|
+
printCapabilities(plugin.apiquest?.capabilities?.provides, ' ');
|
|
74
84
|
console.log('');
|
|
75
85
|
}
|
|
76
86
|
console.log('');
|
|
@@ -86,18 +96,23 @@ export function addPluginCommands(program) {
|
|
|
86
96
|
.description('Remove a plugin')
|
|
87
97
|
.argument('<names...>', 'Plugin name(s) to remove')
|
|
88
98
|
.action(async (names) => {
|
|
99
|
+
let hasErrors = false;
|
|
89
100
|
for (const name of names) {
|
|
90
101
|
const packageName = name.startsWith('@') ? name : `@apiquest/plugin-${name}`;
|
|
91
102
|
console.log(`Removing ${packageName}...`);
|
|
92
103
|
try {
|
|
93
104
|
await execAsync(`npm uninstall -g ${packageName}`);
|
|
94
|
-
console.log(
|
|
105
|
+
console.log(`${packageName} removed`);
|
|
95
106
|
}
|
|
96
107
|
catch (error) {
|
|
108
|
+
hasErrors = true;
|
|
97
109
|
const err = error;
|
|
98
|
-
console.error(
|
|
110
|
+
console.error(`Failed to remove ${packageName}:`, err.message ?? String(error));
|
|
99
111
|
}
|
|
100
112
|
}
|
|
113
|
+
if (hasErrors) {
|
|
114
|
+
process.exit(4);
|
|
115
|
+
}
|
|
101
116
|
});
|
|
102
117
|
// quest plugin update <name>
|
|
103
118
|
pluginCommand
|
|
@@ -105,16 +120,18 @@ export function addPluginCommands(program) {
|
|
|
105
120
|
.description('Update plugin(s)')
|
|
106
121
|
.argument('[names...]', 'Plugin name(s) to update (all if not specified)')
|
|
107
122
|
.action(async (names) => {
|
|
123
|
+
let hasErrors = false;
|
|
108
124
|
if (names.length === 0) {
|
|
109
125
|
// Update all @apiquest plugins
|
|
110
126
|
console.log('Updating all @apiquest plugins...');
|
|
111
127
|
try {
|
|
112
128
|
await execAsync('npm update -g @apiquest/*');
|
|
113
|
-
console.log('
|
|
129
|
+
console.log('All plugins updated');
|
|
114
130
|
}
|
|
115
131
|
catch (error) {
|
|
132
|
+
hasErrors = true;
|
|
116
133
|
const err = error;
|
|
117
|
-
console.error('
|
|
134
|
+
console.error('Failed to update plugins:', err.message ?? String(error));
|
|
118
135
|
}
|
|
119
136
|
}
|
|
120
137
|
else {
|
|
@@ -123,14 +140,18 @@ export function addPluginCommands(program) {
|
|
|
123
140
|
console.log(`Updating ${packageName}...`);
|
|
124
141
|
try {
|
|
125
142
|
await execAsync(`npm update -g ${packageName}`);
|
|
126
|
-
console.log(
|
|
143
|
+
console.log(`${packageName} updated`);
|
|
127
144
|
}
|
|
128
145
|
catch (error) {
|
|
146
|
+
hasErrors = true;
|
|
129
147
|
const err = error;
|
|
130
|
-
console.error(
|
|
148
|
+
console.error(`Failed to update ${packageName}:`, err.message ?? String(error));
|
|
131
149
|
}
|
|
132
150
|
}
|
|
133
151
|
}
|
|
152
|
+
if (hasErrors) {
|
|
153
|
+
process.exit(4);
|
|
154
|
+
}
|
|
134
155
|
});
|
|
135
156
|
}
|
|
136
157
|
/**
|
|
@@ -156,10 +177,15 @@ async function listPluginsFromDir(dir, label) {
|
|
|
156
177
|
foundAny = true;
|
|
157
178
|
const version = pkg.version ?? 'unknown';
|
|
158
179
|
const type = pkg.apiquest?.type ?? 'unknown';
|
|
159
|
-
const runtime = pkg.apiquest?.runtime
|
|
180
|
+
const runtime = pkg.apiquest?.runtime;
|
|
181
|
+
const runtimeStr = Array.isArray(runtime)
|
|
182
|
+
? runtime.join(', ')
|
|
183
|
+
: typeof runtime === 'string'
|
|
184
|
+
? runtime
|
|
185
|
+
: 'unknown';
|
|
160
186
|
console.log(` - ${pkg.name ?? 'unknown'}@${version}`);
|
|
161
187
|
console.log(` Type: ${type}`);
|
|
162
|
-
console.log(` Runtime: ${
|
|
188
|
+
console.log(` Runtime: ${runtimeStr}`);
|
|
163
189
|
printCapabilities(pkg.apiquest?.capabilities?.provides, ' ');
|
|
164
190
|
}
|
|
165
191
|
catch {
|
|
@@ -175,65 +201,14 @@ async function listPluginsFromDir(dir, label) {
|
|
|
175
201
|
console.log(` [${label}] Directory not found or not accessible\n`);
|
|
176
202
|
}
|
|
177
203
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
searchUrl.searchParams.set('size', '250');
|
|
182
|
-
const response = await fetch(searchUrl.toString(), {
|
|
183
|
-
headers: {
|
|
184
|
-
'Accept': 'application/json'
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
if (!response.ok) {
|
|
188
|
-
throw new Error(`Registry search failed: ${response.status} ${response.statusText}`);
|
|
189
|
-
}
|
|
190
|
-
const data = await response.json();
|
|
191
|
-
const names = data.objects
|
|
192
|
-
.map(obj => obj.package?.name)
|
|
193
|
-
.filter((name) => typeof name === 'string' && name.startsWith('@apiquest/plugin-'));
|
|
194
|
-
const pluginResults = await Promise.all(names.map(async (name) => {
|
|
195
|
-
try {
|
|
196
|
-
return await fetchRegistryPluginInfo(name);
|
|
197
|
-
}
|
|
198
|
-
catch {
|
|
199
|
-
return null;
|
|
200
|
-
}
|
|
201
|
-
}));
|
|
202
|
-
return pluginResults
|
|
203
|
-
.filter((plugin) => plugin !== null)
|
|
204
|
-
.filter(plugin => plugin.runtime.includes('fracture'))
|
|
205
|
-
.sort((a, b) => a.name.localeCompare(b.name));
|
|
206
|
-
}
|
|
207
|
-
async function fetchRegistryPluginInfo(name) {
|
|
208
|
-
const response = await fetch(`https://registry.npmjs.org/${encodeURIComponent(name)}`, {
|
|
209
|
-
headers: {
|
|
210
|
-
'Accept': 'application/json'
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
if (!response.ok) {
|
|
214
|
-
return null;
|
|
215
|
-
}
|
|
216
|
-
const data = await response.json();
|
|
217
|
-
const latest = data['dist-tags']?.latest;
|
|
218
|
-
const versionData = latest !== undefined && data.versions !== undefined ? data.versions[latest] : undefined;
|
|
219
|
-
const metadata = versionData?.apiquest;
|
|
220
|
-
if (latest === undefined || metadata === undefined) {
|
|
221
|
-
return null;
|
|
222
|
-
}
|
|
223
|
-
const runtime = Array.isArray(metadata.runtime) ? metadata.runtime : [];
|
|
224
|
-
return {
|
|
225
|
-
name: data.name,
|
|
226
|
-
version: latest,
|
|
227
|
-
description: versionData?.description,
|
|
228
|
-
type: metadata.type,
|
|
229
|
-
runtime,
|
|
230
|
-
provides: metadata.capabilities?.provides
|
|
231
|
-
};
|
|
232
|
-
}
|
|
204
|
+
/**
|
|
205
|
+
* Print plugin capabilities (fracture runtime capabilities only)
|
|
206
|
+
*/
|
|
233
207
|
function printCapabilities(provides, indent = ' ') {
|
|
234
208
|
if (provides === undefined) {
|
|
235
209
|
return;
|
|
236
210
|
}
|
|
211
|
+
// Fracture runtime capabilities:
|
|
237
212
|
if (provides.protocols !== undefined && provides.protocols.length > 0) {
|
|
238
213
|
console.log(`${indent}Protocols: ${provides.protocols.join(', ')}`);
|
|
239
214
|
}
|
|
@@ -243,17 +218,8 @@ function printCapabilities(provides, indent = ' ') {
|
|
|
243
218
|
if (provides.reportTypes !== undefined && provides.reportTypes.length > 0) {
|
|
244
219
|
console.log(`${indent}Report Types: ${provides.reportTypes.join(', ')}`);
|
|
245
220
|
}
|
|
246
|
-
if (provides.
|
|
247
|
-
console.log(`${indent}
|
|
248
|
-
}
|
|
249
|
-
if (provides.exportFormats !== undefined && provides.exportFormats.length > 0) {
|
|
250
|
-
console.log(`${indent}Export Formats: ${provides.exportFormats.join(', ')}`);
|
|
251
|
-
}
|
|
252
|
-
if (provides.visualizations !== undefined && provides.visualizations.length > 0) {
|
|
253
|
-
console.log(`${indent}Visualizations: ${provides.visualizations.join(', ')}`);
|
|
254
|
-
}
|
|
255
|
-
if (provides.provider !== undefined) {
|
|
256
|
-
console.log(`${indent}Provider: ${provides.provider}`);
|
|
221
|
+
if (provides.valueTypes !== undefined && provides.valueTypes.length > 0) {
|
|
222
|
+
console.log(`${indent}Value Providers: ${provides.valueTypes.join(', ')}`);
|
|
257
223
|
}
|
|
258
224
|
}
|
|
259
225
|
//# sourceMappingURL=plugin-commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-commands.js","sourceRoot":"","sources":["../../src/cli/plugin-commands.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,MAAM,aAAa,GAAG,OAAO;SAC1B,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE1C,8BAA8B;IAC9B,aAAa;SACV,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,kBAAkB,CAAC;SAC/B,QAAQ,CAAC,YAAY,EAAE,2BAA2B,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,KAAe,EAAE,EAAE;QAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,IAAI,EAAE,CAAC;YAE7E,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW,KAAK,CAAC,CAAC;YAE5C,IAAI,CAAC;gBACH,8BAA8B;gBAC9B,MAAM,SAAS,CAAC,kBAAkB,WAAW,EAAE,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"plugin-commands.js","sourceRoot":"","sources":["../../src/cli/plugin-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { PluginRequirements } from '../CollectionAnalyzer.js';
|
|
2
|
+
import type { ResolvedPlugin } from '../PluginResolver.js';
|
|
3
|
+
export interface PluginInstallResult {
|
|
4
|
+
installed: string[];
|
|
5
|
+
failed: string[];
|
|
6
|
+
skipped: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Installer for ApiQuest plugins
|
|
10
|
+
* Handles global installation of missing plugins via npm
|
|
11
|
+
* Uses package.json metadata from npm registry to map capabilities to packages
|
|
12
|
+
*/
|
|
13
|
+
export declare class PluginInstaller {
|
|
14
|
+
/**
|
|
15
|
+
* Find plugins that are required but not resolved
|
|
16
|
+
* Queries npm registry to read package.json metadata and map capabilities to actual package names
|
|
17
|
+
*
|
|
18
|
+
* @param requirements - Plugin requirements (protocols, authTypes, valueProviders)
|
|
19
|
+
* @param resolved - Already resolved/installed plugins
|
|
20
|
+
* @param registryUrl - Optional custom npm registry URL
|
|
21
|
+
*/
|
|
22
|
+
static findMissingPlugins(requirements: PluginRequirements, resolved: ResolvedPlugin[], registryUrl?: string): Promise<Set<string>>;
|
|
23
|
+
/**
|
|
24
|
+
* Find which package provides a specific protocol
|
|
25
|
+
* Searches registry metadata to find the correct package
|
|
26
|
+
*/
|
|
27
|
+
private static findPackageForProtocol;
|
|
28
|
+
/**
|
|
29
|
+
* Find which package provides a specific auth type
|
|
30
|
+
* Searches registry metadata to find the correct package
|
|
31
|
+
* Note: Multiple packages can provide the same auth type, we pick the first match
|
|
32
|
+
*/
|
|
33
|
+
private static findPackageForAuthType;
|
|
34
|
+
/**
|
|
35
|
+
* Find which package provides a specific value provider
|
|
36
|
+
* Searches registry metadata to find the correct package
|
|
37
|
+
*/
|
|
38
|
+
private static findPackageForProvider;
|
|
39
|
+
/**
|
|
40
|
+
* Install plugins globally via npm
|
|
41
|
+
*/
|
|
42
|
+
static installPlugins(packageNames: Set<string>): Promise<PluginInstallResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Clear the registry cache (useful for testing or forcing a refresh)
|
|
45
|
+
*/
|
|
46
|
+
static clearCache(): void;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=plugin-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-installer.d.ts","sourceRoot":"","sources":["../../src/cli/plugin-installer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM3D,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAOD;;;;GAIG;AACH,qBAAa,eAAe;IAC1B;;;;;;;OAOG;WACU,kBAAkB,CAC7B,YAAY,EAAE,kBAAkB,EAChC,QAAQ,EAAE,cAAc,EAAE,EAC1B,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IA2DvB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAOrC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAOrC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAOrC;;OAEG;WACU,cAAc,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA2BpF;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,IAAI;CAG1B"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { fetchAvailablePlugins } from './plugin-registry.js';
|
|
4
|
+
const execAsync = promisify(exec);
|
|
5
|
+
/**
|
|
6
|
+
* Cache for registry plugin data to avoid repeated queries
|
|
7
|
+
*/
|
|
8
|
+
let registryPluginsCache = null;
|
|
9
|
+
/**
|
|
10
|
+
* Installer for ApiQuest plugins
|
|
11
|
+
* Handles global installation of missing plugins via npm
|
|
12
|
+
* Uses package.json metadata from npm registry to map capabilities to packages
|
|
13
|
+
*/
|
|
14
|
+
export class PluginInstaller {
|
|
15
|
+
/**
|
|
16
|
+
* Find plugins that are required but not resolved
|
|
17
|
+
* Queries npm registry to read package.json metadata and map capabilities to actual package names
|
|
18
|
+
*
|
|
19
|
+
* @param requirements - Plugin requirements (protocols, authTypes, valueProviders)
|
|
20
|
+
* @param resolved - Already resolved/installed plugins
|
|
21
|
+
* @param registryUrl - Optional custom npm registry URL
|
|
22
|
+
*/
|
|
23
|
+
static async findMissingPlugins(requirements, resolved, registryUrl) {
|
|
24
|
+
const missing = new Set();
|
|
25
|
+
// Fetch available plugins from registry (cached)
|
|
26
|
+
if (registryPluginsCache === null) {
|
|
27
|
+
try {
|
|
28
|
+
registryPluginsCache = await fetchAvailablePlugins(registryUrl);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw new Error(`Failed to fetch plugin registry data from ${registryUrl ?? 'default registry'}. ` +
|
|
32
|
+
`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const registryPlugins = registryPluginsCache;
|
|
36
|
+
// Check protocols
|
|
37
|
+
for (const protocol of requirements.protocols) {
|
|
38
|
+
const found = resolved.some(p => p.protocols?.includes(protocol) === true);
|
|
39
|
+
if (!found) {
|
|
40
|
+
const packageName = this.findPackageForProtocol(protocol, registryPlugins);
|
|
41
|
+
if (packageName !== null) {
|
|
42
|
+
missing.add(packageName);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
console.warn(`Warning: No package found in registry for protocol "${protocol}"`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Check auth types
|
|
50
|
+
for (const authType of requirements.authTypes) {
|
|
51
|
+
const found = resolved.some(p => p.authTypes?.includes(authType) === true);
|
|
52
|
+
if (!found) {
|
|
53
|
+
const packageName = this.findPackageForAuthType(authType, registryPlugins);
|
|
54
|
+
if (packageName !== null) {
|
|
55
|
+
missing.add(packageName);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.warn(`Warning: No package found in registry for auth type "${authType}"`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Check value providers
|
|
63
|
+
for (const provider of requirements.valueProviders) {
|
|
64
|
+
const found = resolved.some(p => p.valueTypes?.includes(provider) === true);
|
|
65
|
+
if (!found) {
|
|
66
|
+
const packageName = this.findPackageForProvider(provider, registryPlugins);
|
|
67
|
+
if (packageName !== null) {
|
|
68
|
+
missing.add(packageName);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
console.warn(`Warning: No package found in registry for provider "${provider}"`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return missing;
|
|
76
|
+
}
|
|
77
|
+
//TODO: Need to enhance this to use provides/supports ....
|
|
78
|
+
/**
|
|
79
|
+
* Find which package provides a specific protocol
|
|
80
|
+
* Searches registry metadata to find the correct package
|
|
81
|
+
*/
|
|
82
|
+
static findPackageForProtocol(protocol, plugins) {
|
|
83
|
+
const plugin = plugins.find(p => p.apiquest?.capabilities?.provides?.protocols?.includes(protocol) === true);
|
|
84
|
+
return plugin?.name ?? null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Find which package provides a specific auth type
|
|
88
|
+
* Searches registry metadata to find the correct package
|
|
89
|
+
* Note: Multiple packages can provide the same auth type, we pick the first match
|
|
90
|
+
*/
|
|
91
|
+
static findPackageForAuthType(authType, plugins) {
|
|
92
|
+
const plugin = plugins.find(p => p.apiquest?.capabilities?.provides?.authTypes?.includes(authType) === true);
|
|
93
|
+
return plugin?.name ?? null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Find which package provides a specific value provider
|
|
97
|
+
* Searches registry metadata to find the correct package
|
|
98
|
+
*/
|
|
99
|
+
static findPackageForProvider(provider, plugins) {
|
|
100
|
+
const plugin = plugins.find(p => p.apiquest?.capabilities?.provides?.valueTypes?.includes(provider) === true);
|
|
101
|
+
return plugin?.name ?? null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Install plugins globally via npm
|
|
105
|
+
*/
|
|
106
|
+
static async installPlugins(packageNames) {
|
|
107
|
+
const result = {
|
|
108
|
+
installed: [],
|
|
109
|
+
failed: [],
|
|
110
|
+
skipped: []
|
|
111
|
+
};
|
|
112
|
+
for (const packageName of packageNames) {
|
|
113
|
+
try {
|
|
114
|
+
console.log(`Installing ${packageName}...`);
|
|
115
|
+
// Install globally
|
|
116
|
+
await execAsync(`npm install -g ${packageName}`, {
|
|
117
|
+
timeout: 120000 // 2 minute timeout
|
|
118
|
+
});
|
|
119
|
+
result.installed.push(packageName);
|
|
120
|
+
console.log(`Successfully installed ${packageName}`);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
result.failed.push(packageName);
|
|
124
|
+
console.error(`Failed to install ${packageName}:`, error instanceof Error ? error.message : String(error));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Clear the registry cache (useful for testing or forcing a refresh)
|
|
131
|
+
*/
|
|
132
|
+
static clearCache() {
|
|
133
|
+
registryPluginsCache = null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=plugin-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-installer.js","sourceRoot":"","sources":["../../src/cli/plugin-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared npm registry querying functionality for plugin discovery
|
|
3
|
+
* Uses types from @apiquest/types
|
|
4
|
+
*/
|
|
5
|
+
import type { PluginPackageJson } from '@apiquest/types';
|
|
6
|
+
/**
|
|
7
|
+
* Default npm registry URL
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_REGISTRY_URL = "https://registry.npmjs.org";
|
|
10
|
+
/**
|
|
11
|
+
* Fetch all available @apiquest/plugin-* packages from npm registry
|
|
12
|
+
* Filters for fracture runtime
|
|
13
|
+
*
|
|
14
|
+
* @param registryUrl - Base registry URL (default: https://registry.npmjs.org)
|
|
15
|
+
*/
|
|
16
|
+
export declare function fetchAvailablePlugins(registryUrl?: string): Promise<PluginPackageJson[]>;
|
|
17
|
+
//# sourceMappingURL=plugin-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-registry.d.ts","sourceRoot":"","sources":["../../src/cli/plugin-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAoBzD;;GAEG;AACH,eAAO,MAAM,oBAAoB,+BAA+B,CAAC;AAEjE;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,WAAW,GAAE,MAA6B,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAsCpH"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared npm registry querying functionality for plugin discovery
|
|
3
|
+
* Uses types from @apiquest/types
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Default npm registry URL
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_REGISTRY_URL = 'https://registry.npmjs.org';
|
|
9
|
+
/**
|
|
10
|
+
* Fetch all available @apiquest/plugin-* packages from npm registry
|
|
11
|
+
* Filters for fracture runtime
|
|
12
|
+
*
|
|
13
|
+
* @param registryUrl - Base registry URL (default: https://registry.npmjs.org)
|
|
14
|
+
*/
|
|
15
|
+
export async function fetchAvailablePlugins(registryUrl = DEFAULT_REGISTRY_URL) {
|
|
16
|
+
const searchUrl = new URL(`${registryUrl}/-/v1/search`);
|
|
17
|
+
searchUrl.searchParams.set('text', '@apiquest/plugin');
|
|
18
|
+
searchUrl.searchParams.set('size', '250');
|
|
19
|
+
const response = await fetch(searchUrl.toString(), {
|
|
20
|
+
headers: {
|
|
21
|
+
'Accept': 'application/json'
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
throw new Error(`Registry search failed: ${response.status} ${response.statusText}`);
|
|
26
|
+
}
|
|
27
|
+
const data = await response.json();
|
|
28
|
+
const names = data.objects
|
|
29
|
+
.map(obj => obj.package?.name)
|
|
30
|
+
.filter((name) => typeof name === 'string' && name.startsWith('@apiquest/plugin-'));
|
|
31
|
+
const pluginResults = await Promise.all(names.map(async (name) => {
|
|
32
|
+
try {
|
|
33
|
+
return await fetchRegistryPluginInfo(name, registryUrl);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}));
|
|
39
|
+
return pluginResults
|
|
40
|
+
.filter((plugin) => plugin !== null)
|
|
41
|
+
.filter(plugin => {
|
|
42
|
+
const runtime = plugin.apiquest?.runtime;
|
|
43
|
+
if (Array.isArray(runtime)) {
|
|
44
|
+
return runtime.includes('fracture');
|
|
45
|
+
}
|
|
46
|
+
return runtime === 'fracture';
|
|
47
|
+
})
|
|
48
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Fetch package.json metadata for a specific plugin from npm registry
|
|
52
|
+
*
|
|
53
|
+
* @param name - Package name (e.g., @apiquest/plugin-http)
|
|
54
|
+
* @param registryUrl - Base registry URL (default: https://registry.npmjs.org)
|
|
55
|
+
*/
|
|
56
|
+
async function fetchRegistryPluginInfo(name, registryUrl = DEFAULT_REGISTRY_URL) {
|
|
57
|
+
const response = await fetch(`${registryUrl}/${encodeURIComponent(name)}`, {
|
|
58
|
+
headers: {
|
|
59
|
+
'Accept': 'application/json'
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const data = await response.json();
|
|
66
|
+
const latest = data['dist-tags']?.latest;
|
|
67
|
+
const versionData = latest !== undefined && data.versions !== undefined ? data.versions[latest] : undefined;
|
|
68
|
+
if (latest === undefined || versionData?.apiquest === undefined) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
...versionData,
|
|
73
|
+
name: data.name,
|
|
74
|
+
version: latest
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=plugin-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-registry.js","sourceRoot":"","sources":["../../src/cli/plugin-registry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/tsconfig.json
CHANGED
package/tsconfig.test.json
CHANGED
package/dist/QuestAPI.types.d.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
export interface RequestConfig {
|
|
2
|
-
url: string;
|
|
3
|
-
method?: string;
|
|
4
|
-
header?: Record<string, string>;
|
|
5
|
-
headers?: Record<string, string>;
|
|
6
|
-
body?: string | RequestBody;
|
|
7
|
-
}
|
|
8
|
-
export interface RequestBody {
|
|
9
|
-
mode?: 'raw' | 'urlencoded' | 'formdata';
|
|
10
|
-
raw?: string;
|
|
11
|
-
urlencoded?: Array<{
|
|
12
|
-
key: string;
|
|
13
|
-
value: string;
|
|
14
|
-
}>;
|
|
15
|
-
formdata?: Array<{
|
|
16
|
-
key: string;
|
|
17
|
-
value: string;
|
|
18
|
-
}>;
|
|
19
|
-
}
|
|
20
|
-
export interface ResponseObject {
|
|
21
|
-
status: number;
|
|
22
|
-
statusText: string;
|
|
23
|
-
body: string;
|
|
24
|
-
headers: Record<string, string | string[]>;
|
|
25
|
-
time: number;
|
|
26
|
-
json(): unknown | null;
|
|
27
|
-
text(): string;
|
|
28
|
-
}
|
|
29
|
-
export interface HistoryFilterCriteria {
|
|
30
|
-
path?: string;
|
|
31
|
-
name?: string;
|
|
32
|
-
iteration?: number;
|
|
33
|
-
id?: string;
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=QuestAPI.types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"QuestAPI.types.d.ts","sourceRoot":"","sources":["../src/QuestAPI.types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,KAAK,GAAG,YAAY,GAAG,UAAU,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC;IACvB,IAAI,IAAI,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb"}
|