main funcions fixes

This commit is contained in:
2025-09-29 22:06:11 +09:00
parent 40e016e128
commit c8c3274527
7995 changed files with 1517998 additions and 1057 deletions

View File

@@ -0,0 +1,3 @@
const envPaths = require('env-paths')
module.exports.devDir = () => envPaths('node-gyp', { suffix: '' }).cache

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
[{"path":"C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildToolsUnusable","version":"15.9.28307.665","packages":["Microsoft.VisualStudio.Product.BuildTools","Microsoft.VisualStudio.Component.Windows10SDK.17134","Win10SDK_10.0.17134","Microsoft.VisualStudio.Component.VC.Tools.x86.x64","Microsoft.VisualCpp.CodeAnalysis.Extensions","Microsoft.VisualCpp.CodeAnalysis.Extensions.X86","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X86.Resources","Microsoft.VisualCpp.CodeAnalysis.Extensions.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64","Microsoft.VisualCpp.CodeAnalysis.ConcurrencyCheck.X64.Resources","Microsoft.VisualStudio.Component.Static.Analysis.Tools","Microsoft.VisualStudio.StaticAnalysis","Microsoft.VisualStudio.StaticAnalysis.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX86","Microsoft.VisualCpp.VCTip.HostX64.TargetX86","Microsoft.VisualCpp.Tools.HostX64.TargetX86.Resources","Microsoft.VisualCpp.Tools.HostX64.TargetX64","Microsoft.VisualCpp.VCTip.HostX64.TargetX64","Microsoft.VisualCpp.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX64","Microsoft.VisualCpp.Premium.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86","Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86.Resources","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64","Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64.Resources","Microsoft.VisualCpp.PGO.X86","Microsoft.VisualCpp.PGO.X64","Microsoft.VisualCpp.PGO.Headers","Microsoft.VisualCpp.CRT.x86.Store","Microsoft.VisualCpp.CRT.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.x64.Store","Microsoft.VisualCpp.CRT.x64.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.x86.OneCore.Desktop","Microsoft.VisualCpp.CRT.Redist.x64.OneCore.Desktop","Microsoft.VisualCpp.CRT.ClickOnce.Msi","Microsoft.VisualStudio.PackageGroup.VC.Tools.x86","Microsoft.VisualCpp.Tools.HostX86.TargetX64","Microsoft.VisualCpp.VCTip.hostX86.targetX64","Microsoft.VisualCpp.Tools.Hostx86.Targetx64.Resources","Microsoft.VisualCpp.Tools.HostX86.TargetX86","Microsoft.VisualCpp.VCTip.hostX86.targetX86","Microsoft.VisualCpp.Tools.HostX86.TargetX86.Resources","Microsoft.VisualCpp.Tools.Core.Resources","Microsoft.VisualCpp.Tools.Core.x86","Microsoft.VisualCpp.Tools.Common.Utils","Microsoft.VisualCpp.Tools.Common.Utils.Resources","Microsoft.VisualCpp.DIA.SDK","Microsoft.VisualCpp.CRT.x86.Desktop","Microsoft.VisualCpp.CRT.x64.Desktop","Microsoft.VisualCpp.CRT.Source","Microsoft.VisualCpp.CRT.Redist.X86","Microsoft.VisualCpp.CRT.Redist.X64","Microsoft.VisualCpp.CRT.Redist.Resources","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.RuntimeDebug.14","Microsoft.VisualCpp.Redist.14","Microsoft.VisualCpp.Redist.14","Microsoft.VisualCpp.CRT.Headers","Microsoft.VisualStudio.Workload.MSBuildTools","Microsoft.VisualStudio.Component.CoreBuildTools","Microsoft.VisualStudio.Setup.Configuration","Microsoft.VisualStudio.PackageGroup.VsDevCmd","Microsoft.VisualStudio.VsDevCmd.Ext.NetFxSdk","Microsoft.VisualStudio.VsDevCmd.Core.WinSdk","Microsoft.VisualStudio.VsDevCmd.Core.DotNet","Microsoft.VisualStudio.VC.DevCmd","Microsoft.VisualStudio.VC.DevCmd.Resources","Microsoft.VisualStudio.BuildTools.Resources","Microsoft.VisualStudio.Net.Eula.Resources","Microsoft.Build.Dependencies","Microsoft.Build.FileTracker.Msi","Microsoft.Component.MSBuild","Microsoft.PythonTools.BuildCore.Vsix","Microsoft.NuGet.Build.Tasks","Microsoft.VisualStudio.Component.Roslyn.Compiler","Microsoft.CodeAnalysis.Compilers.Resources","Microsoft.CodeAnalysis.Compilers","Microsoft.Net.PackageGroup.4.6.1.Redist","Microsoft.Net.4.6.1.FullRedist.NonThreshold","Microsoft.Windows.UniversalCRT.Msu.81","Microsoft.VisualStudio.NativeImageSupport","Microsoft.Build"]}]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,569 @@
[
{
"path": "C:\\Program Files\\Microsoft Visual Studio\\2022\\Community",
"version": "17.4.33213.308",
"packages": [
"Microsoft.VisualStudio.Product.Community",
"Microsoft.VisualStudio.PackageGroup.LiveShare.VSCore",
"Microsoft.VisualStudio.LiveShare.VSCore",
"Microsoft.VisualStudio.Workload.NativeDesktop",
"Microsoft.VisualStudio.Component.VC.ASAN",
"Microsoft.VisualCpp.ASAN.X86",
"Microsoft.VC.14.34.17.4.ASAN.X86.base",
"Microsoft.VC.14.34.17.4.ASAN.X64.base",
"Microsoft.VC.14.34.17.4.ASAN.Headers.base",
"Microsoft.VisualStudio.VC.IDE.Project.Factories",
"Microsoft.VisualStudio.Component.VC.TestAdapterForGoogleTest",
"Microsoft.VisualStudio.VC.Ide.TestAdapterForGoogleTest",
"Microsoft.VisualStudio.Component.VC.TestAdapterForBoostTest",
"Microsoft.VisualStudio.VC.Ide.TestAdapterForBoostTest",
"Microsoft.VisualStudio.Component.VC.CMake.Project",
"Microsoft.VisualStudio.ComponentGroup.WebToolsExtensions.CMake",
"Microsoft.VisualStudio.VC.CMake",
"Microsoft.VisualStudio.VC.CMake.Project",
"Microsoft.VisualStudio.VC.CMake.Client",
"Microsoft.VisualStudio.VC.ExternalBuildFramework",
"Microsoft.VisualStudio.Component.VC.DiagnosticTools",
"Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core",
"Microsoft.VisualStudio.PackageGroup.TestTools.Native",
"Microsoft.VisualStudio.Component.VC.Redist.14.Latest",
"Microsoft.VisualStudio.VC.Templates.UnitTest",
"Microsoft.VisualStudio.VC.UnitTest.Desktop.Build.Core",
"Microsoft.VisualStudio.TestTools.TestPlatform.V1.CPP",
"Microsoft.VisualStudio.VC.Templates.UnitTest.Resources",
"Microsoft.VisualStudio.VC.Templates.Desktop",
"Microsoft.VisualStudio.Component.Graphics",
"Microsoft.VisualStudio.Graphics.Viewers",
"Microsoft.VisualStudio.Graphics.Viewers.Resources",
"Microsoft.VisualStudio.Component.VC.ATL.ARM64",
"Microsoft.VisualCpp.ATL.ARM64",
"Microsoft.VC.14.34.17.4.ATL.ARM64.base",
"Microsoft.VisualStudio.Component.VC.ATL",
"Microsoft.VisualStudio.VC.Ide.ATL",
"Microsoft.VisualStudio.VC.Ide.ATL.Resources",
"Microsoft.VisualCpp.ATL.X86",
"Microsoft.VC.14.34.17.4.ATL.X86.base",
"Microsoft.VisualCpp.ATL.X64",
"Microsoft.VC.14.34.17.4.ATL.X64.base",
"Microsoft.VC.14.34.17.4.Props.ATLMFC",
"Microsoft.VisualCpp.ATL.Source",
"Microsoft.VC.14.34.17.4.ATL.Source.base",
"Microsoft.VisualCpp.ATL.Headers",
"Microsoft.VC.14.34.17.4.ATL.Headers.base",
"Microsoft.VC.14.34.17.4.Servicing.ATL",
"Microsoft.VisualStudio.Component.VC.Tools.ARM64",
"Microsoft.VisualStudio.VC.MSBuild.v170.ARM64.v143",
"Microsoft.VisualStudio.VC.MSBuild.v170.ARM64",
"Microsoft.VS.VC.vcvars.arm64.Shortcuts",
"Microsoft.VisualCpp.CA.Ext.Hostx64.TargetARM64",
"Microsoft.VC.14.34.17.4.CA.Ext.Hostx64.TargetARM64.base",
"Microsoft.VC.14.34.17.4.CA.Ext.Hostx64.TargetARM64.Res.base",
"Microsoft.VisualCpp.CA.Ext.Hostx86.TargetARM64",
"Microsoft.VC.14.34.17.4.CA.Ext.Hostx86.TargetARM64.base",
"Microsoft.VC.14.34.17.4.CA.Ext.Hostx86.TargetARM64.Res.base",
"Microsoft.VisualCpp.CA.Ext.HostARM64.TargetARM64",
"Microsoft.VC.14.34.17.4.CA.Ext.HostARM64.TargetARM64.base",
"Microsoft.VC.14.34.17.4.CA.Ext.HostARM64.TargetARM64.Res.base",
"Microsoft.VisualCpp.Tools.Hostx86.Targetarm64",
"Microsoft.VC.14.34.17.4.Tools.Hostx86.Targetarm64.base",
"Microsoft.VC.14.34.17.4.Tools.HostX86.TargetARM64.Res.base",
"Microsoft.VisualCpp.Tools.HostARM64.TargetARM64",
"Microsoft.VC.14.34.17.4.Tools.HostARM64.TargetARM64.base",
"Microsoft.VC.14.34.17.4.Tools.HostARM64.TargetARM64.Res.base",
"Microsoft.VisualCpp.CRT.Redist.ARM64.OneCore.Desktop",
"Microsoft.VC.14.34.17.4.CRT.Redist.ARM64.OneCore.Desktop.base",
"Microsoft.VisualCpp.CRT.Redist.ARM64",
"Microsoft.VC.14.34.17.4.CRT.Redist.ARM64.base",
"Microsoft.VisualCpp.CRT.ARM64.OneCore.Desktop",
"Microsoft.VC.14.34.17.4.CRT.ARM64.OneCore.Desktop.base",
"Microsoft.VC.14.34.17.4.CRT.ARM64.OneCore.Desktop.debug.base",
"Microsoft.VisualCpp.CRT.ARM64.Store",
"Microsoft.VC.14.34.17.4.CRT.ARM64.Store.base",
"Microsoft.VisualCpp.CRT.ARM64.Desktop",
"Microsoft.VC.14.34.17.4.CRT.ARM64.Desktop.base",
"Microsoft.VC.14.34.17.4.CRT.ARM64.Desktop.debug.base",
"Microsoft.VisualStudio.PackageGroup.VC.Tools.x64.ARM64",
"Microsoft.VisualCpp.Tools.Core",
"Microsoft.VisualCpp.PGO.ARM64",
"Microsoft.VC.14.34.17.4.PGO.ARM64.base",
"Microsoft.VisualCpp.Premium.Tools.Hostx86.Targetarm64",
"Microsoft.VC.14.34.17.4.Premium.Tools.Hostx86.Targetarm64.base",
"Microsoft.VC.14.34.17.4.Prem.HostX86.TargetARM64.Res.base",
"Microsoft.VisualCpp.Premium.Tools.HostX64.TargetARM64",
"Microsoft.VC.14.34.17.4.Premium.Tools.HostX64.TargetARM64.base",
"Microsoft.VC.14.34.17.4.Prem.HostX64.TargetARM64.Res.base",
"Microsoft.VisualCpp.Premium.Tools.ARM64.Base",
"Microsoft.VC.14.34.17.4.Premium.Tools.ARM64.Base.base",
"Microsoft.VisualCpp.Tools.HostX64.TargetARM64",
"Microsoft.VC.14.34.17.4.Tools.HostX64.TargetARM64.base",
"Microsoft.VC.14.34.17.4.Props.ARM64",
"Microsoft.VC.14.34.17.4.Tools.HostX64.TargetARM64.Res.base",
"Microsoft.VisualStudio.Component.VC.Tools.ARM64EC",
"Microsoft.VisualStudio.Component.Windows11SDK.22621",
"Win11SDK_10.0.22621",
"Microsoft.VisualStudio.VC.MSBuild.v170.ARM64EC.v143",
"Microsoft.VisualStudio.VC.MSBuild.v170.ARM64EC",
"Microsoft.VisualCpp.CRT.ARM64EC.Store",
"Microsoft.VC.14.34.17.4.CRT.ARM64EC.Store.base",
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
"Microsoft.VisualCpp.CodeAnalysis.Extensions",
"Microsoft.VisualCpp.CA.Ext.HostARM64.Targetx64",
"Microsoft.VC.14.34.17.4.CA.Ext.HostARM64.Targetx64.base",
"Microsoft.VC.14.34.17.4.CA.Ext.HostARM64.Targetx64.Res.base",
"Microsoft.VisualCpp.CA.Ext.HostARM64.Targetx86",
"Microsoft.VC.14.34.17.4.CA.Ext.HostARM64.Targetx86.base",
"Microsoft.VC.14.34.17.4.CA.Ext.HostARM64.Targetx86.Res.base",
"Microsoft.VisualCpp.CA.Ext.Hostx86.Targetx64",
"Microsoft.VC.14.34.17.4.CA.Ext.Hostx86.Targetx64.base",
"Microsoft.VC.14.34.17.4.CA.Ext.Hostx86.Targetx64.Res.base",
"Microsoft.VisualCpp.CA.Ext.Hostx86.Targetx86",
"Microsoft.VC.14.34.17.4.CA.Ext.Hostx86.Targetx86.base",
"Microsoft.VC.14.34.17.4.CA.Ext.Hostx86.Targetx86.Res.base",
"Microsoft.VisualCpp.CA.Ext.Hostx64.Targetx64",
"Microsoft.VC.14.34.17.4.CA.Ext.Hostx64.Targetx64.base",
"Microsoft.VC.14.34.17.4.CA.Ext.Hostx64.Targetx64.Res.base",
"Microsoft.VisualCpp.CA.Ext.Hostx64.Targetx86",
"Microsoft.VC.14.34.17.4.CA.Ext.Hostx64.Targetx86.base",
"Microsoft.VC.14.34.17.4.Servicing.CAExtensions",
"Microsoft.VC.14.34.17.4.CA.Ext.Hostx64.Targetx86.Res.base",
"Microsoft.VisualCpp.Tools.HostX64.TargetX86",
"Microsoft.VC.14.34.17.4.Tools.HostX64.TargetX86.base",
"Microsoft.VC.14.34.17.4.Tools.HostX64.TargetX86.Res.base",
"Microsoft.VisualCpp.Tools.HostX64.TargetX64",
"Microsoft.VC.14.34.17.4.Tools.HostX64.TargetX64.base",
"Microsoft.VC.14.34.17.4.Tools.HostX64.TargetX64.Res.base",
"Microsoft.VisualCpp.Tools.HostARM64.TargetX86",
"Microsoft.VC.14.34.17.4.Tools.HostARM64.TargetX86.base",
"Microsoft.VisualCpp.RuntimeDebug.14",
"Microsoft.VC.14.34.17.4.Tools.HostARM64.TargetX86.Res.base",
"Microsoft.VisualCpp.Tools.HostARM64.TargetX64",
"Microsoft.VC.14.34.17.4.Tools.HostARM64.TargetX64.base",
"Microsoft.VisualCpp.RuntimeDebug.14.ARM64",
"Microsoft.VisualCpp.Redist.14.Latest",
"Microsoft.VisualCpp.Redist.14.Latest",
"Microsoft.VC.14.34.17.4.Tools.HostARM64.Targetx64.Res.base",
"Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX64",
"Microsoft.VC.14.34.17.4.Premium.Tools.HostX86.TargetX64.base",
"Microsoft.VC.14.34.17.4.Prem.Hostx86.Targetx64.Res.base",
"Microsoft.VisualCpp.Premium.Tools.HostX86.TargetX86",
"Microsoft.VC.14.34.17.4.Premium.Tools.HostX86.TargetX86.base",
"Microsoft.VC.14.34.17.4.Prem.HostX86.TargetX86.Res.base",
"Microsoft.VisualCpp.Premium.Tools.HostARM64.TargetX86",
"Microsoft.VC.14.34.17.4.Premium.Tools.HostARM64.TargetX86.base",
"Microsoft.VC.14.34.17.4.Prem.HostARM64.TargetX86.Res.base",
"Microsoft.VisualCpp.Premium.Tools.HostARM64.TargetX64",
"Microsoft.VC.14.34.17.4.Premium.Tools.HostARM64.TargetX64.base",
"Microsoft.VC.14.34.17.4.Prem.HostARM64.Targetx64.Res.base",
"Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX86",
"Microsoft.VC.14.34.17.4.Premium.Tools.HostX64.TargetX86.base",
"Microsoft.VC.14.34.17.4.Prem.HostX64.TargetX86.Res.base",
"Microsoft.VisualCpp.Premium.Tools.HostX64.TargetX64",
"Microsoft.VC.14.34.17.4.Premium.Tools.HostX64.TargetX64.base",
"Microsoft.VC.14.34.17.4.Prem.HostX64.TargetX64.Res.base",
"Microsoft.VisualCpp.PGO.X86",
"Microsoft.VC.14.34.17.4.PGO.X86.base",
"Microsoft.VisualCpp.PGO.X64",
"Microsoft.VC.14.34.17.4.PGO.X64.base",
"Microsoft.VisualCpp.PGO.Headers",
"Microsoft.VC.14.34.17.4.PGO.Headers.base",
"Microsoft.VisualCpp.CRT.x86.Store",
"Microsoft.VC.14.34.17.4.CRT.x86.Store.base",
"Microsoft.VisualCpp.CRT.x86.OneCore.Desktop",
"Microsoft.VC.14.34.17.4.CRT.x86.OneCore.Desktop.base",
"Microsoft.VisualCpp.CRT.x64.Store",
"Microsoft.VC.14.34.17.4.CRT.x64.Store.base",
"Microsoft.VisualCpp.CRT.x64.OneCore.Desktop",
"Microsoft.VC.14.34.17.4.CRT.x64.OneCore.Desktop.base",
"Microsoft.VisualCpp.CRT.Redist.x86.OneCore.Desktop",
"Microsoft.VC.14.34.17.4.CRT.Redist.x86.OneCore.Desktop.base",
"Microsoft.VisualCpp.CRT.Redist.x64.OneCore.Desktop",
"Microsoft.VC.14.34.17.4.CRT.Redist.x64.OneCore.Desktop.base",
"Microsoft.VisualStudio.PackageGroup.VC.Tools.x86",
"Microsoft.VisualCpp.Tools.Hostx86.Targetx64.Res",
"Microsoft.VisualCpp.Tools.HostX86.TargetX64",
"Microsoft.VC.14.34.17.4.Tools.HostX86.TargetX64.base",
"Microsoft.VC.14.34.17.4.Props.x64",
"Microsoft.VC.14.34.17.4.Tools.Hostx86.Targetx64.Res.base",
"Microsoft.VisualCpp.Tools.HostX86.TargetX86.Res",
"Microsoft.VisualCpp.Tools.HostX86.TargetX86",
"Microsoft.VC.14.34.17.4.Tools.HostX86.TargetX86.base",
"Microsoft.VC.14.34.17.4.Servicing.Compilers",
"Microsoft.VC.14.34.17.4.Props.x86",
"Microsoft.VC.14.34.17.4.Props",
"Microsoft.VC.14.34.17.4.Tools.HostX86.TargetX86.Res.base",
"Microsoft.VisualCpp.Tools.Core.Resources",
"Microsoft.VisualCpp.Tools.Core.x86",
"Microsoft.VC.14.34.17.4.Tools.Core.Props",
"Microsoft.VisualCpp.DIA.SDK",
"Microsoft.VisualCpp.Servicing.DIASDK",
"Microsoft.VisualCpp.CRT.x86.Desktop",
"Microsoft.VC.14.34.17.4.CRT.x86.Desktop.base",
"Microsoft.VisualCpp.CRT.x64.Desktop",
"Microsoft.VC.14.34.17.4.CRT.x64.Desktop.base",
"Microsoft.VisualCpp.CRT.Source",
"Microsoft.VC.14.34.17.4.CRT.Source.base",
"Microsoft.VisualCpp.CRT.Redist.X86",
"Microsoft.VC.14.34.17.4.CRT.Redist.X86.base",
"Microsoft.VisualCpp.CRT.Redist.X64",
"Microsoft.VisualCpp.CRT.Redist.Resources",
"Microsoft.VC.14.34.17.4.CRT.Redist.X64.base",
"Microsoft.VisualCpp.CRT.Headers",
"Microsoft.VC.14.34.17.4.CRT.Headers.base",
"Microsoft.VC.14.34.17.4.Servicing.CrtHeaders",
"Microsoft.VC.14.34.17.4.Servicing",
"Microsoft.VisualStudio.Component.VC.CoreIde",
"Microsoft.VisualStudio.VC.Ide.Pro",
"Microsoft.VisualStudio.VC.Ide.Pro.Resources",
"Microsoft.VisualStudio.VC.Templates.General",
"Microsoft.VisualStudio.VC.Templates.General.Resources",
"Microsoft.VisualStudio.VC.Items.Pro",
"Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Reduced",
"Microsoft.VisualStudio.VC.Ide.x64",
"Microsoft.VisualStudio.PackageGroup.VC.CoreIDE.Express",
"Microsoft.VisualStudio.VC.vcvars",
"Microsoft.VS.VC.vcvars.x86.Shortcuts",
"Microsoft.VS.VC.vcvars.x64.Shortcuts",
"Microsoft.VS.VC.vcvars.arm64_x64.Shortcuts",
"Microsoft.VisualStudio.VC.MSBuild.v170.X64.v143",
"Microsoft.VisualStudio.VC.MSBuild.v170.X64",
"Microsoft.VisualStudio.VC.MSBuild.v170.ARM.v143",
"Microsoft.VisualStudio.VC.MSBuild.v170.ARM",
"Microsoft.VisualStudio.VC.MSBuild.v170.x86.v143",
"Microsoft.VisualStudio.VC.MSBuild.v170.X86",
"Microsoft.VisualStudio.VC.MSBuild.v170.Base",
"Microsoft.VisualStudio.VC.MSBuild.v170.Base.Resources",
"Microsoft.VisualStudio.VC.Ide.WinXPlus",
"Microsoft.VisualStudio.VC.Ide.Dskx",
"Microsoft.VisualStudio.VC.Ide.Dskx.Resources",
"Microsoft.VisualStudio.VC.Ide.Base",
"Microsoft.VisualStudio.VC.Ide.LanguageService",
"Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.Scripts",
"Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.PythonDistro",
"Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.10",
"Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.9",
"Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.8",
"Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.7",
"Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.6",
"Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.5",
"Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.4",
"Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.3",
"Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.2",
"Microsoft.VisualStudio.VC.Ide.SecurityIssueAnalysis.3rdPartyLibs.1",
"Microsoft.VisualStudio.VC.Ide.VCPkgDatabase",
"Microsoft.VisualStudio.VC.Ide.Core",
"Microsoft.VisualStudio.VC.Ide.ProjectSystem",
"Microsoft.VisualStudio.VC.Ide.ProjectSystem.Resources",
"Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine",
"Microsoft.VisualStudio.VC.Ide.Core.VCProjectEngine.Resources",
"Microsoft.VisualStudio.VC.Ide.LanguageService.Resources",
"Microsoft.VisualStudio.VC.Llvm.Base",
"Microsoft.VisualStudio.VC.Ide.Base.Resources",
"Microsoft.Net.PackageGroup.4.8.1.Redist",
"Microsoft.VisualStudio.Component.IntelliCode",
"Microsoft.VisualStudio.IntelliCode.CSharp",
"Microsoft.VisualStudio.IntelliCode",
"Component.Microsoft.VisualStudio.LiveShare.2022",
"Microsoft.VisualStudio.Component.Debugger.JustInTime",
"Microsoft.VisualStudio.Debugger.ImmersiveActivateHelper.Msi",
"Microsoft.VisualStudio.Debugger.JustInTime",
"Microsoft.VisualStudio.Debugger.JustInTime.Msi",
"Microsoft.VisualStudio.LiveShare.2022",
"Microsoft.Icecap.Analysis",
"Microsoft.Icecap.Analysis.Resources",
"Microsoft.Icecap.Analysis.Resources.Targeted",
"Microsoft.Icecap.Collection.Msi",
"Microsoft.Icecap.Collection.Msi.Targeted",
"Microsoft.Icecap.Collection.Msi.Resources",
"Microsoft.Icecap.Collection.Msi.Resources.Targeted",
"Microsoft.DiagnosticsHub.Instrumentation",
"Microsoft.DiagnosticsHub.Instrumentation.Targeted",
"Microsoft.DiagnosticsHub.CpuSampling",
"Microsoft.DiagnosticsHub.CpuSampling.Targeted",
"Microsoft.PackageGroup.DiagnosticsHub.Platform",
"Microsoft.VisualStudio.InstrumentationEngine.ARM64",
"Microsoft.VisualStudio.InstrumentationEngine",
"Microsoft.DiagnosticsHub.Runtime.ExternalDependencies",
"SQLiteCore",
"SQLiteCore.Targeted",
"Microsoft.DiagnosticsHub.Runtime.ExternalDependencies.Targeted",
"Microsoft.DiagnosticsHub.Runtime",
"Microsoft.DiagnosticsHub.Runtime.Targeted",
"Microsoft.DiagnosticsHub.Collection.ExternalDependencies.arm64",
"Microsoft.DiagnosticsHub.Collection",
"Microsoft.DiagnosticsHub.Collection.Service",
"Microsoft.VisualStudio.VC.Ide.MDD",
"Microsoft.VisualStudio.VC.Ide.Linux.ConnectionManager",
"Microsoft.VisualStudio.VisualC.Utilities",
"Microsoft.VisualStudio.VisualC.Utilities.Resources",
"Microsoft.VisualStudio.VC.Ide.Linux.ConnectionManager.Resources",
"Microsoft.VisualStudio.VC.Ide.ResourceEditor",
"Microsoft.VisualStudio.VC.Ide.ResourceEditor.Resources",
"Microsoft.VisualStudio.PackageGroup.TestTools.Core",
"Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.V2.CLI",
"Microsoft.VisualStudio.TestTools.TestPlatform.V2.CLI",
"Microsoft.VisualStudio.TestTools.Pex.Common",
"Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.V1.CLI",
"Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.Legacy",
"Microsoft.VisualStudio.PackageGroup.MinShell.Interop",
"Microsoft.VisualStudio.TestTools.TP.Legacy.Tips.Msi",
"Microsoft.VisualStudio.TestTools.TP.Legacy.Tips.Common",
"Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Tips",
"Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Tips.Resources",
"Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.TestSettings",
"Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Professional",
"Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Common",
"Microsoft.VisualStudio.TestTools.TP.Legacy.Common.Res",
"Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core",
"Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Core.Resources",
"Microsoft.VisualStudio.TestTools.TestPlatform.Legacy.Agent",
"Microsoft.VisualStudio.PackageGroup.TestTools.TestPlatform.IDE",
"Microsoft.VisualStudio.Cache.Service",
"Microsoft.VisualStudio.TestTools.TestWIExtension",
"Microsoft.VisualStudio.TestTools.TestPlatform.V1.CLI",
"Microsoft.VisualStudio.TestTools.TestPlatform.IDE",
"Microsoft.VisualStudio.PackageGroup.TestTools.CodeCoverage",
"Microsoft.VisualStudio.PackageGroup.TestTools.DataCollectors",
"Microsoft.VisualStudio.Component.NuGet",
"Microsoft.CredentialProvider",
"Microsoft.VisualStudio.NuGet.Licenses",
"Microsoft.VisualStudio.Component.TextTemplating",
"Microsoft.VisualStudio.TextTemplating.MSBuild",
"Microsoft.VisualStudio.TextTemplating.Integration",
"Microsoft.VisualStudio.TextTemplating.Core",
"Microsoft.VisualStudio.TextTemplating.Integration.Resources",
"Microsoft.VisualCpp.CRT.ClickOnce.Msi",
"Microsoft.VisualStudio.Component.Roslyn.LanguageServices",
"Microsoft.VisualStudio.InteractiveWindow",
"Microsoft.DiaSymReader.Native",
"Microsoft.VisualCpp.Redist.14",
"Microsoft.VisualCpp.Redist.14",
"Microsoft.VisualCpp.Servicing.Redist",
"Microsoft.VisualStudio.PackageGroup.StaticAnalysis",
"Microsoft.VisualStudio.StaticAnalysis.IDE",
"Microsoft.VisualStudio.StaticAnalysis.IDE.Resources",
"Microsoft.VisualStudio.StaticAnalysis.FxCop.Resources",
"Microsoft.VisualStudio.StaticAnalysis.auxil",
"Microsoft.VisualStudio.StaticAnalysis.auxil.Resources",
"Roslyn.VisualStudio.Setup.ServiceHub",
"Microsoft.Component.MSBuild",
"Microsoft.NuGet.Build.Tasks.Setup",
"Microsoft.VisualStudio.Component.Roslyn.Compiler",
"Microsoft.CodeAnalysis.Compilers",
"Microsoft.VisualStudio.Component.JavaScript.TypeScript",
"Microsoft.VisualStudio.JavaScript.ProjectSystem",
"Microsoft.VisualStudio.ComponentGroup.WebToolsExtensions",
"Microsoft.VisualStudio.ProTools",
"sqlsysclrtypes",
"SQLCommon",
"Microsoft.VisualStudio.ProTools.Resources",
"Microsoft.VisualStudio.Web.Scaffolding",
"Microsoft.VisualStudio.WebToolsExtensions",
"Microsoft.VisualStudio.ConnectedServices.Core",
"Microsoft.VisualStudio.WebTools",
"Microsoft.VisualStudio.WebToolsExtensions.MSBuild",
"Microsoft.VisualStudio.WebTools.Resources",
"Microsoft.VisualStudio.WebTools.WSP.FSA",
"Microsoft.VisualStudio.WebTools.WSP.FSA.Resources",
"Microsoft.VisualStudio.PackageGroup.Debugger.Script",
"Microsoft.VisualStudio.Component.TypeScript.TSServer",
"Microsoft.VisualStudio.Package.TypeScript.TSServer",
"Microsoft.VisualStudio.PackageGroup.JavaScript.Language",
"Microsoft.VisualStudio.Package.NodeJs",
"TypeScript.Build",
"TypeScript.LanguageService",
"TypeScript.Tools",
"Microsoft.VisualStudio.PackageGroup.Community",
"Microsoft.VisualStudio.Community.VB.x86",
"Microsoft.VisualStudio.Community.VB.x64",
"Microsoft.VisualStudio.PackageGroup.Core",
"Microsoft.VisualStudio.CodeSense.Community",
"Microsoft.VisualStudio.TestTools.TeamFoundationClient",
"Microsoft.VisualStudio.PackageGroup.Debugger.Core",
"Microsoft.VisualStudio.Debugger.BrokeredServices",
"Microsoft.VisualStudio.Debugger.VSCodeDebuggerHost",
"Microsoft.VisualStudio.Debugger.AzureAttach",
"Microsoft.VisualStudio.Web.Azure.Common",
"Microsoft.WebTools.Shared",
"Microsoft.WebTools.DotNet.Core.ItemTemplates",
"Microsoft.VisualStudio.PackageGroup.Debugger.TimeTravel.Replay",
"Microsoft.VisualStudio.VC.Ide.Debugger",
"Microsoft.VisualStudio.VC.Ide.Debugger.Concord",
"Microsoft.VisualStudio.VC.Ide.Debugger.Concord.Resources",
"Microsoft.VisualStudio.VC.Ide.Debugger.Resources",
"Microsoft.VisualStudio.VC.Ide.Common",
"Microsoft.VisualStudio.VC.Ide.Common.Resources",
"Microsoft.VisualStudio.Debugger.CollectionAgents",
"Microsoft.VisualStudio.Debugger.Parallel",
"Microsoft.VisualStudio.Debugger.Parallel.Resources",
"Microsoft.VisualStudio.Debugger.Managed",
"Microsoft.CodeAnalysis.ExpressionEvaluator",
"Microsoft.CodeAnalysis.VisualStudio.Setup",
"Microsoft.VisualStudio.Debugger.Concord.Managed",
"Microsoft.VisualStudio.Debugger.Concord.Managed.Resources",
"Microsoft.VisualStudio.Debugger.Managed.Resources",
"Microsoft.VisualStudio.Debugger.TargetComposition",
"Microsoft.VisualStudio.Debugger.TargetComposition.Remote.arm64",
"Microsoft.VisualStudio.Debugger.TargetComposition.Remote",
"Microsoft.VisualStudio.Debugger.TargetComposition.Remote",
"Microsoft.VisualStudio.Debugger.Remote",
"Microsoft.VisualStudio.Debugger.Concord.Remote",
"Microsoft.VisualStudio.Debugger.Concord.Remote.Resources",
"Microsoft.VisualStudio.Debugger.Remote",
"Microsoft.VisualStudio.Debugger.Remote.ARM64",
"Microsoft.VisualStudio.Debugger.Concord.Remote.ARM64",
"Microsoft.VisualStudio.Debugger.Concord.Remote.Resources.ARM64",
"Microsoft.VisualStudio.Debugger.Remote.ARM",
"Microsoft.VisualStudio.Debugger.Concord.Remote.ARM",
"Microsoft.VisualStudio.Debugger.Concord.Remote.Resources.ARM",
"Microsoft.VisualStudio.Debugger.Remote.Resources.ARM",
"Microsoft.VisualStudio.Debugger.Remote.Resources.ARM64",
"Microsoft.VisualStudio.Debugger.Concord.Remote",
"Microsoft.VisualStudio.Debugger.Concord.Remote.Resources",
"Microsoft.VisualStudio.Debugger.Remote.Resources",
"Microsoft.VisualStudio.Debugger.Remote.Resources",
"Microsoft.VisualStudio.Debugger",
"Microsoft.VisualStudio.VC.MSVCDis",
"Microsoft.IntelliTrace.DiagnosticsHub",
"Microsoft.VisualStudio.Debugger.Concord",
"Microsoft.VisualStudio.Debugger.Concord.Resources",
"Microsoft.VisualStudio.Debugger.Resources",
"Microsoft.VisualStudio.Debugger.Package.DiagHub.Client",
"Microsoft.VisualStudio.Debugger.Remote.DiagnosticsHub.Client",
"Microsoft.VisualStudio.Debugger.Remote.DiagnosticsHub.Client",
"Microsoft.VisualStudio.Debugger.Remote.DiagnosticsHub.Client",
"Microsoft.PackageGroup.ClientDiagnostics",
"Microsoft.VisualStudio.AppResponsiveness",
"Microsoft.VisualStudio.AppResponsiveness.Targeted",
"Microsoft.VisualStudio.AppResponsiveness.Resources",
"Microsoft.VisualStudio.ClientDiagnostics",
"Microsoft.VisualStudio.ClientDiagnostics.Targeted",
"Microsoft.VisualStudio.ClientDiagnostics.Resources",
"Microsoft.VisualStudio.PackageGroup.CommunityCore",
"Microsoft.VisualStudio.ProjectSystem.Full",
"Microsoft.VisualStudio.LiveShareApi",
"Microsoft.VisualStudio.ProjectSystem.Query",
"Microsoft.VisualStudio.ProjectSystem",
"Microsoft.VisualStudio.Community.x86",
"Microsoft.VisualStudio.Community.x64",
"Microsoft.VisualStudio.Community.Msi.Resources",
"Microsoft.VisualStudio.Community.Msi",
"Microsoft.VisualStudio.Community.Shared.Msi",
"Microsoft.VisualStudio.Devenv.Msi",
"Microsoft.VisualStudio.Devenv.Shared.Msi",
"Microsoft.VisualStudio.MinShell.Interop.Msi",
"Microsoft.VisualStudio.MinShell.Interop.Shared.Msi",
"Microsoft.VisualStudio.Editors",
"Microsoft.VisualStudio.Workload.CoreEditor",
"Microsoft.VisualStudio.Component.CoreEditor",
"Microsoft.VisualStudio.PackageGroup.CoreEditor",
"Microsoft.WebView2",
"Microsoft.VisualStudio.ScriptedHost",
"Microsoft.VisualStudio.ScriptedHost.Targeted",
"Microsoft.VisualCpp.Tools.Common.UtilsPrereq",
"Microsoft.VisualCpp.Tools.Common.Utils",
"Microsoft.VisualCpp.Tools.Common.Utils.Resources",
"Microsoft.VisualStudio.PackageGroup.VsDevCmd",
"Microsoft.VisualStudio.VsDevCmd.Ext.NetFxSdk",
"Microsoft.VisualStudio.VsDevCmd.Core.WinSdk",
"Microsoft.VisualStudio.VsDevCmd.Core.DotNet",
"Microsoft.VisualStudio.VC.DevCmd",
"Microsoft.VisualStudio.VC.DevCmd.Resources",
"Microsoft.VisualStudio.VirtualTree",
"Microsoft.DiaSymReader",
"Microsoft.Build.Dependencies",
"Microsoft.Build.FileTracker.Msi",
"Microsoft.Build",
"Microsoft.VisualStudio.PackageGroup.NuGet",
"Microsoft.DataAI.NuGetRecommender",
"Microsoft.VisualStudio.NuGet.Core",
"Microsoft.Build.Arm64",
"Microsoft.Build.UnGAC",
"Microsoft.VisualStudio.TextMateGrammars",
"Microsoft.VisualStudio.Platform.Markdown",
"Microsoft.VisualStudio.Platform.CrossRepositorySearch",
"Microsoft.VisualStudio.PackageGroup.TeamExplorer.Common",
"Microsoft.VisualStudio.TeamExplorer",
"Microsoft.VisualStudio.PackageGroup.ServiceHub",
"Microsoft.ServiceHub.Node",
"Microsoft.ServiceHub.Managed",
"Microsoft.ServiceHub.arm64",
"Microsoft.VisualStudio.ProjectServices",
"Microsoft.VisualStudio.OpenFolder.VSIX",
"Microsoft.VisualStudio.FileHandler.Msi",
"Microsoft.VisualStudio.FileHandler.Msi",
"Microsoft.VisualStudio.PackageGroup.MinShell",
"Microsoft.VisualStudio.MinShell.Msi",
"Microsoft.VisualStudio.MinShell.Shared.Msi",
"Microsoft.VisualStudio.MinShell.Msi.Resources",
"Microsoft.VisualStudio.MinShell.Interop",
"CoreEditorFonts",
"Microsoft.VisualStudio.Log",
"Microsoft.VisualStudio.Log.Targeted",
"Microsoft.VisualStudio.Log.Resources",
"Microsoft.VisualStudio.Finalizer",
"Microsoft.VisualStudio.Devenv",
"Microsoft.VisualStudio.Devenv.Resources",
"Microsoft.VisualStudio.CoreEditor",
"Microsoft.VisualStudio.Navigation.RichCodeNav",
"Microsoft.VisualStudio.Platform.NavigateTo",
"Microsoft.VisualStudio.Connected",
"SQLitePCLRaw",
"SQLitePCLRaw.Targeted",
"Microsoft.VisualStudio.Connected.Auto",
"Microsoft.VisualStudio.Connected.Auto.Resources",
"Microsoft.VisualStudio.AzureSDK",
"Microsoft.VisualStudio.PerfLib",
"Microsoft.VisualStudio.Connected.Resources",
"Microsoft.Net.PackageGroup.4.8.Redist",
"Microsoft.VisualStudio.PackageGroup.Progression",
"Microsoft.VisualStudio.PerformanceProvider",
"Microsoft.VisualStudio.GraphModel",
"Microsoft.VisualStudio.GraphProvider",
"Microsoft.VisualStudio.Community.VB.Targeted",
"Microsoft.VisualStudio.Community.VB.Neutral",
"Microsoft.VisualStudio.Community.CSharp.Targeted",
"Microsoft.VisualStudio.Community.CSharp.Neutral",
"Microsoft.VisualStudio.Community.ProductArch.TargetedExtra",
"Microsoft.VisualStudio.Community.ProductArch.Targeted",
"Microsoft.VisualStudio.Community.ProductArch.NeutralExtra",
"Microsoft.DiaSymReader.PortablePdb",
"Microsoft.IntelliTrace.CollectorCab",
"Microsoft.VisualStudio.Community.VB.Resources.Targeted",
"Microsoft.VisualStudio.Community.VB.Resources.Neutral",
"Microsoft.VisualStudio.Community.CSharp.Resources.Targeted",
"Microsoft.VisualStudio.Community.CSharp.Resources.Neutral",
"Microsoft.VisualStudio.Community.ProductArch.Resources.Targeted",
"Microsoft.VisualStudio.Community.ProductArch.Resources.NeutralExtra",
"Microsoft.VisualStudio.Net.Eula.Resources",
"Microsoft.VisualStudio.Community.ProductArch.Resources.Neutral",
"Microsoft.VisualStudio.WebSiteProject.DTE",
"Microsoft.VisualStudio.Diagnostics.AspNetHelper",
"Microsoft.VisualStudio.Diagnostics.AspNetHelper.Standard",
"Microsoft.MSHtml",
"Microsoft.VisualStudio.Platform.CallHierarchy",
"Microsoft.VisualStudio.Community.ProductArch.Neutral",
"Microsoft.VisualStudio.MinShell",
"Microsoft.VisualStudio.VsWebProtocolSelector.Msi",
"Microsoft.Net.6.WindowsDesktop.Runtime",
"Microsoft.Net.6.Runtime",
"Microsoft.VisualStudio.PackageGroup.Setup.Common",
"Microsoft.VisualStudio.Setup.WMIProvider",
"Microsoft.VisualStudio.Setup.Configuration.Interop",
"Microsoft.VisualStudio.Setup.Configuration",
"Microsoft.VisualStudio.Extensibility.Container",
"Microsoft.VisualStudio.LanguageServer",
"Microsoft.VisualStudio.Platform.Terminal",
"Microsoft.VisualStudio.MefHosting",
"Microsoft.VisualStudio.Initializer",
"Microsoft.VisualStudio.ExtensionManager",
"Microsoft.VisualStudio.Platform.Editor",
"Microsoft.VisualStudio.MinShell.Targeted",
"Microsoft.VisualStudio.NativeImageSupport",
"Microsoft.VisualStudio.Devenv.Config",
"Microsoft.VisualStudio.MinShell.Resources.arm64",
"Microsoft.VisualStudio.MinShell.Auto",
"Microsoft.VisualStudio.MinShell.Auto.Resources",
"Microsoft.VisualStudio.Branding.Community"
]
}
]

