UNPKG

lambda-live-debugger

Version:

Debug Lambda functions locally like it is running in the cloud

186 lines (174 loc) 6.96 kB
'use strict'; var node_os = require('node:os'); var node_process = require('node:process'); var utilConfigProvider = require('@smithy/util-config-provider'); var promises = require('node:fs/promises'); var node_path = require('node:path'); var middlewareUserAgent = require('@aws-sdk/middleware-user-agent'); const getRuntimeUserAgentPair = () => { const runtimesToCheck = ["deno", "bun", "llrt"]; for (const runtime of runtimesToCheck) { if (node_process.versions[runtime]) { return [`md/${runtime}`, node_process.versions[runtime]]; } } return ["md/nodejs", node_process.versions.node]; }; const getNodeModulesParentDirs = (dirname) => { const cwd = process.cwd(); if (!dirname) { return [cwd]; } const normalizedPath = node_path.normalize(dirname); const parts = normalizedPath.split(node_path.sep); const nodeModulesIndex = parts.indexOf("node_modules"); const parentDir = nodeModulesIndex !== -1 ? parts.slice(0, nodeModulesIndex).join(node_path.sep) : normalizedPath; if (cwd === parentDir) { return [cwd]; } return [parentDir, cwd]; }; const SEMVER_REGEX = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?$/; const getSanitizedTypeScriptVersion = (version = "") => { const match = version.match(SEMVER_REGEX); if (!match) { return undefined; } const [major, minor, patch, prerelease] = [match[1], match[2], match[3], match[4]]; return prerelease ? `${major}.${minor}.${patch}-${prerelease}` : `${major}.${minor}.${patch}`; }; const ALLOWED_PREFIXES = ["^", "~", ">=", "<=", ">", "<"]; const ALLOWED_DIST_TAGS = ["latest", "beta", "dev", "rc", "insiders", "next"]; const getSanitizedDevTypeScriptVersion = (version = "") => { if (ALLOWED_DIST_TAGS.includes(version)) { return version; } const prefix = ALLOWED_PREFIXES.find((p) => version.startsWith(p)) ?? ""; const sanitizedTypeScriptVersion = getSanitizedTypeScriptVersion(version.slice(prefix.length)); if (!sanitizedTypeScriptVersion) { return undefined; } return `${prefix}${sanitizedTypeScriptVersion}`; }; let tscVersion; const TS_PACKAGE_JSON = node_path.join("node_modules", "typescript", "package.json"); const getTypeScriptUserAgentPair = async () => { if (tscVersion === null) { return undefined; } else if (typeof tscVersion === "string") { return ["md/tsc", tscVersion]; } let isTypeScriptDetectionDisabled = false; try { isTypeScriptDetectionDisabled = utilConfigProvider.booleanSelector(process.env, "AWS_SDK_JS_TYPESCRIPT_DETECTION_DISABLED", utilConfigProvider.SelectorType.ENV) || false; } catch { } if (isTypeScriptDetectionDisabled) { tscVersion = null; return undefined; } const dirname = typeof __dirname !== "undefined" ? __dirname : undefined; const nodeModulesParentDirs = getNodeModulesParentDirs(dirname); let versionFromApp; for (const nodeModulesParentDir of nodeModulesParentDirs) { try { const appPackageJsonPath = node_path.join(nodeModulesParentDir, "package.json"); const packageJson = await promises.readFile(appPackageJsonPath, "utf-8"); const { dependencies, devDependencies } = JSON.parse(packageJson); const version = devDependencies?.typescript ?? dependencies?.typescript; if (typeof version !== "string") { continue; } versionFromApp = version; break; } catch { } } if (!versionFromApp) { tscVersion = null; return undefined; } let versionFromNodeModules; for (const nodeModulesParentDir of nodeModulesParentDirs) { try { const tsPackageJsonPath = node_path.join(nodeModulesParentDir, TS_PACKAGE_JSON); const packageJson = await promises.readFile(tsPackageJsonPath, "utf-8"); const { version } = JSON.parse(packageJson); const sanitizedVersion = getSanitizedTypeScriptVersion(version); if (typeof sanitizedVersion !== "string") { continue; } versionFromNodeModules = sanitizedVersion; break; } catch { } } if (versionFromNodeModules) { tscVersion = versionFromNodeModules; return ["md/tsc", tscVersion]; } const sanitizedVersion = getSanitizedDevTypeScriptVersion(versionFromApp); if (typeof sanitizedVersion !== "string") { tscVersion = null; return undefined; } tscVersion = `dev_${sanitizedVersion}`; return ["md/tsc", tscVersion]; }; const crtAvailability = { isCrtAvailable: false, }; const isCrtAvailable = () => { if (crtAvailability.isCrtAvailable) { return ["md/crt-avail"]; } return null; }; const createDefaultUserAgentProvider = ({ serviceId, clientVersion }) => { const runtimeUserAgentPair = getRuntimeUserAgentPair(); return async (config) => { const sections = [ ["aws-sdk-js", clientVersion], ["ua", "2.1"], [`os/${node_os.platform()}`, node_os.release()], ["lang/js"], runtimeUserAgentPair, ]; const typescriptUserAgentPair = await getTypeScriptUserAgentPair(); if (typescriptUserAgentPair) { sections.push(typescriptUserAgentPair); } const crtAvailable = isCrtAvailable(); if (crtAvailable) { sections.push(crtAvailable); } if (serviceId) { sections.push([`api/${serviceId}`, clientVersion]); } if (node_process.env.AWS_EXECUTION_ENV) { sections.push([`exec-env/${node_process.env.AWS_EXECUTION_ENV}`]); } const appId = await config?.userAgentAppId?.(); const resolvedUserAgent = appId ? [...sections, [`app/${appId}`]] : [...sections]; return resolvedUserAgent; }; }; const defaultUserAgent = createDefaultUserAgentProvider; const UA_APP_ID_ENV_NAME = "AWS_SDK_UA_APP_ID"; const UA_APP_ID_INI_NAME = "sdk_ua_app_id"; const UA_APP_ID_INI_NAME_DEPRECATED = "sdk-ua-app-id"; const NODE_APP_ID_CONFIG_OPTIONS = { environmentVariableSelector: (env) => env[UA_APP_ID_ENV_NAME], configFileSelector: (profile) => profile[UA_APP_ID_INI_NAME] ?? profile[UA_APP_ID_INI_NAME_DEPRECATED], default: middlewareUserAgent.DEFAULT_UA_APP_ID, }; exports.NODE_APP_ID_CONFIG_OPTIONS = NODE_APP_ID_CONFIG_OPTIONS; exports.UA_APP_ID_ENV_NAME = UA_APP_ID_ENV_NAME; exports.UA_APP_ID_INI_NAME = UA_APP_ID_INI_NAME; exports.createDefaultUserAgentProvider = createDefaultUserAgentProvider; exports.crtAvailability = crtAvailability; exports.defaultUserAgent = defaultUserAgent;