@easynet/agent-common 1.0.0 → 1.0.2

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.
@@ -26,8 +26,8 @@ function parseNpmProviderSpec(spec) {
26
26
 
27
27
  // src/npm/version.ts
28
28
  import { execFileSync } from "child_process";
29
- import { readFileSync } from "fs";
30
- import { createRequire } from "module";
29
+ import { existsSync, readFileSync } from "fs";
30
+ import path from "path";
31
31
  var versionCache = /* @__PURE__ */ new Map();
32
32
  var CACHE_TTL = 5 * 60 * 1e3;
33
33
  function clearVersionCache() {
@@ -72,14 +72,21 @@ function formatProviderDisplay(provider) {
72
72
  return `npm:${parsed.pkg}@${version}${frag}`;
73
73
  }
74
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;
75
+ let dir = path.resolve(options.cwd ?? process.cwd());
76
+ const segs = packageName.split("/");
77
+ while (true) {
78
+ const pkgJsonPath = path.join(dir, "node_modules", ...segs, "package.json");
79
+ if (existsSync(pkgJsonPath)) {
80
+ try {
81
+ const j = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
82
+ return typeof j.version === "string" ? j.version : null;
83
+ } catch {
84
+ return null;
85
+ }
86
+ }
87
+ const parent = path.dirname(dir);
88
+ if (parent === dir) return null;
89
+ dir = parent;
83
90
  }
84
91
  }
85
92
 
@@ -124,7 +131,7 @@ async function ensureNpmPackageInstalled(packageName, options = {}) {
124
131
 
125
132
  // src/npm/cache.ts
126
133
  import { execSync } from "child_process";
127
- import { readFileSync as readFileSync2, readdirSync, mkdirSync, rmSync, renameSync, existsSync } from "fs";
134
+ import { readFileSync as readFileSync2, readdirSync, mkdirSync, rmSync, renameSync, existsSync as existsSync2 } from "fs";
128
135
  import { join } from "path";
129
136
  import { homedir } from "os";
130
137
  import { pathToFileURL } from "url";
@@ -135,7 +142,7 @@ function isLatestRequest(version) {
135
142
  }
136
143
  function getCachedPackageVersion(cacheDir) {
137
144
  const pkgPath = join(cacheDir, "package.json");
138
- if (!existsSync(pkgPath)) return void 0;
145
+ if (!existsSync2(pkgPath)) return void 0;
139
146
  try {
140
147
  const pkg = JSON.parse(readFileSync2(pkgPath, "utf-8"));
141
148
  return typeof pkg.version === "string" ? pkg.version : void 0;
@@ -157,7 +164,7 @@ function ensurePackageInCache(packageName, version = "latest", options = {}) {
157
164
  const cacheDir = resolveCacheDir(cacheBase, packageName, resolvedVersion);
158
165
  const packageJsonPath = join(cacheDir, "package.json");
159
166
  const nodeModulesPath = join(cacheDir, "node_modules");
160
- if (existsSync(packageJsonPath) && existsSync(nodeModulesPath)) {
167
+ if (existsSync2(packageJsonPath) && existsSync2(nodeModulesPath)) {
161
168
  const cachedVersion = getCachedPackageVersion(cacheDir);
162
169
  if (cachedVersion === resolvedVersion) {
163
170
  options.afterInstall?.(cacheDir, packageName);
@@ -183,11 +190,11 @@ function ensurePackageInCache(packageName, version = "latest", options = {}) {
183
190
  encoding: "utf-8"
184
191
  });
185
192
  const extractedPackage = join(extractDir, "package");
186
- if (!existsSync(extractedPackage)) {
193
+ if (!existsSync2(extractedPackage)) {
187
194
  throw new Error(`Extracted tarball did not contain "package" dir in ${extractDir}`);
188
195
  }
189
196
  mkdirSync(join(cacheDir, ".."), { recursive: true });
190
- if (existsSync(cacheDir)) rmSync(cacheDir, { recursive: true, force: true });
197
+ if (existsSync2(cacheDir)) rmSync(cacheDir, { recursive: true, force: true });
191
198
  renameSync(extractedPackage, cacheDir);
192
199
  const npmInstallTimeout = 12e4;
193
200
  const maxAttempts = 3;
@@ -214,16 +221,16 @@ function ensurePackageInCache(packageName, version = "latest", options = {}) {
214
221
  options.afterInstall?.(cacheDir, packageName);
215
222
  return cacheDir;
216
223
  } finally {
217
- if (existsSync(packDest)) rmSync(packDest, { recursive: true, force: true });
224
+ if (existsSync2(packDest)) rmSync(packDest, { recursive: true, force: true });
218
225
  }
219
226
  }
220
227
  function getPackageEntryPath(packageRoot) {
221
228
  const pkgPath = join(packageRoot, "package.json");
222
- if (!existsSync(pkgPath)) throw new Error(`No package.json in ${packageRoot}`);
229
+ if (!existsSync2(pkgPath)) throw new Error(`No package.json in ${packageRoot}`);
223
230
  const pkg = JSON.parse(readFileSync2(pkgPath, "utf-8"));
224
231
  const main = pkg.main ?? "dist/index.js";
225
232
  const entry = join(packageRoot, main);
226
- if (!existsSync(entry)) throw new Error(`Entry not found: ${entry}`);
233
+ if (!existsSync2(entry)) throw new Error(`Entry not found: ${entry}`);
227
234
  return entry;
228
235
  }
229
236
  async function importFromCache(packageRoot) {
@@ -235,6 +242,77 @@ async function importFromCache(packageRoot) {
235
242
  );
236
243
  }
237
244
 
245
+ // src/npm/command.ts
246
+ import { spawnSync } from "child_process";
247
+ function normalizeOutput(v) {
248
+ return typeof v === "string" ? v : "";
249
+ }
250
+ function runNpmCommand(args, options = {}) {
251
+ const result = spawnSync("npm", args, {
252
+ cwd: options.cwd ?? process.cwd(),
253
+ env: options.env ?? process.env,
254
+ encoding: "utf-8",
255
+ timeout: options.timeoutMs,
256
+ stdio: options.stdio ?? "pipe",
257
+ shell: options.shell ?? false
258
+ });
259
+ return {
260
+ args,
261
+ status: result.status,
262
+ stdout: normalizeOutput(result.stdout),
263
+ stderr: normalizeOutput(result.stderr),
264
+ signal: result.signal,
265
+ error: result.error ?? void 0
266
+ };
267
+ }
268
+ function assertNpmCommandSuccess(result, context) {
269
+ if (!result.error && result.status === 0) return;
270
+ const details = result.error?.message || result.stderr.trim() || (result.status == null ? "terminated" : `exit code ${result.status}`);
271
+ throw new Error(`${context} failed: npm ${result.args.join(" ")} (${details})`);
272
+ }
273
+ function npmSearchJson(query, options = {}) {
274
+ const result = runNpmCommand(["search", query, "--json"], options);
275
+ if (result.error || result.status !== 0) return [];
276
+ const text = result.stdout.trim();
277
+ if (!text) return [];
278
+ try {
279
+ const parsed = JSON.parse(text);
280
+ return Array.isArray(parsed) ? parsed : [];
281
+ } catch {
282
+ return [];
283
+ }
284
+ }
285
+ function npmInstall(options = {}) {
286
+ const args = ["install"];
287
+ if (options.global) args.push("-g");
288
+ if (options.registry) args.push("--registry", options.registry);
289
+ if (options.legacyPeerDeps) args.push("--legacy-peer-deps");
290
+ if (options.noPackageLock) args.push("--no-package-lock");
291
+ if (Array.isArray(options.packages) && options.packages.length > 0) {
292
+ args.push(...options.packages);
293
+ }
294
+ const result = runNpmCommand(args, options);
295
+ assertNpmCommandSuccess(result, "npm install");
296
+ }
297
+ function npmRunScript(script, options = {}) {
298
+ const result = runNpmCommand(["run", script], options);
299
+ assertNpmCommandSuccess(result, `npm run ${script}`);
300
+ }
301
+ function npmPublish(options = {}) {
302
+ const args = ["publish"];
303
+ if (options.tag) args.push("--tag", options.tag);
304
+ if (options.access) args.push("--access", options.access);
305
+ if (options.registry) args.push("--registry", options.registry);
306
+ const result = runNpmCommand(args, options);
307
+ assertNpmCommandSuccess(result, "npm publish");
308
+ }
309
+ function npmRoot(options = {}) {
310
+ const args = ["root", ...options.global ? ["-g"] : []];
311
+ const result = runNpmCommand(args, options);
312
+ assertNpmCommandSuccess(result, "npm root");
313
+ return result.stdout.trim();
314
+ }
315
+
238
316
  export {
239
317
  NPM_PROTOCOL_PREFIX,
240
318
  isNpmProviderSpec,
@@ -248,6 +326,13 @@ export {
248
326
  ensureNpmPackageInstalled,
249
327
  ensurePackageInCache,
250
328
  getPackageEntryPath,
251
- importFromCache
329
+ importFromCache,
330
+ runNpmCommand,
331
+ assertNpmCommandSuccess,
332
+ npmSearchJson,
333
+ npmInstall,
334
+ npmRunScript,
335
+ npmPublish,
336
+ npmRoot
252
337
  };
253
- //# sourceMappingURL=chunk-3PI6JR76.js.map
338
+ //# sourceMappingURL=chunk-UDSSVJ5F.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","../src/npm/command.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 { existsSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\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 let dir = path.resolve(options.cwd ?? process.cwd());\n const segs = packageName.split(\"/\");\n while (true) {\n const pkgJsonPath = path.join(dir, \"node_modules\", ...segs, \"package.json\");\n if (existsSync(pkgJsonPath)) {\n try {\n const j = JSON.parse(readFileSync(pkgJsonPath, \"utf-8\")) as { version?: string };\n return typeof j.version === \"string\" ? j.version : null;\n } catch {\n return null;\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\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","import { spawnSync } from \"node:child_process\";\n\nexport interface RunNpmCommandOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n timeoutMs?: number;\n stdio?: \"pipe\" | \"inherit\";\n shell?: boolean;\n}\n\nexport interface NpmCommandResult {\n args: string[];\n status: number | null;\n stdout: string;\n stderr: string;\n signal: NodeJS.Signals | null;\n error?: Error;\n}\n\nexport interface NpmInstallOptions extends RunNpmCommandOptions {\n packages?: string[];\n global?: boolean;\n noPackageLock?: boolean;\n legacyPeerDeps?: boolean;\n registry?: string;\n}\n\nexport interface NpmPublishOptions extends RunNpmCommandOptions {\n tag?: string;\n access?: \"public\" | \"restricted\";\n registry?: string;\n}\n\nfunction normalizeOutput(v: unknown): string {\n return typeof v === \"string\" ? v : \"\";\n}\n\nexport function runNpmCommand(args: string[], options: RunNpmCommandOptions = {}): NpmCommandResult {\n const result = spawnSync(\"npm\", args, {\n cwd: options.cwd ?? process.cwd(),\n env: options.env ?? process.env,\n encoding: \"utf-8\",\n timeout: options.timeoutMs,\n stdio: options.stdio ?? \"pipe\",\n shell: options.shell ?? false,\n });\n\n return {\n args,\n status: result.status,\n stdout: normalizeOutput(result.stdout),\n stderr: normalizeOutput(result.stderr),\n signal: result.signal,\n error: result.error ?? undefined,\n };\n}\n\nexport function assertNpmCommandSuccess(result: NpmCommandResult, context: string): void {\n if (!result.error && result.status === 0) return;\n const details =\n result.error?.message ||\n result.stderr.trim() ||\n (result.status == null ? \"terminated\" : `exit code ${result.status}`);\n throw new Error(`${context} failed: npm ${result.args.join(\" \")} (${details})`);\n}\n\nexport function npmSearchJson(query: string, options: RunNpmCommandOptions = {}): unknown[] {\n const result = runNpmCommand([\"search\", query, \"--json\"], options);\n if (result.error || result.status !== 0) return [];\n const text = result.stdout.trim();\n if (!text) return [];\n try {\n const parsed = JSON.parse(text) as unknown;\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nexport function npmInstall(options: NpmInstallOptions = {}): void {\n const args: string[] = [\"install\"];\n if (options.global) args.push(\"-g\");\n if (options.registry) args.push(\"--registry\", options.registry);\n if (options.legacyPeerDeps) args.push(\"--legacy-peer-deps\");\n if (options.noPackageLock) args.push(\"--no-package-lock\");\n if (Array.isArray(options.packages) && options.packages.length > 0) {\n args.push(...options.packages);\n }\n const result = runNpmCommand(args, options);\n assertNpmCommandSuccess(result, \"npm install\");\n}\n\nexport function npmRunScript(script: string, options: RunNpmCommandOptions = {}): void {\n const result = runNpmCommand([\"run\", script], options);\n assertNpmCommandSuccess(result, `npm run ${script}`);\n}\n\nexport function npmPublish(options: NpmPublishOptions = {}): void {\n const args: string[] = [\"publish\"];\n if (options.tag) args.push(\"--tag\", options.tag);\n if (options.access) args.push(\"--access\", options.access);\n if (options.registry) args.push(\"--registry\", options.registry);\n const result = runNpmCommand(args, options);\n assertNpmCommandSuccess(result, \"npm publish\");\n}\n\nexport function npmRoot(options: RunNpmCommandOptions & { global?: boolean } = {}): string {\n const args = [\"root\", ...(options.global ? [\"-g\"] : [])];\n const result = runNpmCommand(args, options);\n assertNpmCommandSuccess(result, \"npm root\");\n return result.stdout.trim();\n}\n"],"mappings":"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","names":["execFileSync","execFileSync","readFileSync","existsSync","existsSync","readFileSync"]}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  NPM_PROTOCOL_PREFIX,
3
+ assertNpmCommandSuccess,
3
4
  clearVersionCache,
4
5
  ensureNpmPackageInstalled,
5
6
  ensurePackageInCache,
@@ -8,13 +9,20 @@ import {
8
9
  getPackageEntryPath,
9
10
  importFromCache,
10
11
  isNpmProviderSpec,
12
+ npmInstall,
13
+ npmPublish,
14
+ npmRoot,
15
+ npmRunScript,
16
+ npmSearchJson,
11
17
  parseNpmProvider,
12
18
  parseNpmProviderSpec,
13
19
  resolveLatestVersionFromRegistry,
14
- resolveNpmPackageVersion
15
- } from "./chunk-3PI6JR76.js";
20
+ resolveNpmPackageVersion,
21
+ runNpmCommand
22
+ } from "./chunk-UDSSVJ5F.js";
16
23
  export {
17
24
  NPM_PROTOCOL_PREFIX,
25
+ assertNpmCommandSuccess,
18
26
  clearVersionCache,
19
27
  ensureNpmPackageInstalled,
20
28
  ensurePackageInCache,
@@ -23,9 +31,15 @@ export {
23
31
  getPackageEntryPath,
24
32
  importFromCache,
25
33
  isNpmProviderSpec,
34
+ npmInstall,
35
+ npmPublish,
36
+ npmRoot,
37
+ npmRunScript,
38
+ npmSearchJson,
26
39
  parseNpmProvider,
27
40
  parseNpmProviderSpec,
28
41
  resolveLatestVersionFromRegistry,
29
- resolveNpmPackageVersion
42
+ resolveNpmPackageVersion,
43
+ runNpmCommand
30
44
  };
31
45
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,36 @@
1
+ export interface RunNpmCommandOptions {
2
+ cwd?: string;
3
+ env?: NodeJS.ProcessEnv;
4
+ timeoutMs?: number;
5
+ stdio?: "pipe" | "inherit";
6
+ shell?: boolean;
7
+ }
8
+ export interface NpmCommandResult {
9
+ args: string[];
10
+ status: number | null;
11
+ stdout: string;
12
+ stderr: string;
13
+ signal: NodeJS.Signals | null;
14
+ error?: Error;
15
+ }
16
+ export interface NpmInstallOptions extends RunNpmCommandOptions {
17
+ packages?: string[];
18
+ global?: boolean;
19
+ noPackageLock?: boolean;
20
+ legacyPeerDeps?: boolean;
21
+ registry?: string;
22
+ }
23
+ export interface NpmPublishOptions extends RunNpmCommandOptions {
24
+ tag?: string;
25
+ access?: "public" | "restricted";
26
+ registry?: string;
27
+ }
28
+ export declare function runNpmCommand(args: string[], options?: RunNpmCommandOptions): NpmCommandResult;
29
+ export declare function assertNpmCommandSuccess(result: NpmCommandResult, context: string): void;
30
+ export declare function npmSearchJson(query: string, options?: RunNpmCommandOptions): unknown[];
31
+ export declare function npmInstall(options?: NpmInstallOptions): void;
32
+ export declare function npmRunScript(script: string, options?: RunNpmCommandOptions): void;
33
+ export declare function npmPublish(options?: NpmPublishOptions): void;
34
+ export declare function npmRoot(options?: RunNpmCommandOptions & {
35
+ global?: boolean;
36
+ }): string;
@@ -2,3 +2,4 @@ export { NPM_PROTOCOL_PREFIX, isNpmProviderSpec, parseNpmProvider, parseNpmProvi
2
2
  export { clearVersionCache, resolveNpmPackageVersion, resolveLatestVersionFromRegistry, formatProviderDisplay, getInstalledVersion, type ResolveNpmVersionOptions, } from "./version.js";
3
3
  export { ensureNpmPackageInstalled, type EnsureNpmPackageInstalledOptions, } from "./install.js";
4
4
  export { ensurePackageInCache, getPackageEntryPath, importFromCache, type EnsurePackageInCacheOptions, } from "./cache.js";
5
+ export { runNpmCommand, assertNpmCommandSuccess, npmSearchJson, npmInstall, npmRunScript, npmPublish, npmRoot, type RunNpmCommandOptions, type NpmCommandResult, type NpmInstallOptions, type NpmPublishOptions, } from "./command.js";
package/dist/npm/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  NPM_PROTOCOL_PREFIX,
3
+ assertNpmCommandSuccess,
3
4
  clearVersionCache,
4
5
  ensureNpmPackageInstalled,
5
6
  ensurePackageInCache,
@@ -8,13 +9,20 @@ import {
8
9
  getPackageEntryPath,
9
10
  importFromCache,
10
11
  isNpmProviderSpec,
12
+ npmInstall,
13
+ npmPublish,
14
+ npmRoot,
15
+ npmRunScript,
16
+ npmSearchJson,
11
17
  parseNpmProvider,
12
18
  parseNpmProviderSpec,
13
19
  resolveLatestVersionFromRegistry,
14
- resolveNpmPackageVersion
15
- } from "../chunk-3PI6JR76.js";
20
+ resolveNpmPackageVersion,
21
+ runNpmCommand
22
+ } from "../chunk-UDSSVJ5F.js";
16
23
  export {
17
24
  NPM_PROTOCOL_PREFIX,
25
+ assertNpmCommandSuccess,
18
26
  clearVersionCache,
19
27
  ensureNpmPackageInstalled,
20
28
  ensurePackageInCache,
@@ -23,9 +31,15 @@ export {
23
31
  getPackageEntryPath,
24
32
  importFromCache,
25
33
  isNpmProviderSpec,
34
+ npmInstall,
35
+ npmPublish,
36
+ npmRoot,
37
+ npmRunScript,
38
+ npmSearchJson,
26
39
  parseNpmProvider,
27
40
  parseNpmProviderSpec,
28
41
  resolveLatestVersionFromRegistry,
29
- resolveNpmPackageVersion
42
+ resolveNpmPackageVersion,
43
+ runNpmCommand
30
44
  };
31
45
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easynet/agent-common",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Shared runtime utilities for Easynet agent projects",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +0,0 @@
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":";AAAO,IAAM,sBAAsB;AAc5B,SAAS,kBAAkB,MAA+B;AAC/D,SAAO,OAAO,SAAS,YAAY,KAAK,WAAW,mBAAmB;AACxE;AAEO,SAAS,iBAAiB,UAA0C;AACzE,MAAI,CAAC,kBAAkB,QAAQ,EAAG,QAAO;AACzC,QAAM,OAAO,SAAS,MAAM,oBAAoB,MAAM;AACtD,QAAM,UAAU,KAAK,QAAQ,GAAG;AAChC,QAAM,WAAW,WAAW,IAAI,KAAK,MAAM,UAAU,CAAC,IAAI;AAC1D,QAAM,aAAa,WAAW,IAAI,KAAK,MAAM,GAAG,OAAO,IAAI;AAC3D,QAAM,QAAQ,WAAW,WAAW,GAAG,IAAI,WAAW,QAAQ,KAAK,CAAC,IAAI,WAAW,YAAY,GAAG;AAClG,QAAM,MAAM,QAAQ,IAAI,WAAW,MAAM,GAAG,KAAK,IAAI;AACrD,QAAM,MAAM,QAAQ,IAAI,WAAW,MAAM,QAAQ,CAAC,IAAI;AACtD,SAAO,EAAE,KAAK,OAAO,YAAY,KAAK,OAAO,QAAW,SAAS;AACnE;AAEO,SAAS,qBAAqB,MAAsC;AACzE,QAAM,SAAS,iBAAiB,IAAI;AACpC,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO;AAAA,IACL,aAAa,OAAO;AAAA,IACpB,SAAS,OAAO;AAAA,IAChB,UAAU,OAAO;AAAA,EACnB;AACF;;;ACtCA,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAQ9B,IAAM,eAAe,oBAAI,IAA+B;AACxD,IAAM,YAAY,IAAI,KAAK;AAOpB,SAAS,oBAA0B;AACxC,eAAa,MAAM;AACrB;AAEO,SAAS,yBAAyB,KAAa,KAAc,UAAoC,CAAC,GAAkB;AACzH,QAAM,WAAW,MAAM,GAAG,GAAG,IAAI,GAAG,KAAK;AACzC,QAAM,SAAS,aAAa,IAAI,QAAQ;AACxC,MAAI,UAAU,KAAK,IAAI,IAAI,OAAO,YAAY,WAAW;AACvD,WAAO,OAAO;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,OAAO,MAAM,GAAG,GAAG,IAAI,GAAG,KAAK;AACrC,UAAM,MAAM,aAAa,OAAO,CAAC,QAAQ,MAAM,SAAS,GAAG;AAAA,MACzD,KAAK,QAAQ,OAAO,QAAQ,IAAI;AAAA,MAChC,UAAU;AAAA,MACV,SAAS,QAAQ,aAAa;AAAA,MAC9B,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,UAAM,UAAU,KAAK,KAAK,KAAK;AAC/B,QAAI,SAAS;AACX,mBAAa,IAAI,UAAU,EAAE,SAAS,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,IAC/D;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iCAAiC,aAAqB,UAAoC,CAAC,GAAW;AACpH,QAAM,UAAU,yBAAyB,aAAa,QAAW,OAAO;AACxE,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,wCAAwC,WAAW,EAAE;AAAA,EACvE;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,UAA0B;AAC9D,QAAM,SAAS,iBAAiB,QAAQ;AACxC,MAAI,UAAU,KAAM,QAAO;AAE3B,QAAM,WAAW,yBAAyB,OAAO,KAAK,OAAO,GAAG;AAChE,QAAM,UAAU,YAAY,OAAO,OAAO;AAC1C,QAAM,OAAO,OAAO,WAAW,IAAI,OAAO,QAAQ,KAAK;AACvD,SAAO,OAAO,OAAO,GAAG,IAAI,OAAO,GAAG,IAAI;AAC5C;AAEO,SAAS,oBAAoB,aAAqB,UAA4B,CAAC,GAAkB;AACtG,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,MAAM,cAAc,YAAY,GAAG;AACzC,MAAI;AACF,UAAM,IAAI,IAAI,QAAQ,GAAG,WAAW,iBAAiB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;AACrE,UAAM,IAAI,KAAK,MAAM,aAAa,GAAG,OAAO,CAAC;AAC7C,WAAO,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU;AAAA,EACrD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC3EA,SAAS,gBAAAA,qBAAoB;AAG7B,IAAM,iBAAiB;AAUvB,eAAe,sBACb,aACA,SACA,KACiB;AACjB,QAAM,kBACJ,YAAY,UACZ,YAAY,MACX,OAAO,YAAY,YAAY,QAAQ,YAAY,MAAM;AAC5D,MAAI,iBAAiB;AACnB,WAAO,iCAAiC,aAAa,EAAE,IAAI,CAAC;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,eAAsB,0BACpB,aACA,UAA4C,CAAC,GAC9B;AACf,MAAI,OAAO,gBAAgB,YAAY,YAAY,KAAK,EAAE,WAAW,GAAG;AACtE,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AAEA,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,kBAAkB,MAAM,sBAAsB,aAAa,QAAQ,SAAS,GAAG;AACrF,QAAM,mBAAmB,oBAAoB,aAAa,EAAE,IAAI,CAAC;AAEjE,MAAI,qBAAqB,gBAAiB;AAE1C,QAAM,cAAc,GAAG,WAAW,IAAI,eAAe;AACrD,QAAM,SAAS,QAAQ,aAAa;AACpC,MAAI,qBAAqB,MAAM;AAC7B,YAAQ,KAAK,GAAG,MAAM,yBAAyB,WAAW,EAAE;AAAA,EAC9D,OAAO;AACL,YAAQ,KAAK,GAAG,MAAM,uBAAuB,WAAW,IAAI,gBAAgB,OAAO,eAAe,EAAE;AAAA,EACtG;AAEA,QAAM,OAAO,CAAC,WAAW,WAAW;AACpC,MAAI,QAAQ,kBAAkB,MAAO,MAAK,KAAK,mBAAmB;AAElE,MAAI;AACF,IAAAC,cAAa,OAAO,MAAM;AAAA,MACxB;AAAA,MACA,OAAO,QAAQ,SAAS;AAAA,MACxB,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,SAAS,GAAG;AACV,UAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACrD,UAAM,IAAI,MAAM,0BAA0B,WAAW,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC;AAAA,EAC/E;AACF;;;AC/DA,SAAS,gBAAgB;AACzB,SAAS,gBAAAC,eAAc,aAAa,WAAW,QAAQ,YAAY,kBAAkB;AACrF,SAAS,YAAY;AACrB,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAQ9B,IAAM,qBAAqB,KAAK,QAAQ,GAAG,UAAU,OAAO;AAE5D,SAAS,gBAAgB,SAA0B;AACjD,QAAM,KAAK,WAAW,IAAI,KAAK,EAAE,YAAY;AAC7C,SAAO,MAAM,MAAM,MAAM;AAC3B;AAEA,SAAS,wBAAwB,UAAsC;AACrE,QAAM,UAAU,KAAK,UAAU,cAAc;AAC7C,MAAI,CAAC,WAAW,OAAO,EAAG,QAAO;AACjC,MAAI;AACF,UAAM,MAAM,KAAK,MAAMC,cAAa,SAAS,OAAO,CAAC;AACrD,WAAO,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,EACzD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,MAAwB;AACnD,QAAM,eAAe,KAAK,QAAQ,MAAM,EAAE;AAC1C,SAAO,aAAa,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/C;AAEA,SAAS,gBAAgB,WAAmB,aAAqB,SAAyB;AACxF,QAAM,WAAW,oBAAoB,WAAW;AAChD,SAAO,KAAK,WAAW,GAAG,UAAU,OAAO;AAC7C;AAEO,SAAS,qBACd,aACA,UAAkB,UAClB,UAAuC,CAAC,GAChC;AACR,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,kBAAkB,gBAAgB,OAAO,IAC3C,iCAAiC,WAAW,IAC5C;AAEJ,QAAM,WAAW,gBAAgB,WAAW,aAAa,eAAe;AACxE,QAAM,kBAAkB,KAAK,UAAU,cAAc;AACrD,QAAM,kBAAkB,KAAK,UAAU,cAAc;AAErD,MAAI,WAAW,eAAe,KAAK,WAAW,eAAe,GAAG;AAC9D,UAAM,gBAAgB,wBAAwB,QAAQ;AACtD,QAAI,kBAAkB,iBAAiB;AACrC,cAAQ,eAAe,UAAU,WAAW;AAC5C,aAAO;AAAA,IACT;AACA,WAAO,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACnD;AAEA,QAAM,WAAW,KAAK,WAAW,aAAa,YAAY,QAAQ,MAAM,EAAE,EAAE,QAAQ,OAAO,GAAG,CAAC;AAC/F,YAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAEvC,MAAI;AACF,aAAS,YAAY,WAAW,IAAI,eAAe,wBAAwB,QAAQ,KAAK;AAAA,MACtF,KAAK,QAAQ,IAAI;AAAA,MACjB,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AAED,UAAM,QAAQ,YAAY,QAAQ;AAClC,UAAM,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC;AAChD,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,sCAAsC,QAAQ,EAAE;AAE1E,UAAM,aAAa,KAAK,UAAU,SAAS;AAC3C,cAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,aAAS,aAAa,KAAK,UAAU,GAAG,CAAC,SAAS,UAAU,KAAK;AAAA,MAC/D,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AAED,UAAM,mBAAmB,KAAK,YAAY,SAAS;AACnD,QAAI,CAAC,WAAW,gBAAgB,GAAG;AACjC,YAAM,IAAI,MAAM,sDAAwD,UAAU,EAAE;AAAA,IACtF;AAEA,cAAU,KAAK,UAAU,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,QAAI,WAAW,QAAQ,EAAG,QAAO,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC3E,eAAW,kBAAkB,QAAQ;AAErC,UAAM,oBAAoB;AAC1B,UAAM,cAAc;AACpB,aAAS,UAAU,GAAG,WAAW,aAAa,WAAW;AACvD,UAAI;AACF,iBAAS,qDAAqD;AAAA,UAC5D,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,UACV,SAAS;AAAA,QACX,CAAC;AACD;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,WAAW,aAAa;AAC1B,gBAAM,UAAU,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAClE,gBAAM,IAAI,MAAM,qCAAqC,WAAW,cAAc,QAAQ,OAAO,EAAE;AAAA,QACjG;AACA,cAAM,UAAU,MAAQ;AACxB,cAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,eAAO,KAAK,IAAI,IAAI,UAAU;AAAA,QAE9B;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,eAAe,UAAU,WAAW;AAC5C,WAAO;AAAA,EACT,UAAE;AACA,QAAI,WAAW,QAAQ,EAAG,QAAO,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAC7E;AACF;AAEO,SAAS,oBAAoB,aAA6B;AAC/D,QAAM,UAAU,KAAK,aAAa,cAAc;AAChD,MAAI,CAAC,WAAW,OAAO,EAAG,OAAM,IAAI,MAAM,sBAAsB,WAAW,EAAE;AAC7E,QAAM,MAAM,KAAK,MAAMA,cAAa,SAAS,OAAO,CAAC;AACrD,QAAM,OAAO,IAAI,QAAQ;AACzB,QAAM,QAAQ,KAAK,aAAa,IAAI;AACpC,MAAI,CAAC,WAAW,KAAK,EAAG,OAAM,IAAI,MAAM,oBAAoB,KAAK,EAAE;AACnE,SAAO;AACT;AAEA,eAAsB,gBAAgB,aAAuC;AAC3E,QAAM,YAAY,oBAAoB,WAAW;AACjD,QAAM,UAAU,cAAc,SAAS,EAAE;AACzC,SAAO;AAAA;AAAA,IAA0B;AAAA;AACnC;","names":["execFileSync","execFileSync","readFileSync","readFileSync"]}