View File

@@ -0,0 +1,151 @@
module.exports['ca.key'] = `
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAtTbG0k2UFUyCdZuip0TTEtXRHh57qosegrpHPBreSNTxt7OT
KfOUZp2rToTHeN9w0ZbV2eKRI5AuFx8Cmlm73/KIHKzSNTBATGMeeHnGaxvL/W/s
KJdTDRNf7/qCXHQ+gsuEWWCFzOZuHmmAQa2IBX2HAQTqXJI8+2iJ9gytFfJLxjqy
6O4u9ugZVHSyQJWs49tGRcWMlNm7EMStADFvJn3S11xe/kwIA2mSI/eddDnzL0Mx
AkR9dQBL66xOABLL5v3QQdhipfHluX6HLbDd/1YsFTuOpgvLRlr72rTAFrQZCokV
hXPiqstn5zJFW5arHakvMR0+OPaICF5feh/4qQIDAQABAoIBAHWg6exnWUF+GY0Y
CrwDS/QFASpI5UNt7M809bqJQlMKjyEMmvF3YJQ/soxUWlsWx1f1TjmR/V6VX6W4
hmsE5pRXDY13jTfja0lqacQQYAD02TRY63XpzIpHUlYnSWmUN2OVkgKmShQYW9C3
8P4xE4Nk2TaLJ0oRzy3uzOb/kXcVaJfknBRUnOhuaTSs+w4l4pPXueYA7xuHgVsL
Qq0S4kK+PmdwCMB7gzlAAQhCM3vQ1U4cjC9JIIKSmPy7BcvD0kBfVPIFQ2byGpA1
VkWBLSyeig0YxA5oIshK5cLiDIfBIiCSEzm4AMhVhGf0tbGEwiPljxKjbarYUUIi
ATMk83UCgYEA7kKeOveuPbMqxmT42swfa9OU5jLUjH+VExU0Kv3BbEjv/OGt0fac
/cs1Ze3vnrtCHudVajocFjydb8B4c62DbA4/T+LcUw/HaMaORbOoICQidi/zZ1Lj
gjg8Ip2WKXEhSAwqUpaFd6w16NZOxiTh+NDaRKywwbe8j57eDH4uR6MCgYEAwrTS
q5ra6+WDGUFMs0y3GMbL8j14PGhxBQBYSTM//NysI+EM6eeKn1cV3BbphEw//jgE
0pVokkjvLAQWWEG2dZyRxRE3YAMgOAIPx5zbJCim3iBVuoqY9ckLg2jF8Fqqubsb
3Rf2/Xzn/rFqsXdhsjGcJpdN66T9aEjwEkAnc0MCgYA5cOYk4UGormFJo147oaqR
nFjxhp+nn7qY9yu0kajoKk1xchct337J0Qv2nv5+DjdKrArzqT7MPaDXKFfhy5s7
mdO5tr/XZp50rCnws/d8iDmmtLjB2EHxSw10avmg1B1p+UTa1F8pEuOMVt529r1j
9zYoCFo02c8j8PEnoeQWcQKBgQCVBCuQZu5SSM/zTkTTnU0sy0lf1qflI9IMD92B
+JVqg8HDnAR0KF+x38a9MVP7ixgXCuy19t+XxfY269HmLjTlArWV671D4GCSPRGy
plwZ6nr72ieCo3y57+q94jxL3jh3+bozlpnUG/q6tTKBLGs7JDjsWDSsuxOu8tO6
RBttXQKBgB6LQFOTjDMfsFHKsnQXFUZId3GG/iLg3WCWxEo88T5Rq3JIR0zDpW8H
cKhl/sPY+JVHsxizNCMPtp7Hn7GrB6D/v9LbO0jpG2U0BFiJ6zhiDopbP9B0EAW4
5JJ+JGKRKoCxs3DmSVyns0gU4j4rVte97UWyVy5TZ8Acr/qrgOA1
-----END RSA PRIVATE KEY-----
`
module.exports['ca.crt'] = `
-----BEGIN CERTIFICATE-----
MIIDmzCCAoOgAwIBAgIUDA0GrvcnG41XT6LYFeNwvq8YV1UwDQYJKoZIhvcNAQEL
BQAwXTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRAwDgYDVQQKDAdOb2RlLmpz
MREwDwYDVQQLDAhub2RlLWd5cDEcMBoGA1UEAwwTbm9kZS1neXAubm9kZWpzLm9y
ZzAeFw0yMjA1MTEwNDIyMjRaFw00OTA5MjUwNDIyMjRaMF0xCzAJBgNVBAYTAlVT
MQswCQYDVQQIDAJDQTEQMA4GA1UECgwHTm9kZS5qczERMA8GA1UECwwIbm9kZS1n
eXAxHDAaBgNVBAMME25vZGUtZ3lwLm5vZGVqcy5vcmcwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQC1NsbSTZQVTIJ1m6KnRNMS1dEeHnuqix6Cukc8Gt5I
1PG3s5Mp85RmnatOhMd433DRltXZ4pEjkC4XHwKaWbvf8ogcrNI1MEBMYx54ecZr
G8v9b+wol1MNE1/v+oJcdD6Cy4RZYIXM5m4eaYBBrYgFfYcBBOpckjz7aIn2DK0V
8kvGOrLo7i726BlUdLJAlazj20ZFxYyU2bsQxK0AMW8mfdLXXF7+TAgDaZIj9510
OfMvQzECRH11AEvrrE4AEsvm/dBB2GKl8eW5foctsN3/ViwVO46mC8tGWvvatMAW
tBkKiRWFc+Kqy2fnMkVblqsdqS8xHT449ogIXl96H/ipAgMBAAGjUzBRMB0GA1Ud
DgQWBBT6LcYYABEOAMv4hI/5bC82rGlD/DAfBgNVHSMEGDAWgBT6LcYYABEOAMv4
hI/5bC82rGlD/DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQA9
D+qoKw0njub+NaFRS2DFbSiKb5JKTxVjU5aNusFONFLSXBuRpnYyjjkXpJy8JMWz
g8GFDEPP6kiSb8xaPNrFcUzb4PFzJabNTuaLJpBpd2gNBj5AeYwwpRa2DPv/b4yw
y2mfULuCWS09ZAguI2OcaARlAsFxYN0IuQ6pN1AvGFGee67ve9l2VF/hhwEi4lCk
MM0CWlP6COJ8TX7X0MTtexVOgo9m3hBuTSYEZClYFIdSOk10xkPl8Y3Iz/x6mzfK
Uu2l2ZtYvSdAX1CQMds3ZWt0ChNNEjOKPv4g2QSDhGkiqrmi4wUS81g68wKqOpqn
GbN8uKxIfyMjqZKaujPR
-----END CERTIFICATE-----
`
module.exports['server.key'] = `
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDpxqKqzq8PuOuo
M09X1gdh6V1nMmJ6Oqk/d8ZSAHhGBTjB5BBILtrxJPAdsNCRc8gPCtSuAzu9r0ct
D2znJjto8HO3a0s/4mlqMQ8iSvfH0c8nGLPxRXg0C9tR0VOyqJrqAPn9X6utxVQj
H2jLjZngZllhqlxIUxYuXO7MZfC2MQ4DRsp6GaJTftcOxTxevMdT6lK0yl3mDn0W
DyV9aWR5oCVXKIRK7jmF9bi9ETHwJHffFrduaaKYLQ/UOEtNek/pJsz0DNO0ePkm
DAt0GQkX3hmKd0VRgGEtaO+MAGbrDucPuDylMkC1GJm1lq6+6rkyQRNoAd8/yOJD
GihBJmLPAgMBAAECggEBAL3+WM/3IGHnyWavJMnfQaq6rdWkJlLugAT8BCs7BITr
04AJKY5wvjID8j4/KJM+BRbsl4NBT3lPDcq6YajO8rPL0E/+nG60RTYv3vvg79Xv
V6uPsRbifdnW1Q1+0cY+r4CFAKeC7JVS7ZmJ+nKMh8XPiM8OVOfW1w0hLFbkdqiq
UetA5H0oiJr0rFWh9Gfzc0avpmawXmZJqK8lKWB1rt2teu3bQWqn20dGr2IyCipz
KlGh3QImYogjqWEqPyowPGxnq8KWQ40Pjx61dy6cqYrw77yxLHGR8Az+TlRQZf/K
BeT3UkXCU5BTyC3PKZJpcYB/GMB8GBKRdNK+8H3OXskCgYEA963tUnLoiCwJjxvv
gIiMY5mIUAMnTDsCxSYekfkDvt4qdttn/+Y8/5/lXMSlCt+WZcXH0V8gmVOMqfHB
QRXWpi0uJnl9sUllb80Mw5PnS317UlJIbkro3crVUhIbrn9tKVFP1GO9xszNda8E
MkHV8FGmSaihXGnA8KEkTKg1CisCgYEA8aEjATIpDXyxQM4M9B1S0jI/nHOrg2lr
dMKQWJVruuvwrrZl6CFNIm2/PBXyHjCXqROXs7aXkE3vfRSypYNKBZl7BX08c0nE
koMVXwhGbSbUXjFx5bcUKaG/2eOK+ZV4ivNQokq1iIK+WKINAfP69ewzD7EAgbBg
KY7owSxka+0CgYB4Urh+W3B35tzl9y5NBQkewdGk/UM0F17rI++p/o1BRnDeuQw3
F0T+8lDc1nNPavuHiaPfJRWTJzGoxdeapN9Yb46CBnd3jy6GN9lBkjLFS7qDbZHe
cunaBdXIPx/Pj/waHHRpu+LQF2KhD1s8hxtF2oSsOA3b9UxUGhSmYPkTbQKBgEP8
muTTQEnTM+yQDYUCWzNZgBx9T10CZIHN3N+P62gEywvdtn7CH/n39z7ozd9AvOuN
37lpPuwTgbcoA7weXM2Gid7ZhhDKSM0QpQrAQVClBEwcjXedM8cjA+BC7e+b5vbx
z1ZavwlSAEzgC9jo1Uws0ZEwtHvJLMWEuGjiHL9hAoGAWEbj2cxhpCKTK3C8Qf+C
BscBwAZKmUasdWQBUzRFpR1UAO3fFBatjMPwrFYnt+ZgiCXTGFcoEa7mjoP/r5Mh
j1nRCoPQVcbmB1B9AtiaEa1AA+BqYF1r2aErbcsGrCV5OHU7TYFk1dep1SAQP/0W
9MQ+1Af5ttYSFYlJLnWJo4M=
-----END PRIVATE KEY-----
`
module.exports['server.crt'] = `
-----BEGIN CERTIFICATE-----
MIIDPjCCAiagAwIBAgIJALrth9K8D7HIMA0GCSqGSIb3DQEBCwUAMF0xCzAJBgNV
BAYTAlVTMQswCQYDVQQIDAJDQTEQMA4GA1UECgwHTm9kZS5qczERMA8GA1UECwwI
bm9kZS1neXAxHDAaBgNVBAMME25vZGUtZ3lwLm5vZGVqcy5vcmcwHhcNMjMwOTI4
MDUxODM2WhcNMzMwOTI1MDUxODM2WjBgMQswCQYDVQQGEwJVUzETMBEGA1UECAwK
Q2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEQMA4GA1UECgwHTm9k
ZS5qczESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEA6caiqs6vD7jrqDNPV9YHYeldZzJiejqpP3fGUgB4RgU4weQQSC7a
8STwHbDQkXPIDwrUrgM7va9HLQ9s5yY7aPBzt2tLP+JpajEPIkr3x9HPJxiz8UV4
NAvbUdFTsqia6gD5/V+rrcVUIx9oy42Z4GZZYapcSFMWLlzuzGXwtjEOA0bKehmi
U37XDsU8XrzHU+pStMpd5g59Fg8lfWlkeaAlVyiESu45hfW4vREx8CR33xa3bmmi
mC0P1DhLTXpP6SbM9AzTtHj5JgwLdBkJF94ZindFUYBhLWjvjABm6w7nD7g8pTJA
tRiZtZauvuq5MkETaAHfP8jiQxooQSZizwIDAQABMA0GCSqGSIb3DQEBCwUAA4IB
AQBwgEyrqJOV8SC7PVTtEOqfSyrM7lJjVcmwXEIFPVCPxXnDtLS9+OaQe9ybjOR/
Bi/AvZK4gwsV9G5Bvbl0/sphYEKYLEpP76jhdETcBwhaEgK3itumoREeriut4bZI
OM6b1O45CoD67Lm87CUwLOdcNzPu4k7mat+xog5aFwaQuRjLBmmZcjl41QjVr9ti
La4PCMh7NwVMtHRqbYvgq785PsKAh+j4FSX1sj9NRzRPoJJ2qsre1Qn5tL/i6ovj
6s+3GxOQ5I1UzJX22PZFu003a582ha1CEFM0VaeDzzwbGNcV5SP+g2nw55zx9YRR
Rg8nGmjRuRtbs+/XAre2eQ5p
-----END CERTIFICATE-----
`
module.exports['ca-bundle.crt'] = `
-----BEGIN CERTIFICATE-----
MIIDJjCCAg4CAhnOMA0GCSqGSIb3DQEBBQUAMH0xCzAJBgNVBAYTAlVTMQswCQYD
VQQIDAJDQTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEZMBcGA1UECgwQU3Ryb25n
TG9vcCwgSW5jLjESMBAGA1UECwwJU3Ryb25nT3BzMRowGAYDVQQDDBFjYS5zdHJv
bmdsb29wLmNvbTAeFw0xNTEyMDgyMzM1MzNaFw00MzA0MjQyMzM1MzNaMBkxFzAV
BgNVBAMMDnN0cm9uZ2xvb3AuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAwOYI7OZ2FX/YjRgLZoDQlbPc5UZXU/j0e1wwiJNPtPEax9Y5Uoza0Pnt
Ikzkc2SfvQ+IJrhXo385tI0W5juuqbHnE7UrjUuPjUX6NHevkxcs/flmjan5wnZM
cPsGhH71WDuUEEflvZihf2Se2x+xgZtMhc5XGmVmRuZFYKvkgUhA2/w8/QrK+jPT
n9QRJxZjWNh2RBdC1B7u4jffSmOSUljYFH1I2eTeY+Rdi6YUIYSU9gEoZxsv3Tia
SomfMF5jt2Mouo6MzA+IhLvvFjcrcph1Qxgi9RkfdCMMd+Ipm9YWELkyG1bDRpQy
0iyHD4gvVsAqz1Y2KdRSdc3Kt+nTqwIDAQABoxkwFzAVBgNVHREEDjAMhwQAAAAA
hwR/AAABMA0GCSqGSIb3DQEBBQUAA4IBAQAhy4J0hML3NgmDRHdL5/iTucBe22Mf
jJjg2aifD1S187dHm+Il4qZNO2plWwAhN0h704f+8wpsaALxUvBIu6nvlvcMP5PH
jGN5JLe2Km3UaPvYOQU2SgacLilu+uBcIo2JSHLV6O7ziqUj5Gior6YxDLCtEZie
Ea8aX5/YjuACtEMJ1JjRqjgkM66XAoUe0E8onOK3FgTIO3tGoTJwRp0zS50pFuP0
PsZtT04ck6mmXEXXknNoAyBCvPypfms9OHqcUIW9fiQnrGbS/Ri4QSQYj0DtFk/1
na4fY1gf3zTHxH8259b/TOOaPfTnCEsOQtjUrWNR4xhmVZ+HJy4yytUW
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDbzCCAlcCAmm6MA0GCSqGSIb3DQEBCwUAMH0xCzAJBgNVBAYTAlVTMQswCQYD
VQQIDAJDQTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEZMBcGA1UECgwQU3Ryb25n
TG9vcCwgSW5jLjESMBAGA1UECwwJU3Ryb25nT3BzMRowGAYDVQQDDBFjYS5zdHJv
bmdsb29wLmNvbTAeFw0xNTEyMDgyMzM1MzNaFw00MzA0MjQyMzM1MzNaMH0xCzAJ
BgNVBAYTAlVTMQswCQYDVQQIDAJDQTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzEZ
MBcGA1UECgwQU3Ryb25nTG9vcCwgSW5jLjESMBAGA1UECwwJU3Ryb25nT3BzMRow
GAYDVQQDDBFjYS5zdHJvbmdsb29wLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBANfj86jkvvYDjHBgiqWhk9Cj+bqiMq3MqnV0CBO4iuK33Fo6XssE
H+yVdXlIBFbFe6t655MdBVOR2Sfj7WqNh96vhu6PyDHiwcQlTaiLU6nhIed1J4Wv
lvnJHFmp8Wbtx5AgLT4UYu03ftvXEl2DLi3vhSL2tRM1ebXHB/KPbRWkb25DPX0P
foOHot3f2dgNe2x6kponf7E/QDmAu3s7Nlkfh+ryDhgGU7wocXEhXbprNqRqOGNo
xbXgUI+/9XDxYT/7Gn5LF/fPjtN+aB0SKMnTsDhprVlZie83mlqJ46fOOrR+vrsQ
mi/1m/TadrARtZoIExC/cQRdVM05EK4tUa8CAwEAATANBgkqhkiG9w0BAQsFAAOC
AQEAQ7k5WhyhDTIGYCNzRnrMHWSzGqa1y4tJMW06wafJNRqTm1cthq1ibc6Hfq5a
K10K0qMcgauRTfQ1MWrVCTW/KnJ1vkhiTOH+RvxapGn84gSaRmV6KZen0+gMsgae
KEGe/3Hn+PmDVV+PTamHgPACfpTww38WHIe/7Ce9gHfG7MZ8cKHNZhDy0IAYPln+
YRwMLd7JNQffHAbWb2CE1mcea4H/12U8JZW5tHCF6y9V+7IuDzqwIrLKcW3lG17n
VUG6ODF/Ryqn3V5X+TL91YyXi6c34y34IpC7MQDV/67U7+5Bp5CfeDPWW2wVSrW+
uGZtfEvhbNm6m2i4UNmpCXxUZQ==
-----END CERTIFICATE-----
`

