186 lines
6.8 KiB
JavaScript
186 lines
6.8 KiB
JavaScript
'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;
|