@adaptabletools/adaptable-mcp 0.0.0-stage → 0.1.0-canary.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/README.md +90 -2
- package/data/manifest.snapshot.json +184 -0
- package/dist/bin.js +16 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/build-commands.js +200 -0
- package/dist/cli/build-commands.js.map +1 -0
- package/dist/cli/index.js +86 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/render.js +57 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/core/capabilities.js +99 -0
- package/dist/core/capabilities.js.map +1 -0
- package/dist/core/compat/capabilities.js +127 -0
- package/dist/core/compat/capabilities.js.map +1 -0
- package/dist/core/compat/manifest.js +203 -0
- package/dist/core/compat/manifest.js.map +1 -0
- package/dist/core/constants.js +38 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/context/capabilities.js +106 -0
- package/dist/core/context/capabilities.js.map +1 -0
- package/dist/core/context/detect.js +370 -0
- package/dist/core/context/detect.js.map +1 -0
- package/dist/core/context/projects.js +159 -0
- package/dist/core/context/projects.js.map +1 -0
- package/dist/core/context/resolve.js +85 -0
- package/dist/core/context/resolve.js.map +1 -0
- package/dist/core/docs/areas.js +22 -0
- package/dist/core/docs/areas.js.map +1 -0
- package/dist/core/docs/cache.js +133 -0
- package/dist/core/docs/cache.js.map +1 -0
- package/dist/core/docs/capabilities.js +381 -0
- package/dist/core/docs/capabilities.js.map +1 -0
- package/dist/core/docs/corpus.js +114 -0
- package/dist/core/docs/corpus.js.map +1 -0
- package/dist/core/docs/demos.js +105 -0
- package/dist/core/docs/demos.js.map +1 -0
- package/dist/core/docs/get-page.js +182 -0
- package/dist/core/docs/get-page.js.map +1 -0
- package/dist/core/docs/hosts.js +74 -0
- package/dist/core/docs/hosts.js.map +1 -0
- package/dist/core/docs/search.js +92 -0
- package/dist/core/docs/search.js.map +1 -0
- package/dist/core/envelope.js +79 -0
- package/dist/core/envelope.js.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/packages/cache.js +138 -0
- package/dist/core/packages/cache.js.map +1 -0
- package/dist/core/packages/capabilities.js +95 -0
- package/dist/core/packages/capabilities.js.map +1 -0
- package/dist/core/packages/entry-types.js +13 -0
- package/dist/core/packages/entry-types.js.map +1 -0
- package/dist/core/packages/exec.js +37 -0
- package/dist/core/packages/exec.js.map +1 -0
- package/dist/core/packages/load-entry.js +123 -0
- package/dist/core/packages/load-entry.js.map +1 -0
- package/dist/core/packages/prepare.js +122 -0
- package/dist/core/packages/prepare.js.map +1 -0
- package/dist/core/packages/registry.js +75 -0
- package/dist/core/packages/registry.js.map +1 -0
- package/dist/core/packages/resolve.js +94 -0
- package/dist/core/packages/resolve.js.map +1 -0
- package/dist/core/packages/versions.js +71 -0
- package/dist/core/packages/versions.js.map +1 -0
- package/dist/core/ping.js +22 -0
- package/dist/core/ping.js.map +1 -0
- package/dist/core/register.js +10 -0
- package/dist/core/register.js.map +1 -0
- package/dist/core/state/rules.js +417 -0
- package/dist/core/state/rules.js.map +1 -0
- package/dist/core/state/type-check.js +142 -0
- package/dist/core/state/type-check.js.map +1 -0
- package/dist/mcp/index.js +21 -0
- package/dist/mcp/index.js.map +1 -0
- package/package.json +50 -4
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
const STOP_WORDS = new Set('a an and are as at be by can do does for from how i in is it of on or should that the this to use using what when where which with you your'.split(' '));
|
|
2
|
+
/**
|
|
3
|
+
* Identifiers are indexed whole (`layoutapi`, `group_by`) and split
|
|
4
|
+
* (`layout`, `api`, `group`, `by`), so exact API tokens rank highest while
|
|
5
|
+
* prose queries still match.
|
|
6
|
+
*/
|
|
7
|
+
export function tokenize(text) {
|
|
8
|
+
const tokens = [];
|
|
9
|
+
for (const raw of text.match(/[A-Za-z_$][A-Za-z0-9_$]*|\d+/g) ?? []) {
|
|
10
|
+
const whole = raw.toLowerCase();
|
|
11
|
+
if (!STOP_WORDS.has(whole)) {
|
|
12
|
+
tokens.push(whole);
|
|
13
|
+
}
|
|
14
|
+
const parts = raw
|
|
15
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
16
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
|
|
17
|
+
.split(/[\s_$]+/)
|
|
18
|
+
.map((p) => p.toLowerCase())
|
|
19
|
+
.filter((p) => p && p !== whole && !STOP_WORDS.has(p));
|
|
20
|
+
tokens.push(...parts);
|
|
21
|
+
}
|
|
22
|
+
return tokens;
|
|
23
|
+
}
|
|
24
|
+
const K1 = 1.2;
|
|
25
|
+
const B = 0.75;
|
|
26
|
+
const TITLE_WEIGHT = 3;
|
|
27
|
+
const HEADING_WEIGHT = 2;
|
|
28
|
+
export class SectionIndex {
|
|
29
|
+
docs = [];
|
|
30
|
+
documentFrequency = new Map();
|
|
31
|
+
averageLength = 0;
|
|
32
|
+
constructor(sections) {
|
|
33
|
+
let totalLength = 0;
|
|
34
|
+
for (const section of sections) {
|
|
35
|
+
const termFrequencies = new Map();
|
|
36
|
+
const add = (text, weight) => {
|
|
37
|
+
for (const token of tokenize(text)) {
|
|
38
|
+
termFrequencies.set(token, (termFrequencies.get(token) ?? 0) + weight);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
add(section.pageTitle, TITLE_WEIGHT);
|
|
42
|
+
add(section.headings.join(' '), HEADING_WEIGHT);
|
|
43
|
+
add(section.text, 1);
|
|
44
|
+
let length = 0;
|
|
45
|
+
for (const [term, count] of termFrequencies) {
|
|
46
|
+
length += count;
|
|
47
|
+
this.documentFrequency.set(term, (this.documentFrequency.get(term) ?? 0) + 1);
|
|
48
|
+
}
|
|
49
|
+
totalLength += length;
|
|
50
|
+
this.docs.push({ section, length, termFrequencies });
|
|
51
|
+
}
|
|
52
|
+
this.averageLength = this.docs.length ? totalLength / this.docs.length : 0;
|
|
53
|
+
}
|
|
54
|
+
search(query, options = {}) {
|
|
55
|
+
const terms = [...new Set(tokenize(query))];
|
|
56
|
+
if (!terms.length) {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
const total = this.docs.length;
|
|
60
|
+
const hits = [];
|
|
61
|
+
for (const doc of this.docs) {
|
|
62
|
+
const { section } = doc;
|
|
63
|
+
if (options.framework &&
|
|
64
|
+
section.frameworks &&
|
|
65
|
+
!section.frameworks.includes(options.framework)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (options.categories?.length
|
|
69
|
+
? !options.categories.includes(section.category)
|
|
70
|
+
: options.excludeCategories?.includes(section.category)) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
let score = 0;
|
|
74
|
+
for (const term of terms) {
|
|
75
|
+
const tf = doc.termFrequencies.get(term);
|
|
76
|
+
if (!tf) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const df = this.documentFrequency.get(term) ?? 0;
|
|
80
|
+
const idf = Math.log(1 + (total - df + 0.5) / (df + 0.5));
|
|
81
|
+
score +=
|
|
82
|
+
(idf * tf * (K1 + 1)) / (tf + K1 * (1 - B + (B * doc.length) / this.averageLength));
|
|
83
|
+
}
|
|
84
|
+
if (score > 0) {
|
|
85
|
+
hits.push({ section, score });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
hits.sort((a, b) => b.score - a.score);
|
|
89
|
+
return hits.slice(0, options.limit ?? 8);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/core/docs/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export const SCHEMA_VERSION = 1;
|
|
2
|
+
export const ERROR_CODES = [
|
|
3
|
+
'USAGE',
|
|
4
|
+
'NOT_FOUND',
|
|
5
|
+
'NO_ADAPTABLE_DEPENDENCY',
|
|
6
|
+
'MULTIPLE_PROJECTS',
|
|
7
|
+
'VERSION_NOT_SUPPORTED',
|
|
8
|
+
'UNSUPPORTED_FOR_MAJOR',
|
|
9
|
+
'PACKAGE_REQUIRED',
|
|
10
|
+
'DOCS_NOT_AVAILABLE',
|
|
11
|
+
'INPUT_TOO_LARGE',
|
|
12
|
+
'NETWORK_REQUIRED',
|
|
13
|
+
'NOT_AVAILABLE_OVER_MCP',
|
|
14
|
+
'NOT_AVAILABLE_REMOTELY',
|
|
15
|
+
'EXTRACTION_FAILED',
|
|
16
|
+
'RECORDS_INVALID',
|
|
17
|
+
];
|
|
18
|
+
export function ok(data, extra = {}) {
|
|
19
|
+
return {
|
|
20
|
+
schemaVersion: SCHEMA_VERSION,
|
|
21
|
+
ok: true,
|
|
22
|
+
...(extra.resolvedContext ? { resolvedContext: extra.resolvedContext } : {}),
|
|
23
|
+
warnings: extra.warnings ?? [],
|
|
24
|
+
issues: extra.issues ?? [],
|
|
25
|
+
data,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function fail(code, message, hint, details) {
|
|
29
|
+
return {
|
|
30
|
+
schemaVersion: SCHEMA_VERSION,
|
|
31
|
+
ok: false,
|
|
32
|
+
error: { code, message, hint, ...(details ? { details } : {}) },
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Thrown inside a capability (or context resolution); `runCapability` turns it into a failure envelope. */
|
|
36
|
+
export class CapabilityError extends Error {
|
|
37
|
+
code;
|
|
38
|
+
hint;
|
|
39
|
+
details;
|
|
40
|
+
constructor(code, message, hint, details) {
|
|
41
|
+
super(message);
|
|
42
|
+
this.name = 'CapabilityError';
|
|
43
|
+
this.code = code;
|
|
44
|
+
this.hint = hint;
|
|
45
|
+
this.details = details;
|
|
46
|
+
}
|
|
47
|
+
toEnvelope() {
|
|
48
|
+
return fail(this.code, this.message, this.hint, this.details);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export const EXIT_CODES = { ok: 0, findings: 1, usage: 2, environment: 3 };
|
|
52
|
+
/** Which exit class each error code belongs to (plan §7.1: 2 usage, 3 environment) */
|
|
53
|
+
export const ERROR_EXIT_CLASS = {
|
|
54
|
+
USAGE: 'usage',
|
|
55
|
+
NOT_FOUND: 'usage',
|
|
56
|
+
INPUT_TOO_LARGE: 'usage',
|
|
57
|
+
EXTRACTION_FAILED: 'usage',
|
|
58
|
+
NOT_AVAILABLE_OVER_MCP: 'usage',
|
|
59
|
+
NOT_AVAILABLE_REMOTELY: 'usage',
|
|
60
|
+
NO_ADAPTABLE_DEPENDENCY: 'environment',
|
|
61
|
+
MULTIPLE_PROJECTS: 'environment',
|
|
62
|
+
VERSION_NOT_SUPPORTED: 'environment',
|
|
63
|
+
UNSUPPORTED_FOR_MAJOR: 'environment',
|
|
64
|
+
PACKAGE_REQUIRED: 'environment',
|
|
65
|
+
DOCS_NOT_AVAILABLE: 'environment',
|
|
66
|
+
NETWORK_REQUIRED: 'environment',
|
|
67
|
+
RECORDS_INVALID: 'environment',
|
|
68
|
+
};
|
|
69
|
+
/** Issue severities that make a successful call a "findings" exit (1); `info` does not. */
|
|
70
|
+
export const FINDING_SEVERITIES = ['error', 'warning'];
|
|
71
|
+
export function exitCodeFor(envelope) {
|
|
72
|
+
if (!envelope.ok) {
|
|
73
|
+
return EXIT_CODES[ERROR_EXIT_CLASS[envelope.error.code]];
|
|
74
|
+
}
|
|
75
|
+
return envelope.issues.some((issue) => FINDING_SEVERITIES.includes(issue.severity))
|
|
76
|
+
? EXIT_CODES.findings
|
|
77
|
+
: EXIT_CODES.ok;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/core/envelope.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,OAAO;IACP,WAAW;IACX,yBAAyB;IACzB,mBAAmB;IACnB,uBAAuB;IACvB,uBAAuB;IACvB,kBAAkB;IAClB,oBAAoB;IACpB,iBAAiB;IACjB,kBAAkB;IAClB,wBAAwB;IACxB,wBAAwB;IACxB,mBAAmB;IACnB,iBAAiB;CACT,CAAC;AA+DX,MAAM,UAAU,EAAE,CAChB,IAAO,EACP,QAAsF,EAAE;IAExF,OAAO;QACL,aAAa,EAAE,cAAc;QAC7B,EAAE,EAAE,IAAI;QACR,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;QAC1B,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,IAAe,EACf,OAAe,EACf,IAAY,EACZ,OAAiC;IAEjC,OAAO;QACL,aAAa,EAAE,cAAc;QAC7B,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;KAChE,CAAC;AACJ,CAAC;AAED,4GAA4G;AAC5G,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,CAAY;IAChB,IAAI,CAAS;IACb,OAAO,CAA2B;IAE3C,YAAY,IAAe,EAAE,OAAe,EAAE,IAAY,EAAE,OAAiC;QAC3F,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;CACF;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAW,CAAC;AAGpF,sFAAsF;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAA+C;IAC1E,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,OAAO;IAClB,eAAe,EAAE,OAAO;IACxB,iBAAiB,EAAE,OAAO;IAC1B,sBAAsB,EAAE,OAAO;IAC/B,sBAAsB,EAAE,OAAO;IAC/B,uBAAuB,EAAE,aAAa;IACtC,iBAAiB,EAAE,aAAa;IAChC,qBAAqB,EAAE,aAAa;IACpC,qBAAqB,EAAE,aAAa;IACpC,gBAAgB,EAAE,aAAa;IAC/B,kBAAkB,EAAE,aAAa;IACjC,gBAAgB,EAAE,aAAa;IAC/B,eAAe,EAAE,aAAa;CAC/B,CAAC;AAEF,2FAA2F;AAC3F,MAAM,CAAC,MAAM,kBAAkB,GAA6B,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAEjF,MAAM,UAAU,WAAW,CAAC,QAA2B;IACrD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjF,CAAC,CAAC,UAAU,CAAC,QAAQ;QACrB,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The only import surface for `src/cli` and `src/mcp` (plan Appendix H).
|
|
3
|
+
* Runtime exports are the Appendix H eight — `listCapabilities`, `getCapability`,
|
|
4
|
+
* `runCapability`, `CLI_PACKAGE`, `CLI_RANGE`, `RECORDS_FLOOR`, `MIGRATION_FLOOR`,
|
|
5
|
+
* `SCHEMA_VERSION` — plus two reviewed additions for the bindings (A0.3):
|
|
6
|
+
* `exitCodeFor` (the §7.1 exit mapping the CLI applies) and `CLI_VERSION`
|
|
7
|
+
* (reported by `--version`, `--capabilities` and the MCP server info).
|
|
8
|
+
* Adding an export is a reviewed change.
|
|
9
|
+
*/
|
|
10
|
+
import './register.js';
|
|
11
|
+
export { CLI_PACKAGE, CLI_RANGE, MIGRATION_FLOOR, PACKAGE_VERSION as CLI_VERSION, RECORDS_FLOOR, SCHEMA_VERSION, getCapability, listCapabilities, runCapability, } from './capabilities.js';
|
|
12
|
+
export { exitCodeFor } from './envelope.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,eAAe,CAAC;AAEvB,OAAO,EACL,WAAW,EACX,SAAS,EACT,eAAe,EACf,eAAe,IAAI,WAAW,EAC9B,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The on-disk cache (plan §7.1): `~/.cache/adaptable-mcp/` — `$XDG_CACHE_HOME`
|
|
3
|
+
* honoured, `ADAPTABLE_MCP_CACHE_DIR` overrides — with
|
|
4
|
+
* pkgs/@adaptabletools/adaptable@<version>/ extracted library packages (§7.3)
|
|
5
|
+
* entries/<version>/<entry>.mjs esbuild bundles of a package's entries
|
|
6
|
+
* docs/<host>/<manifest hash>/ docs corpora (A1.1)
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, mkdirSync, readdirSync, rmSync, statSync } from 'node:fs';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { LIBRARY_PACKAGE } from '../constants.js';
|
|
12
|
+
import { compareSemver } from './versions.js';
|
|
13
|
+
export function getCacheRoot() {
|
|
14
|
+
return (process.env.ADAPTABLE_MCP_CACHE_DIR ||
|
|
15
|
+
join(process.env.XDG_CACHE_HOME || join(homedir(), '.cache'), 'adaptable-mcp'));
|
|
16
|
+
}
|
|
17
|
+
/** A cache folder, created on demand */
|
|
18
|
+
export function getCacheDir(...segments) {
|
|
19
|
+
const dir = join(getCacheRoot(), ...segments);
|
|
20
|
+
mkdirSync(dir, { recursive: true });
|
|
21
|
+
return dir;
|
|
22
|
+
}
|
|
23
|
+
export const PKGS_DIR = 'pkgs';
|
|
24
|
+
export const ENTRIES_DIR = 'entries';
|
|
25
|
+
export const DOCS_DIR = 'docs';
|
|
26
|
+
/** Folder a cached library version lives in (its `package.json` is directly inside) */
|
|
27
|
+
export function packageCacheDir(version) {
|
|
28
|
+
return join(getCacheRoot(), PKGS_DIR, `${LIBRARY_PACKAGE}@${version}`);
|
|
29
|
+
}
|
|
30
|
+
export function entriesCacheDir(version) {
|
|
31
|
+
return join(getCacheRoot(), ENTRIES_DIR, version);
|
|
32
|
+
}
|
|
33
|
+
/** Cached library packages, oldest first */
|
|
34
|
+
export function listCachedPackages() {
|
|
35
|
+
const scopeDir = join(getCacheRoot(), PKGS_DIR, LIBRARY_PACKAGE.split('/')[0]);
|
|
36
|
+
const prefix = `${LIBRARY_PACKAGE.split('/')[1]}@`;
|
|
37
|
+
let names;
|
|
38
|
+
try {
|
|
39
|
+
names = readdirSync(scopeDir);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
return names
|
|
45
|
+
.filter((name) => name.startsWith(prefix) && existsSync(join(scopeDir, name, 'package.json')))
|
|
46
|
+
.map((name) => ({ version: name.slice(prefix.length), dir: join(scopeDir, name) }))
|
|
47
|
+
.sort((a, b) => compareSemver(a.version, b.version));
|
|
48
|
+
}
|
|
49
|
+
function folderSize(dir) {
|
|
50
|
+
let total = 0;
|
|
51
|
+
const walk = (path) => {
|
|
52
|
+
let entries;
|
|
53
|
+
try {
|
|
54
|
+
entries = readdirSync(path, { withFileTypes: true });
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const entry of entries) {
|
|
60
|
+
const full = join(path, entry.name);
|
|
61
|
+
if (entry.isDirectory()) {
|
|
62
|
+
walk(full);
|
|
63
|
+
}
|
|
64
|
+
else if (entry.isFile()) {
|
|
65
|
+
try {
|
|
66
|
+
total += statSync(full).size;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// removed meanwhile
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
walk(dir);
|
|
75
|
+
return total;
|
|
76
|
+
}
|
|
77
|
+
function ageDays(path) {
|
|
78
|
+
try {
|
|
79
|
+
return Math.floor((Date.now() - statSync(path).mtimeMs) / 86_400_000);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** What `cache list` shows: packages, entry bundles and docs corpora with sizes and ages */
|
|
86
|
+
export function summarizeCache() {
|
|
87
|
+
const root = getCacheRoot();
|
|
88
|
+
const packages = listCachedPackages().map(({ version, dir }) => ({
|
|
89
|
+
version,
|
|
90
|
+
bytes: folderSize(dir),
|
|
91
|
+
ageDays: ageDays(dir),
|
|
92
|
+
}));
|
|
93
|
+
const entriesRoot = join(root, ENTRIES_DIR);
|
|
94
|
+
const entries = (existsSync(entriesRoot) ? readdirSync(entriesRoot) : [])
|
|
95
|
+
.filter((version) => statSync(join(entriesRoot, version)).isDirectory())
|
|
96
|
+
.sort(compareSemver)
|
|
97
|
+
.map((version) => ({
|
|
98
|
+
version,
|
|
99
|
+
files: readdirSync(join(entriesRoot, version)).sort(),
|
|
100
|
+
bytes: folderSize(join(entriesRoot, version)),
|
|
101
|
+
}));
|
|
102
|
+
const docsRoot = join(root, DOCS_DIR);
|
|
103
|
+
const docs = [];
|
|
104
|
+
if (existsSync(docsRoot)) {
|
|
105
|
+
for (const host of readdirSync(docsRoot).sort()) {
|
|
106
|
+
const hostDir = join(docsRoot, host);
|
|
107
|
+
if (!statSync(hostDir).isDirectory()) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
for (const hash of readdirSync(hostDir).sort()) {
|
|
111
|
+
const dir = join(hostDir, hash);
|
|
112
|
+
if (statSync(dir).isDirectory()) {
|
|
113
|
+
docs.push({ host, hash, bytes: folderSize(dir), ageDays: ageDays(dir) });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { root, packages, entries, docs };
|
|
119
|
+
}
|
|
120
|
+
/** Removes docs corpora and/or packages (with their entry bundles); everything when neither flag is set */
|
|
121
|
+
export function clearCache(options = {}) {
|
|
122
|
+
const all = !options.docs && !options.pkgs;
|
|
123
|
+
const root = getCacheRoot();
|
|
124
|
+
const removed = [];
|
|
125
|
+
const targets = [
|
|
126
|
+
...(all || options.docs ? [DOCS_DIR] : []),
|
|
127
|
+
...(all || options.pkgs ? [PKGS_DIR, ENTRIES_DIR] : []),
|
|
128
|
+
];
|
|
129
|
+
for (const target of targets) {
|
|
130
|
+
const dir = join(root, target);
|
|
131
|
+
if (existsSync(dir)) {
|
|
132
|
+
rmSync(dir, { recursive: true, force: true });
|
|
133
|
+
removed.push(target);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return { removed };
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/core/packages/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `adaptable cache add <major|version|tag>` · `cache list` · `cache clear [--docs|--pkgs]` (plan §8.13).
|
|
3
|
+
* CLI only: an MCP client has no business filling a user's cache.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { registerCapability } from '../capabilities.js';
|
|
7
|
+
import { LIBRARY_PACKAGE } from '../constants.js';
|
|
8
|
+
import { CapabilityError, ok } from '../envelope.js';
|
|
9
|
+
import { clearCache, listCachedPackages, summarizeCache } from './cache.js';
|
|
10
|
+
import { npmRegistry } from './registry.js';
|
|
11
|
+
import { pickVersion } from './resolve.js';
|
|
12
|
+
/** Tests swap the registry; production uses npm */
|
|
13
|
+
let registryFactory = (cwd) => npmRegistry({ cwd });
|
|
14
|
+
export function setPackageRegistryFactory(factory) {
|
|
15
|
+
registryFactory = factory;
|
|
16
|
+
}
|
|
17
|
+
const formatBytes = (bytes) => bytes >= 1_048_576 ? `${(bytes / 1_048_576).toFixed(1)} MB` : `${Math.ceil(bytes / 1024)} kB`;
|
|
18
|
+
registerCapability({
|
|
19
|
+
name: 'cache-add',
|
|
20
|
+
description: `Downloads a ${LIBRARY_PACKAGE} version into the cache so checks and migrations for that major work offline.`,
|
|
21
|
+
cli: { command: ['cache', 'add'], positionals: ['spec'] },
|
|
22
|
+
mcp: null,
|
|
23
|
+
input: z.object({
|
|
24
|
+
spec: z.string().describe('A major (23), an exact version (23.1.1) or a dist-tag (canary)'),
|
|
25
|
+
}),
|
|
26
|
+
output: z.object({
|
|
27
|
+
version: z.string(),
|
|
28
|
+
dir: z.string(),
|
|
29
|
+
status: z.enum(['downloaded', 'already-cached']),
|
|
30
|
+
}),
|
|
31
|
+
run: async (input, ctx) => {
|
|
32
|
+
if (ctx.globals.offline) {
|
|
33
|
+
throw new CapabilityError('NETWORK_REQUIRED', '`cache add` downloads from the npm registry and cannot run with --offline.', 'Drop --offline, or run the command on a connected machine and copy the cache folder.');
|
|
34
|
+
}
|
|
35
|
+
const registry = registryFactory(ctx.cwd);
|
|
36
|
+
const view = await registry.view();
|
|
37
|
+
const version = pickVersion(input.spec, view);
|
|
38
|
+
if (!version) {
|
|
39
|
+
throw new CapabilityError('VERSION_NOT_SUPPORTED', `The npm registry has no ${LIBRARY_PACKAGE} matching "${input.spec}".`, `Pass a published major (${[...new Set(view.versions.map((v) => v.split('.')[0]))].slice(-4).join(', ')}), an exact version or a dist-tag (${Object.keys(view.distTags).join(', ')}).`);
|
|
40
|
+
}
|
|
41
|
+
const cached = listCachedPackages().find((p) => p.version === version);
|
|
42
|
+
if (cached) {
|
|
43
|
+
return ok({ version, dir: cached.dir, status: 'already-cached' });
|
|
44
|
+
}
|
|
45
|
+
const dir = await registry.fetch(version);
|
|
46
|
+
return ok({ version, dir, status: 'downloaded' });
|
|
47
|
+
},
|
|
48
|
+
markdown: (data) => data.status === 'downloaded'
|
|
49
|
+
? `Cached ${LIBRARY_PACKAGE}@${data.version} at \`${data.dir}\`.`
|
|
50
|
+
: `${LIBRARY_PACKAGE}@${data.version} was already cached at \`${data.dir}\`.`,
|
|
51
|
+
});
|
|
52
|
+
registerCapability({
|
|
53
|
+
name: 'cache-list',
|
|
54
|
+
description: 'Shows cached library packages, bundled entries and docs corpora with sizes and ages.',
|
|
55
|
+
cli: { command: ['cache', 'list'] },
|
|
56
|
+
mcp: null,
|
|
57
|
+
input: z.object({}),
|
|
58
|
+
output: z.object({
|
|
59
|
+
root: z.string(),
|
|
60
|
+
packages: z.array(z.object({ version: z.string(), bytes: z.number(), ageDays: z.number().optional() })),
|
|
61
|
+
entries: z.array(z.object({ version: z.string(), files: z.array(z.string()), bytes: z.number() })),
|
|
62
|
+
docs: z.array(z.object({ host: z.string(), hash: z.string(), bytes: z.number(), ageDays: z.number().optional() })),
|
|
63
|
+
}),
|
|
64
|
+
run: async () => ok(summarizeCache()),
|
|
65
|
+
markdown: (data) => {
|
|
66
|
+
const lines = [`Cache: \`${data.root}\``, ''];
|
|
67
|
+
lines.push(`## Packages (${data.packages.length})`, '');
|
|
68
|
+
for (const p of data.packages) {
|
|
69
|
+
lines.push(`- ${LIBRARY_PACKAGE}@${p.version} — ${formatBytes(p.bytes)}${p.ageDays !== undefined ? `, ${p.ageDays} d old` : ''}`);
|
|
70
|
+
}
|
|
71
|
+
lines.push('', `## Entry bundles (${data.entries.length})`, '');
|
|
72
|
+
for (const e of data.entries) {
|
|
73
|
+
lines.push(`- ${e.version}: ${e.files.join(', ')} — ${formatBytes(e.bytes)}`);
|
|
74
|
+
}
|
|
75
|
+
lines.push('', `## Docs corpora (${data.docs.length})`, '');
|
|
76
|
+
for (const d of data.docs) {
|
|
77
|
+
lines.push(`- ${d.host} (${d.hash}) — ${formatBytes(d.bytes)}${d.ageDays !== undefined ? `, ${d.ageDays} d old` : ''}`);
|
|
78
|
+
}
|
|
79
|
+
return lines.join('\n');
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
registerCapability({
|
|
83
|
+
name: 'cache-clear',
|
|
84
|
+
description: 'Removes cached docs corpora and/or library packages (with their entry bundles); everything when no flag is given.',
|
|
85
|
+
cli: { command: ['cache', 'clear'] },
|
|
86
|
+
mcp: null,
|
|
87
|
+
input: z.object({
|
|
88
|
+
docs: z.boolean().optional().describe('Remove docs corpora only'),
|
|
89
|
+
pkgs: z.boolean().optional().describe('Remove packages and entry bundles only'),
|
|
90
|
+
}),
|
|
91
|
+
output: z.object({ removed: z.array(z.string()) }),
|
|
92
|
+
run: async (input) => ok(clearCache(input)),
|
|
93
|
+
markdown: (data) => (data.removed.length ? `Removed: ${data.removed.join(', ')}.` : 'Nothing to remove.'),
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/core/packages/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry-types.js","sourceRoot":"","sources":["../../../src/core/packages/entry-types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,OAAO;IACP,kBAAkB;IAClB,cAAc;IACd,QAAQ;IACR,cAAc;IACd,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,cAAc;CACN,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
/** Runs a command and resolves with its stdout; rejects with stderr on a non-zero exit */
|
|
3
|
+
export function exec(command, args, options = {}) {
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
const child = spawn(command, args, {
|
|
6
|
+
cwd: options.cwd,
|
|
7
|
+
shell: process.platform === 'win32',
|
|
8
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
9
|
+
env: { ...process.env, NO_UPDATE_NOTIFIER: '1', npm_config_update_notifier: 'false' },
|
|
10
|
+
});
|
|
11
|
+
const out = [];
|
|
12
|
+
const err = [];
|
|
13
|
+
child.stdout.on('data', (chunk) => out.push(chunk));
|
|
14
|
+
child.stderr.on('data', (chunk) => err.push(chunk));
|
|
15
|
+
const timer = options.timeoutMs
|
|
16
|
+
? setTimeout(() => {
|
|
17
|
+
child.kill();
|
|
18
|
+
reject(new Error(`${command} ${args.join(' ')} timed out after ${options.timeoutMs} ms`));
|
|
19
|
+
}, options.timeoutMs)
|
|
20
|
+
: undefined;
|
|
21
|
+
child.on('error', (error) => {
|
|
22
|
+
clearTimeout(timer);
|
|
23
|
+
reject(error);
|
|
24
|
+
});
|
|
25
|
+
child.on('close', (code) => {
|
|
26
|
+
clearTimeout(timer);
|
|
27
|
+
if (code === 0) {
|
|
28
|
+
resolve(Buffer.concat(out).toString('utf8'));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
reject(new Error(`${command} ${args.join(' ')} exited with ${code}: ${Buffer.concat(err).toString('utf8').trim()}`));
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export const NPM = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
37
|
+
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/core/packages/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAO3C,0FAA0F;AAC1F,MAAM,UAAU,IAAI,CAAC,OAAe,EAAE,IAAc,EAAE,UAAuB,EAAE;IAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;YACnC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,0BAA0B,EAAE,OAAO,EAAE;SACtF,CAAC,CAAC;QACH,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS;YAC7B,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;gBACd,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC;YAC5F,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC;YACvB,CAAC,CAAC,SAAS,CAAC;QACd,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,MAAM,CACJ,IAAI,KAAK,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC7G,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loads a library entry (`aql`, `upgrade`) from a resolved package. The
|
|
3
|
+
* published package is bundler-only ESM (extensionless relative imports), so
|
|
4
|
+
* each entry is bundled once per version with esbuild into
|
|
5
|
+
* `entries/<version>/<entry>.mjs` and imported from there (plan §7.3).
|
|
6
|
+
*
|
|
7
|
+
* `ADAPTABLE_MCP_ADAPTABLE_SRC` points at an AdapTable source folder instead
|
|
8
|
+
* (e.g. `packages/adaptable` in the AdapTable repo); source bundles are never
|
|
9
|
+
* cached because they change with every edit.
|
|
10
|
+
*/
|
|
11
|
+
import { createHash } from 'node:crypto';
|
|
12
|
+
import { existsSync, mkdirSync, readFileSync, statSync } from 'node:fs';
|
|
13
|
+
import { tmpdir } from 'node:os';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { pathToFileURL } from 'node:url';
|
|
16
|
+
import { build } from 'esbuild';
|
|
17
|
+
import { entriesCacheDir } from './cache.js';
|
|
18
|
+
import { entryNodePaths } from './prepare.js';
|
|
19
|
+
export const SOURCE_ENV = 'ADAPTABLE_MCP_ADAPTABLE_SRC';
|
|
20
|
+
/** The source override, when `ADAPTABLE_MCP_ADAPTABLE_SRC` is set */
|
|
21
|
+
export function sourceOverride() {
|
|
22
|
+
const dir = process.env[SOURCE_ENV];
|
|
23
|
+
return dir ? { kind: 'source', dir } : undefined;
|
|
24
|
+
}
|
|
25
|
+
export const packageLocation = (pkg) => ({
|
|
26
|
+
kind: 'package',
|
|
27
|
+
version: pkg.version,
|
|
28
|
+
dir: pkg.dir,
|
|
29
|
+
});
|
|
30
|
+
function entryFile(location, name) {
|
|
31
|
+
if (location.kind === 'source') {
|
|
32
|
+
const entry = join(location.dir, `${name}.ts`);
|
|
33
|
+
const tsconfig = join(location.dir, 'tsconfig.cjs.json');
|
|
34
|
+
return existsSync(entry) ? { entry, tsconfig: existsSync(tsconfig) ? tsconfig : undefined } : undefined;
|
|
35
|
+
}
|
|
36
|
+
const entry = join(location.dir, `${name}.js`);
|
|
37
|
+
return existsSync(entry) ? { entry } : undefined;
|
|
38
|
+
}
|
|
39
|
+
function sourceStamp(dir) {
|
|
40
|
+
// a source entry changes with every edit to the files it imports: never reuse a bundle
|
|
41
|
+
return createHash('sha256').update(dir).update(`${process.pid}-${Date.now()}`).digest('hex').slice(0, 16);
|
|
42
|
+
}
|
|
43
|
+
function packageVersionAt(dir) {
|
|
44
|
+
try {
|
|
45
|
+
return JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8')).version;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function bundle(entry, outfile, tsconfig, nodePaths) {
|
|
52
|
+
mkdirSync(join(outfile, '..'), { recursive: true });
|
|
53
|
+
await build({
|
|
54
|
+
entryPoints: [entry],
|
|
55
|
+
bundle: true,
|
|
56
|
+
platform: 'node',
|
|
57
|
+
format: 'esm',
|
|
58
|
+
outfile,
|
|
59
|
+
tsconfig,
|
|
60
|
+
nodePaths,
|
|
61
|
+
logLevel: 'silent',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const loaded = new Map();
|
|
65
|
+
async function loadUncached(location, name) {
|
|
66
|
+
const found = entryFile(location, name);
|
|
67
|
+
if (!found) {
|
|
68
|
+
const where = location.kind === 'source' ? location.dir : `${location.dir} (version ${location.version})`;
|
|
69
|
+
return {
|
|
70
|
+
ok: false,
|
|
71
|
+
reason: `${where} has no ${name} entry point; it ships with @adaptabletools/adaptable 24 and later.`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
let outfile;
|
|
75
|
+
let cacheable;
|
|
76
|
+
if (location.kind === 'source') {
|
|
77
|
+
outfile = join(tmpdir(), `adaptable-${name}-${sourceStamp(location.dir)}.mjs`);
|
|
78
|
+
cacheable = false;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// the folder is keyed by the declared version; the file name also carries the
|
|
82
|
+
// entry's mtime so a re-fetched or edited package of the same version is rebundled
|
|
83
|
+
const version = packageVersionAt(location.dir) ?? location.version;
|
|
84
|
+
const stamp = createHash('sha256')
|
|
85
|
+
.update(found.entry)
|
|
86
|
+
.update(String(statSync(found.entry).mtimeMs))
|
|
87
|
+
.digest('hex')
|
|
88
|
+
.slice(0, 8);
|
|
89
|
+
outfile = join(entriesCacheDir(version), `${name}-${stamp}.mjs`);
|
|
90
|
+
cacheable = true;
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
if (!cacheable || !existsSync(outfile)) {
|
|
94
|
+
await bundle(found.entry, outfile, found.tsconfig, location.kind === 'package' ? entryNodePaths(location.dir) : undefined);
|
|
95
|
+
}
|
|
96
|
+
const module = await import(pathToFileURL(outfile).href);
|
|
97
|
+
return { ok: true, module, source: found.entry, bundle: outfile };
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
101
|
+
const unresolved = [...message.matchAll(/Could not resolve "([^"]+)"/g)].map((m) => m[1]);
|
|
102
|
+
const hint = unresolved.length && location.kind === 'package'
|
|
103
|
+
? ` The package folder lacks ${[...new Set(unresolved)].join(', ')}; re-run \`adaptable cache add ${location.version}\` on a connected machine to install the entry dependencies.`
|
|
104
|
+
: '';
|
|
105
|
+
return { ok: false, reason: `Could not load ${found.entry}: ${message}${hint}` };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Loads `name` from `location`, bundling it first when needed; memoised per process */
|
|
109
|
+
export function loadEntry(location, name) {
|
|
110
|
+
const key = `${location.kind}:${location.dir}:${name}`;
|
|
111
|
+
let result = loaded.get(key);
|
|
112
|
+
if (!result) {
|
|
113
|
+
result = loadUncached(location, name);
|
|
114
|
+
result.then((r) => {
|
|
115
|
+
if (!r.ok) {
|
|
116
|
+
loaded.delete(key);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
loaded.set(key, result);
|
|
120
|
+
}
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=load-entry.js.map
|