@studio-foundation/cli 0.11.1 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -30
- package/dist/commands/init.d.ts +7 -3
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +17 -21
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/integrations.d.ts.map +1 -1
- package/dist/commands/integrations.js +20 -28
- package/dist/commands/integrations.js.map +1 -1
- package/dist/commands/marketplace.d.ts +17 -0
- package/dist/commands/marketplace.d.ts.map +1 -0
- package/dist/commands/marketplace.js +132 -0
- package/dist/commands/marketplace.js.map +1 -0
- package/dist/commands/plugin.d.ts +8 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +42 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/registry/audit.d.ts +2 -1
- package/dist/commands/registry/audit.d.ts.map +1 -1
- package/dist/commands/registry/audit.js +32 -22
- package/dist/commands/registry/audit.js.map +1 -1
- package/dist/commands/registry/index.d.ts.map +1 -1
- package/dist/commands/registry/index.js +4 -3
- package/dist/commands/registry/index.js.map +1 -1
- package/dist/commands/registry/install.d.ts +4 -2
- package/dist/commands/registry/install.d.ts.map +1 -1
- package/dist/commands/registry/install.js +132 -73
- package/dist/commands/registry/install.js.map +1 -1
- package/dist/commands/registry/remove.d.ts.map +1 -1
- package/dist/commands/registry/remove.js +11 -25
- package/dist/commands/registry/remove.js.map +1 -1
- package/dist/commands/registry/search.d.ts +1 -1
- package/dist/commands/registry/search.d.ts.map +1 -1
- package/dist/commands/registry/search.js +33 -17
- package/dist/commands/registry/search.js.map +1 -1
- package/dist/commands/registry/sync.d.ts +1 -0
- package/dist/commands/registry/sync.d.ts.map +1 -1
- package/dist/commands/registry/sync.js +46 -12
- package/dist/commands/registry/sync.js.map +1 -1
- package/dist/commands/registry/update.d.ts +14 -2
- package/dist/commands/registry/update.d.ts.map +1 -1
- package/dist/commands/registry/update.js +70 -18
- package/dist/commands/registry/update.js.map +1 -1
- package/dist/commands/templates.d.ts.map +1 -1
- package/dist/commands/templates.js +13 -16
- package/dist/commands/templates.js.map +1 -1
- package/dist/commands/tools.d.ts.map +1 -1
- package/dist/commands/tools.js +6 -2
- package/dist/commands/tools.js.map +1 -1
- package/dist/commands/upgrade.d.ts +3 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +79 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/generated/bundled-assets.d.ts +1 -1
- package/dist/generated/bundled-assets.d.ts.map +1 -1
- package/dist/generated/bundled-assets.js +77 -2
- package/dist/generated/bundled-assets.js.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/output/map-progress.d.ts +11 -1
- package/dist/output/map-progress.d.ts.map +1 -1
- package/dist/output/map-progress.js +43 -4
- package/dist/output/map-progress.js.map +1 -1
- package/dist/output/progress.d.ts.map +1 -1
- package/dist/output/progress.js +1 -1
- package/dist/output/progress.js.map +1 -1
- package/dist/registry/cache.d.ts +1 -1
- package/dist/registry/cache.d.ts.map +1 -1
- package/dist/registry/cache.js +3 -2
- package/dist/registry/cache.js.map +1 -1
- package/dist/registry/client.d.ts +20 -11
- package/dist/registry/client.d.ts.map +1 -1
- package/dist/registry/client.js +145 -45
- package/dist/registry/client.js.map +1 -1
- package/dist/registry/constraints.d.ts +17 -0
- package/dist/registry/constraints.d.ts.map +1 -0
- package/dist/registry/constraints.js +30 -0
- package/dist/registry/constraints.js.map +1 -0
- package/dist/registry/dependency-spec.d.ts +15 -0
- package/dist/registry/dependency-spec.d.ts.map +1 -0
- package/dist/registry/dependency-spec.js +17 -0
- package/dist/registry/dependency-spec.js.map +1 -0
- package/dist/registry/git-source.d.ts +16 -0
- package/dist/registry/git-source.d.ts.map +1 -0
- package/dist/registry/git-source.js +92 -0
- package/dist/registry/git-source.js.map +1 -0
- package/dist/registry/legacy-paths.d.ts +3 -0
- package/dist/registry/legacy-paths.d.ts.map +1 -0
- package/dist/registry/legacy-paths.js +31 -0
- package/dist/registry/legacy-paths.js.map +1 -0
- package/dist/registry/lockfile.d.ts +5 -1
- package/dist/registry/lockfile.d.ts.map +1 -1
- package/dist/registry/lockfile.js +28 -7
- package/dist/registry/lockfile.js.map +1 -1
- package/dist/registry/marketplaces.d.ts +23 -0
- package/dist/registry/marketplaces.d.ts.map +1 -0
- package/dist/registry/marketplaces.js +83 -0
- package/dist/registry/marketplaces.js.map +1 -0
- package/dist/registry/registry-index.d.ts +36 -0
- package/dist/registry/registry-index.d.ts.map +1 -0
- package/dist/registry/registry-index.js +57 -0
- package/dist/registry/registry-index.js.map +1 -0
- package/dist/registry/resolver.d.ts +15 -3
- package/dist/registry/resolver.d.ts.map +1 -1
- package/dist/registry/resolver.js +82 -72
- package/dist/registry/resolver.js.map +1 -1
- package/dist/registry/seed.d.ts +10 -0
- package/dist/registry/seed.d.ts.map +1 -0
- package/dist/registry/seed.js +25 -0
- package/dist/registry/seed.js.map +1 -0
- package/dist/registry/types.d.ts +66 -7
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry/types.js +28 -8
- package/dist/registry/types.js.map +1 -1
- package/dist/registry/verify.d.ts +15 -0
- package/dist/registry/verify.d.ts.map +1 -0
- package/dist/registry/verify.js +86 -0
- package/dist/registry/verify.js.map +1 -0
- package/dist/upgrade.d.ts +28 -0
- package/dist/upgrade.d.ts.map +1 -0
- package/dist/upgrade.js +64 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/version-guard.d.ts +3 -1
- package/dist/version-guard.d.ts.map +1 -1
- package/dist/version-guard.js +8 -2
- package/dist/version-guard.js.map +1 -1
- package/package.json +12 -12
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { mkdir, rm, rename, stat } from 'node:fs/promises';
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
import { resolve } from 'node:path';
|
|
6
|
+
import { homedir } from 'node:os';
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
const run = promisify(execFile);
|
|
9
|
+
/** How long an unpinned clone (a marketplace repo) is reused before refetching. */
|
|
10
|
+
const HEAD_TTL_MS = 24 * 60 * 60 * 1000;
|
|
11
|
+
function cacheRoot() {
|
|
12
|
+
return resolve(homedir(), '.cache', 'studio', 'git');
|
|
13
|
+
}
|
|
14
|
+
/** The commit `ref` points at upstream right now, peeling annotated tags. */
|
|
15
|
+
async function remoteSha(url, ref) {
|
|
16
|
+
const { stdout } = await run('git', ['ls-remote', url, ref, `${ref}^{}`]);
|
|
17
|
+
const lines = stdout.trim().split('\n').filter(Boolean);
|
|
18
|
+
if (lines.length === 0)
|
|
19
|
+
return null;
|
|
20
|
+
const peeled = lines.find((l) => l.endsWith('^{}'));
|
|
21
|
+
return (peeled ?? lines[0]).split('\t')[0];
|
|
22
|
+
}
|
|
23
|
+
async function fetchPinned(url, ref, sha, dir) {
|
|
24
|
+
await mkdir(dir, { recursive: true });
|
|
25
|
+
await run('git', ['init', '-q', dir]);
|
|
26
|
+
await run('git', ['-C', dir, 'remote', 'add', 'origin', url]);
|
|
27
|
+
try {
|
|
28
|
+
await run('git', ['-C', dir, 'fetch', '-q', '--depth', '1', 'origin', sha]);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Servers that refuse a by-sha fetch still serve the ref; the checkout below
|
|
32
|
+
// is what proves the sha is actually in what we got.
|
|
33
|
+
await run('git', ['-C', dir, 'fetch', '-q', '--depth', '1', 'origin', ref]);
|
|
34
|
+
}
|
|
35
|
+
await run('git', ['-C', dir, 'checkout', '-q', sha]);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Fetch a git-sourced package or marketplace and return the local directory.
|
|
39
|
+
*
|
|
40
|
+
* A pinned checkout is verified against its ref before anything is read: if the
|
|
41
|
+
* upstream tag or branch no longer points at the recorded commit, the entry has
|
|
42
|
+
* been changed under us and the install fails rather than resolving to either one.
|
|
43
|
+
*/
|
|
44
|
+
export async function materializeGit(target, root = cacheRoot()) {
|
|
45
|
+
if (target.sha) {
|
|
46
|
+
if (!target.ref)
|
|
47
|
+
throw new Error(`Git source for ${target.url} pins a sha but declares no ref.`);
|
|
48
|
+
const upstream = await remoteSha(target.url, target.ref);
|
|
49
|
+
if (!upstream) {
|
|
50
|
+
throw new Error(`Ref '${target.ref}' not found in ${target.url}.`);
|
|
51
|
+
}
|
|
52
|
+
if (upstream !== target.sha) {
|
|
53
|
+
throw new Error(`Pinned sha mismatch for ${target.url}: the entry pins ${target.sha}, ` +
|
|
54
|
+
`but '${target.ref}' now points at ${upstream}. Refusing to install.`);
|
|
55
|
+
}
|
|
56
|
+
const dir = resolve(root, target.sha);
|
|
57
|
+
if (existsSync(dir))
|
|
58
|
+
return dir;
|
|
59
|
+
const staging = `${dir}.partial`;
|
|
60
|
+
await rm(staging, { recursive: true, force: true });
|
|
61
|
+
try {
|
|
62
|
+
await fetchPinned(target.url, target.ref, target.sha, staging);
|
|
63
|
+
await rename(staging, dir);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
await rm(staging, { recursive: true, force: true });
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
return dir;
|
|
70
|
+
}
|
|
71
|
+
const key = createHash('sha256').update(`${target.url}#${target.ref ?? ''}`).digest('hex').slice(0, 16);
|
|
72
|
+
const dir = resolve(root, `head-${key}`);
|
|
73
|
+
if (existsSync(dir)) {
|
|
74
|
+
const age = Date.now() - (await stat(dir)).mtimeMs;
|
|
75
|
+
if (age < HEAD_TTL_MS)
|
|
76
|
+
return dir;
|
|
77
|
+
await rm(dir, { recursive: true, force: true });
|
|
78
|
+
}
|
|
79
|
+
const staging = `${dir}.partial`;
|
|
80
|
+
await rm(staging, { recursive: true, force: true });
|
|
81
|
+
try {
|
|
82
|
+
const branch = target.ref ? ['--branch', target.ref] : [];
|
|
83
|
+
await run('git', ['clone', '-q', '--depth', '1', ...branch, target.url, staging]);
|
|
84
|
+
await rename(staging, dir);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
await rm(staging, { recursive: true, force: true });
|
|
88
|
+
throw err;
|
|
89
|
+
}
|
|
90
|
+
return dir;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=git-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-source.js","sourceRoot":"","sources":["../../src/registry/git-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEhC,mFAAmF;AACnF,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAUxC,SAAS,SAAS;IAChB,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,6EAA6E;AAC7E,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,GAAW;IAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW;IAC3E,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,6EAA6E;QAC7E,qDAAqD;QACrD,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAmB,EAAE,IAAI,GAAG,SAAS,EAAE;IAC1E,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,CAAC,GAAG,kCAAkC,CAAC,CAAC;QACjG,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,CAAC,GAAG,kBAAkB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,QAAQ,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CACb,2BAA2B,MAAM,CAAC,GAAG,oBAAoB,MAAM,CAAC,GAAG,IAAI;gBACvE,QAAQ,MAAM,CAAC,GAAG,mBAAmB,QAAQ,wBAAwB,CACtE,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QAEhC,MAAM,OAAO,GAAG,GAAG,GAAG,UAAU,CAAC;QACjC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxG,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;QACnD,IAAI,GAAG,GAAG,WAAW;YAAE,OAAO,GAAG,CAAC;QAClC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,GAAG,UAAU,CAAC;IACjC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QAClF,MAAM,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-paths.d.ts","sourceRoot":"","sources":["../../src/registry/legacy-paths.ts"],"names":[],"mappings":"AAuBA,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKvE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a package installed by a pre-`files` CLI landed, so `remove` and `audit`
|
|
3
|
+
* still find it. Lockfiles written before ADR 0002 record one of the seven old
|
|
4
|
+
* package types and no file list; paths had to be derived from the type.
|
|
5
|
+
*/
|
|
6
|
+
const LEGACY_DIRS = {
|
|
7
|
+
tool: 'tools',
|
|
8
|
+
template: 'projects',
|
|
9
|
+
pipeline: 'pipelines',
|
|
10
|
+
integration: 'integrations',
|
|
11
|
+
agent: 'agents',
|
|
12
|
+
plugin: 'plugins',
|
|
13
|
+
skill: 'skills',
|
|
14
|
+
};
|
|
15
|
+
const LEGACY_EXTENSIONS = {
|
|
16
|
+
tool: '.tool.yaml',
|
|
17
|
+
pipeline: '.pipeline.yaml',
|
|
18
|
+
integration: '.integration.yaml',
|
|
19
|
+
agent: '.agent.yaml',
|
|
20
|
+
skill: '.skill.md',
|
|
21
|
+
};
|
|
22
|
+
/** Paths relative to `.studio/`. Empty when the type is unknown. */
|
|
23
|
+
export function legacyInstallPaths(name, type) {
|
|
24
|
+
const dir = LEGACY_DIRS[type];
|
|
25
|
+
if (!dir)
|
|
26
|
+
return [];
|
|
27
|
+
if (type === 'template' || type === 'plugin')
|
|
28
|
+
return [`${dir}/${name}`];
|
|
29
|
+
return [`${dir}/${name}${LEGACY_EXTENSIONS[type] ?? '.yaml'}`];
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=legacy-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-paths.js","sourceRoot":"","sources":["../../src/registry/legacy-paths.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,GAA2B;IAC1C,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,WAAW;IACrB,WAAW,EAAE,cAAc;IAC3B,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,MAAM,iBAAiB,GAA2B;IAChD,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE,gBAAgB;IAC1B,WAAW,EAAE,mBAAmB;IAChC,KAAK,EAAE,aAAa;IACpB,KAAK,EAAE,WAAW;CACnB,CAAC;AAEF,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,IAAY;IAC3D,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -5,13 +5,17 @@ export declare class RegistryLockfile {
|
|
|
5
5
|
constructor(studioDir: string);
|
|
6
6
|
read(): Promise<Lockfile>;
|
|
7
7
|
private write;
|
|
8
|
+
/**
|
|
9
|
+
* Dependents survive a reinstall: `--force` rewrites the payload fields, not the
|
|
10
|
+
* graph, so `studio registry update` can't orphan an entry it just refreshed.
|
|
11
|
+
*/
|
|
8
12
|
add(name: string, entry: LockfileEntry): Promise<void>;
|
|
9
13
|
remove(name: string): Promise<void>;
|
|
10
14
|
get(name: string): Promise<LockfileEntry | null>;
|
|
11
15
|
list(): Promise<Array<{
|
|
12
16
|
name: string;
|
|
13
17
|
} & LockfileEntry>>;
|
|
14
|
-
addRequiredBy(name: string, requiredBy: string): Promise<void>;
|
|
18
|
+
addRequiredBy(name: string, requiredBy: string, range?: string): Promise<void>;
|
|
15
19
|
removeRequiredBy(name: string, requiredBy: string): Promise<void>;
|
|
16
20
|
}
|
|
17
21
|
//# sourceMappingURL=lockfile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../src/registry/lockfile.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAKvB,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC;YASjB,KAAK;
|
|
1
|
+
{"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../src/registry/lockfile.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,EAAE,MAAM;IAKvB,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC;YASjB,KAAK;IAKnB;;;OAGG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAatD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAKhD,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAC,CAAC;IAKxD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9E,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAaxE"}
|
|
@@ -20,9 +20,20 @@ export class RegistryLockfile {
|
|
|
20
20
|
await mkdir(this.studioDir, { recursive: true });
|
|
21
21
|
await writeFile(this.lockPath, JSON.stringify(data, null, 2) + '\n');
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Dependents survive a reinstall: `--force` rewrites the payload fields, not the
|
|
25
|
+
* graph, so `studio registry update` can't orphan an entry it just refreshed.
|
|
26
|
+
*/
|
|
23
27
|
async add(name, entry) {
|
|
24
28
|
const data = await this.read();
|
|
25
|
-
data.installed[name]
|
|
29
|
+
const previous = data.installed[name];
|
|
30
|
+
const required_by = [...new Set([...(previous?.required_by ?? []), ...(entry.required_by ?? [])])];
|
|
31
|
+
const constraints = { ...previous?.constraints, ...entry.constraints };
|
|
32
|
+
data.installed[name] = {
|
|
33
|
+
...entry,
|
|
34
|
+
required_by,
|
|
35
|
+
...(Object.keys(constraints).length > 0 ? { constraints } : {}),
|
|
36
|
+
};
|
|
26
37
|
await this.write(data);
|
|
27
38
|
}
|
|
28
39
|
async remove(name) {
|
|
@@ -38,23 +49,33 @@ export class RegistryLockfile {
|
|
|
38
49
|
const data = await this.read();
|
|
39
50
|
return Object.entries(data.installed).map(([name, entry]) => ({ name, ...entry }));
|
|
40
51
|
}
|
|
41
|
-
async addRequiredBy(name, requiredBy) {
|
|
52
|
+
async addRequiredBy(name, requiredBy, range) {
|
|
42
53
|
const data = await this.read();
|
|
43
54
|
const entry = data.installed[name];
|
|
44
55
|
if (!entry)
|
|
45
56
|
return;
|
|
46
57
|
const existing = entry.required_by ?? [];
|
|
47
|
-
if (
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
58
|
+
if (existing.includes(requiredBy) && entry.constraints?.[requiredBy] === range)
|
|
59
|
+
return;
|
|
60
|
+
data.installed[name] = {
|
|
61
|
+
...entry,
|
|
62
|
+
required_by: existing.includes(requiredBy) ? existing : [...existing, requiredBy],
|
|
63
|
+
...(range ? { constraints: { ...entry.constraints, [requiredBy]: range } } : {}),
|
|
64
|
+
};
|
|
65
|
+
await this.write(data);
|
|
51
66
|
}
|
|
52
67
|
async removeRequiredBy(name, requiredBy) {
|
|
53
68
|
const data = await this.read();
|
|
54
69
|
const entry = data.installed[name];
|
|
55
70
|
if (!entry)
|
|
56
71
|
return;
|
|
57
|
-
|
|
72
|
+
const constraints = { ...entry.constraints };
|
|
73
|
+
delete constraints[requiredBy];
|
|
74
|
+
data.installed[name] = {
|
|
75
|
+
...entry,
|
|
76
|
+
required_by: (entry.required_by ?? []).filter(r => r !== requiredBy),
|
|
77
|
+
...(Object.keys(constraints).length > 0 ? { constraints } : { constraints: undefined }),
|
|
78
|
+
};
|
|
58
79
|
await this.write(data);
|
|
59
80
|
}
|
|
60
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/registry/lockfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,OAAO,gBAAgB;IACnB,QAAQ,CAAS;IACjB,SAAS,CAAS;IAE1B,YAAY,SAAiB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,IAAc;QAChC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,KAAoB;QAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/registry/lockfile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface Marketplace {
|
|
2
|
+
name: string;
|
|
3
|
+
url: string;
|
|
4
|
+
}
|
|
5
|
+
export declare const DEFAULT_MARKETPLACE_ENTRY: Marketplace;
|
|
6
|
+
/**
|
|
7
|
+
* A marketplace is a property of the machine, not of a checkout: the same private
|
|
8
|
+
* marketplace serves every project on it, and a project must not be able to point
|
|
9
|
+
* its own installs at an unreviewed source.
|
|
10
|
+
*/
|
|
11
|
+
export declare function marketplacesPath(): string;
|
|
12
|
+
/** The default marketplace first, then whatever the user registered. */
|
|
13
|
+
export declare function loadMarketplaces(file?: string): Promise<Marketplace[]>;
|
|
14
|
+
export declare function findMarketplace(name: string, file?: string): Promise<Marketplace>;
|
|
15
|
+
export declare function addMarketplace(entry: Marketplace, file?: string): Promise<void>;
|
|
16
|
+
export declare function removeMarketplace(name: string, file?: string): Promise<void>;
|
|
17
|
+
/** `owner/repo` when the URL is a GitHub remote, else null — the raw/API fast path. */
|
|
18
|
+
export declare function githubRepoOf(url: string): string | null;
|
|
19
|
+
export declare function rawBaseOf(repo: string): string;
|
|
20
|
+
export declare function apiBaseOf(repo: string): string;
|
|
21
|
+
/** Default name for `studio marketplace add <url>`: the repository name. */
|
|
22
|
+
export declare function marketplaceNameFromUrl(url: string): string;
|
|
23
|
+
//# sourceMappingURL=marketplaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplaces.d.ts","sourceRoot":"","sources":["../../src/registry/marketplaces.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,yBAAyB,EAAE,WAGvC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAMD,wEAAwE;AACxE,wBAAsB,gBAAgB,CAAC,IAAI,SAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAUxF;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAQvF;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,SAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBjG;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW9F;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGvD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK1D"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { resolve, dirname } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { DEFAULT_MARKETPLACE } from './dependency-spec.js';
|
|
5
|
+
import { REGISTRY_REPO } from './types.js';
|
|
6
|
+
export const DEFAULT_MARKETPLACE_ENTRY = {
|
|
7
|
+
name: DEFAULT_MARKETPLACE,
|
|
8
|
+
url: `https://github.com/${REGISTRY_REPO}.git`,
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* A marketplace is a property of the machine, not of a checkout: the same private
|
|
12
|
+
* marketplace serves every project on it, and a project must not be able to point
|
|
13
|
+
* its own installs at an unreviewed source.
|
|
14
|
+
*/
|
|
15
|
+
export function marketplacesPath() {
|
|
16
|
+
return resolve(homedir(), '.studio', 'marketplaces.json');
|
|
17
|
+
}
|
|
18
|
+
/** The default marketplace first, then whatever the user registered. */
|
|
19
|
+
export async function loadMarketplaces(file = marketplacesPath()) {
|
|
20
|
+
let raw;
|
|
21
|
+
try {
|
|
22
|
+
raw = await readFile(file, 'utf8');
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return [DEFAULT_MARKETPLACE_ENTRY];
|
|
26
|
+
}
|
|
27
|
+
const data = JSON.parse(raw);
|
|
28
|
+
const registered = (data.marketplaces ?? []).filter((m) => m.name !== DEFAULT_MARKETPLACE);
|
|
29
|
+
return [DEFAULT_MARKETPLACE_ENTRY, ...registered];
|
|
30
|
+
}
|
|
31
|
+
export async function findMarketplace(name, file) {
|
|
32
|
+
const found = (await loadMarketplaces(file)).find((m) => m.name === name);
|
|
33
|
+
if (!found) {
|
|
34
|
+
throw new Error(`Marketplace '${name}' is not registered. Run: studio marketplace add <url> --name ${name}`);
|
|
35
|
+
}
|
|
36
|
+
return found;
|
|
37
|
+
}
|
|
38
|
+
export async function addMarketplace(entry, file = marketplacesPath()) {
|
|
39
|
+
if (entry.name === DEFAULT_MARKETPLACE) {
|
|
40
|
+
throw new Error(`'${DEFAULT_MARKETPLACE}' is the default marketplace and is always available.`);
|
|
41
|
+
}
|
|
42
|
+
const existing = (await loadMarketplaces(file)).find((m) => m.name === entry.name);
|
|
43
|
+
if (existing && existing.url !== entry.url) {
|
|
44
|
+
throw new Error(`Marketplace '${entry.name}' is already registered as ${existing.url}. ` +
|
|
45
|
+
`Remove it first, or add this one under another name with --name.`);
|
|
46
|
+
}
|
|
47
|
+
const others = (await loadMarketplaces(file)).filter((m) => m.name !== DEFAULT_MARKETPLACE && m.name !== entry.name);
|
|
48
|
+
await mkdir(dirname(file), { recursive: true });
|
|
49
|
+
const data = { marketplaces: [...others, entry] };
|
|
50
|
+
await writeFile(file, JSON.stringify(data, null, 2) + '\n');
|
|
51
|
+
}
|
|
52
|
+
export async function removeMarketplace(name, file = marketplacesPath()) {
|
|
53
|
+
if (name === DEFAULT_MARKETPLACE) {
|
|
54
|
+
throw new Error(`'${DEFAULT_MARKETPLACE}' is the default marketplace and cannot be removed.`);
|
|
55
|
+
}
|
|
56
|
+
const registered = (await loadMarketplaces(file)).filter((m) => m.name !== DEFAULT_MARKETPLACE);
|
|
57
|
+
if (!registered.some((m) => m.name === name)) {
|
|
58
|
+
throw new Error(`Marketplace '${name}' is not registered.`);
|
|
59
|
+
}
|
|
60
|
+
await mkdir(dirname(file), { recursive: true });
|
|
61
|
+
const data = { marketplaces: registered.filter((m) => m.name !== name) };
|
|
62
|
+
await writeFile(file, JSON.stringify(data, null, 2) + '\n');
|
|
63
|
+
}
|
|
64
|
+
/** `owner/repo` when the URL is a GitHub remote, else null — the raw/API fast path. */
|
|
65
|
+
export function githubRepoOf(url) {
|
|
66
|
+
const match = /^(?:https?:\/\/github\.com\/|git@github\.com:)([^/]+\/[^/]+?)(?:\.git)?\/?$/.exec(url.trim());
|
|
67
|
+
return match ? match[1] : null;
|
|
68
|
+
}
|
|
69
|
+
export function rawBaseOf(repo) {
|
|
70
|
+
return `https://raw.githubusercontent.com/${repo}/main`;
|
|
71
|
+
}
|
|
72
|
+
export function apiBaseOf(repo) {
|
|
73
|
+
return `https://api.github.com/repos/${repo}`;
|
|
74
|
+
}
|
|
75
|
+
/** Default name for `studio marketplace add <url>`: the repository name. */
|
|
76
|
+
export function marketplaceNameFromUrl(url) {
|
|
77
|
+
const trimmed = url.trim().replace(/\/+$/, '').replace(/\.git$/, '');
|
|
78
|
+
const name = trimmed.slice(trimmed.lastIndexOf('/') + 1).trim();
|
|
79
|
+
if (!name)
|
|
80
|
+
throw new Error(`Cannot derive a marketplace name from '${url}' — pass --name.`);
|
|
81
|
+
return name;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=marketplaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplaces.js","sourceRoot":"","sources":["../../src/registry/marketplaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Marketplace } from './marketplaces.js';
|
|
2
|
+
import type { PackageEntry } from './types.js';
|
|
3
|
+
/** An index entry knows which marketplace served it — names are unique per marketplace, not globally. */
|
|
4
|
+
export interface IndexedPackage extends PackageEntry {
|
|
5
|
+
marketplace: string;
|
|
6
|
+
}
|
|
7
|
+
export interface MergedIndex {
|
|
8
|
+
packages: IndexedPackage[];
|
|
9
|
+
marketplaces: Marketplace[];
|
|
10
|
+
}
|
|
11
|
+
interface LoadOptions {
|
|
12
|
+
cacheDir?: string;
|
|
13
|
+
marketplacesFile?: string;
|
|
14
|
+
/** Stand in for an uncached default marketplace with the bundled snapshot. */
|
|
15
|
+
seed?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** Every registered marketplace's cached index, merged. Assumes `syncRegistry` ran. */
|
|
18
|
+
export declare function loadMergedIndex(options?: LoadOptions): Promise<MergedIndex>;
|
|
19
|
+
/**
|
|
20
|
+
* Every index entry for one package name, newest-first ordering left as published.
|
|
21
|
+
*
|
|
22
|
+
* An unqualified name that exists in more than one marketplace is an error, never
|
|
23
|
+
* a pick: which one wins would otherwise depend on registration order.
|
|
24
|
+
*/
|
|
25
|
+
export declare function candidatesFor(packages: IndexedPackage[], name: string, marketplace?: string): IndexedPackage[];
|
|
26
|
+
export interface PackageRef {
|
|
27
|
+
marketplace?: string;
|
|
28
|
+
name: string;
|
|
29
|
+
version?: string;
|
|
30
|
+
}
|
|
31
|
+
/** A package as typed on the command line: `[marketplace:]name[@version]`. */
|
|
32
|
+
export declare function parsePackageRef(raw: string): PackageRef;
|
|
33
|
+
/** The index entry to install for `name[@version]`, or null when there is none. */
|
|
34
|
+
export declare function entryFor(packages: IndexedPackage[], name: string, version?: string, marketplace?: string): IndexedPackage | null;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=registry-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-index.d.ts","sourceRoot":"","sources":["../../src/registry/registry-index.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,yGAAyG;AACzG,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8EAA8E;IAC9E,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,uFAAuF;AACvF,wBAAsB,eAAe,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAYrF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,cAAc,EAAE,EAC1B,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,GACnB,cAAc,EAAE,CAYlB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAUvD;AAED,mFAAmF;AACnF,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,cAAc,EAAE,EAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,cAAc,GAAG,IAAI,CAIvB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { RegistryCache } from './cache.js';
|
|
2
|
+
import { loadMarketplaces } from './marketplaces.js';
|
|
3
|
+
import { DEFAULT_MARKETPLACE } from './dependency-spec.js';
|
|
4
|
+
import { seedIndex } from './seed.js';
|
|
5
|
+
/** Every registered marketplace's cached index, merged. Assumes `syncRegistry` ran. */
|
|
6
|
+
export async function loadMergedIndex(options = {}) {
|
|
7
|
+
const marketplaces = await loadMarketplaces(options.marketplacesFile);
|
|
8
|
+
const packages = [];
|
|
9
|
+
for (const marketplace of marketplaces) {
|
|
10
|
+
// The snapshot only ever stands in for the marketplace it was bundled from,
|
|
11
|
+
// and only where an empty listing would be a failure rather than a fact.
|
|
12
|
+
const seeded = options.seed && marketplace.name === DEFAULT_MARKETPLACE ? seedIndex() : null;
|
|
13
|
+
const index = await new RegistryCache(options.cacheDir, marketplace.name).read() ?? seeded;
|
|
14
|
+
if (!index)
|
|
15
|
+
continue;
|
|
16
|
+
packages.push(...index.packages.map((p) => ({ ...p, marketplace: marketplace.name })));
|
|
17
|
+
}
|
|
18
|
+
return { packages, marketplaces };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Every index entry for one package name, newest-first ordering left as published.
|
|
22
|
+
*
|
|
23
|
+
* An unqualified name that exists in more than one marketplace is an error, never
|
|
24
|
+
* a pick: which one wins would otherwise depend on registration order.
|
|
25
|
+
*/
|
|
26
|
+
export function candidatesFor(packages, name, marketplace) {
|
|
27
|
+
const byName = packages.filter((p) => p.name === name);
|
|
28
|
+
if (marketplace)
|
|
29
|
+
return byName.filter((p) => p.marketplace === marketplace);
|
|
30
|
+
const owners = [...new Set(byName.map((p) => p.marketplace))];
|
|
31
|
+
if (owners.length > 1) {
|
|
32
|
+
throw new Error(`Package '${name}' exists in several marketplaces (${owners.join(', ')}). ` +
|
|
33
|
+
`Qualify it: ${owners.map((m) => `${m}:${name}`).join(' or ')}.`);
|
|
34
|
+
}
|
|
35
|
+
return byName;
|
|
36
|
+
}
|
|
37
|
+
/** A package as typed on the command line: `[marketplace:]name[@version]`. */
|
|
38
|
+
export function parsePackageRef(raw) {
|
|
39
|
+
const trimmed = raw.trim();
|
|
40
|
+
const colon = trimmed.indexOf(':');
|
|
41
|
+
const marketplace = colon === -1 ? undefined : trimmed.slice(0, colon).trim();
|
|
42
|
+
const rest = colon === -1 ? trimmed : trimmed.slice(colon + 1).trim();
|
|
43
|
+
const [name, version] = rest.split('@');
|
|
44
|
+
if (!name)
|
|
45
|
+
throw new Error(`Invalid package name: '${raw}'`);
|
|
46
|
+
if (colon !== -1 && !marketplace)
|
|
47
|
+
throw new Error(`Invalid package name: '${raw}' — empty marketplace`);
|
|
48
|
+
return { marketplace, name, version: version || undefined };
|
|
49
|
+
}
|
|
50
|
+
/** The index entry to install for `name[@version]`, or null when there is none. */
|
|
51
|
+
export function entryFor(packages, name, version, marketplace) {
|
|
52
|
+
const candidates = candidatesFor(packages, name, marketplace);
|
|
53
|
+
if (candidates.length === 0)
|
|
54
|
+
return null;
|
|
55
|
+
return (version && candidates.find((c) => c.version === version)) || candidates[0];
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=registry-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-index.js","sourceRoot":"","sources":["../../src/registry/registry-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,25 @@
|
|
|
1
|
-
import type { PackageMetadata, PackageType,
|
|
1
|
+
import type { PackageMetadata, PackageType, Lockfile } from './types.js';
|
|
2
|
+
import { type Constraint } from './constraints.js';
|
|
3
|
+
import { type IndexedPackage } from './registry-index.js';
|
|
2
4
|
export interface DependencyNode {
|
|
3
5
|
name: string;
|
|
6
|
+
marketplace: string;
|
|
4
7
|
type: PackageType;
|
|
8
|
+
version: string;
|
|
9
|
+
/** Every range declared on this node, so the caller can record its own. */
|
|
10
|
+
constraints: Constraint[];
|
|
5
11
|
}
|
|
6
12
|
export interface ResolvedGraph {
|
|
7
13
|
required: DependencyNode[];
|
|
8
14
|
recommended: DependencyNode[];
|
|
9
15
|
}
|
|
10
|
-
type MetadataFetcher = (name: string) => Promise<PackageMetadata>;
|
|
11
|
-
export
|
|
16
|
+
type MetadataFetcher = (name: string, marketplace: string) => Promise<PackageMetadata>;
|
|
17
|
+
export interface ResolveOptions {
|
|
18
|
+
/** Marketplace of the package being resolved — where its unqualified deps resolve. */
|
|
19
|
+
marketplace: string;
|
|
20
|
+
/** Names of every registered marketplace. A dependency may name no other. */
|
|
21
|
+
registered: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare function resolveDependencies(rootPackageName: string, meta: PackageMetadata, packages: IndexedPackage[], _lockfile: Lockfile, fetchMeta: MetadataFetcher, options: ResolveOptions): Promise<ResolvedGraph>;
|
|
12
24
|
export {};
|
|
13
25
|
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/registry/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/registry/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ,EAAuB,MAAM,YAAY,CAAC;AAE9F,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,KAAK,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,sFAAsF;IACtF,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAkCD,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,cAAc,EAAE,EAC1B,SAAS,EAAE,QAAQ,EACnB,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAwExB"}
|