View File

@@ -0,0 +1,6 @@
# Test configuration
{
'variables': {
'build_with_electron': true
}
}

View File

@@ -0,0 +1,31 @@
import sys
import locale
try:
reload(sys)
except NameError: # Python 3
pass
def main():
encoding = locale.getdefaultlocale()[1]
if not encoding:
return False
try:
sys.setdefaultencoding(encoding)
except AttributeError: # Python 3
pass
textmap = {
"cp936": "\u4e2d\u6587",
"cp1252": "Lat\u012Bna",
"cp932": "\u306b\u307b\u3093\u3054",
}
if encoding in textmap:
print(textmap[encoding])
return True
if __name__ == "__main__":
print(main())

View File

@@ -0,0 +1,140 @@
'use strict'
const fs = require('graceful-fs')
const childProcess = require('child_process')
function startsWith (str, search, pos) {
if (String.prototype.startsWith) {
return str.startsWith(search, pos)
}
return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search
}
function processExecSync (file, args, options) {
var child, error, timeout, tmpdir, command
command = makeCommand(file, args)
/*
this function emulates child_process.execSync for legacy node <= 0.10.x
derived from https://github.com/gvarsanyi/sync-exec/blob/master/js/sync-exec.js
*/
options = options || {}
// init timeout
timeout = Date.now() + options.timeout
// init tmpdir
var osTempBase = '/tmp'
var os = determineOS()
osTempBase = '/tmp'
if (process.env.TMP) {
osTempBase = process.env.TMP
}
if (osTempBase[osTempBase.length - 1] !== '/') {
osTempBase += '/'
}
tmpdir = osTempBase + 'processExecSync.' + Date.now() + Math.random()
fs.mkdirSync(tmpdir)
// init command
if (os === 'linux') {
command = '(' + command + ' > ' + tmpdir + '/stdout 2> ' + tmpdir +
'/stderr); echo $? > ' + tmpdir + '/status'
} else {
command = '(' + command + ' > ' + tmpdir + '/stdout 2> ' + tmpdir +
'/stderr) | echo %errorlevel% > ' + tmpdir + '/status | exit'
}
// init child
child = childProcess.exec(command, options)
var maxTry = 100000 // increases the test time by 6 seconds on win-2016-node-0.10
var tryCount = 0
while (tryCount < maxTry) {
try {
var x = fs.readFileSync(tmpdir + '/status')
if (x.toString() === '0') {
break
}
} catch (ignore) {}
tryCount++
if (Date.now() > timeout) {
error = child
break
}
}
['stdout', 'stderr', 'status'].forEach(function (file) {
child[file] = fs.readFileSync(tmpdir + '/' + file, options.encoding)
setTimeout(unlinkFile, 500, tmpdir + '/' + file)
})
child.status = Number(child.status)
if (child.status !== 0) {
error = child
}
try {
fs.rmdirSync(tmpdir)
} catch (ignore) {}
if (error) {
throw error
}
return child.stdout
}
function makeCommand (file, args) {
var command, quote
command = file
if (args.length > 0) {
for (var i in args) {
command = command + ' '
if (args[i][0] === '-') {
command = command + args[i]
} else {
if (!quote) {
command = command + '"'
quote = true
}
command = command + args[i]
if (quote) {
if (args.length === (parseInt(i) + 1)) {
command = command + '"'
}
}
}
}
}
return command
}
function determineOS () {
var os = ''
var tmpVar = ''
if (process.env.OSTYPE) {
tmpVar = process.env.OSTYPE
} else if (process.env.OS) {
tmpVar = process.env.OS
} else {
// default is linux
tmpVar = 'linux'
}
if (startsWith(tmpVar, 'linux')) {
os = 'linux'
}
if (startsWith(tmpVar, 'win')) {
os = 'win'
}
return os
}
function unlinkFile (file) {
fs.unlinkSync(file)
}
module.exports = processExecSync

