@spool-lab/core 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/dist/connectors/capabilities/cookies-chrome.d.ts +0 -19
- package/dist/connectors/capabilities/cookies-chrome.d.ts.map +0 -1
- package/dist/connectors/capabilities/cookies-chrome.js +0 -199
- package/dist/connectors/capabilities/cookies-chrome.js.map +0 -1
- package/dist/connectors/capabilities/exec-impl.d.ts +0 -3
- package/dist/connectors/capabilities/exec-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/exec-impl.js +0 -108
- package/dist/connectors/capabilities/exec-impl.js.map +0 -1
- package/dist/connectors/capabilities/fetch-impl.d.ts +0 -3
- package/dist/connectors/capabilities/fetch-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/fetch-impl.js +0 -4
- package/dist/connectors/capabilities/fetch-impl.js.map +0 -1
- package/dist/connectors/capabilities/index.d.ts +0 -6
- package/dist/connectors/capabilities/index.d.ts.map +0 -1
- package/dist/connectors/capabilities/index.js +0 -6
- package/dist/connectors/capabilities/index.js.map +0 -1
- package/dist/connectors/capabilities/log-impl.d.ts +0 -3
- package/dist/connectors/capabilities/log-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/log-impl.js +0 -26
- package/dist/connectors/capabilities/log-impl.js.map +0 -1
- package/dist/connectors/capabilities/sqlite-impl.d.ts +0 -3
- package/dist/connectors/capabilities/sqlite-impl.d.ts.map +0 -1
- package/dist/connectors/capabilities/sqlite-impl.js +0 -19
- package/dist/connectors/capabilities/sqlite-impl.js.map +0 -1
- package/dist/connectors/loader.d.ts +0 -47
- package/dist/connectors/loader.d.ts.map +0 -1
- package/dist/connectors/loader.js +0 -328
- package/dist/connectors/loader.js.map +0 -1
- package/dist/connectors/npm-install.d.ts +0 -26
- package/dist/connectors/npm-install.d.ts.map +0 -1
- package/dist/connectors/npm-install.js +0 -74
- package/dist/connectors/npm-install.js.map +0 -1
- package/dist/connectors/prerequisites.d.ts +0 -14
- package/dist/connectors/prerequisites.d.ts.map +0 -1
- package/dist/connectors/prerequisites.js +0 -109
- package/dist/connectors/prerequisites.js.map +0 -1
- package/dist/connectors/registry-fetch.d.ts +0 -22
- package/dist/connectors/registry-fetch.d.ts.map +0 -1
- package/dist/connectors/registry-fetch.js +0 -54
- package/dist/connectors/registry-fetch.js.map +0 -1
- package/dist/connectors/registry.d.ts +0 -23
- package/dist/connectors/registry.d.ts.map +0 -1
- package/dist/connectors/registry.js +0 -59
- package/dist/connectors/registry.js.map +0 -1
- package/dist/connectors/sync-engine.d.ts +0 -31
- package/dist/connectors/sync-engine.d.ts.map +0 -1
- package/dist/connectors/sync-engine.js +0 -604
- package/dist/connectors/sync-engine.js.map +0 -1
- package/dist/connectors/sync-scheduler.d.ts +0 -56
- package/dist/connectors/sync-scheduler.d.ts.map +0 -1
- package/dist/connectors/sync-scheduler.js +0 -238
- package/dist/connectors/sync-scheduler.js.map +0 -1
- package/dist/connectors/trust-store.d.ts +0 -13
- package/dist/connectors/trust-store.d.ts.map +0 -1
- package/dist/connectors/trust-store.js +0 -48
- package/dist/connectors/trust-store.js.map +0 -1
- package/dist/connectors/types.d.ts +0 -111
- package/dist/connectors/types.d.ts.map +0 -1
- package/dist/connectors/types.js +0 -50
- package/dist/connectors/types.js.map +0 -1
|
@@ -1,328 +0,0 @@
|
|
|
1
|
-
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { pathToFileURL } from 'node:url';
|
|
4
|
-
import { SyncError, SyncErrorCode, KNOWN_CAPABILITIES_V1 } from '@spool-lab/connector-sdk';
|
|
5
|
-
export function validatePrerequisites(prereqs, packageName) {
|
|
6
|
-
const result = [];
|
|
7
|
-
const seen = new Set();
|
|
8
|
-
for (const raw of prereqs) {
|
|
9
|
-
const p = raw;
|
|
10
|
-
if (!p.id || !p.name || !p.kind || !p.detect || !p.install) {
|
|
11
|
-
throw new Error(`Invalid prerequisite in ${packageName}: missing required fields`);
|
|
12
|
-
}
|
|
13
|
-
if (p.install.kind !== p.kind) {
|
|
14
|
-
throw new Error(`Prerequisite ${p.id} in ${packageName}: install.kind "${p.install.kind}" must match kind "${p.kind}"`);
|
|
15
|
-
}
|
|
16
|
-
if (p.kind === 'browser-extension') {
|
|
17
|
-
const inst = p.install;
|
|
18
|
-
if (!inst.webstoreUrl && !inst.manual) {
|
|
19
|
-
throw new Error(`Prerequisite ${p.id} in ${packageName}: browser-extension requires webstoreUrl or manual`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
if (p.minVersion && !(p.detect.type === 'exec' && p.detect.versionRegex)) {
|
|
23
|
-
throw new Error(`Prerequisite ${p.id} in ${packageName}: minVersion requires detect.versionRegex`);
|
|
24
|
-
}
|
|
25
|
-
if (seen.has(p.id)) {
|
|
26
|
-
throw new Error(`Prerequisite ${p.id} in ${packageName}: duplicate id`);
|
|
27
|
-
}
|
|
28
|
-
for (const req of p.requires ?? []) {
|
|
29
|
-
if (!seen.has(req)) {
|
|
30
|
-
throw new Error(`Prerequisite ${p.id} in ${packageName}: requires "${req}" must appear earlier in array`);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
seen.add(p.id);
|
|
34
|
-
result.push(p);
|
|
35
|
-
}
|
|
36
|
-
return result;
|
|
37
|
-
}
|
|
38
|
-
const KNOWN_CAPS_SET = new Set(KNOWN_CAPABILITIES_V1);
|
|
39
|
-
const importedModules = new Map();
|
|
40
|
-
export async function loadConnectors(deps) {
|
|
41
|
-
const { connectorsDir, log } = deps;
|
|
42
|
-
importedModules.clear();
|
|
43
|
-
deps.registry.clear();
|
|
44
|
-
const discovered = discoverConnectorPackages(connectorsDir, log);
|
|
45
|
-
const loadResults = [];
|
|
46
|
-
for (const pkg of discovered) {
|
|
47
|
-
const result = await loadOneConnector(pkg, deps);
|
|
48
|
-
loadResults.push(result);
|
|
49
|
-
}
|
|
50
|
-
return { loadResults };
|
|
51
|
-
}
|
|
52
|
-
function discoverConnectorPackages(connectorsDir, log) {
|
|
53
|
-
const nodeModules = join(connectorsDir, 'node_modules');
|
|
54
|
-
if (!existsSync(nodeModules))
|
|
55
|
-
return [];
|
|
56
|
-
const results = [];
|
|
57
|
-
let topEntries;
|
|
58
|
-
try {
|
|
59
|
-
topEntries = readdirSync(nodeModules);
|
|
60
|
-
}
|
|
61
|
-
catch (err) {
|
|
62
|
-
log.error('failed to read node_modules', { error: String(err) });
|
|
63
|
-
return results;
|
|
64
|
-
}
|
|
65
|
-
for (const entry of topEntries) {
|
|
66
|
-
if (entry.startsWith('.'))
|
|
67
|
-
continue;
|
|
68
|
-
const entryPath = join(nodeModules, entry);
|
|
69
|
-
if (entry.startsWith('@')) {
|
|
70
|
-
let scopedEntries;
|
|
71
|
-
try {
|
|
72
|
-
scopedEntries = readdirSync(entryPath);
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
for (const sub of scopedEntries) {
|
|
78
|
-
if (sub.startsWith('.'))
|
|
79
|
-
continue;
|
|
80
|
-
results.push(...tryReadConnectorManifest(join(entryPath, sub), log));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
results.push(...tryReadConnectorManifest(entryPath, log));
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return results;
|
|
88
|
-
}
|
|
89
|
-
function tryReadConnectorManifest(pkgDir, log) {
|
|
90
|
-
const pkgJsonPath = join(pkgDir, 'package.json');
|
|
91
|
-
if (!existsSync(pkgJsonPath))
|
|
92
|
-
return [];
|
|
93
|
-
let json;
|
|
94
|
-
try {
|
|
95
|
-
json = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
log.warn('invalid package.json', { path: pkgJsonPath, error: String(err) });
|
|
99
|
-
return [];
|
|
100
|
-
}
|
|
101
|
-
if (json?.spool?.type !== 'connector')
|
|
102
|
-
return [];
|
|
103
|
-
const packageName = String(json.name);
|
|
104
|
-
let prerequisites;
|
|
105
|
-
try {
|
|
106
|
-
prerequisites = validatePrerequisites(Array.isArray(json.spool.prerequisites) ? json.spool.prerequisites : [], packageName);
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
log.error('invalid prerequisites in package', { package: packageName, error: String(err) });
|
|
110
|
-
return [];
|
|
111
|
-
}
|
|
112
|
-
// Multi-connector package: spool.connectors is an array
|
|
113
|
-
if (Array.isArray(json.spool.connectors)) {
|
|
114
|
-
const results = [];
|
|
115
|
-
for (const entry of json.spool.connectors) {
|
|
116
|
-
const declared = Array.isArray(entry.capabilities) ? entry.capabilities : [];
|
|
117
|
-
const unknown = declared.filter(c => !KNOWN_CAPS_SET.has(c));
|
|
118
|
-
if (unknown.length > 0) {
|
|
119
|
-
log.error('unknown capability in spool.connectors entry', {
|
|
120
|
-
package: packageName,
|
|
121
|
-
connectorId: entry.id,
|
|
122
|
-
unknown,
|
|
123
|
-
error: `Unknown capability "${unknown[0]}" — known v1 values: ${[...KNOWN_CAPS_SET].join(', ')}`,
|
|
124
|
-
});
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
results.push({
|
|
128
|
-
dir: pkgDir,
|
|
129
|
-
name: packageName,
|
|
130
|
-
version: String(json.version ?? '0.0.0'),
|
|
131
|
-
manifest: {
|
|
132
|
-
id: String(entry.id ?? ''),
|
|
133
|
-
platform: String(entry.platform ?? ''),
|
|
134
|
-
label: String(entry.label ?? ''),
|
|
135
|
-
description: String(entry.description ?? ''),
|
|
136
|
-
color: String(entry.color ?? '#888'),
|
|
137
|
-
ephemeral: Boolean(entry.ephemeral),
|
|
138
|
-
capabilities: declared,
|
|
139
|
-
},
|
|
140
|
-
main: String(json.main ?? 'dist/index.js'),
|
|
141
|
-
multi: true,
|
|
142
|
-
prerequisites,
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
return results;
|
|
146
|
-
}
|
|
147
|
-
// Single-connector package (original path)
|
|
148
|
-
const declared = Array.isArray(json.spool.capabilities)
|
|
149
|
-
? json.spool.capabilities
|
|
150
|
-
: [];
|
|
151
|
-
const unknown = declared.filter(c => !KNOWN_CAPS_SET.has(c));
|
|
152
|
-
if (unknown.length > 0) {
|
|
153
|
-
log.error('unknown capability in spool.capabilities', {
|
|
154
|
-
package: packageName,
|
|
155
|
-
unknown,
|
|
156
|
-
error: `Unknown capability "${unknown[0]}" — known v1 values: ${[...KNOWN_CAPS_SET].join(', ')}`,
|
|
157
|
-
});
|
|
158
|
-
return [];
|
|
159
|
-
}
|
|
160
|
-
return [{
|
|
161
|
-
dir: pkgDir,
|
|
162
|
-
name: packageName,
|
|
163
|
-
version: String(json.version ?? '0.0.0'),
|
|
164
|
-
manifest: {
|
|
165
|
-
id: String(json.spool.id ?? ''),
|
|
166
|
-
platform: String(json.spool.platform ?? ''),
|
|
167
|
-
label: String(json.spool.label ?? ''),
|
|
168
|
-
description: String(json.spool.description ?? ''),
|
|
169
|
-
color: String(json.spool.color ?? '#888'),
|
|
170
|
-
ephemeral: Boolean(json.spool.ephemeral),
|
|
171
|
-
capabilities: declared,
|
|
172
|
-
},
|
|
173
|
-
main: String(json.main ?? 'dist/index.js'),
|
|
174
|
-
multi: false,
|
|
175
|
-
prerequisites,
|
|
176
|
-
}];
|
|
177
|
-
}
|
|
178
|
-
async function loadOneConnector(pkg, deps) {
|
|
179
|
-
if (!deps.trustStore.isTrusted(pkg.name)) {
|
|
180
|
-
deps.log.info('skip untrusted connector', { name: pkg.name, id: pkg.manifest.id });
|
|
181
|
-
return { status: 'skipped', name: pkg.name, reason: 'not-in-allowlist' };
|
|
182
|
-
}
|
|
183
|
-
try {
|
|
184
|
-
const entryPath = join(pkg.dir, pkg.main);
|
|
185
|
-
if (!existsSync(entryPath)) {
|
|
186
|
-
throw new Error(`entry file not found: ${entryPath}`);
|
|
187
|
-
}
|
|
188
|
-
let mod;
|
|
189
|
-
if (importedModules.has(entryPath)) {
|
|
190
|
-
mod = importedModules.get(entryPath);
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
const modUrl = pathToFileURL(entryPath).href;
|
|
194
|
-
mod = await import(modUrl);
|
|
195
|
-
importedModules.set(entryPath, mod);
|
|
196
|
-
}
|
|
197
|
-
const caps = buildCapabilities(pkg.manifest.capabilities, pkg.manifest.id, pkg.name, deps.capabilityImpls);
|
|
198
|
-
let ConnectorClass;
|
|
199
|
-
if (pkg.multi) {
|
|
200
|
-
// Multi-connector: find the class from mod.connectors by matching id
|
|
201
|
-
const classes = mod.connectors;
|
|
202
|
-
if (!Array.isArray(classes)) {
|
|
203
|
-
throw new Error('multi-connector package must export a `connectors` array');
|
|
204
|
-
}
|
|
205
|
-
ConnectorClass = null;
|
|
206
|
-
for (const Cls of classes) {
|
|
207
|
-
if (typeof Cls !== 'function')
|
|
208
|
-
continue;
|
|
209
|
-
const probe = new Cls(caps);
|
|
210
|
-
if (probe.id === pkg.manifest.id) {
|
|
211
|
-
ConnectorClass = Cls;
|
|
212
|
-
break;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
if (!ConnectorClass) {
|
|
216
|
-
throw new Error(`no connector class with id="${pkg.manifest.id}" found in connectors array`);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
ConnectorClass =
|
|
221
|
-
mod.default ??
|
|
222
|
-
mod[pkg.manifest.id] ??
|
|
223
|
-
(typeof mod === 'function' ? mod : null);
|
|
224
|
-
}
|
|
225
|
-
if (typeof ConnectorClass !== 'function') {
|
|
226
|
-
throw new Error('module does not export a connector class');
|
|
227
|
-
}
|
|
228
|
-
const instance = new ConnectorClass(caps);
|
|
229
|
-
applyManifestMetadata(instance, pkg, deps.log);
|
|
230
|
-
deps.registry.register(instance);
|
|
231
|
-
const connectorPkg = {
|
|
232
|
-
id: pkg.name,
|
|
233
|
-
packageName: pkg.name,
|
|
234
|
-
rootDir: pkg.dir,
|
|
235
|
-
connectors: [instance],
|
|
236
|
-
};
|
|
237
|
-
if (pkg.prerequisites.length > 0) {
|
|
238
|
-
connectorPkg.prerequisites = pkg.prerequisites;
|
|
239
|
-
}
|
|
240
|
-
deps.registry.registerPackage(connectorPkg);
|
|
241
|
-
deps.log.info('loaded connector', { name: pkg.name, id: pkg.manifest.id, version: pkg.version });
|
|
242
|
-
return { status: 'loaded', name: pkg.name, version: pkg.version };
|
|
243
|
-
}
|
|
244
|
-
catch (err) {
|
|
245
|
-
deps.log.error('failed to load connector', {
|
|
246
|
-
name: pkg.name,
|
|
247
|
-
id: pkg.manifest.id,
|
|
248
|
-
error: err instanceof Error ? err.message : String(err),
|
|
249
|
-
stack: err instanceof Error ? err.stack : undefined,
|
|
250
|
-
});
|
|
251
|
-
return { status: 'failed', name: pkg.name, error: err };
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
function buildCapabilities(declared, connectorId, packageId, impls) {
|
|
255
|
-
const caps = {
|
|
256
|
-
fetch: declared.includes('fetch')
|
|
257
|
-
? impls.fetch
|
|
258
|
-
: undefinedCapability('fetch'),
|
|
259
|
-
cookies: declared.includes('cookies:chrome')
|
|
260
|
-
? impls.cookies
|
|
261
|
-
: undefinedCapability('cookies:chrome'),
|
|
262
|
-
log: declared.includes('log')
|
|
263
|
-
? impls.logFor(connectorId)
|
|
264
|
-
: undefinedCapability('log'),
|
|
265
|
-
sqlite: declared.includes('sqlite')
|
|
266
|
-
? impls.sqlite
|
|
267
|
-
: undefinedCapability('sqlite'),
|
|
268
|
-
exec: declared.includes('exec')
|
|
269
|
-
? impls.exec
|
|
270
|
-
: undefinedCapability('exec'),
|
|
271
|
-
};
|
|
272
|
-
if (declared.includes('prerequisites') && impls.prerequisitesFor) {
|
|
273
|
-
caps.prerequisites = impls.prerequisitesFor(packageId);
|
|
274
|
-
}
|
|
275
|
-
return caps;
|
|
276
|
-
}
|
|
277
|
-
function undefinedCapability(name) {
|
|
278
|
-
return new Proxy(function undef() {
|
|
279
|
-
throw makeUndeclaredError(name, 'call');
|
|
280
|
-
}, {
|
|
281
|
-
get(_target, prop) {
|
|
282
|
-
return () => {
|
|
283
|
-
throw makeUndeclaredError(name, String(prop));
|
|
284
|
-
};
|
|
285
|
-
},
|
|
286
|
-
apply() {
|
|
287
|
-
throw makeUndeclaredError(name, 'call');
|
|
288
|
-
},
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
function makeUndeclaredError(name, accessor) {
|
|
292
|
-
return new SyncError(SyncErrorCode.CONNECTOR_ERROR, `Capability "${name}" used (via .${accessor}) but not declared in spool.capabilities`);
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Manifest is the single source of truth for connector metadata.
|
|
296
|
-
*
|
|
297
|
-
* Any `readonly id/platform/label/description/color/ephemeral` declared on the
|
|
298
|
-
* connector class is treated as a default and overwritten with the manifest
|
|
299
|
-
* value so that runtime behavior always matches what the package declared.
|
|
300
|
-
*
|
|
301
|
-
* If the class field disagrees with the manifest, we log a warning so authors
|
|
302
|
-
* can clean it up — but loading proceeds, since silently dropping a connector
|
|
303
|
-
* because two redundant declarations drifted is worse than the inconsistency.
|
|
304
|
-
*/
|
|
305
|
-
function applyManifestMetadata(instance, pkg, log) {
|
|
306
|
-
const fields = [
|
|
307
|
-
'id', 'platform', 'label', 'description', 'color', 'ephemeral',
|
|
308
|
-
];
|
|
309
|
-
for (const field of fields) {
|
|
310
|
-
const classValue = instance[field];
|
|
311
|
-
const manifestValue = pkg.manifest[field];
|
|
312
|
-
if (classValue !== undefined && classValue !== manifestValue) {
|
|
313
|
-
log.warn('connector class field disagrees with manifest; manifest wins', {
|
|
314
|
-
package: pkg.name,
|
|
315
|
-
field,
|
|
316
|
-
classValue,
|
|
317
|
-
manifestValue,
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
Object.defineProperty(instance, field, {
|
|
321
|
-
value: manifestValue,
|
|
322
|
-
writable: false,
|
|
323
|
-
configurable: true,
|
|
324
|
-
enumerable: true,
|
|
325
|
-
});
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/connectors/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export interface NpmPackageInfo {
|
|
2
|
-
name: string;
|
|
3
|
-
version: string;
|
|
4
|
-
tarballUrl: string;
|
|
5
|
-
isConnector: boolean;
|
|
6
|
-
label: string | null;
|
|
7
|
-
description: string | null;
|
|
8
|
-
}
|
|
9
|
-
export interface InstallResult {
|
|
10
|
-
name: string;
|
|
11
|
-
version: string;
|
|
12
|
-
installPath: string;
|
|
13
|
-
}
|
|
14
|
-
export interface UpdateInfo {
|
|
15
|
-
current: string;
|
|
16
|
-
latest: string;
|
|
17
|
-
}
|
|
18
|
-
export declare function registryUrl(packageName: string): string;
|
|
19
|
-
export declare function resolveNpmPackage(packageName: string, fetchFn: typeof globalThis.fetch): Promise<NpmPackageInfo>;
|
|
20
|
-
export declare function downloadAndInstall(packageName: string, connectorsDir: string, fetchFn: typeof globalThis.fetch): Promise<InstallResult>;
|
|
21
|
-
export declare function checkForUpdates(connectors: Array<{
|
|
22
|
-
packageName: string;
|
|
23
|
-
currentVersion: string;
|
|
24
|
-
}>, fetchFn: typeof globalThis.fetch): Promise<Map<string, UpdateInfo>>;
|
|
25
|
-
export declare function uninstallConnector(packageName: string, connectorsDir: string): void;
|
|
26
|
-
//# sourceMappingURL=npm-install.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"npm-install.d.ts","sourceRoot":"","sources":["../../src/connectors/npm-install.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKvD;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,GAC/B,OAAO,CAAC,cAAc,CAAC,CAkBzB;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,GAC/B,OAAO,CAAC,aAAa,CAAC,CA0BxB;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,KAAK,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,EAClE,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,GAC/B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAclC;AAED,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,IAAI,CAKN"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, createWriteStream, rmSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { pipeline } from 'node:stream/promises';
|
|
4
|
-
import { tmpdir } from 'node:os';
|
|
5
|
-
import * as tar from 'tar';
|
|
6
|
-
import * as semver from 'semver';
|
|
7
|
-
export function registryUrl(packageName) {
|
|
8
|
-
const encoded = packageName.includes('/')
|
|
9
|
-
? packageName.replace('/', '%2F')
|
|
10
|
-
: packageName;
|
|
11
|
-
return `https://registry.npmjs.org/${encoded}/latest`;
|
|
12
|
-
}
|
|
13
|
-
export async function resolveNpmPackage(packageName, fetchFn) {
|
|
14
|
-
const url = registryUrl(packageName);
|
|
15
|
-
const res = await fetchFn(url);
|
|
16
|
-
if (!res.ok) {
|
|
17
|
-
throw new Error(`npm registry returned ${res.status} for ${packageName}`);
|
|
18
|
-
}
|
|
19
|
-
const data = await res.json();
|
|
20
|
-
const name = data['name'];
|
|
21
|
-
const version = data['version'];
|
|
22
|
-
const dist = data['dist'];
|
|
23
|
-
const tarballUrl = dist['tarball'];
|
|
24
|
-
const spool = data['spool'];
|
|
25
|
-
const isConnector = spool?.['type'] === 'connector';
|
|
26
|
-
const label = typeof spool?.['label'] === 'string' ? spool['label'] : null;
|
|
27
|
-
const description = typeof spool?.['description'] === 'string' ? spool['description'] : null;
|
|
28
|
-
return { name, version, tarballUrl, isConnector, label, description };
|
|
29
|
-
}
|
|
30
|
-
export async function downloadAndInstall(packageName, connectorsDir, fetchFn) {
|
|
31
|
-
const info = await resolveNpmPackage(packageName, fetchFn);
|
|
32
|
-
if (!info.isConnector) {
|
|
33
|
-
throw new Error(`Package "${packageName}" is not a spool connector (missing spool.type: "connector")`);
|
|
34
|
-
}
|
|
35
|
-
// Download tarball to temp file
|
|
36
|
-
const tmpPath = join(tmpdir(), `spool-install-${Date.now()}.tgz`);
|
|
37
|
-
const res = await fetchFn(info.tarballUrl);
|
|
38
|
-
if (!res.ok || !res.body) {
|
|
39
|
-
throw new Error(`Failed to download tarball: ${res.status}`);
|
|
40
|
-
}
|
|
41
|
-
const fileStream = createWriteStream(tmpPath);
|
|
42
|
-
await pipeline(res.body, fileStream);
|
|
43
|
-
// Extract to node_modules
|
|
44
|
-
const nameSegments = info.name.startsWith('@') ? info.name.split('/') : [info.name];
|
|
45
|
-
const installPath = join(connectorsDir, 'node_modules', ...nameSegments);
|
|
46
|
-
// Clear any stale entry first: a broken dev symlink (from a removed
|
|
47
|
-
// worktree) would cause mkdirSync to ENOENT by following the dangling link.
|
|
48
|
-
rmSync(installPath, { recursive: true, force: true });
|
|
49
|
-
mkdirSync(installPath, { recursive: true });
|
|
50
|
-
await tar.extract({ file: tmpPath, cwd: installPath, strip: 1 });
|
|
51
|
-
return { name: info.name, version: info.version, installPath };
|
|
52
|
-
}
|
|
53
|
-
export async function checkForUpdates(connectors, fetchFn) {
|
|
54
|
-
const results = new Map();
|
|
55
|
-
const checks = connectors.map(async ({ packageName, currentVersion }) => {
|
|
56
|
-
try {
|
|
57
|
-
const info = await resolveNpmPackage(packageName, fetchFn);
|
|
58
|
-
if (semver.gt(info.version, currentVersion)) {
|
|
59
|
-
results.set(packageName, { current: currentVersion, latest: info.version });
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
// Network error or delisted package — skip silently
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
await Promise.all(checks);
|
|
67
|
-
return results;
|
|
68
|
-
}
|
|
69
|
-
export function uninstallConnector(packageName, connectorsDir) {
|
|
70
|
-
const nameSegments = packageName.startsWith('@') ? packageName.split('/') : [packageName];
|
|
71
|
-
const installPath = join(connectorsDir, 'node_modules', ...nameSegments);
|
|
72
|
-
rmSync(installPath, { recursive: true, force: true });
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=npm-install.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"npm-install.js","sourceRoot":"","sources":["../../src/connectors/npm-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { SetupStep, ExecCapability } from '@spool-lab/connector-sdk';
|
|
2
|
-
import type { ConnectorPackage } from './types.js';
|
|
3
|
-
export declare class PrerequisiteChecker {
|
|
4
|
-
private exec;
|
|
5
|
-
private cache;
|
|
6
|
-
private inFlight;
|
|
7
|
-
constructor(exec: ExecCapability);
|
|
8
|
-
getCached(packageId: string): SetupStep[] | undefined;
|
|
9
|
-
invalidate(packageId: string): void;
|
|
10
|
-
check(pkg: ConnectorPackage): Promise<SetupStep[]>;
|
|
11
|
-
private runCheck;
|
|
12
|
-
private detectOne;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=prerequisites.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prerequisites.d.ts","sourceRoot":"","sources":["../../src/connectors/prerequisites.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,SAAS,EAAe,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACpG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAiBlD,qBAAa,mBAAmB;IAIlB,OAAO,CAAC,IAAI;IAHxB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAA0C;gBAEtC,IAAI,EAAE,cAAc;IAExC,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,SAAS;IAIrD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAI7B,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YAQ1C,QAAQ;YAoBR,SAAS;CAkDxB"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { valid, gte } from 'semver';
|
|
2
|
-
function baseStep(p, status, extras = {}) {
|
|
3
|
-
const step = {
|
|
4
|
-
id: p.id,
|
|
5
|
-
label: p.name,
|
|
6
|
-
kind: p.kind,
|
|
7
|
-
status,
|
|
8
|
-
install: p.install,
|
|
9
|
-
...extras,
|
|
10
|
-
};
|
|
11
|
-
if (p.docsUrl !== undefined)
|
|
12
|
-
step.docsUrl = p.docsUrl;
|
|
13
|
-
if (p.minVersion !== undefined && step.minVersion === undefined)
|
|
14
|
-
step.minVersion = p.minVersion;
|
|
15
|
-
return step;
|
|
16
|
-
}
|
|
17
|
-
export class PrerequisiteChecker {
|
|
18
|
-
exec;
|
|
19
|
-
cache = new Map();
|
|
20
|
-
inFlight = new Map();
|
|
21
|
-
constructor(exec) {
|
|
22
|
-
this.exec = exec;
|
|
23
|
-
}
|
|
24
|
-
getCached(packageId) {
|
|
25
|
-
return this.cache.get(packageId);
|
|
26
|
-
}
|
|
27
|
-
invalidate(packageId) {
|
|
28
|
-
this.cache.delete(packageId);
|
|
29
|
-
}
|
|
30
|
-
async check(pkg) {
|
|
31
|
-
const existing = this.inFlight.get(pkg.id);
|
|
32
|
-
if (existing)
|
|
33
|
-
return existing;
|
|
34
|
-
const promise = this.runCheck(pkg).finally(() => this.inFlight.delete(pkg.id));
|
|
35
|
-
this.inFlight.set(pkg.id, promise);
|
|
36
|
-
return promise;
|
|
37
|
-
}
|
|
38
|
-
async runCheck(pkg) {
|
|
39
|
-
const prereqs = pkg.prerequisites ?? [];
|
|
40
|
-
const steps = [];
|
|
41
|
-
const okIds = new Set();
|
|
42
|
-
for (const p of prereqs) {
|
|
43
|
-
const unmet = (p.requires ?? []).filter(id => !okIds.has(id));
|
|
44
|
-
if (unmet.length > 0) {
|
|
45
|
-
steps.push(baseStep(p, 'pending'));
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
const step = await this.detectOne(p);
|
|
49
|
-
steps.push(step);
|
|
50
|
-
if (step.status === 'ok')
|
|
51
|
-
okIds.add(p.id);
|
|
52
|
-
}
|
|
53
|
-
this.cache.set(pkg.id, steps);
|
|
54
|
-
return steps;
|
|
55
|
-
}
|
|
56
|
-
async detectOne(p) {
|
|
57
|
-
if (p.detect.type !== 'exec') {
|
|
58
|
-
return baseStep(p, 'error', { hint: `Unknown detect type: ${p.detect.type}` });
|
|
59
|
-
}
|
|
60
|
-
const timeout = p.detect.timeoutMs ?? 5000;
|
|
61
|
-
let result;
|
|
62
|
-
try {
|
|
63
|
-
result = await this.exec.run(p.detect.command, p.detect.args, { timeout });
|
|
64
|
-
}
|
|
65
|
-
catch (e) {
|
|
66
|
-
const msg = e.message ?? '';
|
|
67
|
-
// TODO: fragile substring sniff — the ExecCapability contract does not
|
|
68
|
-
// define a recognizable timeout signal (no err.code, err.name, or
|
|
69
|
-
// { timedOut } flag). See packages/connector-sdk/src/capabilities.ts
|
|
70
|
-
// near ExecCapability for a proposed fix.
|
|
71
|
-
if (/timeout/i.test(msg))
|
|
72
|
-
return baseStep(p, 'error', { hint: 'Detection timed out' });
|
|
73
|
-
return baseStep(p, 'missing');
|
|
74
|
-
}
|
|
75
|
-
if (p.detect.matchStdout) {
|
|
76
|
-
const re = new RegExp(p.detect.matchStdout);
|
|
77
|
-
return re.test(result.stdout + result.stderr)
|
|
78
|
-
? baseStep(p, 'ok')
|
|
79
|
-
: baseStep(p, 'missing');
|
|
80
|
-
}
|
|
81
|
-
if (p.detect.versionRegex && p.minVersion) {
|
|
82
|
-
const vm = new RegExp(p.detect.versionRegex).exec(result.stdout);
|
|
83
|
-
if (!vm || !vm[1]) {
|
|
84
|
-
return baseStep(p, 'error', { hint: 'Could not parse version' });
|
|
85
|
-
}
|
|
86
|
-
const detectedVersion = vm[1];
|
|
87
|
-
// Normalize for semver: strip leading zeros from numeric segments so
|
|
88
|
-
// zero-padded CalVer (yt-dlp, Ubuntu, Postgres) like `2026.03.17`
|
|
89
|
-
// validates as `2026.3.17`. Ordering is preserved.
|
|
90
|
-
const normalizedDetected = stripLeadingZeros(detectedVersion);
|
|
91
|
-
const normalizedMin = stripLeadingZeros(p.minVersion);
|
|
92
|
-
if (!valid(normalizedDetected)) {
|
|
93
|
-
return baseStep(p, 'error', { hint: 'Could not parse detected version' });
|
|
94
|
-
}
|
|
95
|
-
if (gte(normalizedDetected, normalizedMin)) {
|
|
96
|
-
return baseStep(p, 'ok', { detectedVersion });
|
|
97
|
-
}
|
|
98
|
-
return baseStep(p, 'outdated', {
|
|
99
|
-
detectedVersion,
|
|
100
|
-
hint: `Detected ${detectedVersion}, requires ≥ ${p.minVersion}`,
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
return result.exitCode === 0 ? baseStep(p, 'ok') : baseStep(p, 'missing');
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
function stripLeadingZeros(version) {
|
|
107
|
-
return version.replace(/(^|\.)0+(\d)/g, '$1$2');
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=prerequisites.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../../src/connectors/prerequisites.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAEnC,SAAS,QAAQ,CAAC,CAAe,EAAE,MAAmB,EAAE,SAA6B,EAAE;IACrF,MAAM,IAAI,GAAc;QACtB,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,IAAI;QACb,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM;QACN,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,GAAG,MAAM;KACV,CAAA;IACD,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAA;IACrD,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;QAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAA;IAC/F,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,OAAO,mBAAmB;IAIV;IAHZ,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAA;IACtC,QAAQ,GAAG,IAAI,GAAG,EAAgC,CAAA;IAE1D,YAAoB,IAAoB;QAApB,SAAI,GAAJ,IAAI,CAAgB;IAAG,CAAC;IAE5C,SAAS,CAAC,SAAiB;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAClC,CAAC;IAED,UAAU,CAAC,SAAiB;QAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAqB;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC1C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAA;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QAC9E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAClC,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,GAAqB;QAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,IAAI,EAAE,CAAA;QACvC,MAAM,KAAK,GAAgB,EAAE,CAAA;QAC7B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;QAE/B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;YAC7D,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;gBAClC,SAAQ;YACV,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACpC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC3C,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;QAC7B,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,CAAe;QACrC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,wBAAyB,CAAC,CAAC,MAAc,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACzF,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAA;QAC1C,IAAI,MAA4D,CAAA;QAChE,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QAC5E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAI,CAAW,CAAC,OAAO,IAAI,EAAE,CAAA;YACtC,uEAAuE;YACvE,kEAAkE;YAClE,qEAAqE;YACrE,0CAA0C;YAC1C,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAA;YACtF,OAAO,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;QAC/B,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YAC3C,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC3C,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC;gBACnB,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;QAC5B,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC1C,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAChE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClB,OAAO,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC,CAAA;YAClE,CAAC;YACD,MAAM,eAAe,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;YAC7B,qEAAqE;YACrE,kEAAkE;YAClE,mDAAmD;YACnD,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAA;YAC7D,MAAM,aAAa,GAAG,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;YACrD,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC/B,OAAO,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,kCAAkC,EAAE,CAAC,CAAA;YAC3E,CAAC;YACD,IAAI,GAAG,CAAC,kBAAkB,EAAE,aAAa,CAAC,EAAE,CAAC;gBAC3C,OAAO,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,CAAC,CAAA;YAC/C,CAAC;YACD,OAAO,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE;gBAC7B,eAAe;gBACf,IAAI,EAAE,YAAY,eAAe,gBAAgB,CAAC,CAAC,UAAU,EAAE;aAChE,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IAC3E,CAAC;CACF;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;AACjD,CAAC"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export interface RegistryConnector {
|
|
2
|
-
name: string;
|
|
3
|
-
id: string;
|
|
4
|
-
platform: string;
|
|
5
|
-
label: string;
|
|
6
|
-
description: string;
|
|
7
|
-
color: string;
|
|
8
|
-
author: string;
|
|
9
|
-
category: string;
|
|
10
|
-
firstParty: boolean;
|
|
11
|
-
bundled: boolean;
|
|
12
|
-
npm: string;
|
|
13
|
-
}
|
|
14
|
-
interface FetchRegistryOpts {
|
|
15
|
-
fetchFn?: typeof fetch;
|
|
16
|
-
cacheDir: string;
|
|
17
|
-
/** Override source. HTTP(S) URL, file:// URL, or absolute filesystem path. */
|
|
18
|
-
url?: string;
|
|
19
|
-
}
|
|
20
|
-
export declare function fetchRegistry(opts: FetchRegistryOpts): Promise<RegistryConnector[]>;
|
|
21
|
-
export {};
|
|
22
|
-
//# sourceMappingURL=registry-fetch.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry-fetch.d.ts","sourceRoot":"","sources":["../../src/connectors/registry-fetch.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,UAAU,iBAAiB;IACzB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAaD,wBAAsB,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAyBzF"}
|