@easynet/agent-common 1.0.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/dist/chunk-3PI6JR76.js +253 -0
- package/dist/chunk-3PI6JR76.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/npm/cache.d.ts +7 -0
- package/dist/npm/index.d.ts +4 -0
- package/dist/npm/index.js +31 -0
- package/dist/npm/index.js.map +1 -0
- package/dist/npm/install.d.ts +8 -0
- package/dist/npm/provider.d.ts +14 -0
- package/dist/npm/version.d.ts +11 -0
- package/package.json +64 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// src/npm/provider.ts
|
|
2
|
+
var NPM_PROTOCOL_PREFIX = "npm:";
|
|
3
|
+
function isNpmProviderSpec(spec) {
|
|
4
|
+
return typeof spec === "string" && spec.startsWith(NPM_PROTOCOL_PREFIX);
|
|
5
|
+
}
|
|
6
|
+
function parseNpmProvider(provider) {
|
|
7
|
+
if (!isNpmProviderSpec(provider)) return null;
|
|
8
|
+
const rest = provider.slice(NPM_PROTOCOL_PREFIX.length);
|
|
9
|
+
const hashIdx = rest.indexOf("#");
|
|
10
|
+
const fragment = hashIdx >= 0 ? rest.slice(hashIdx + 1) : void 0;
|
|
11
|
+
const beforeHash = hashIdx >= 0 ? rest.slice(0, hashIdx) : rest;
|
|
12
|
+
const atIdx = beforeHash.startsWith("@") ? beforeHash.indexOf("@", 1) : beforeHash.lastIndexOf("@");
|
|
13
|
+
const pkg = atIdx > 0 ? beforeHash.slice(0, atIdx) : beforeHash;
|
|
14
|
+
const tag = atIdx > 0 ? beforeHash.slice(atIdx + 1) : void 0;
|
|
15
|
+
return { pkg: pkg || beforeHash, tag: tag || void 0, fragment };
|
|
16
|
+
}
|
|
17
|
+
function parseNpmProviderSpec(spec) {
|
|
18
|
+
const parsed = parseNpmProvider(spec);
|
|
19
|
+
if (!parsed) return null;
|
|
20
|
+
return {
|
|
21
|
+
packageName: parsed.pkg,
|
|
22
|
+
version: parsed.tag,
|
|
23
|
+
provider: parsed.fragment
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// src/npm/version.ts
|
|
28
|
+
import { execFileSync } from "child_process";
|
|
29
|
+
import { readFileSync } from "fs";
|
|
30
|
+
import { createRequire } from "module";
|
|
31
|
+
var versionCache = /* @__PURE__ */ new Map();
|
|
32
|
+
var CACHE_TTL = 5 * 60 * 1e3;
|
|
33
|
+
function clearVersionCache() {
|
|
34
|
+
versionCache.clear();
|
|
35
|
+
}
|
|
36
|
+
function resolveNpmPackageVersion(pkg, tag, options = {}) {
|
|
37
|
+
const cacheKey = tag ? `${pkg}@${tag}` : pkg;
|
|
38
|
+
const cached = versionCache.get(cacheKey);
|
|
39
|
+
if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
|
|
40
|
+
return cached.version;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const spec = tag ? `${pkg}@${tag}` : pkg;
|
|
44
|
+
const out = execFileSync("npm", ["view", spec, "version"], {
|
|
45
|
+
cwd: options.cwd ?? process.cwd(),
|
|
46
|
+
encoding: "utf-8",
|
|
47
|
+
timeout: options.timeoutMs ?? 8e3,
|
|
48
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
49
|
+
});
|
|
50
|
+
const version = out?.trim() ?? null;
|
|
51
|
+
if (version) {
|
|
52
|
+
versionCache.set(cacheKey, { version, timestamp: Date.now() });
|
|
53
|
+
}
|
|
54
|
+
return version;
|
|
55
|
+
} catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function resolveLatestVersionFromRegistry(packageName, options = {}) {
|
|
60
|
+
const version = resolveNpmPackageVersion(packageName, void 0, options);
|
|
61
|
+
if (!version) {
|
|
62
|
+
throw new Error(`Failed to resolve latest version for ${packageName}`);
|
|
63
|
+
}
|
|
64
|
+
return version;
|
|
65
|
+
}
|
|
66
|
+
function formatProviderDisplay(provider) {
|
|
67
|
+
const parsed = parseNpmProvider(provider);
|
|
68
|
+
if (parsed == null) return provider;
|
|
69
|
+
const resolved = resolveNpmPackageVersion(parsed.pkg, parsed.tag);
|
|
70
|
+
const version = resolved ?? parsed.tag ?? "latest";
|
|
71
|
+
const frag = parsed.fragment ? `#${parsed.fragment}` : "";
|
|
72
|
+
return `npm:${parsed.pkg}@${version}${frag}`;
|
|
73
|
+
}
|
|
74
|
+
function getInstalledVersion(packageName, options = {}) {
|
|
75
|
+
const cwd = options.cwd ?? process.cwd();
|
|
76
|
+
const req = createRequire(import.meta.url);
|
|
77
|
+
try {
|
|
78
|
+
const p = req.resolve(`${packageName}/package.json`, { paths: [cwd] });
|
|
79
|
+
const j = JSON.parse(readFileSync(p, "utf-8"));
|
|
80
|
+
return typeof j.version === "string" ? j.version : null;
|
|
81
|
+
} catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/npm/install.ts
|
|
87
|
+
import { execFileSync as execFileSync2 } from "child_process";
|
|
88
|
+
var VERSION_LATEST = "latest";
|
|
89
|
+
async function resolveInstallVersion(packageName, version, cwd) {
|
|
90
|
+
const isLatestOrEmpty = version === void 0 || version === "" || typeof version === "string" && version.toLowerCase() === VERSION_LATEST;
|
|
91
|
+
if (isLatestOrEmpty) {
|
|
92
|
+
return resolveLatestVersionFromRegistry(packageName, { cwd });
|
|
93
|
+
}
|
|
94
|
+
return version;
|
|
95
|
+
}
|
|
96
|
+
async function ensureNpmPackageInstalled(packageName, options = {}) {
|
|
97
|
+
if (typeof packageName !== "string" || packageName.trim().length === 0) {
|
|
98
|
+
throw new Error("ensureNpmPackageInstalled requires a non-empty package name");
|
|
99
|
+
}
|
|
100
|
+
const cwd = options.cwd ?? process.cwd();
|
|
101
|
+
const resolvedVersion = await resolveInstallVersion(packageName, options.version, cwd);
|
|
102
|
+
const installedVersion = getInstalledVersion(packageName, { cwd });
|
|
103
|
+
if (installedVersion === resolvedVersion) return;
|
|
104
|
+
const installSpec = `${packageName}@${resolvedVersion}`;
|
|
105
|
+
const prefix = options.logPrefix ?? "[agent-common]";
|
|
106
|
+
if (installedVersion === null) {
|
|
107
|
+
console.info(`${prefix} Installing provider: ${installSpec}`);
|
|
108
|
+
} else {
|
|
109
|
+
console.info(`${prefix} Updating provider: ${packageName} ${installedVersion} -> ${resolvedVersion}`);
|
|
110
|
+
}
|
|
111
|
+
const args = ["install", installSpec];
|
|
112
|
+
if (options.noPackageLock !== false) args.push("--no-package-lock");
|
|
113
|
+
try {
|
|
114
|
+
execFileSync2("npm", args, {
|
|
115
|
+
cwd,
|
|
116
|
+
stdio: options.stdio ?? "inherit",
|
|
117
|
+
encoding: "utf-8"
|
|
118
|
+
});
|
|
119
|
+
} catch (e) {
|
|
120
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
121
|
+
throw new Error(`npm install failed for ${installSpec}: ${msg}`, { cause: e });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// src/npm/cache.ts
|
|
126
|
+
import { execSync } from "child_process";
|
|
127
|
+
import { readFileSync as readFileSync2, readdirSync, mkdirSync, rmSync, renameSync, existsSync } from "fs";
|
|
128
|
+
import { join } from "path";
|
|
129
|
+
import { homedir } from "os";
|
|
130
|
+
import { pathToFileURL } from "url";
|
|
131
|
+
var DEFAULT_CACHE_BASE = join(homedir(), ".agent", "cache");
|
|
132
|
+
function isLatestRequest(version) {
|
|
133
|
+
const v = (version ?? "").trim().toLowerCase();
|
|
134
|
+
return v === "" || v === "latest";
|
|
135
|
+
}
|
|
136
|
+
function getCachedPackageVersion(cacheDir) {
|
|
137
|
+
const pkgPath = join(cacheDir, "package.json");
|
|
138
|
+
if (!existsSync(pkgPath)) return void 0;
|
|
139
|
+
try {
|
|
140
|
+
const pkg = JSON.parse(readFileSync2(pkgPath, "utf-8"));
|
|
141
|
+
return typeof pkg.version === "string" ? pkg.version : void 0;
|
|
142
|
+
} catch {
|
|
143
|
+
return void 0;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function packagePathSegments(name) {
|
|
147
|
+
const withoutScope = name.replace(/^@/, "");
|
|
148
|
+
return withoutScope.split("/").filter(Boolean);
|
|
149
|
+
}
|
|
150
|
+
function resolveCacheDir(cacheBase, packageName, version) {
|
|
151
|
+
const segments = packagePathSegments(packageName);
|
|
152
|
+
return join(cacheBase, ...segments, version);
|
|
153
|
+
}
|
|
154
|
+
function ensurePackageInCache(packageName, version = "latest", options = {}) {
|
|
155
|
+
const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;
|
|
156
|
+
const resolvedVersion = isLatestRequest(version) ? resolveLatestVersionFromRegistry(packageName) : version;
|
|
157
|
+
const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);
|
|
158
|
+
const packageJsonPath = join(cacheDir, "package.json");
|
|
159
|
+
const nodeModulesPath = join(cacheDir, "node_modules");
|
|
160
|
+
if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {
|
|
161
|
+
const cachedVersion = getCachedPackageVersion(cacheDir);
|
|
162
|
+
if (cachedVersion === resolvedVersion) {
|
|
163
|
+
options.afterInstall?.(cacheDir, packageName);
|
|
164
|
+
return cacheDir;
|
|
165
|
+
}
|
|
166
|
+
rmSync(cacheDir, { recursive: true, force: true });
|
|
167
|
+
}
|
|
168
|
+
const packDest = join(cacheBase, ".pack-tmp", packageName.replace(/@/g, "").replace(/\//g, "_"));
|
|
169
|
+
mkdirSync(packDest, { recursive: true });
|
|
170
|
+
try {
|
|
171
|
+
execSync(`npm pack ${packageName}@${resolvedVersion} --pack-destination "${packDest}"`, {
|
|
172
|
+
cwd: process.cwd(),
|
|
173
|
+
stdio: "pipe",
|
|
174
|
+
encoding: "utf-8"
|
|
175
|
+
});
|
|
176
|
+
const files = readdirSync(packDest);
|
|
177
|
+
const tgz = files.find((f) => f.endsWith(".tgz"));
|
|
178
|
+
if (!tgz) throw new Error(`npm pack did not produce a .tgz in ${packDest}`);
|
|
179
|
+
const extractDir = join(packDest, "extract");
|
|
180
|
+
mkdirSync(extractDir, { recursive: true });
|
|
181
|
+
execSync(`tar -xzf "${join(packDest, tgz)}" -C "${extractDir}"`, {
|
|
182
|
+
stdio: "pipe",
|
|
183
|
+
encoding: "utf-8"
|
|
184
|
+
});
|
|
185
|
+
const extractedPackage = join(extractDir, "package");
|
|
186
|
+
if (!existsSync(extractedPackage)) {
|
|
187
|
+
throw new Error(`Extracted tarball did not contain "package" dir in ${extractDir}`);
|
|
188
|
+
}
|
|
189
|
+
mkdirSync(join(cacheDir, ".."), { recursive: true });
|
|
190
|
+
if (existsSync(cacheDir)) rmSync(cacheDir, { recursive: true, force: true });
|
|
191
|
+
renameSync(extractedPackage, cacheDir);
|
|
192
|
+
const npmInstallTimeout = 12e4;
|
|
193
|
+
const maxAttempts = 3;
|
|
194
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
195
|
+
try {
|
|
196
|
+
execSync("npm install --prefer-offline --no-audit --no-fund", {
|
|
197
|
+
cwd: cacheDir,
|
|
198
|
+
stdio: "pipe",
|
|
199
|
+
encoding: "utf-8",
|
|
200
|
+
timeout: npmInstallTimeout
|
|
201
|
+
});
|
|
202
|
+
break;
|
|
203
|
+
} catch (err) {
|
|
204
|
+
if (attempt >= maxAttempts) {
|
|
205
|
+
const lastErr = err instanceof Error ? err : new Error(String(err));
|
|
206
|
+
throw new Error(`npm install in cache failed after ${maxAttempts} attempts: ${lastErr.message}`);
|
|
207
|
+
}
|
|
208
|
+
const delayMs = 5e3 * attempt;
|
|
209
|
+
const deadline = Date.now() + delayMs;
|
|
210
|
+
while (Date.now() < deadline) {
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
options.afterInstall?.(cacheDir, packageName);
|
|
215
|
+
return cacheDir;
|
|
216
|
+
} finally {
|
|
217
|
+
if (existsSync(packDest)) rmSync(packDest, { recursive: true, force: true });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function getPackageEntryPath(packageRoot) {
|
|
221
|
+
const pkgPath = join(packageRoot, "package.json");
|
|
222
|
+
if (!existsSync(pkgPath)) throw new Error(`No package.json in ${packageRoot}`);
|
|
223
|
+
const pkg = JSON.parse(readFileSync2(pkgPath, "utf-8"));
|
|
224
|
+
const main = pkg.main ?? "dist/index.js";
|
|
225
|
+
const entry = join(packageRoot, main);
|
|
226
|
+
if (!existsSync(entry)) throw new Error(`Entry not found: ${entry}`);
|
|
227
|
+
return entry;
|
|
228
|
+
}
|
|
229
|
+
async function importFromCache(packageRoot) {
|
|
230
|
+
const entryPath = getPackageEntryPath(packageRoot);
|
|
231
|
+
const fileUrl = pathToFileURL(entryPath).href;
|
|
232
|
+
return import(
|
|
233
|
+
/* @vite-ignore */
|
|
234
|
+
fileUrl
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export {
|
|
239
|
+
NPM_PROTOCOL_PREFIX,
|
|
240
|
+
isNpmProviderSpec,
|
|
241
|
+
parseNpmProvider,
|
|
242
|
+
parseNpmProviderSpec,
|
|
243
|
+
clearVersionCache,
|
|
244
|
+
resolveNpmPackageVersion,
|
|
245
|
+
resolveLatestVersionFromRegistry,
|
|
246
|
+
formatProviderDisplay,
|
|
247
|
+
getInstalledVersion,
|
|
248
|
+
ensureNpmPackageInstalled,
|
|
249
|
+
ensurePackageInCache,
|
|
250
|
+
getPackageEntryPath,
|
|
251
|
+
importFromCache
|
|
252
|
+
};
|
|
253
|
+
//# sourceMappingURL=chunk-3PI6JR76.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/npm/provider.ts","../src/npm/version.ts","../src/npm/install.ts","../src/npm/cache.ts"],"sourcesContent":["export const NPM_PROTOCOL_PREFIX = \"npm:\";\n\nexport interface NpmProviderInfo {\n pkg: string;\n tag?: string;\n fragment?: string;\n}\n\nexport interface NpmProviderSpec {\n packageName: string;\n version?: string;\n provider?: string;\n}\n\nexport function isNpmProviderSpec(spec: unknown): spec is string {\n return typeof spec === \"string\" && spec.startsWith(NPM_PROTOCOL_PREFIX);\n}\n\nexport function parseNpmProvider(provider: string): NpmProviderInfo | null {\n if (!isNpmProviderSpec(provider)) return null;\n const rest = provider.slice(NPM_PROTOCOL_PREFIX.length);\n const hashIdx = rest.indexOf(\"#\");\n const fragment = hashIdx >= 0 ? rest.slice(hashIdx + 1) : undefined;\n const beforeHash = hashIdx >= 0 ? rest.slice(0, hashIdx) : rest;\n const atIdx = beforeHash.startsWith(\"@\") ? beforeHash.indexOf(\"@\", 1) : beforeHash.lastIndexOf(\"@\");\n const pkg = atIdx > 0 ? beforeHash.slice(0, atIdx) : beforeHash;\n const tag = atIdx > 0 ? beforeHash.slice(atIdx + 1) : undefined;\n return { pkg: pkg || beforeHash, tag: tag || undefined, fragment };\n}\n\nexport function parseNpmProviderSpec(spec: string): NpmProviderSpec | null {\n const parsed = parseNpmProvider(spec);\n if (!parsed) return null;\n return {\n packageName: parsed.pkg,\n version: parsed.tag,\n provider: parsed.fragment,\n };\n}\n","import { execFileSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { parseNpmProvider } from \"./provider.js\";\n\ninterface VersionCacheEntry {\n version: string;\n timestamp: number;\n}\n\nconst versionCache = new Map<string, VersionCacheEntry>();\nconst CACHE_TTL = 5 * 60 * 1000;\n\nexport interface ResolveNpmVersionOptions {\n cwd?: string;\n timeoutMs?: number;\n}\n\nexport function clearVersionCache(): void {\n versionCache.clear();\n}\n\nexport function resolveNpmPackageVersion(pkg: string, tag?: string, options: ResolveNpmVersionOptions = {}): string | null {\n const cacheKey = tag ? `${pkg}@${tag}` : pkg;\n const cached = versionCache.get(cacheKey);\n if (cached && Date.now() - cached.timestamp < CACHE_TTL) {\n return cached.version;\n }\n\n try {\n const spec = tag ? `${pkg}@${tag}` : pkg;\n const out = execFileSync(\"npm\", [\"view\", spec, \"version\"], {\n cwd: options.cwd ?? process.cwd(),\n encoding: \"utf-8\",\n timeout: options.timeoutMs ?? 8000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const version = out?.trim() ?? null;\n if (version) {\n versionCache.set(cacheKey, { version, timestamp: Date.now() });\n }\n return version;\n } catch {\n return null;\n }\n}\n\nexport function resolveLatestVersionFromRegistry(packageName: string, options: ResolveNpmVersionOptions = {}): string {\n const version = resolveNpmPackageVersion(packageName, undefined, options);\n if (!version) {\n throw new Error(`Failed to resolve latest version for ${packageName}`);\n }\n return version;\n}\n\nexport function formatProviderDisplay(provider: string): string {\n const parsed = parseNpmProvider(provider);\n if (parsed == null) return provider;\n\n const resolved = resolveNpmPackageVersion(parsed.pkg, parsed.tag);\n const version = resolved ?? parsed.tag ?? \"latest\";\n const frag = parsed.fragment ? `#${parsed.fragment}` : \"\";\n return `npm:${parsed.pkg}@${version}${frag}`;\n}\n\nexport function getInstalledVersion(packageName: string, options: { cwd?: string } = {}): string | null {\n const cwd = options.cwd ?? process.cwd();\n const req = createRequire(import.meta.url);\n try {\n const p = req.resolve(`${packageName}/package.json`, { paths: [cwd] });\n const j = JSON.parse(readFileSync(p, \"utf-8\")) as { version?: string };\n return typeof j.version === \"string\" ? j.version : null;\n } catch {\n return null;\n }\n}\n","import { execFileSync } from \"node:child_process\";\nimport { getInstalledVersion, resolveLatestVersionFromRegistry } from \"./version.js\";\n\nconst VERSION_LATEST = \"latest\";\n\nexport interface EnsureNpmPackageInstalledOptions {\n version?: string;\n cwd?: string;\n stdio?: \"inherit\" | \"pipe\";\n noPackageLock?: boolean;\n logPrefix?: string;\n}\n\nasync function resolveInstallVersion(\n packageName: string,\n version: string | undefined,\n cwd: string,\n): Promise<string> {\n const isLatestOrEmpty =\n version === undefined ||\n version === \"\" ||\n (typeof version === \"string\" && version.toLowerCase() === VERSION_LATEST);\n if (isLatestOrEmpty) {\n return resolveLatestVersionFromRegistry(packageName, { cwd });\n }\n return version;\n}\n\nexport async function ensureNpmPackageInstalled(\n packageName: string,\n options: EnsureNpmPackageInstalledOptions = {},\n): Promise<void> {\n if (typeof packageName !== \"string\" || packageName.trim().length === 0) {\n throw new Error(\"ensureNpmPackageInstalled requires a non-empty package name\");\n }\n\n const cwd = options.cwd ?? process.cwd();\n const resolvedVersion = await resolveInstallVersion(packageName, options.version, cwd);\n const installedVersion = getInstalledVersion(packageName, { cwd });\n\n if (installedVersion === resolvedVersion) return;\n\n const installSpec = `${packageName}@${resolvedVersion}`;\n const prefix = options.logPrefix ?? \"[agent-common]\";\n if (installedVersion === null) {\n console.info(`${prefix} Installing provider: ${installSpec}`);\n } else {\n console.info(`${prefix} Updating provider: ${packageName} ${installedVersion} -> ${resolvedVersion}`);\n }\n\n const args = [\"install\", installSpec];\n if (options.noPackageLock !== false) args.push(\"--no-package-lock\");\n\n try {\n execFileSync(\"npm\", args, {\n cwd,\n stdio: options.stdio ?? \"inherit\",\n encoding: \"utf-8\",\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`npm install failed for ${installSpec}: ${msg}`, { cause: e });\n }\n}\n","import { execSync } from \"node:child_process\";\nimport { readFileSync, readdirSync, mkdirSync, rmSync, renameSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\nimport { resolveLatestVersionFromRegistry } from \"./version.js\";\n\nexport interface EnsurePackageInCacheOptions {\n cacheBase?: string;\n afterInstall?: (cacheDir: string, packageName: string) => void;\n}\n\nconst DEFAULT_CACHE_BASE = join(homedir(), \".agent\", \"cache\");\n\nfunction isLatestRequest(version: string): boolean {\n const v = (version ?? \"\").trim().toLowerCase();\n return v === \"\" || v === \"latest\";\n}\n\nfunction getCachedPackageVersion(cacheDir: string): string | undefined {\n const pkgPath = join(cacheDir, \"package.json\");\n if (!existsSync(pkgPath)) return undefined;\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { version?: string };\n return typeof pkg.version === \"string\" ? pkg.version : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction packagePathSegments(name: string): string[] {\n const withoutScope = name.replace(/^@/, \"\");\n return withoutScope.split(\"/\").filter(Boolean);\n}\n\nfunction resolveCacheDir(cacheBase: string, packageName: string, version: string): string {\n const segments = packagePathSegments(packageName);\n return join(cacheBase, ...segments, version);\n}\n\nexport function ensurePackageInCache(\n packageName: string,\n version: string = \"latest\",\n options: EnsurePackageInCacheOptions = {},\n): string {\n const cacheBase = options.cacheBase ?? DEFAULT_CACHE_BASE;\n const resolvedVersion = isLatestRequest(version)\n ? resolveLatestVersionFromRegistry(packageName)\n : version;\n\n const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);\n const packageJsonPath = join(cacheDir, \"package.json\");\n const nodeModulesPath = join(cacheDir, \"node_modules\");\n\n if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {\n const cachedVersion = getCachedPackageVersion(cacheDir);\n if (cachedVersion === resolvedVersion) {\n options.afterInstall?.(cacheDir, packageName);\n return cacheDir;\n }\n rmSync(cacheDir, { recursive: true, force: true });\n }\n\n const packDest = join(cacheBase, \".pack-tmp\", packageName.replace(/@/g, \"\").replace(/\\//g, \"_\"));\n mkdirSync(packDest, { recursive: true });\n\n try {\n execSync(`npm pack ${packageName}@${resolvedVersion} --pack-destination \"${packDest}\"`, {\n cwd: process.cwd(),\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const files = readdirSync(packDest);\n const tgz = files.find((f) => f.endsWith(\".tgz\"));\n if (!tgz) throw new Error(`npm pack did not produce a .tgz in ${packDest}`);\n\n const extractDir = join(packDest, \"extract\");\n mkdirSync(extractDir, { recursive: true });\n execSync(`tar -xzf \"${join(packDest, tgz)}\" -C \"${extractDir}\"`, {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n const extractedPackage = join(extractDir, \"package\");\n if (!existsSync(extractedPackage)) {\n throw new Error(`Extracted tarball did not contain \\\"package\\\" dir in ${extractDir}`);\n }\n\n mkdirSync(join(cacheDir, \"..\"), { recursive: true });\n if (existsSync(cacheDir)) rmSync(cacheDir, { recursive: true, force: true });\n renameSync(extractedPackage, cacheDir);\n\n const npmInstallTimeout = 120_000;\n const maxAttempts = 3;\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n execSync(\"npm install --prefer-offline --no-audit --no-fund\", {\n cwd: cacheDir,\n stdio: \"pipe\",\n encoding: \"utf-8\",\n timeout: npmInstallTimeout,\n });\n break;\n } catch (err) {\n if (attempt >= maxAttempts) {\n const lastErr = err instanceof Error ? err : new Error(String(err));\n throw new Error(`npm install in cache failed after ${maxAttempts} attempts: ${lastErr.message}`);\n }\n const delayMs = 5_000 * attempt;\n const deadline = Date.now() + delayMs;\n while (Date.now() < deadline) {\n // retry delay\n }\n }\n }\n\n options.afterInstall?.(cacheDir, packageName);\n return cacheDir;\n } finally {\n if (existsSync(packDest)) rmSync(packDest, { recursive: true, force: true });\n }\n}\n\nexport function getPackageEntryPath(packageRoot: string): string {\n const pkgPath = join(packageRoot, \"package.json\");\n if (!existsSync(pkgPath)) throw new Error(`No package.json in ${packageRoot}`);\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { main?: string };\n const main = pkg.main ?? \"dist/index.js\";\n const entry = join(packageRoot, main);\n if (!existsSync(entry)) throw new Error(`Entry not found: ${entry}`);\n return entry;\n}\n\nexport async function importFromCache(packageRoot: string): Promise<unknown> {\n const entryPath = getPackageEntryPath(packageRoot);\n const fileUrl = pathToFileURL(entryPath).href;\n return import(/* @vite-ignore */ fileUrl);\n}\n"],"mappings":"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","names":["execFileSync","execFileSync","readFileSync","readFileSync"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./npm/index.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
NPM_PROTOCOL_PREFIX,
|
|
3
|
+
clearVersionCache,
|
|
4
|
+
ensureNpmPackageInstalled,
|
|
5
|
+
ensurePackageInCache,
|
|
6
|
+
formatProviderDisplay,
|
|
7
|
+
getInstalledVersion,
|
|
8
|
+
getPackageEntryPath,
|
|
9
|
+
importFromCache,
|
|
10
|
+
isNpmProviderSpec,
|
|
11
|
+
parseNpmProvider,
|
|
12
|
+
parseNpmProviderSpec,
|
|
13
|
+
resolveLatestVersionFromRegistry,
|
|
14
|
+
resolveNpmPackageVersion
|
|
15
|
+
} from "./chunk-3PI6JR76.js";
|
|
16
|
+
export {
|
|
17
|
+
NPM_PROTOCOL_PREFIX,
|
|
18
|
+
clearVersionCache,
|
|
19
|
+
ensureNpmPackageInstalled,
|
|
20
|
+
ensurePackageInCache,
|
|
21
|
+
formatProviderDisplay,
|
|
22
|
+
getInstalledVersion,
|
|
23
|
+
getPackageEntryPath,
|
|
24
|
+
importFromCache,
|
|
25
|
+
isNpmProviderSpec,
|
|
26
|
+
parseNpmProvider,
|
|
27
|
+
parseNpmProviderSpec,
|
|
28
|
+
resolveLatestVersionFromRegistry,
|
|
29
|
+
resolveNpmPackageVersion
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface EnsurePackageInCacheOptions {
|
|
2
|
+
cacheBase?: string;
|
|
3
|
+
afterInstall?: (cacheDir: string, packageName: string) => void;
|
|
4
|
+
}
|
|
5
|
+
export declare function ensurePackageInCache(packageName: string, version?: string, options?: EnsurePackageInCacheOptions): string;
|
|
6
|
+
export declare function getPackageEntryPath(packageRoot: string): string;
|
|
7
|
+
export declare function importFromCache(packageRoot: string): Promise<unknown>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { NPM_PROTOCOL_PREFIX, isNpmProviderSpec, parseNpmProvider, parseNpmProviderSpec, type NpmProviderInfo, type NpmProviderSpec, } from "./provider.js";
|
|
2
|
+
export { clearVersionCache, resolveNpmPackageVersion, resolveLatestVersionFromRegistry, formatProviderDisplay, getInstalledVersion, type ResolveNpmVersionOptions, } from "./version.js";
|
|
3
|
+
export { ensureNpmPackageInstalled, type EnsureNpmPackageInstalledOptions, } from "./install.js";
|
|
4
|
+
export { ensurePackageInCache, getPackageEntryPath, importFromCache, type EnsurePackageInCacheOptions, } from "./cache.js";
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
NPM_PROTOCOL_PREFIX,
|
|
3
|
+
clearVersionCache,
|
|
4
|
+
ensureNpmPackageInstalled,
|
|
5
|
+
ensurePackageInCache,
|
|
6
|
+
formatProviderDisplay,
|
|
7
|
+
getInstalledVersion,
|
|
8
|
+
getPackageEntryPath,
|
|
9
|
+
importFromCache,
|
|
10
|
+
isNpmProviderSpec,
|
|
11
|
+
parseNpmProvider,
|
|
12
|
+
parseNpmProviderSpec,
|
|
13
|
+
resolveLatestVersionFromRegistry,
|
|
14
|
+
resolveNpmPackageVersion
|
|
15
|
+
} from "../chunk-3PI6JR76.js";
|
|
16
|
+
export {
|
|
17
|
+
NPM_PROTOCOL_PREFIX,
|
|
18
|
+
clearVersionCache,
|
|
19
|
+
ensureNpmPackageInstalled,
|
|
20
|
+
ensurePackageInCache,
|
|
21
|
+
formatProviderDisplay,
|
|
22
|
+
getInstalledVersion,
|
|
23
|
+
getPackageEntryPath,
|
|
24
|
+
importFromCache,
|
|
25
|
+
isNpmProviderSpec,
|
|
26
|
+
parseNpmProvider,
|
|
27
|
+
parseNpmProviderSpec,
|
|
28
|
+
resolveLatestVersionFromRegistry,
|
|
29
|
+
resolveNpmPackageVersion
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface EnsureNpmPackageInstalledOptions {
|
|
2
|
+
version?: string;
|
|
3
|
+
cwd?: string;
|
|
4
|
+
stdio?: "inherit" | "pipe";
|
|
5
|
+
noPackageLock?: boolean;
|
|
6
|
+
logPrefix?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function ensureNpmPackageInstalled(packageName: string, options?: EnsureNpmPackageInstalledOptions): Promise<void>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const NPM_PROTOCOL_PREFIX = "npm:";
|
|
2
|
+
export interface NpmProviderInfo {
|
|
3
|
+
pkg: string;
|
|
4
|
+
tag?: string;
|
|
5
|
+
fragment?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface NpmProviderSpec {
|
|
8
|
+
packageName: string;
|
|
9
|
+
version?: string;
|
|
10
|
+
provider?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function isNpmProviderSpec(spec: unknown): spec is string;
|
|
13
|
+
export declare function parseNpmProvider(provider: string): NpmProviderInfo | null;
|
|
14
|
+
export declare function parseNpmProviderSpec(spec: string): NpmProviderSpec | null;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ResolveNpmVersionOptions {
|
|
2
|
+
cwd?: string;
|
|
3
|
+
timeoutMs?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function clearVersionCache(): void;
|
|
6
|
+
export declare function resolveNpmPackageVersion(pkg: string, tag?: string, options?: ResolveNpmVersionOptions): string | null;
|
|
7
|
+
export declare function resolveLatestVersionFromRegistry(packageName: string, options?: ResolveNpmVersionOptions): string;
|
|
8
|
+
export declare function formatProviderDisplay(provider: string): string;
|
|
9
|
+
export declare function getInstalledVersion(packageName: string, options?: {
|
|
10
|
+
cwd?: string;
|
|
11
|
+
}): string | null;
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@easynet/agent-common",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Shared runtime utilities for Easynet agent projects",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"typesVersions": {
|
|
9
|
+
"*": {
|
|
10
|
+
"npm": [
|
|
11
|
+
"dist/npm/index.d.ts"
|
|
12
|
+
],
|
|
13
|
+
"*": [
|
|
14
|
+
"dist/*"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"import": "./dist/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./npm": {
|
|
24
|
+
"types": "./dist/npm/index.d.ts",
|
|
25
|
+
"import": "./dist/npm/index.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsup && tsc -p tsconfig.dts.json",
|
|
33
|
+
"dev": "tsup --watch",
|
|
34
|
+
"typecheck": "tsc --noEmit",
|
|
35
|
+
"test": "npm run build && npm run typecheck",
|
|
36
|
+
"release": "semantic-release"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@semantic-release/commit-analyzer": "^13.0.0",
|
|
40
|
+
"@semantic-release/git": "^10.0.1",
|
|
41
|
+
"@semantic-release/npm": "^12.0.0",
|
|
42
|
+
"@semantic-release/release-notes-generator": "^14.0.0",
|
|
43
|
+
"@types/node": "^22.10.0",
|
|
44
|
+
"semantic-release": "^24.2.0",
|
|
45
|
+
"tsup": "^8.3.5",
|
|
46
|
+
"typescript": "^5.7.2"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=18.0.0"
|
|
50
|
+
},
|
|
51
|
+
"license": "MIT",
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public",
|
|
54
|
+
"registry": "https://registry.npmjs.org/"
|
|
55
|
+
},
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "https://github.com/easynet-world/agent-common.git"
|
|
59
|
+
},
|
|
60
|
+
"homepage": "https://github.com/easynet-world/agent-common#readme",
|
|
61
|
+
"bugs": {
|
|
62
|
+
"url": "https://github.com/easynet-world/agent-common/issues"
|
|
63
|
+
}
|
|
64
|
+
}
|