View File

@@ -0,0 +1,75 @@
const Mocha = require('mocha')
class Reporter {
constructor (runner) {
this.failedTests = []
runner.on(Mocha.Runner.constants.EVENT_RUN_BEGIN, () => {
console.log('Starting tests')
})
runner.on(Mocha.Runner.constants.EVENT_RUN_END, () => {
console.log('Tests finished')
console.log()
console.log('****************')
console.log('* TESTS REPORT *')
console.log('****************')
console.log()
console.log(`Executed ${runner.stats.suites} suites with ${runner.stats.tests} tests in ${runner.stats.duration} ms`)
console.log(` Passed: ${runner.stats.passes}`)
console.log(` Skipped: ${runner.stats.pending}`)
console.log(` Failed: ${runner.stats.failures}`)
if (this.failedTests.length > 0) {
console.log()
console.log(' Failed test details')
this.failedTests.forEach((failedTest, index) => {
console.log()
console.log(` ${index + 1}.'${failedTest.test.fullTitle()}'`)
console.log(` Name: ${failedTest.error.name}`)
console.log(` Message: ${failedTest.error.message}`)
console.log(` Code: ${failedTest.error.code}`)
console.log(` Stack: ${failedTest.error.stack}`)
})
}
console.log()
})
runner.on(Mocha.Runner.constants.EVENT_SUITE_BEGIN, (suite) => {
if (suite.root) {
return
}
console.log(`Starting suite '${suite.title}'`)
})
runner.on(Mocha.Runner.constants.EVENT_SUITE_END, (suite) => {
if (suite.root) {
return
}
console.log(`Suite '${suite.title}' finished`)
console.log()
})
runner.on(Mocha.Runner.constants.EVENT_TEST_BEGIN, (test) => {
console.log(`Starting test '${test.title}'`)
})
runner.on(Mocha.Runner.constants.EVENT_TEST_PASS, (test) => {
console.log(`Test '${test.title}' passed in ${test.duration} ms`)
})
runner.on(Mocha.Runner.constants.EVENT_TEST_PENDING, (test) => {
console.log(`Test '${test.title}' skipped in ${test.duration} ms`)
})
runner.on(Mocha.Runner.constants.EVENT_TEST_FAIL, (test, error) => {
this.failedTests.push({ test, error })
console.log(`Test '${test.title}' failed in ${test.duration} ms with ${error}`)
})
runner.on(Mocha.Runner.constants.EVENT_TEST_END, (test) => {
console.log()
})
}
}
module.exports = Reporter

View File

@@ -0,0 +1,27 @@
'use strict'
const http = require('http')
const https = require('https')
const server = http.createServer(handler)
const port = +process.argv[2]
const prefix = process.argv[3]
const upstream = process.argv[4]
var calls = 0
server.listen(port)
function handler (req, res) {
if (req.url.indexOf(prefix) !== 0) {
throw new Error('request url [' + req.url + '] does not start with [' + prefix + ']')
}
var upstreamUrl = upstream + req.url.substring(prefix.length)
https.get(upstreamUrl, function (ures) {
ures.on('end', function () {
if (++calls === 2) {
server.close()
}
})
ures.pipe(res)
})
}

View File

