Movatterモバイル変換


[0]ホーム

URL:


Skip to content
Search Gists
Sign in Sign up

Instantly share code, notes, and snippets.

@RareScrap
Last activeAugust 25, 2025 13:20
    • Star(0)You must be signed in to star a gist
    • Fork(0)You must be signed in to fork a gist

    Select an option

    Save RareScrap/0ba9e5aba0f996a31538f2b7869d57ac to your computer and use it in GitHub Desktop.
    importosfrom'node:os';
    exportfunctiongetOsPlatformUsingPlatform():NodeJS.Platform|undefined{
    constsanitizedOsType=os.type().toLowerCase()
    switch(sanitizedOsType){
    // Значения, представленные в документации os.type():
    case"windows_nt":return"win32"
    case"darwin":return"darwin"
    case"linux":return"linux"
    }
    returnundefined
    }
    exportfunctiongetOsArchitectureUsingPlatform(osPlatform:NodeJS.Platform|undefined):NodeJS.Architecture|undefined{
    constsanitizedOsMachine=os.machine().toLowerCase()
    switch(sanitizedOsMachine){
    // Значения, представленные в документации os.machine():
    case"arm":return"arm"
    case"arm64":return"arm64"
    case"aarch64":return"arm64"
    case"mips":return"mips"
    case"mips64":return"mips"
    case"ppc64":return"ppc64"
    case"ppc64le":return"ppc"
    case"s390":return"s390"
    case"s390x":return"s390x"
    case"i386":return"ia32"
    // Значение "i686" используется для обозначения x86 приложений, запущенных на x86_64 операционной системе:
    // https://github.com/nodejs/node/issues/56975#issuecomment-2650606500
    // https://github.com/nodejs/node/blob/b07ff551db152ccb507e71160ce077e235206b16/deps/uv/src/win/util.c#L1685
    case"i686":{
    // NodeJS имеет баг, не позволяющий в сборке под x86 точно определить разрядность операционной системы средствами его API
    // https://github.com/nodejs/node/issues/58493
    constisWindows=osPlatform==="win32"
    if(isWindows){
    constwindowsOsArchitecture=getWindowsOsArchitectureUsingPlatform()
    returnwindowsOsArchitecture
    }
    return"x64"
    }
    case"x86_64":{
    // Экспериментально подтверждено, что os.machine() на Windows для arm64 для сборок под x86_64
    // Возвращает значение x86_64, не соответствующее фактической архитектуре операционной системы
    constisWindows=osPlatform==="win32"
    if(isWindows){
    constwindowsOsArchitecture=getWindowsOsArchitectureUsingPlatform()
    returnwindowsOsArchitecture
    }
    return"x64"
    }
    // Остальные значения, возвращаемые реализацией NodeJS:
    // https://github.com/nodejs/node/blob/b07ff551db152ccb507e71160ce077e235206b16/deps/uv/src/win/util.c#L1667
    // Неподдерживаемые значения:
    // 1) DEC Aplha: "alpha"
    // https://github.com/nodejs/node/blob/b07ff551db152ccb507e71160ce077e235206b16/deps/uv/src/win/util.c#L1692
    // 2) SuperH: "shx"
    // https://github.com/nodejs/node/blob/b07ff551db152ccb507e71160ce077e235206b16/deps/uv/src/win/util.c#L1698
    case"ia64":return"x64"
    case"powerpc":return"ppc"
    // Значения, оставшиеся в NodeJS.Architecture (включено на всякий случай):
    case"loong64":return"loong64"
    case"mipsel":return"mipsel"
    case"ppc":return"ppc"
    case"riscv64":return"riscv64"
    // Значения, выявленные экспериментально:
    // Значение "unknown" может использоваться виртуализированными системами (пр. на Windows 11 под arm64 в Parallels Desktop на MacOS под arm64)
    case"unknown":{
    constisWindows=osPlatform==="win32"
    if(isWindows){
    constwindowsOsArchitecture=getWindowsOsArchitectureUsingPlatform()
    returnwindowsOsArchitecture
    }
    returnundefined
    }
    }
    returnundefined
    }
    exportfunctiongetOsArchitectureEnvVar(osPlatform:NodeJS.Platform|undefined):string|undefined{
    // Для лучшей точности в случае неопределенной платформы следует сначала обрабатывать переменные
    // среды, специфичные для каждой операционной системы, и только после переходить к общим навроде HOSTTYPE
    constisWindows=osPlatform==="win32"
    if(isWindows||!osPlatform){
    constrawOsArchitecture=getWindowsOsArchitectureEnvVar()
    if(isWindows)returnrawOsArchitecture
    constisMostLikelyWindows=!osPlatform&&rawOsArchitecture
    if(isMostLikelyWindows)returnrawOsArchitecture
    }
    constosTypeEnvVar=process.env["OSTYPE"]
    constisMacOs=osPlatform==="darwin"||(osTypeEnvVar?.startsWith("darwin")??false)
    if(isMacOs||!osPlatform){
    // Экспериментально подтверждено, что MACHTYPE на MacOS для arm64 без использования Rosetta
    // возвращает значение x86_64, не соответствующее фактической архитектуре операционной системы
    constmachTypeEnvVar=process.env["MACHTYPE"]
    constcpuTypeEnvVar=process.env["CPUTYPE"]
    constisValuesExpected=machTypeEnvVar&&cpuTypeEnvVar&&machTypeEnvVar.toLocaleLowerCase()===cpuTypeEnvVar.toLocaleLowerCase()
    constrawOsArchitecture=isValuesExpected ?machTypeEnvVar :cpuTypeEnvVar
    if(isMacOs)returnrawOsArchitecture
    constisMostLikelyMacOs=!osPlatform&&rawOsArchitecture
    if(isMostLikelyMacOs)returnrawOsArchitecture
    }
    constisLinux=osPlatform==="linux"
    if(isLinux||!osPlatform){
    constrawOsArchitecture=process.env["HOSTTYPE"]??process.env["MACHTYPE"]
    if(isLinux)returnrawOsArchitecture
    constisMostLikelyLinux=!osPlatform&&rawOsArchitecture
    if(isMostLikelyLinux)returnrawOsArchitecture
    }
    returnundefined
    }
    functiongetWindowsOsArchitectureUsingPlatform():NodeJS.Architecture|undefined{
    constwindowsOsArchitectureEnvVar=getWindowsOsArchitectureEnvVar()
    if(windowsOsArchitectureEnvVar===undefined)returnundefined
    constsanitizedOsArchitectureEnvVar=windowsOsArchitectureEnvVar.toLowerCase()
    switch(sanitizedOsArchitectureEnvVar){
    // Значения, представленные в документации win32:
    // https://learn.microsoft.com/en-us/windows/win32/winprog64/wow64-implementation-details#environment-variables
    case"amd64":{
    // Экспериментально подтверждено, что переменная PROCESSOR_ARCHITECTURE на Windows для arm64 для сборок под x86_64
    // имеет значение AMD64, не соответствующее фактической архитектуре операционной системы
    constprogramFilesArmEnvVar=process.env["ProgramFiles(Arm)"]
    constisArm64=programFilesArmEnvVar!==undefined
    if(isArm64)return"arm64"
    return"x64"
    }
    case"ia64":return"x64"
    case"arm64":return"arm64"
    case"x86":return"ia32"
    }
    returnundefined
    }
    functiongetWindowsOsArchitectureEnvVar():string|undefined{
    // Несмотря на название, переменная среды PROCESSOR_ARCHITECTURE хранит архитектуру операционной системы, а не
    // самого процессора (пр. на Windows на x86 на процессоре x86_64 переменная имеет значение `x86`)
    constosArchitectureEnvVar=process.env["PROCESSOR_ARCHITECTURE"]
    if(osArchitectureEnvVar===undefined)returnundefined
    constsanitizedOsArchitectureEnvVar=osArchitectureEnvVar.toLowerCase()
    // При запуске 32-битного процесса (x86) на 64-битной операционной системе (x86_64, arm64)
    // реальное содержимое PROCESSOR_ARCHITECTURE содержится в PROCESSOR_ARCHITEW6432
    // https://learn.microsoft.com/en-us/windows/win32/winprog64/wow64-implementation-details#environment-variables
    constis32BitProcess=sanitizedOsArchitectureEnvVar==="x86"
    if(is32BitProcess){
    constwowCpuArchitectureEnvVar=process.env["PROCESSOR_ARCHITEW6432"]
    if(wowCpuArchitectureEnvVar)returnwowCpuArchitectureEnvVar
    }
    returnosArchitectureEnvVar
    }
    Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment

    [8]ページ先頭

    ©2009-2025 Movatter.jp