@@ -0,0 +1,152 @@
'use strict'
const { describe, it } = require('mocha')
const assert = require('assert')
const path = require('path')
const fs = require('graceful-fs')
const childProcess = require('child_process')
const os = require('os')
const addonPath = path.resolve(__dirname, 'node_modules', 'hello_world')
const nodeGyp = path.resolve(__dirname, '..', 'bin', 'node-gyp.js')
const execFileSync = childProcess.execFileSync || require('./process-exec-sync')
const execFile = childProcess.execFile
function runHello (hostProcess) {
if (!hostProcess) {
hostProcess = process.execPath
}
var testCode = "console.log(require('hello_world').hello())"
return execFileSync(hostProcess, ['-e', testCode], { cwd: __dirname }).toString()
}
function getEncoding () {
var code = 'import locale;print(locale.getdefaultlocale()[1])'
return execFileSync('python', ['-c', code]).toString().trim()
}
function checkCharmapValid () {
var data
try {
data = execFileSync('python', ['fixtures/test-charmap.py'],
{ cwd: __dirname })
} catch (err) {
return false
}
var lines = data.toString().trim().split('\n')
return lines.pop() === 'True'
}
describe('addon', function () {
this.timeout(300000)
it('build simple addon', function (done) {
// Set the loglevel otherwise the output disappears when run via 'npm test'
var cmd = [nodeGyp, 'rebuild', '-C', addonPath, '--loglevel=verbose']
var proc = execFile(process.execPath, cmd, function (err, stdout, stderr) {
var logLines = stderr.toString().trim().split(/\r?\n/)
var lastLine = logLines[logLines.length - 1]
assert.strictEqual(err, null)
assert.strictEqual(lastLine, 'gyp info ok', 'should end in ok')
assert.strictEqual(runHello().trim(), 'world')
done()
})
proc.stdout.setEncoding('utf-8')
proc.stderr.setEncoding('utf-8')
})
it('build simple addon in path with non-ascii characters', function (done) {
if (!checkCharmapValid()) {
return this.skip('python console app can\'t encode non-ascii character.')
}
var testDirNames = {
cp936: '文件夹',
cp1252: 'Latīna',
cp932: 'フォルダ'
}
// Select non-ascii characters by current encoding
var testDirName = testDirNames[getEncoding()]
// If encoding is UTF-8 or other then no need to test
if (!testDirName) {
return this.skip('no need to test')
}
this.timeout(300000)
var data
var configPath = path.join(addonPath, 'build', 'config.gypi')
try {
data = fs.readFileSync(configPath, 'utf8')
} catch (err) {
assert.fail(err)
return
}
var config = JSON.parse(data.replace(/#.+\n/, ''))
var nodeDir = config.variables.nodedir
var testNodeDir = path.join(addonPath, testDirName)
// Create symbol link to path with non-ascii characters
try {
fs.symlinkSync(nodeDir, testNodeDir, 'dir')
} catch (err) {
switch (err.code) {
case 'EEXIST': break
case 'EPERM':
assert.fail(err, null, 'Please try to running console as an administrator')
return
default:
assert.fail(err)
return
}
}
var cmd = [
nodeGyp,
'rebuild',
'-C',
addonPath,
'--loglevel=verbose',
'-nodedir=' + testNodeDir
]
var proc = execFile(process.execPath, cmd, function (err, stdout, stderr) {
try {
fs.unlink(testNodeDir)
} catch (err) {
assert.fail(err)
}
var logLines = stderr.toString().trim().split(/\r?\n/)
var lastLine = logLines[logLines.length - 1]
assert.strictEqual(err, null)
assert.strictEqual(lastLine, 'gyp info ok', 'should end in ok')
assert.strictEqual(runHello().trim(), 'world')
done()
})
proc.stdout.setEncoding('utf-8')
proc.stderr.setEncoding('utf-8')
})
it('addon works with renamed host executable', function (done) {
// No `fs.copyFileSync` before node8.
if (process.version.substr(1).split('.')[0] < 8) {
return this.skip('skipping test for old node version')
}
this.timeout(300000)
var notNodePath = path.join(os.tmpdir(), 'notnode' + path.extname(process.execPath))
fs.copyFileSync(process.execPath, notNodePath)
var cmd = [nodeGyp, 'rebuild', '-C', addonPath, '--loglevel=verbose']
var proc = execFile(process.execPath, cmd, function (err, stdout, stderr) {
var logLines = stderr.toString().trim().split(/\r?\n/)
var lastLine = logLines[logLines.length - 1]
assert.strictEqual(err, null)
assert.strictEqual(lastLine, 'gyp info ok', 'should end in ok')
assert.strictEqual(runHello(notNodePath).trim(), 'world')
fs.unlinkSync(notNodePath)
done()
})
proc.stdout.setEncoding('utf-8')
proc.stderr.setEncoding('utf-8')
})
})

View File

@@ -0,0 +1,81 @@
'use strict'
const { describe, it } = require('mocha')
const assert = require('assert')
const path = require('path')
const devDir = require('./common').devDir()
const gyp = require('../lib/node-gyp')
const requireInject = require('require-inject')
const configure = requireInject('../lib/configure', {
'graceful-fs': {
openSync: function () { return 0 },
closeSync: function () { },
writeFile: function (file, data, cb) { cb() },
stat: function (file, cb) { cb(null, {}) },
mkdir: function (dir, options, cb) { cb() },
promises: {
writeFile: function (file, data) { return Promise.resolve(null) }
},
unlink: function (path, cb) { cb() },
symlink: function (target, path, cb) { cb() }
}
})
const EXPECTED_PYPATH = path.join(__dirname, '..', 'gyp', 'pylib')
const SEPARATOR = process.platform === 'win32' ? ';' : ':'
const SPAWN_RESULT = cb => ({ on: function () { cb() } })
require('npmlog').level = 'warn'
describe('configure-python', function () {
it('configure PYTHONPATH with no existing env', function (done) {
delete process.env.PYTHONPATH
var prog = gyp()
prog.parseArgv([])
prog.spawn = function () {
assert.strictEqual(process.env.PYTHONPATH, EXPECTED_PYPATH)
return SPAWN_RESULT(done)
}
prog.devDir = devDir
configure(prog, [], assert.fail)
})
it('configure PYTHONPATH with existing env of one dir', function (done) {
var existingPath = path.join('a', 'b')
process.env.PYTHONPATH = existingPath
var prog = gyp()
prog.parseArgv([])
prog.spawn = function () {
assert.strictEqual(process.env.PYTHONPATH, [EXPECTED_PYPATH, existingPath].join(SEPARATOR))
var dirs = process.env.PYTHONPATH.split(SEPARATOR)
assert.deepStrictEqual(dirs, [EXPECTED_PYPATH, existingPath])
return SPAWN_RESULT(done)
}
prog.devDir = devDir
configure(prog, [], assert.fail)
})
it('configure PYTHONPATH with existing env of multiple dirs', function (done) {
var pythonDir1 = path.join('a', 'b')
var pythonDir2 = path.join('b', 'c')
var existingPath = [pythonDir1, pythonDir2].join(SEPARATOR)
process.env.PYTHONPATH = existingPath
var prog = gyp()
prog.parseArgv([])
prog.spawn = function () {
assert.strictEqual(process.env.PYTHONPATH, [EXPECTED_PYPATH, existingPath].join(SEPARATOR))
var dirs = process.env.PYTHONPATH.split(SEPARATOR)
assert.deepStrictEqual(dirs, [EXPECTED_PYPATH, pythonDir1, pythonDir2])
return SPAWN_RESULT(done)
}
prog.devDir = devDir
configure(prog, [], assert.fail)
})
})

View File

@@ -0,0 +1,61 @@
'use strict'
const path = require('path')
const { describe, it } = require('mocha')
const assert = require('assert')
const gyp = require('../lib/node-gyp')
const createConfigGypi = require('../lib/create-config-gypi')
const { parseConfigGypi, getCurrentConfigGypi } = createConfigGypi.test
describe('create-config-gypi', function () {
it('config.gypi with no options', async function () {
const prog = gyp()
prog.parseArgv([])
const config = await getCurrentConfigGypi({ gyp: prog, vsInfo: {} })
assert.strictEqual(config.target_defaults.default_configuration, 'Release')
assert.strictEqual(config.variables.target_arch, process.arch)
})
it('config.gypi with --debug', async function () {
const prog = gyp()
prog.parseArgv(['_', '_', '--debug'])
const config = await getCurrentConfigGypi({ gyp: prog, vsInfo: {} })
assert.strictEqual(config.target_defaults.default_configuration, 'Debug')
})
it('config.gypi with custom options', async function () {
const prog = gyp()
prog.parseArgv(['_', '_', '--shared-libxml2'])
const config = await getCurrentConfigGypi({ gyp: prog, vsInfo: {} })
assert.strictEqual(config.variables.shared_libxml2, true)
})
it('config.gypi with nodedir', async function () {
const nodeDir = path.join(__dirname, 'fixtures', 'nodedir')
const prog = gyp()
prog.parseArgv(['_', '_', `--nodedir=${nodeDir}`])
const config = await getCurrentConfigGypi({ gyp: prog, nodeDir, vsInfo: {} })
assert.strictEqual(config.variables.build_with_electron, true)
})
it('config.gypi with --force-process-config', async function () {
const nodeDir = path.join(__dirname, 'fixtures', 'nodedir')
const prog = gyp()
prog.parseArgv(['_', '_', '--force-process-config', `--nodedir=${nodeDir}`])
const config = await getCurrentConfigGypi({ gyp: prog, nodeDir, vsInfo: {} })
assert.strictEqual(config.variables.build_with_electron, undefined)
})
it('config.gypi parsing', function () {
const str = "# Some comments\n{'variables': {'multiline': 'A'\n'B'}}"
const config = parseConfigGypi(str)
assert.deepStrictEqual(config, { variables: { multiline: 'AB' } })
})
})

View File

@@ -0,0 +1,210 @@
'use strict'
const { describe, it, after } = require('mocha')
const assert = require('assert')
const fs = require('fs')
const path = require('path')
const util = require('util')
const http = require('http')
const https = require('https')
const install = require('../lib/install')
const semver = require('semver')
const devDir = require('./common').devDir()
const rimraf = require('rimraf')
const gyp = require('../lib/node-gyp')
const log = require('npmlog')
const certs = require('./fixtures/certs')
log.level = 'warn'
describe('download', function () {
it('download over http', async function () {
const server = http.createServer((req, res) => {
assert.strictEqual(req.headers['user-agent'], `node-gyp v42 (node ${process.version})`)
res.end('ok')
})
after(() => new Promise((resolve) => server.close(resolve)))
const host = 'localhost'
await new Promise((resolve) => server.listen(0, host, resolve))
const { port } = server.address()
const gyp = {
opts: {},
version: '42'
}
const url = `http://${host}:${port}`
const res = await install.test.download(gyp, url)
assert.strictEqual(await res.text(), 'ok')
})
it('download over https with custom ca', async function () {
const cafile = path.join(__dirname, 'fixtures/ca.crt')
const cacontents = certs['ca.crt']
const cert = certs['server.crt']
const key = certs['server.key']
await fs.promises.writeFile(cafile, cacontents, 'utf8')
const ca = await install.test.readCAFile(cafile)
assert.strictEqual(ca.length, 1)
const options = { ca: ca, cert: cert, key: key }
const server = https.createServer(options, (req, res) => {
assert.strictEqual(req.headers['user-agent'], `node-gyp v42 (node ${process.version})`)
res.end('ok')
})
after(async () => {
await new Promise((resolve) => server.close(resolve))
await fs.promises.unlink(cafile)
})
server.on('clientError', (err) => { throw err })
const host = 'localhost'
await new Promise((resolve) => server.listen(0, host, resolve))
const { port } = server.address()
const gyp = {
opts: { cafile },
version: '42'
}
const url = `https://${host}:${port}`
const res = await install.test.download(gyp, url)
assert.strictEqual(await res.text(), 'ok')
})
it('download over http with proxy', async function () {
const server = http.createServer((_, res) => {
res.end('ok')
})
const pserver = http.createServer((req, res) => {
assert.strictEqual(req.headers['user-agent'], `node-gyp v42 (node ${process.version})`)
res.end('proxy ok')
})
after(() => Promise.all([
new Promise((resolve) => server.close(resolve)),
new Promise((resolve) => pserver.close(resolve))
]))
const host = 'localhost'
await new Promise((resolve) => server.listen(0, host, resolve))
const { port } = server.address()
await new Promise((resolve) => pserver.listen(port + 1, host, resolve))
const gyp = {
opts: {
proxy: `http://${host}:${port + 1}`,
noproxy: 'bad'
},
version: '42'
}
const url = `http://${host}:${port}`
const res = await install.test.download(gyp, url)
assert.strictEqual(await res.text(), 'proxy ok')
})
it('download over http with noproxy', async function () {
const server = http.createServer((req, res) => {
assert.strictEqual(req.headers['user-agent'], `node-gyp v42 (node ${process.version})`)
res.end('ok')
})
const pserver = http.createServer((_, res) => {
res.end('proxy ok')
})
after(() => Promise.all([
new Promise((resolve) => server.close(resolve)),
new Promise((resolve) => pserver.close(resolve))
]))
const host = 'localhost'
await new Promise((resolve) => server.listen(0, host, resolve))
const { port } = server.address()
await new Promise((resolve) => pserver.listen(port + 1, host, resolve))
const gyp = {
opts: {
proxy: `http://${host}:${port + 1}`,
noproxy: host
},
version: '42'
}
const url = `http://${host}:${port}`
const res = await install.test.download(gyp, url)
assert.strictEqual(await res.text(), 'ok')
})
it('download with missing cafile', async function () {
const gyp = {
opts: { cafile: 'no.such.file' }
}
try {
await install.test.download(gyp, {}, 'http://bad/')
} catch (e) {
assert.ok(/no.such.file/.test(e.message))
}
})
it('check certificate splitting', async function () {
const cafile = path.join(__dirname, 'fixtures/ca-bundle.crt')
const cacontents = certs['ca-bundle.crt']
await fs.promises.writeFile(cafile, cacontents, 'utf8')
after(async () => {
await fs.promises.unlink(cafile)
})
const cas = await install.test.readCAFile(path.join(__dirname, 'fixtures/ca-bundle.crt'))
assert.strictEqual(cas.length, 2)
assert.notStrictEqual(cas[0], cas[1])
})
// only run this test if we are running a version of Node with predictable version path behavior
it('download headers (actual)', async function () {
if (process.env.FAST_TEST ||
process.release.name !== 'node' ||
semver.prerelease(process.version) !== null ||
semver.satisfies(process.version, '<10')) {
return this.skip('Skipping actual download of headers due to test environment configuration')
}
this.timeout(300000)
const expectedDir = path.join(devDir, process.version.replace(/^v/, ''))
await util.promisify(rimraf)(expectedDir)
const prog = gyp()
prog.parseArgv([])
prog.devDir = devDir
log.level = 'warn'
await util.promisify(install)(prog, [])
const data = await fs.promises.readFile(path.join(expectedDir, 'installVersion'), 'utf8')
assert.strictEqual(data, '11\n', 'correct installVersion')
const list = await fs.promises.readdir(path.join(expectedDir, 'include/node'))
assert.ok(list.includes('common.gypi'))
assert.ok(list.includes('config.gypi'))
assert.ok(list.includes('node.h'))
assert.ok(list.includes('node_version.h'))
assert.ok(list.includes('openssl'))
assert.ok(list.includes('uv'))
assert.ok(list.includes('uv.h'))
assert.ok(list.includes('v8-platform.h'))
assert.ok(list.includes('v8.h'))
assert.ok(list.includes('zlib.h'))
const lines = (await fs.promises.readFile(path.join(expectedDir, 'include/node/node_version.h'), 'utf8')).split('\n')
// extract the 3 version parts from the defines to build a valid version string and
// and check them against our current env version
const version = ['major', 'minor', 'patch'].reduce((version, type) => {
const re = new RegExp(`^#define\\sNODE_${type.toUpperCase()}_VERSION`)
const line = lines.find((l) => re.test(l))
const i = line ? parseInt(line.replace(/^[^0-9]+([0-9]+).*$/, '$1'), 10) : 'ERROR'
return `${version}${type !== 'major' ? '.' : 'v'}${i}`
}, '')
assert.strictEqual(version, process.version)
})
})

View File

@@ -0,0 +1,73 @@
'use strict'
const { describe, it } = require('mocha')
const assert = require('assert')
const path = require('path')
const requireInject = require('require-inject')
const configure = requireInject('../lib/configure', {
'graceful-fs': {
closeSync: function () { return undefined },
openSync: function (path) {
if (readableFiles.some(function (f) { return f === path })) {
return 0
} else {
var error = new Error('ENOENT - not found')
throw error
}
}
}
})
const dir = path.sep + 'testdir'
const readableFile = 'readable_file'
const anotherReadableFile = 'another_readable_file'
const readableFileInDir = 'somedir' + path.sep + readableFile
const readableFiles = [
path.resolve(dir, readableFile),
path.resolve(dir, anotherReadableFile),
path.resolve(dir, readableFileInDir)
]
describe('find-accessible-sync', function () {
it('find accessible - empty array', function () {
var candidates = []
var found = configure.test.findAccessibleSync('test', dir, candidates)
assert.strictEqual(found, undefined)
})
it('find accessible - single item array, readable', function () {
var candidates = [readableFile]
var found = configure.test.findAccessibleSync('test', dir, candidates)
assert.strictEqual(found, path.resolve(dir, readableFile))
})
it('find accessible - single item array, readable in subdir', function () {
var candidates = [readableFileInDir]
var found = configure.test.findAccessibleSync('test', dir, candidates)
assert.strictEqual(found, path.resolve(dir, readableFileInDir))
})
it('find accessible - single item array, unreadable', function () {
var candidates = ['unreadable_file']
var found = configure.test.findAccessibleSync('test', dir, candidates)
assert.strictEqual(found, undefined)
})
it('find accessible - multi item array, no matches', function () {
var candidates = ['non_existent_file', 'unreadable_file']
var found = configure.test.findAccessibleSync('test', dir, candidates)
assert.strictEqual(found, undefined)
})
it('find accessible - multi item array, single match', function () {
var candidates = ['non_existent_file', readableFile]
var found = configure.test.findAccessibleSync('test', dir, candidates)
assert.strictEqual(found, path.resolve(dir, readableFile))
})
it('find accessible - multi item array, return first match', function () {
var candidates = ['non_existent_file', anotherReadableFile, readableFile]
var found = configure.test.findAccessibleSync('test', dir, candidates)
assert.strictEqual(found, path.resolve(dir, anotherReadableFile))
})
})

View File

@@ -0,0 +1,115 @@
'use strict'
const { describe, it } = require('mocha')
const assert = require('assert')
const path = require('path')
const findNodeDirectory = require('../lib/find-node-directory')
const platforms = ['darwin', 'freebsd', 'linux', 'sunos', 'win32', 'aix', 'os400']
describe('find-node-directory', function () {
// we should find the directory based on the directory
// the script is running in and it should match the layout
// in a build tree where npm is installed in
// .... /deps/npm
it('test find-node-directory - node install', function () {
for (var next = 0; next < platforms.length; next++) {
var processObj = { execPath: '/x/y/bin/node', platform: platforms[next] }
assert.strictEqual(
findNodeDirectory('/x/deps/npm/node_modules/node-gyp/lib', processObj),
path.join('/x'))
}
})
// we should find the directory based on the directory
// the script is running in and it should match the layout
// in an installed tree where npm is installed in
// .... /lib/node_modules/npm or .../node_modules/npm
// depending on the patform
it('test find-node-directory - node build', function () {
for (var next = 0; next < platforms.length; next++) {
var processObj = { execPath: '/x/y/bin/node', platform: platforms[next] }
if (platforms[next] === 'win32') {
assert.strictEqual(
findNodeDirectory('/y/node_modules/npm/node_modules/node-gyp/lib',
processObj), path.join('/y'))
} else {
assert.strictEqual(
findNodeDirectory('/y/lib/node_modules/npm/node_modules/node-gyp/lib',
processObj), path.join('/y'))
}
}
})
// we should find the directory based on the execPath
// for node and match because it was in the bin directory
it('test find-node-directory - node in bin directory', function () {
for (var next = 0; next < platforms.length; next++) {
var processObj = { execPath: '/x/y/bin/node', platform: platforms[next] }
assert.strictEqual(
findNodeDirectory('/nothere/npm/node_modules/node-gyp/lib', processObj),
path.join('/x/y'))
}
})
// we should find the directory based on the execPath
// for node and match because it was in the Release directory
it('test find-node-directory - node in build release dir', function () {
for (var next = 0; next < platforms.length; next++) {
var processObj
if (platforms[next] === 'win32') {
processObj = { execPath: '/x/y/Release/node', platform: platforms[next] }
} else {
processObj = {
execPath: '/x/y/out/Release/node',
platform: platforms[next]
}
}
assert.strictEqual(
findNodeDirectory('/nothere/npm/node_modules/node-gyp/lib', processObj),
path.join('/x/y'))
}
})
// we should find the directory based on the execPath
// for node and match because it was in the Debug directory
it('test find-node-directory - node in Debug release dir', function () {
for (var next = 0; next < platforms.length; next++) {
var processObj
if (platforms[next] === 'win32') {
processObj = { execPath: '/a/b/Debug/node', platform: platforms[next] }
} else {
processObj = { execPath: '/a/b/out/Debug/node', platform: platforms[next] }
}
assert.strictEqual(
findNodeDirectory('/nothere/npm/node_modules/node-gyp/lib', processObj),
path.join('/a/b'))
}
})
// we should not find it as it will not match based on the execPath nor
// the directory from which the script is running
it('test find-node-directory - not found', function () {
for (var next = 0; next < platforms.length; next++) {
var processObj = { execPath: '/x/y/z/y', platform: next }
assert.strictEqual(findNodeDirectory('/a/b/c/d', processObj), '')
}
})
// we should find the directory based on the directory
// the script is running in and it should match the layout
// in a build tree where npm is installed in
// .... /deps/npm
// same test as above but make sure additional directory entries
// don't cause an issue
it('test find-node-directory - node install', function () {
for (var next = 0; next < platforms.length; next++) {
var processObj = { execPath: '/x/y/bin/node', platform: platforms[next] }
assert.strictEqual(
findNodeDirectory('/x/y/z/a/b/c/deps/npm/node_modules/node-gyp/lib',
processObj), path.join('/x/y/z/a/b/c'))
}
})
})

View File

@@ -0,0 +1,213 @@
'use strict'
delete process.env.PYTHON
const { describe, it } = require('mocha')
const assert = require('assert')
const findPython = require('../lib/find-python')
const execFile = require('child_process').execFile
const PythonFinder = findPython.test.PythonFinder
require('npmlog').level = 'warn'
describe('find-python', function () {
it('find python', function () {
findPython.test.findPython(null, function (err, found) {
assert.strictEqual(err, null)
var proc = execFile(found, ['-V'], function (err, stdout, stderr) {
assert.strictEqual(err, null)
assert.ok(/Python 3/.test(stdout))
assert.strictEqual(stderr, '')
})
proc.stdout.setEncoding('utf-8')
proc.stderr.setEncoding('utf-8')
})
})
function poison (object, property) {
function fail () {
console.error(Error(`Property ${property} should not have been accessed.`))
process.abort()
}
var descriptor = {
configurable: false,
enumerable: false,
get: fail,
set: fail
}
Object.defineProperty(object, property, descriptor)
}
function TestPythonFinder () {
PythonFinder.apply(this, arguments)
}
TestPythonFinder.prototype = Object.create(PythonFinder.prototype)
// Silence npmlog - remove for debugging
TestPythonFinder.prototype.log = {
silly: () => {},
verbose: () => {},
info: () => {},
warn: () => {},
error: () => {}
}
delete TestPythonFinder.prototype.env.NODE_GYP_FORCE_PYTHON
it('find python - python', function () {
var f = new TestPythonFinder('python', done)
f.execFile = function (program, args, opts, cb) {
f.execFile = function (program, args, opts, cb) {
poison(f, 'execFile')
assert.strictEqual(program, '/path/python')
assert.ok(/sys\.version_info/.test(args[1]))
cb(null, '3.9.1')
}
assert.strictEqual(program,
process.platform === 'win32' ? '"python"' : 'python')
assert.ok(/sys\.executable/.test(args[1]))
cb(null, '/path/python')
}
f.findPython()
function done (err, python) {
assert.strictEqual(err, null)
assert.strictEqual(python, '/path/python')
}
})
it('find python - python too old', function () {
var f = new TestPythonFinder(null, done)
f.execFile = function (program, args, opts, cb) {
if (/sys\.executable/.test(args[args.length - 1])) {
cb(null, '/path/python')
} else if (/sys\.version_info/.test(args[args.length - 1])) {
cb(null, '2.3.4')
} else {
assert.fail()
}
}
f.findPython()
function done (err) {
assert.ok(/Could not find any Python/.test(err))
assert.ok(/not supported/i.test(f.errorLog))
}
})
it('find python - no python', function () {
var f = new TestPythonFinder(null, done)
f.execFile = function (program, args, opts, cb) {
if (/sys\.executable/.test(args[args.length - 1])) {
cb(new Error('not found'))
} else if (/sys\.version_info/.test(args[args.length - 1])) {
cb(new Error('not a Python executable'))
} else {
assert.fail()
}
}
f.findPython()
function done (err) {
assert.ok(/Could not find any Python/.test(err))
assert.ok(/not in PATH/.test(f.errorLog))
}
})
it('find python - no python2, no python, unix', function () {
var f = new TestPythonFinder(null, done)
f.checkPyLauncher = assert.fail
f.win = false
f.execFile = function (program, args, opts, cb) {
if (/sys\.executable/.test(args[args.length - 1])) {
cb(new Error('not found'))
} else {
assert.fail()
}
}
f.findPython()
function done (err) {
assert.ok(/Could not find any Python/.test(err))
assert.ok(/not in PATH/.test(f.errorLog))
}
})
it('find python - no python, use python launcher', function () {
var f = new TestPythonFinder(null, done)
f.win = true
f.execFile = function (program, args, opts, cb) {
if (program === 'py.exe') {
assert.notStrictEqual(args.indexOf('-3'), -1)
assert.notStrictEqual(args.indexOf('-c'), -1)
return cb(null, 'Z:\\snake.exe')
}
if (/sys\.executable/.test(args[args.length - 1])) {
cb(new Error('not found'))
} else if (f.winDefaultLocations.includes(program)) {
cb(new Error('not found'))
} else if (/sys\.version_info/.test(args[args.length - 1])) {
if (program === 'Z:\\snake.exe') {
cb(null, '3.9.0')
} else {
assert.fail()
}
} else {
assert.fail()
}
}
f.findPython()
function done (err, python) {
assert.strictEqual(err, null)
assert.strictEqual(python, 'Z:\\snake.exe')
}
})
it('find python - no python, no python launcher, good guess', function () {
var f = new TestPythonFinder(null, done)
f.win = true
const expectedProgram = f.winDefaultLocations[0]
f.execFile = function (program, args, opts, cb) {
if (program === 'py.exe') {
return cb(new Error('not found'))
}
if (/sys\.executable/.test(args[args.length - 1])) {
cb(new Error('not found'))
} else if (program === expectedProgram &&
/sys\.version_info/.test(args[args.length - 1])) {
cb(null, '3.7.3')
} else {
assert.fail()
}
}
f.findPython()
function done (err, python) {
assert.strictEqual(err, null)
assert.ok(python === expectedProgram)
}
})
it('find python - no python, no python launcher, bad guess', function () {
var f = new TestPythonFinder(null, done)
f.win = true
f.execFile = function (program, args, opts, cb) {
if (/sys\.executable/.test(args[args.length - 1])) {
cb(new Error('not found'))
} else if (/sys\.version_info/.test(args[args.length - 1])) {
cb(new Error('not a Python executable'))
} else {
assert.fail()
}
}
f.findPython()
function done (err) {
assert.ok(/Could not find any Python/.test(err))
assert.ok(/not in PATH/.test(f.errorLog))
}
})
})

View File

@@ -0,0 +1,670 @@
'use strict'
const { describe, it } = require('mocha')
const assert = require('assert')
const fs = require('fs')
const path = require('path')
const findVisualStudio = require('../lib/find-visualstudio')
const VisualStudioFinder = findVisualStudio.test.VisualStudioFinder
const semverV1 = { major: 1, minor: 0, patch: 0 }
delete process.env.VCINSTALLDIR
function poison (object, property) {
function fail () {
console.error(Error(`Property ${property} should not have been accessed.`))
process.abort()
}
var descriptor = {
configurable: false,
enumerable: false,
get: fail,
set: fail
}
Object.defineProperty(object, property, descriptor)
}
function TestVisualStudioFinder () { VisualStudioFinder.apply(this, arguments) }
TestVisualStudioFinder.prototype = Object.create(VisualStudioFinder.prototype)
// Silence npmlog - remove for debugging
TestVisualStudioFinder.prototype.log = {
silly: () => {},
verbose: () => {},
info: () => {},
warn: () => {},
error: () => {}
}
describe('find-visualstudio', function () {
it('VS2013', function () {
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info, {
msBuild: 'C:\\MSBuild12\\MSBuild.exe',
path: 'C:\\VS2013',
sdk: null,
toolset: 'v120',
version: '12.0',
versionMajor: 12,
versionMinor: 0,
versionYear: 2013
})
})
finder.findVisualStudio2017OrNewer = (cb) => {
finder.parseData(new Error(), '', '', cb)
}
finder.regSearchKeys = (keys, value, addOpts, cb) => {
for (var i = 0; i < keys.length; ++i) {
const fullName = `${keys[i]}\\${value}`
switch (fullName) {
case 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
case 'HKLM\\Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
continue
case 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0':
assert.ok(true, `expected search for registry value ${fullName}`)
return cb(null, 'C:\\VS2013\\VC\\')
case 'HKLM\\Software\\Microsoft\\MSBuild\\ToolsVersions\\12.0\\MSBuildToolsPath':
assert.ok(true, `expected search for registry value ${fullName}`)
return cb(null, 'C:\\MSBuild12\\')
default:
assert.fail(`unexpected search for registry value ${fullName}`)
}
}
return cb(new Error())
}
finder.findVisualStudio()
})
it('VS2013 should not be found on new node versions', function () {
const finder = new TestVisualStudioFinder({
major: 10,
minor: 0,
patch: 0
}, null, (err, info) => {
assert.ok(/find .* Visual Studio/i.test(err), 'expect error')
assert.ok(!info, 'no data')
})
finder.findVisualStudio2017OrNewer = (cb) => {
const file = path.join(__dirname, 'fixtures', 'VS_2017_Unusable.txt')
const data = fs.readFileSync(file)
finder.parseData(null, data, '', cb)
}
finder.regSearchKeys = (keys, value, addOpts, cb) => {
for (var i = 0; i < keys.length; ++i) {
const fullName = `${keys[i]}\\${value}`
switch (fullName) {
case 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
case 'HKLM\\Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
continue
default:
assert.fail(`unexpected search for registry value ${fullName}`)
}
}
return cb(new Error())
}
finder.findVisualStudio()
})
it('VS2015', function () {
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info, {
msBuild: 'C:\\MSBuild14\\MSBuild.exe',
path: 'C:\\VS2015',
sdk: null,
toolset: 'v140',
version: '14.0',
versionMajor: 14,
versionMinor: 0,
versionYear: 2015
})
})
finder.findVisualStudio2017OrNewer = (cb) => {
finder.parseData(new Error(), '', '', cb)
}
finder.regSearchKeys = (keys, value, addOpts, cb) => {
for (var i = 0; i < keys.length; ++i) {
const fullName = `${keys[i]}\\${value}`
switch (fullName) {
case 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
assert.ok(true, `expected search for registry value ${fullName}`)
return cb(null, 'C:\\VS2015\\VC\\')
case 'HKLM\\Software\\Microsoft\\MSBuild\\ToolsVersions\\14.0\\MSBuildToolsPath':
assert.ok(true, `expected search for registry value ${fullName}`)
return cb(null, 'C:\\MSBuild14\\')
default:
assert.fail(`unexpected search for registry value ${fullName}`)
}
}
return cb(new Error())
}
finder.findVisualStudio()
})
it('error from PowerShell', function () {
const finder = new TestVisualStudioFinder(semverV1, null, null)
finder.parseData(new Error(), '', '', (info) => {
assert.ok(/use PowerShell/i.test(finder.errorLog[0]), 'expect error')
assert.ok(!info, 'no data')
})
})
it('empty output from PowerShell', function () {
const finder = new TestVisualStudioFinder(semverV1, null, null)
finder.parseData(null, '', '', (info) => {
assert.ok(/use PowerShell/i.test(finder.errorLog[0]), 'expect error')
assert.ok(!info, 'no data')
})
})
it('output from PowerShell not JSON', function () {
const finder = new TestVisualStudioFinder(semverV1, null, null)
finder.parseData(null, 'AAAABBBB', '', (info) => {
assert.ok(/use PowerShell/i.test(finder.errorLog[0]), 'expect error')
assert.ok(!info, 'no data')
})
})
it('wrong JSON from PowerShell', function () {
const finder = new TestVisualStudioFinder(semverV1, null, null)
finder.parseData(null, '{}', '', (info) => {
assert.ok(/use PowerShell/i.test(finder.errorLog[0]), 'expect error')
assert.ok(!info, 'no data')
})
})
it('empty JSON from PowerShell', function () {
const finder = new TestVisualStudioFinder(semverV1, null, null)
finder.parseData(null, '[]', '', (info) => {
assert.ok(/find .* Visual Studio/i.test(finder.errorLog[0]), 'expect error')
assert.ok(!info, 'no data')
})
})
it('future version', function () {
const finder = new TestVisualStudioFinder(semverV1, null, null)
finder.parseData(null, JSON.stringify([{
packages: [
'Microsoft.VisualStudio.Component.VC.Tools.x86.x64',
'Microsoft.VisualStudio.Component.Windows10SDK.17763',
'Microsoft.VisualStudio.VC.MSBuild.Base'
],
path: 'C:\\VS',
version: '9999.9999.9999.9999'
}]), '', (info) => {
assert.ok(/unknown version/i.test(finder.errorLog[0]), 'expect error')
assert.ok(/find .* Visual Studio/i.test(finder.errorLog[1]), 'expect error')
assert.ok(!info, 'no data')
})
})
it('single unusable VS2017', function () {
const finder = new TestVisualStudioFinder(semverV1, null, null)
const file = path.join(__dirname, 'fixtures', 'VS_2017_Unusable.txt')
const data = fs.readFileSync(file)
finder.parseData(null, data, '', (info) => {
assert.ok(/checking/i.test(finder.errorLog[0]), 'expect error')
assert.ok(/find .* Visual Studio/i.test(finder.errorLog[2]), 'expect error')
assert.ok(!info, 'no data')
})
})
it('minimal VS2017 Build Tools', function () {
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info, {
msBuild: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\' +
'BuildTools\\MSBuild\\15.0\\Bin\\MSBuild.exe',
path:
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools',
sdk: '10.0.17134.0',
toolset: 'v141',
version: '15.9.28307.665',
versionMajor: 15,
versionMinor: 9,
versionYear: 2017
})
})
poison(finder, 'regSearchKeys')
finder.findVisualStudio2017OrNewer = (cb) => {
const file = path.join(__dirname, 'fixtures',
'VS_2017_BuildTools_minimal.txt')
const data = fs.readFileSync(file)
finder.parseData(null, data, '', cb)
}
finder.findVisualStudio()
})
it('VS2017 Community with C++ workload', function () {
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info, {
msBuild: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\' +
'Community\\MSBuild\\15.0\\Bin\\MSBuild.exe',
path:
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community',
sdk: '10.0.17763.0',
toolset: 'v141',
version: '15.9.28307.665',
versionMajor: 15,
versionMinor: 9,
versionYear: 2017
})
})
poison(finder, 'regSearchKeys')
finder.findVisualStudio2017OrNewer = (cb) => {
const file = path.join(__dirname, 'fixtures',
'VS_2017_Community_workload.txt')
const data = fs.readFileSync(file)
finder.parseData(null, data, '', cb)
}
finder.findVisualStudio()
})
it('VS2017 Express', function () {
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info, {
msBuild: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\' +
'WDExpress\\MSBuild\\15.0\\Bin\\MSBuild.exe',
path:
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\WDExpress',
sdk: '10.0.17763.0',
toolset: 'v141',
version: '15.9.28307.858',
versionMajor: 15,
versionMinor: 9,
versionYear: 2017
})
})
poison(finder, 'regSearchKeys')
finder.findVisualStudio2017OrNewer = (cb) => {
const file = path.join(__dirname, 'fixtures', 'VS_2017_Express.txt')
const data = fs.readFileSync(file)
finder.parseData(null, data, '', cb)
}
finder.findVisualStudio()
})
it('VS2019 Preview with C++ workload', function () {
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info, {
msBuild: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\' +
'Preview\\MSBuild\\Current\\Bin\\MSBuild.exe',
path:
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Preview',
sdk: '10.0.17763.0',
toolset: 'v142',
version: '16.0.28608.199',
versionMajor: 16,
versionMinor: 0,
versionYear: 2019
})
})
poison(finder, 'regSearchKeys')
finder.findVisualStudio2017OrNewer = (cb) => {
const file = path.join(__dirname, 'fixtures',
'VS_2019_Preview.txt')
const data = fs.readFileSync(file)
finder.parseData(null, data, '', cb)
}
finder.findVisualStudio()
})
it('minimal VS2019 Build Tools', function () {
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info, {
msBuild: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\' +
'BuildTools\\MSBuild\\Current\\Bin\\MSBuild.exe',
path:
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools',
sdk: '10.0.17134.0',
toolset: 'v142',
version: '16.1.28922.388',
versionMajor: 16,
versionMinor: 1,
versionYear: 2019
})
})
poison(finder, 'regSearchKeys')
finder.findVisualStudio2017OrNewer = (cb) => {
const file = path.join(__dirname, 'fixtures',
'VS_2019_BuildTools_minimal.txt')
const data = fs.readFileSync(file)
finder.parseData(null, data, '', cb)
}
finder.findVisualStudio()
})
it('VS2019 Community with C++ workload', function () {
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info, {
msBuild: 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\' +
'Community\\MSBuild\\Current\\Bin\\MSBuild.exe',
path:
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community',
sdk: '10.0.17763.0',
toolset: 'v142',
version: '16.1.28922.388',
versionMajor: 16,
versionMinor: 1,
versionYear: 2019
})
})
poison(finder, 'regSearchKeys')
finder.findVisualStudio2017OrNewer = (cb) => {
const file = path.join(__dirname, 'fixtures',
'VS_2019_Community_workload.txt')
const data = fs.readFileSync(file)
finder.parseData(null, data, '', cb)
}
finder.findVisualStudio()
})
it('VS2022 Preview with C++ workload', function () {
const msBuildPath = process.arch === 'arm64'
? 'C:\\Program Files\\Microsoft Visual Studio\\2022\\' +
'Community\\MSBuild\\Current\\Bin\\arm64\\MSBuild.exe'
: 'C:\\Program Files\\Microsoft Visual Studio\\2022\\' +
'Community\\MSBuild\\Current\\Bin\\MSBuild.exe'
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info, {
msBuild: msBuildPath,
path:
'C:\\Program Files\\Microsoft Visual Studio\\2022\\Community',
sdk: '10.0.22621.0',
toolset: 'v143',
version: '17.4.33213.308',
versionMajor: 17,
versionMinor: 4,
versionYear: 2022
})
})
poison(finder, 'regSearchKeys')
finder.msBuildPathExists = (path) => {
return true
}
finder.findVisualStudio2017OrNewer = (cb) => {
const file = path.join(__dirname, 'fixtures',
'VS_2022_Community_workload.txt')
const data = fs.readFileSync(file)
finder.parseData(null, data, '', cb)
}
finder.findVisualStudio()
})
function allVsVersions (finder) {
finder.findVisualStudio2017OrNewer = (cb) => {
const data0 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
'VS_2017_Unusable.txt')))
const data1 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
'VS_2017_BuildTools_minimal.txt')))
const data2 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
'VS_2017_Community_workload.txt')))
const data3 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
'VS_2017_Express.txt')))
const data4 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
'VS_2019_Preview.txt')))
const data5 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
'VS_2019_BuildTools_minimal.txt')))
const data6 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
'VS_2019_Community_workload.txt')))
const data7 = JSON.parse(fs.readFileSync(path.join(__dirname, 'fixtures',
'VS_2022_Community_workload.txt')))
const data = JSON.stringify(data0.concat(data1, data2, data3, data4,
data5, data6, data7))
finder.parseData(null, data, '', cb)
}
finder.regSearchKeys = (keys, value, addOpts, cb) => {
for (var i = 0; i < keys.length; ++i) {
const fullName = `${keys[i]}\\${value}`
switch (fullName) {
case 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
case 'HKLM\\Software\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0':
continue
case 'HKLM\\Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0':
return cb(null, 'C:\\VS2013\\VC\\')
case 'HKLM\\Software\\Microsoft\\MSBuild\\ToolsVersions\\12.0\\MSBuildToolsPath':
return cb(null, 'C:\\MSBuild12\\')
case 'HKLM\\Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\14.0':
return cb(null, 'C:\\VS2015\\VC\\')
case 'HKLM\\Software\\Microsoft\\MSBuild\\ToolsVersions\\14.0\\MSBuildToolsPath':
return cb(null, 'C:\\MSBuild14\\')
default:
assert.fail(`unexpected search for registry value ${fullName}`)
}
}
return cb(new Error())
}
}
it('fail when looking for invalid path', function () {
const finder = new TestVisualStudioFinder(semverV1, 'AABB', (err, info) => {
assert.ok(/find .* Visual Studio/i.test(err), 'expect error')
assert.ok(!info, 'no data')
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('look for VS2013 by version number', function () {
const finder = new TestVisualStudioFinder(semverV1, '2013', (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.versionYear, 2013)
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('look for VS2013 by installation path', function () {
const finder = new TestVisualStudioFinder(semverV1, 'C:\\VS2013',
(err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.path, 'C:\\VS2013')
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('look for VS2015 by version number', function () {
const finder = new TestVisualStudioFinder(semverV1, '2015', (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.versionYear, 2015)
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('look for VS2015 by installation path', function () {
const finder = new TestVisualStudioFinder(semverV1, 'C:\\VS2015',
(err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.path, 'C:\\VS2015')
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('look for VS2017 by version number', function () {
const finder = new TestVisualStudioFinder(semverV1, '2017', (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.versionYear, 2017)
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('look for VS2017 by installation path', function () {
const finder = new TestVisualStudioFinder(semverV1,
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community',
(err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.path,
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community')
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('look for VS2019 by version number', function () {
const finder = new TestVisualStudioFinder(semverV1, '2019', (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.versionYear, 2019)
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('look for VS2019 by installation path', function () {
const finder = new TestVisualStudioFinder(semverV1,
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools',
(err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.path,
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools')
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('look for VS2022 by version number', function () {
const finder = new TestVisualStudioFinder(semverV1, '2022', (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.versionYear, 2022)
})
finder.msBuildPathExists = (path) => {
return true
}
allVsVersions(finder)
finder.findVisualStudio()
})
it('msvs_version match should be case insensitive', function () {
const finder = new TestVisualStudioFinder(semverV1,
'c:\\program files (x86)\\microsoft visual studio\\2019\\BUILDTOOLS',
(err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.path,
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools')
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('latest version should be found by default', function () {
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.versionYear, 2022)
})
finder.msBuildPathExists = (path) => {
return true
}
allVsVersions(finder)
finder.findVisualStudio()
})
it('run on a usable VS Command Prompt', function () {
process.env.VCINSTALLDIR = 'C:\\VS2015\\VC'
// VSINSTALLDIR is not defined on Visual C++ Build Tools 2015
delete process.env.VSINSTALLDIR
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.path, 'C:\\VS2015')
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('VCINSTALLDIR match should be case insensitive', function () {
process.env.VCINSTALLDIR =
'c:\\program files (x86)\\microsoft visual studio\\2019\\BUILDTOOLS\\VC'
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.path,
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools')
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('run on a unusable VS Command Prompt', function () {
process.env.VCINSTALLDIR =
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildToolsUnusable\\VC'
const finder = new TestVisualStudioFinder(semverV1, null, (err, info) => {
assert.ok(/find .* Visual Studio/i.test(err), 'expect error')
assert.ok(!info, 'no data')
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('run on a VS Command Prompt with matching msvs_version', function () {
process.env.VCINSTALLDIR = 'C:\\VS2015\\VC'
const finder = new TestVisualStudioFinder(semverV1, 'C:\\VS2015',
(err, info) => {
assert.strictEqual(err, null)
assert.deepStrictEqual(info.path, 'C:\\VS2015')
})
allVsVersions(finder)
finder.findVisualStudio()
})
it('run on a VS Command Prompt with mismatched msvs_version', function () {
process.env.VCINSTALLDIR =
'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC'
const finder = new TestVisualStudioFinder(semverV1, 'C:\\VS2015',
(err, info) => {
assert.ok(/find .* Visual Studio/i.test(err), 'expect error')
assert.ok(!info, 'no data')
})
allVsVersions(finder)
finder.findVisualStudio()
})
})

View File

@@ -0,0 +1,139 @@
'use strict'
const { describe, it, after } = require('mocha')
const assert = require('assert')
const path = require('path')
const os = require('os')
const util = require('util')
const { test: { download, install } } = require('../lib/install')
const rimraf = require('rimraf')
const gyp = require('../lib/node-gyp')
const log = require('npmlog')
const semver = require('semver')
const stream = require('stream')
const streamPipeline = util.promisify(stream.pipeline)
log.level = 'error' // we expect a warning
const TIMEOUT = 20 * 60 * 1000
describe('install', function () {
it('EACCES retry once', async () => {
const fs = {
promises: {
stat (_) {
const err = new Error()
err.code = 'EACCES'
assert.ok(true)
throw err
}
}
}
const Gyp = {
devDir: __dirname,
opts: {
ensure: true
},
commands: {
install (argv, cb) {
install(fs, Gyp, argv).then(cb, cb)
},
remove (_, cb) {
cb()
}
}
}
try {
await install(fs, Gyp, [])
} catch (err) {
assert.ok(true)
if (/"pre" versions of node cannot be installed/.test(err.message)) {
assert.ok(true)
}
}
})
// only run these tests if we are running a version of Node with predictable version path behavior
const skipParallelInstallTests = process.env.FAST_TEST ||
process.release.name !== 'node' ||
semver.prerelease(process.version) !== null ||
semver.satisfies(process.version, '<10')
async function parallelInstallsTest (test, fs, devDir, prog) {
if (skipParallelInstallTests) {
return test.skip('Skipping parallel installs test due to test environment configuration')
}
after(async () => {
await util.promisify(rimraf)(devDir)
})
const expectedDir = path.join(devDir, process.version.replace(/^v/, ''))
await util.promisify(rimraf)(expectedDir)
await Promise.all([
install(fs, prog, []),
install(fs, prog, []),
install(fs, prog, []),
install(fs, prog, []),
install(fs, prog, []),
install(fs, prog, []),
install(fs, prog, []),
install(fs, prog, []),
install(fs, prog, []),
install(fs, prog, [])
])
}
it('parallel installs (ensure=true)', async function () {
this.timeout(TIMEOUT)
const fs = require('graceful-fs')
const devDir = await util.promisify(fs.mkdtemp)(path.join(os.tmpdir(), 'node-gyp-test-'))
const prog = gyp()
prog.parseArgv([])
prog.devDir = devDir
prog.opts.ensure = true
log.level = 'warn'
await parallelInstallsTest(this, fs, devDir, prog)
})
it('parallel installs (ensure=false)', async function () {
this.timeout(TIMEOUT)
const fs = require('graceful-fs')
const devDir = await util.promisify(fs.mkdtemp)(path.join(os.tmpdir(), 'node-gyp-test-'))
const prog = gyp()
prog.parseArgv([])
prog.devDir = devDir
prog.opts.ensure = false
log.level = 'warn'
await parallelInstallsTest(this, fs, devDir, prog)
})
it('parallel installs (tarball)', async function () {
this.timeout(TIMEOUT)
const fs = require('graceful-fs')
const devDir = await util.promisify(fs.mkdtemp)(path.join(os.tmpdir(), 'node-gyp-test-'))
const prog = gyp()
prog.parseArgv([])
prog.devDir = devDir
prog.opts.tarball = path.join(devDir, 'node-headers.tar.gz')
log.level = 'warn'
await streamPipeline(
(await download(prog, `https://nodejs.org/dist/${process.version}/node-${process.version}.tar.gz`)).body,
fs.createWriteStream(prog.opts.tarball)
)
await parallelInstallsTest(this, fs, devDir, prog)
})
})

View File

@@ -0,0 +1,41 @@
'use strict'
const { describe, it } = require('mocha')
const assert = require('assert')
const gyp = require('../lib/node-gyp')
describe('options', function () {
it('options in environment', () => {
// `npm test` dumps a ton of npm_config_* variables in the environment.
Object.keys(process.env)
.filter((key) => /^npm_config_/.test(key))
.forEach((key) => { delete process.env[key] })
// in some platforms, certain keys are stubborn and cannot be removed
const keys = Object.keys(process.env)
.filter((key) => /^npm_config_/.test(key))
.map((key) => key.substring('npm_config_'.length))
.concat('argv', 'x')
// Zero-length keys should get filtered out.
process.env.npm_config_ = '42'
// Other keys should get added.
process.env.npm_config_x = '42'
// Except loglevel.
process.env.npm_config_loglevel = 'debug'
const g = gyp()
g.parseArgv(['rebuild']) // Also sets opts.argv.
assert.deepStrictEqual(Object.keys(g.opts).sort(), keys.sort())
})
it('options with spaces in environment', () => {
process.env.npm_config_force_process_config = 'true'
const g = gyp()
g.parseArgv(['rebuild']) // Also sets opts.argv.
assert.strictEqual(g.opts['force-process-config'], 'true')
})
})

View File

@@ -0,0 +1,401 @@
'use strict'
const { describe, it } = require('mocha')
const assert = require('assert')
const processRelease = require('../lib/process-release')
describe('process-release', function () {
it('test process release - process.version = 0.8.20', function () {
var release = processRelease([], { opts: {} }, 'v0.8.20', null)
assert.strictEqual(release.semver.version, '0.8.20')
delete release.semver
assert.deepStrictEqual(release, {
version: '0.8.20',
name: 'node',
baseUrl: 'https://nodejs.org/dist/v0.8.20/',
tarballUrl: 'https://nodejs.org/dist/v0.8.20/node-v0.8.20.tar.gz',
shasumsUrl: 'https://nodejs.org/dist/v0.8.20/SHASUMS256.txt',
versionDir: '0.8.20',
ia32: { libUrl: 'https://nodejs.org/dist/v0.8.20/node.lib', libPath: 'node.lib' },
x64: { libUrl: 'https://nodejs.org/dist/v0.8.20/x64/node.lib', libPath: 'x64/node.lib' },
arm64: { libUrl: 'https://nodejs.org/dist/v0.8.20/arm64/node.lib', libPath: 'arm64/node.lib' }
})
})
it('test process release - process.version = 0.10.21', function () {
var release = processRelease([], { opts: {} }, 'v0.10.21', null)
assert.strictEqual(release.semver.version, '0.10.21')
delete release.semver
assert.deepStrictEqual(release, {
version: '0.10.21',
name: 'node',
baseUrl: 'https://nodejs.org/dist/v0.10.21/',
tarballUrl: 'https://nodejs.org/dist/v0.10.21/node-v0.10.21.tar.gz',
shasumsUrl: 'https://nodejs.org/dist/v0.10.21/SHASUMS256.txt',
versionDir: '0.10.21',
ia32: { libUrl: 'https://nodejs.org/dist/v0.10.21/node.lib', libPath: 'node.lib' },
x64: { libUrl: 'https://nodejs.org/dist/v0.10.21/x64/node.lib', libPath: 'x64/node.lib' },
arm64: { libUrl: 'https://nodejs.org/dist/v0.10.21/arm64/node.lib', libPath: 'arm64/node.lib' }
})
})
// prior to -headers.tar.gz
it('test process release - process.version = 0.12.9', function () {
var release = processRelease([], { opts: {} }, 'v0.12.9', null)
assert.strictEqual(release.semver.version, '0.12.9')
delete release.semver
assert.deepStrictEqual(release, {
version: '0.12.9',
name: 'node',
baseUrl: 'https://nodejs.org/dist/v0.12.9/',
tarballUrl: 'https://nodejs.org/dist/v0.12.9/node-v0.12.9.tar.gz',
shasumsUrl: 'https://nodejs.org/dist/v0.12.9/SHASUMS256.txt',
versionDir: '0.12.9',
ia32: { libUrl: 'https://nodejs.org/dist/v0.12.9/node.lib', libPath: 'node.lib' },
x64: { libUrl: 'https://nodejs.org/dist/v0.12.9/x64/node.lib', libPath: 'x64/node.lib' },
arm64: { libUrl: 'https://nodejs.org/dist/v0.12.9/arm64/node.lib', libPath: 'arm64/node.lib' }
})
})
// prior to -headers.tar.gz
it('test process release - process.version = 0.10.41', function () {
var release = processRelease([], { opts: {} }, 'v0.10.41', null)
assert.strictEqual(release.semver.version, '0.10.41')
delete release.semver
assert.deepStrictEqual(release, {
version: '0.10.41',
name: 'node',
baseUrl: 'https://nodejs.org/dist/v0.10.41/',
tarballUrl: 'https://nodejs.org/dist/v0.10.41/node-v0.10.41.tar.gz',
shasumsUrl: 'https://nodejs.org/dist/v0.10.41/SHASUMS256.txt',
versionDir: '0.10.41',
ia32: { libUrl: 'https://nodejs.org/dist/v0.10.41/node.lib', libPath: 'node.lib' },
x64: { libUrl: 'https://nodejs.org/dist/v0.10.41/x64/node.lib', libPath: 'x64/node.lib' },
arm64: { libUrl: 'https://nodejs.org/dist/v0.10.41/arm64/node.lib', libPath: 'arm64/node.lib' }
})
})
// has -headers.tar.gz
it('test process release - process.release ~ node@0.10.42', function () {
var release = processRelease([], { opts: {} }, 'v0.10.42', null)
assert.strictEqual(release.semver.version, '0.10.42')
delete release.semver
assert.deepStrictEqual(release, {
version: '0.10.42',
name: 'node',
baseUrl: 'https://nodejs.org/dist/v0.10.42/',
tarballUrl: 'https://nodejs.org/dist/v0.10.42/node-v0.10.42-headers.tar.gz',
shasumsUrl: 'https://nodejs.org/dist/v0.10.42/SHASUMS256.txt',
versionDir: '0.10.42',
ia32: { libUrl: 'https://nodejs.org/dist/v0.10.42/node.lib', libPath: 'node.lib' },
x64: { libUrl: 'https://nodejs.org/dist/v0.10.42/x64/node.lib', libPath: 'x64/node.lib' },
arm64: { libUrl: 'https://nodejs.org/dist/v0.10.42/arm64/node.lib', libPath: 'arm64/node.lib' }
})
})
// has -headers.tar.gz
it('test process release - process.release ~ node@0.12.10', function () {
var release = processRelease([], { opts: {} }, 'v0.12.10', null)
assert.strictEqual(release.semver.version, '0.12.10')
delete release.semver
assert.deepStrictEqual(release, {
version: '0.12.10',
name: 'node',
baseUrl: 'https://nodejs.org/dist/v0.12.10/',
tarballUrl: 'https://nodejs.org/dist/v0.12.10/node-v0.12.10-headers.tar.gz',
shasumsUrl: 'https://nodejs.org/dist/v0.12.10/SHASUMS256.txt',
versionDir: '0.12.10',
ia32: { libUrl: 'https://nodejs.org/dist/v0.12.10/node.lib', libPath: 'node.lib' },
x64: { libUrl: 'https://nodejs.org/dist/v0.12.10/x64/node.lib', libPath: 'x64/node.lib' },
arm64: { libUrl: 'https://nodejs.org/dist/v0.12.10/arm64/node.lib', libPath: 'arm64/node.lib' }
})
})
it('test process release - process.release ~ node@4.1.23', function () {
var release = processRelease([], { opts: {} }, 'v4.1.23', {
name: 'node',
headersUrl: 'https://nodejs.org/dist/v4.1.23/node-v4.1.23-headers.tar.gz'
})
assert.strictEqual(release.semver.version, '4.1.23')
delete release.semver
assert.deepStrictEqual(release, {
version: '4.1.23',
name: 'node',
baseUrl: 'https://nodejs.org/dist/v4.1.23/',
tarballUrl: 'https://nodejs.org/dist/v4.1.23/node-v4.1.23-headers.tar.gz',
shasumsUrl: 'https://nodejs.org/dist/v4.1.23/SHASUMS256.txt',
versionDir: '4.1.23',
ia32: { libUrl: 'https://nodejs.org/dist/v4.1.23/win-x86/node.lib', libPath: 'win-x86/node.lib' },
x64: { libUrl: 'https://nodejs.org/dist/v4.1.23/win-x64/node.lib', libPath: 'win-x64/node.lib' },
arm64: { libUrl: 'https://nodejs.org/dist/v4.1.23/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
})
})
it('test process release - process.release ~ node@4.1.23 / corp build', function () {
var release = processRelease([], { opts: {} }, 'v4.1.23', {
name: 'node',
headersUrl: 'https://some.custom.location/node-v4.1.23-headers.tar.gz'
})
assert.strictEqual(release.semver.version, '4.1.23')
delete release.semver
assert.deepStrictEqual(release, {
version: '4.1.23',
name: 'node',
baseUrl: 'https://some.custom.location/',
tarballUrl: 'https://some.custom.location/node-v4.1.23-headers.tar.gz',
shasumsUrl: 'https://some.custom.location/SHASUMS256.txt',
versionDir: '4.1.23',
ia32: { libUrl: 'https://some.custom.location/win-x86/node.lib', libPath: 'win-x86/node.lib' },
x64: { libUrl: 'https://some.custom.location/win-x64/node.lib', libPath: 'win-x64/node.lib' },
arm64: { libUrl: 'https://some.custom.location/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
})
})
it('test process release - process.release ~ node@12.8.0 Windows', function () {
var release = processRelease([], { opts: {} }, 'v12.8.0', {
name: 'node',
sourceUrl: 'https://nodejs.org/download/release/v12.8.0/node-v12.8.0.tar.gz',
headersUrl: 'https://nodejs.org/download/release/v12.8.0/node-v12.8.0-headers.tar.gz',
libUrl: 'https://nodejs.org/download/release/v12.8.0/win-x64/node.lib'
})
assert.strictEqual(release.semver.version, '12.8.0')
delete release.semver
assert.deepStrictEqual(release, {
version: '12.8.0',
name: 'node',
baseUrl: 'https://nodejs.org/download/release/v12.8.0/',
tarballUrl: 'https://nodejs.org/download/release/v12.8.0/node-v12.8.0-headers.tar.gz',
shasumsUrl: 'https://nodejs.org/download/release/v12.8.0/SHASUMS256.txt',
versionDir: '12.8.0',
ia32: { libUrl: 'https://nodejs.org/download/release/v12.8.0/win-x86/node.lib', libPath: 'win-x86/node.lib' },
x64: { libUrl: 'https://nodejs.org/download/release/v12.8.0/win-x64/node.lib', libPath: 'win-x64/node.lib' },
arm64: { libUrl: 'https://nodejs.org/download/release/v12.8.0/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
})
})
it('test process release - process.release ~ node@12.8.0 Windows ARM64', function () {
var release = processRelease([], { opts: {} }, 'v12.8.0', {
name: 'node',
sourceUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/node-v12.8.0.tar.gz',
headersUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/node-v12.8.0-headers.tar.gz',
libUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/win-arm64/node.lib'
})
assert.strictEqual(release.semver.version, '12.8.0')
delete release.semver
assert.deepStrictEqual(release, {
version: '12.8.0',
name: 'node',
baseUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/',
tarballUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/node-v12.8.0-headers.tar.gz',
shasumsUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/SHASUMS256.txt',
versionDir: '12.8.0',
ia32: { libUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/win-x86/node.lib', libPath: 'win-x86/node.lib' },
x64: { libUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/win-x64/node.lib', libPath: 'win-x64/node.lib' },
arm64: { libUrl: 'https://unofficial-builds.nodejs.org/download/release/v12.8.0/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
})
})
it('test process release - process.release ~ node@4.1.23 --target=0.10.40', function () {
var release = processRelease([], { opts: { target: '0.10.40' } }, 'v4.1.23', {
name: 'node',
headersUrl: 'https://nodejs.org/dist/v4.1.23/node-v4.1.23-headers.tar.gz'
})
assert.strictEqual(release.semver.version, '0.10.40')
delete release.semver
assert.deepStrictEqual(release, {
version: '0.10.40',
name: 'node',
baseUrl: 'https://nodejs.org/dist/v0.10.40/',
tarballUrl: 'https://nodejs.org/dist/v0.10.40/node-v0.10.40.tar.gz',
shasumsUrl: 'https://nodejs.org/dist/v0.10.40/SHASUMS256.txt',
versionDir: '0.10.40',
ia32: { libUrl: 'https://nodejs.org/dist/v0.10.40/node.lib', libPath: 'node.lib' },
x64: { libUrl: 'https://nodejs.org/dist/v0.10.40/x64/node.lib', libPath: 'x64/node.lib' },
arm64: { libUrl: 'https://nodejs.org/dist/v0.10.40/arm64/node.lib', libPath: 'arm64/node.lib' }
})
})
it('test process release - process.release ~ node@4.1.23 --dist-url=https://foo.bar/baz', function () {
var release = processRelease([], { opts: { 'dist-url': 'https://foo.bar/baz' } }, 'v4.1.23', {
name: 'node',
headersUrl: 'https://nodejs.org/dist/v4.1.23/node-v4.1.23-headers.tar.gz'
})
assert.strictEqual(release.semver.version, '4.1.23')
delete release.semver
assert.deepStrictEqual(release, {
version: '4.1.23',
name: 'node',
baseUrl: 'https://foo.bar/baz/v4.1.23/',
tarballUrl: 'https://foo.bar/baz/v4.1.23/node-v4.1.23-headers.tar.gz',
shasumsUrl: 'https://foo.bar/baz/v4.1.23/SHASUMS256.txt',
versionDir: '4.1.23',
ia32: { libUrl: 'https://foo.bar/baz/v4.1.23/win-x86/node.lib', libPath: 'win-x86/node.lib' },
x64: { libUrl: 'https://foo.bar/baz/v4.1.23/win-x64/node.lib', libPath: 'win-x64/node.lib' },
arm64: { libUrl: 'https://foo.bar/baz/v4.1.23/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
})
})
it('test process release - process.release ~ frankenstein@4.1.23', function () {
var release = processRelease([], { opts: {} }, 'v4.1.23', {
name: 'frankenstein',
headersUrl: 'https://frankensteinjs.org/dist/v4.1.23/frankenstein-v4.1.23-headers.tar.gz'
})
assert.strictEqual(release.semver.version, '4.1.23')
delete release.semver
assert.deepStrictEqual(release, {
version: '4.1.23',
name: 'frankenstein',
baseUrl: 'https://frankensteinjs.org/dist/v4.1.23/',
tarballUrl: 'https://frankensteinjs.org/dist/v4.1.23/frankenstein-v4.1.23-headers.tar.gz',
shasumsUrl: 'https://frankensteinjs.org/dist/v4.1.23/SHASUMS256.txt',
versionDir: 'frankenstein-4.1.23',
ia32: { libUrl: 'https://frankensteinjs.org/dist/v4.1.23/win-x86/frankenstein.lib', libPath: 'win-x86/frankenstein.lib' },
x64: { libUrl: 'https://frankensteinjs.org/dist/v4.1.23/win-x64/frankenstein.lib', libPath: 'win-x64/frankenstein.lib' },
arm64: { libUrl: 'https://frankensteinjs.org/dist/v4.1.23/win-arm64/frankenstein.lib', libPath: 'win-arm64/frankenstein.lib' }
})
})
it('test process release - process.release ~ frankenstein@4.1.23 --dist-url=http://foo.bar/baz/', function () {
var release = processRelease([], { opts: { 'dist-url': 'http://foo.bar/baz/' } }, 'v4.1.23', {
name: 'frankenstein',
headersUrl: 'https://frankensteinjs.org/dist/v4.1.23/frankenstein-v4.1.23.tar.gz'
})
assert.strictEqual(release.semver.version, '4.1.23')
delete release.semver
assert.deepStrictEqual(release, {
version: '4.1.23',
name: 'frankenstein',
baseUrl: 'http://foo.bar/baz/v4.1.23/',
tarballUrl: 'http://foo.bar/baz/v4.1.23/frankenstein-v4.1.23-headers.tar.gz',
shasumsUrl: 'http://foo.bar/baz/v4.1.23/SHASUMS256.txt',
versionDir: 'frankenstein-4.1.23',
ia32: { libUrl: 'http://foo.bar/baz/v4.1.23/win-x86/frankenstein.lib', libPath: 'win-x86/frankenstein.lib' },
x64: { libUrl: 'http://foo.bar/baz/v4.1.23/win-x64/frankenstein.lib', libPath: 'win-x64/frankenstein.lib' },
arm64: { libUrl: 'http://foo.bar/baz/v4.1.23/win-arm64/frankenstein.lib', libPath: 'win-arm64/frankenstein.lib' }
})
})
it('test process release - process.release ~ node@4.0.0-rc.4', function () {
var release = processRelease([], { opts: {} }, 'v4.0.0-rc.4', {
name: 'node',
headersUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/node-v4.0.0-rc.4-headers.tar.gz'
})
assert.strictEqual(release.semver.version, '4.0.0-rc.4')
delete release.semver
assert.deepStrictEqual(release, {
version: '4.0.0-rc.4',
name: 'node',
baseUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/',
tarballUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/node-v4.0.0-rc.4-headers.tar.gz',
shasumsUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/SHASUMS256.txt',
versionDir: '4.0.0-rc.4',
ia32: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x86/node.lib', libPath: 'win-x86/node.lib' },
x64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x64/node.lib', libPath: 'win-x64/node.lib' },
arm64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
})
})
it('test process release - process.release ~ node@4.0.0-rc.4 passed as argv[0]', function () {
// note the missing 'v' on the arg, it should normalise when checking
// whether we're on the default or not
var release = processRelease(['4.0.0-rc.4'], { opts: {} }, 'v4.0.0-rc.4', {
name: 'node',
headersUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/node-v4.0.0-rc.4-headers.tar.gz'
})
assert.strictEqual(release.semver.version, '4.0.0-rc.4')
delete release.semver
assert.deepStrictEqual(release, {
version: '4.0.0-rc.4',
name: 'node',
baseUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/',
tarballUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/node-v4.0.0-rc.4-headers.tar.gz',
shasumsUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/SHASUMS256.txt',
versionDir: '4.0.0-rc.4',
ia32: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x86/node.lib', libPath: 'win-x86/node.lib' },
x64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x64/node.lib', libPath: 'win-x64/node.lib' },
arm64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
})
})
it('test process release - process.release ~ node@4.0.0-rc.4 - bogus string passed as argv[0]', function () {
// additional arguments can be passed in on the commandline that should be ignored if they
// are not specifying a valid version @ position 0
var release = processRelease(['this is no version!'], { opts: {} }, 'v4.0.0-rc.4', {
name: 'node',
headersUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/node-v4.0.0-rc.4-headers.tar.gz'
})
assert.strictEqual(release.semver.version, '4.0.0-rc.4')
delete release.semver
assert.deepStrictEqual(release, {
version: '4.0.0-rc.4',
name: 'node',
baseUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/',
tarballUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/node-v4.0.0-rc.4-headers.tar.gz',
shasumsUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/SHASUMS256.txt',
versionDir: '4.0.0-rc.4',
ia32: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x86/node.lib', libPath: 'win-x86/node.lib' },
x64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-x64/node.lib', libPath: 'win-x64/node.lib' },
arm64: { libUrl: 'https://nodejs.org/download/rc/v4.0.0-rc.4/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
})
})
it('test process release - NODEJS_ORG_MIRROR', function () {
process.env.NODEJS_ORG_MIRROR = 'http://foo.bar'
var release = processRelease([], { opts: {} }, 'v4.1.23', {
name: 'node',
headersUrl: 'https://nodejs.org/dist/v4.1.23/node-v4.1.23-headers.tar.gz'
})
assert.strictEqual(release.semver.version, '4.1.23')
delete release.semver
assert.deepStrictEqual(release, {
version: '4.1.23',
name: 'node',
baseUrl: 'http://foo.bar/v4.1.23/',
tarballUrl: 'http://foo.bar/v4.1.23/node-v4.1.23-headers.tar.gz',
shasumsUrl: 'http://foo.bar/v4.1.23/SHASUMS256.txt',
versionDir: '4.1.23',
ia32: { libUrl: 'http://foo.bar/v4.1.23/win-x86/node.lib', libPath: 'win-x86/node.lib' },
x64: { libUrl: 'http://foo.bar/v4.1.23/win-x64/node.lib', libPath: 'win-x64/node.lib' },
arm64: { libUrl: 'http://foo.bar/v4.1.23/win-arm64/node.lib', libPath: 'win-arm64/node.lib' }
})
delete process.env.NODEJS_ORG_MIRROR
})
})