diff --git a/node_modules/node-gyp/.release-please-manifest.json b/node_modules/node-gyp/.release-please-manifest.json
new file mode 100644
index 0000000000000..1842506cfa97f
--- /dev/null
+++ b/node_modules/node-gyp/.release-please-manifest.json
@@ -0,0 +1,3 @@
+{
+ ".": "10.1.0"
+}
diff --git a/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py b/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py
index d3c97c666db07..9a796702142e3 100644
--- a/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py
+++ b/node_modules/node-gyp/gyp/pylib/gyp/generator/android.py
@@ -739,9 +739,9 @@ def ComputeOutput(self, spec):
% (self.android_class, self.android_module)
)
else:
- path = "$(call intermediates-dir-for,{},{},,,$(GYP_VAR_PREFIX))".format(
- self.android_class,
- self.android_module,
+ path = (
+ "$(call intermediates-dir-for,"
+ f"{self.android_class},{self.android_module},,,$(GYP_VAR_PREFIX))"
)
assert spec.get("product_dir") is None # TODO: not supported?
diff --git a/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py b/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py
index 82a07ddc6577b..625b6d65ca1a6 100644
--- a/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py
+++ b/node_modules/node-gyp/gyp/pylib/gyp/generator/gypsh.py
@@ -49,10 +49,9 @@ def GenerateOutput(target_list, target_dicts, data, params):
# Use a banner that looks like the stock Python one and like what
# code.interact uses by default, but tack on something to indicate what
# locals are available, and identify gypsh.
- banner = "Python {} on {}\nlocals.keys() = {}\ngypsh".format(
- sys.version,
- sys.platform,
- repr(sorted(locals.keys())),
+ banner = (
+ f"Python {sys.version} on {sys.platform}\nlocals.keys() = "
+ f"{repr(sorted(locals.keys()))}\ngypsh"
)
code.interact(banner, local=locals)
diff --git a/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py b/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py
index 13b0794b4dccc..6f0f8c1ab64c9 100644
--- a/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py
+++ b/node_modules/node-gyp/gyp/pylib/gyp/generator/msvs.py
@@ -1778,11 +1778,9 @@ def _GetCopies(spec):
outer_dir = posixpath.split(src_bare)[1]
fixed_dst = _FixPath(dst)
full_dst = f'"{fixed_dst}\\{outer_dir}\\"'
- cmd = 'mkdir {} 2>nul & cd "{}" && xcopy /e /f /y "{}" {}'.format(
- full_dst,
- _FixPath(base_dir),
- outer_dir,
- full_dst,
+ cmd = (
+ f'mkdir {full_dst} 2>nul & cd "{_FixPath(base_dir)}" && '
+ f'xcopy /e /f /y "{outer_dir}" {full_dst}'
)
copies.append(
(
@@ -1794,10 +1792,9 @@ def _GetCopies(spec):
)
else:
fix_dst = _FixPath(cpy["destination"])
- cmd = 'mkdir "{}" 2>nul & set ERRORLEVEL=0 & copy /Y "{}" "{}"'.format(
- fix_dst,
- _FixPath(src),
- _FixPath(dst),
+ cmd = (
+ f'mkdir "{fix_dst}" 2>nul & set ERRORLEVEL=0 & '
+ f'copy /Y "{_FixPath(src)}" "{_FixPath(dst)}"'
)
copies.append(([src], [dst], cmd, f"Copying {src} to {fix_dst}"))
return copies
@@ -1899,9 +1896,8 @@ def _GetPlatformOverridesOfProject(spec):
for config_name, c in spec["configurations"].items():
config_fullname = _ConfigFullName(config_name, c)
platform = c.get("msvs_target_platform", _ConfigPlatform(c))
- fixed_config_fullname = "{}|{}".format(
- _ConfigBaseName(config_name, _ConfigPlatform(c)),
- platform,
+ fixed_config_fullname = (
+ f"{_ConfigBaseName(config_name, _ConfigPlatform(c))}|{platform}"
)
if spec["toolset"] == "host" and generator_supports_multiple_toolsets:
fixed_config_fullname = f"{config_name}|x64"
diff --git a/node_modules/node-gyp/gyp/pylib/gyp/input.py b/node_modules/node-gyp/gyp/pylib/gyp/input.py
index 8f39519dee51f..0b56c72750e6c 100644
--- a/node_modules/node-gyp/gyp/pylib/gyp/input.py
+++ b/node_modules/node-gyp/gyp/pylib/gyp/input.py
@@ -1135,18 +1135,16 @@ def EvalCondition(condition, conditions_key, phase, variables, build_file):
true_dict = condition[i + 1]
if type(true_dict) is not dict:
raise GypError(
- "{} {} must be followed by a dictionary, not {}".format(
- conditions_key, cond_expr, type(true_dict)
- )
+ f"{conditions_key} {cond_expr} must be followed by a dictionary, not "
+ f"{type(true_dict)}"
)
if len(condition) > i + 2 and type(condition[i + 2]) is dict:
false_dict = condition[i + 2]
i = i + 3
if i != len(condition):
raise GypError(
- "{} {} has {} unexpected trailing items".format(
- conditions_key, cond_expr, len(condition) - i
- )
+ f"{conditions_key} {cond_expr} has {len(condition) - i} "
+ "unexpected trailing items"
)
else:
false_dict = None
diff --git a/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py b/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py
index 38fa21dd66669..847d1b8dc1d4d 100644
--- a/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py
+++ b/node_modules/node-gyp/gyp/pylib/gyp/msvs_emulation.py
@@ -830,17 +830,14 @@ def _GetLdManifestFlags(
("VCLinkerTool", "UACUIAccess"), config, default="false"
)
- inner = """
+ inner = f"""
-
+
-""".format(
- execution_level_map[execution_level],
- ui_access,
- )
+""" # noqa: E501
else:
inner = ""
diff --git a/node_modules/node-gyp/gyp/pyproject.toml b/node_modules/node-gyp/gyp/pyproject.toml
index 0c25d0b3c1a06..7183e07d3c2cd 100644
--- a/node_modules/node-gyp/gyp/pyproject.toml
+++ b/node_modules/node-gyp/gyp/pyproject.toml
@@ -38,7 +38,7 @@ gyp = "gyp:script_main"
"Homepage" = "https://github.com/nodejs/gyp-next"
[tool.ruff]
-select = [
+lint.select = [
"C4", # flake8-comprehensions
"C90", # McCabe cyclomatic complexity
"DTZ", # flake8-datetimez
@@ -87,7 +87,7 @@ select = [
# "T20", # flake8-print
# "TRY", # tryceratops
]
-ignore = [
+lint.ignore = [
"E721",
"PLC1901",
"PLR0402",
@@ -105,10 +105,10 @@ extend-exclude = ["pylib/packaging"]
line-length = 88
target-version = "py37"
-[tool.ruff.mccabe]
+[tool.ruff.lint.mccabe]
max-complexity = 101
-[tool.ruff.pylint]
+[tool.ruff.lint.pylint]
max-args = 11
max-branches = 108
max-returns = 10
diff --git a/node_modules/node-gyp/lib/configure.js b/node_modules/node-gyp/lib/configure.js
index 8da41a849dfcf..e4b8c94e3d259 100644
--- a/node_modules/node-gyp/lib/configure.js
+++ b/node_modules/node-gyp/lib/configure.js
@@ -1,6 +1,6 @@
'use strict'
-const { promises: fs } = require('graceful-fs')
+const { promises: fs, readFileSync } = require('graceful-fs')
const path = require('path')
const log = require('./log')
const os = require('os')
@@ -13,6 +13,10 @@ const { findAccessibleSync } = require('./util')
const { findPython } = require('./find-python')
const { findVisualStudio } = win ? require('./find-visualstudio') : {}
+const majorRe = /^#define NODE_MAJOR_VERSION (\d+)/m
+const minorRe = /^#define NODE_MINOR_VERSION (\d+)/m
+const patchRe = /^#define NODE_PATCH_VERSION (\d+)/m
+
async function configure (gyp, argv) {
const buildDir = path.resolve('build')
const configNames = ['config.gypi', 'common.gypi']
@@ -27,6 +31,28 @@ async function configure (gyp, argv) {
// 'python' should be set by now
process.env.PYTHON = python
+ if (!gyp.opts.nodedir &&
+ process.config.variables.use_prefix_to_find_headers) {
+ // check if the headers can be found using the prefix specified
+ // at build time. Use them if they match the version expected
+ const prefix = process.config.variables.node_prefix
+ let availVersion
+ try {
+ const nodeVersionH = readFileSync(path.join(prefix,
+ 'include', 'node', 'node_version.h'), { encoding: 'utf8' })
+ const major = nodeVersionH.match(majorRe)[1]
+ const minor = nodeVersionH.match(minorRe)[1]
+ const patch = nodeVersionH.match(patchRe)[1]
+ availVersion = major + '.' + minor + '.' + patch
+ } catch {}
+ if (availVersion === release.version) {
+ // ok version matches, use the headers
+ gyp.opts.nodedir = prefix
+ log.verbose('using local node headers based on prefix',
+ 'setting nodedir to ' + gyp.opts.nodedir)
+ }
+ }
+
if (gyp.opts.nodedir) {
// --nodedir was specified. use that for the dev files
nodeDir = gyp.opts.nodedir.replace(/^~/, os.homedir())
diff --git a/node_modules/node-gyp/lib/find-python.js b/node_modules/node-gyp/lib/find-python.js
index 615da57bb8572..a71c00c2b65bc 100644
--- a/node_modules/node-gyp/lib/find-python.js
+++ b/node_modules/node-gyp/lib/find-python.js
@@ -41,7 +41,7 @@ class PythonFinder {
static findPython = (...args) => new PythonFinder(...args).findPython()
log = log.withPrefix('find Python')
- argsExecutable = ['-c', 'import sys; print(sys.executable);']
+ argsExecutable = ['-c', 'import sys; sys.stdout.buffer.write(sys.executable.encode(\'utf-8\'));']
argsVersion = ['-c', 'import sys; print("%s.%s.%s" % sys.version_info[:3]);']
semverRange = '>=3.6.0'
diff --git a/node_modules/node-gyp/lib/find-visualstudio.js b/node_modules/node-gyp/lib/find-visualstudio.js
index b57770259abde..8c5ae96127504 100644
--- a/node_modules/node-gyp/lib/find-visualstudio.js
+++ b/node_modules/node-gyp/lib/find-visualstudio.js
@@ -54,7 +54,10 @@ class VisualStudioFinder {
}
const checks = [
- () => this.findVisualStudio2017OrNewer(),
+ () => this.findVisualStudio2019OrNewerUsingSetupModule(),
+ () => this.findVisualStudio2019OrNewer(),
+ () => this.findVisualStudio2017UsingSetupModule(),
+ () => this.findVisualStudio2017(),
() => this.findVisualStudio2015(),
() => this.findVisualStudio2013()
]
@@ -113,9 +116,84 @@ class VisualStudioFinder {
throw new Error('Could not find any Visual Studio installation to use')
}
+ async findVisualStudio2019OrNewerUsingSetupModule () {
+ return this.findNewVSUsingSetupModule([2019, 2022])
+ }
+
+ async findVisualStudio2017UsingSetupModule () {
+ if (this.nodeSemver.major >= 22) {
+ this.addLog(
+ 'not looking for VS2017 as it is only supported up to Node.js 21')
+ return null
+ }
+ return this.findNewVSUsingSetupModule([2017])
+ }
+
+ async findNewVSUsingSetupModule (supportedYears) {
+ const ps = path.join(process.env.SystemRoot, 'System32',
+ 'WindowsPowerShell', 'v1.0', 'powershell.exe')
+ const vcInstallDir = this.envVcInstallDir
+
+ const checkModuleArgs = [
+ '-NoProfile',
+ '-Command',
+ '&{@(Get-Module -ListAvailable -Name VSSetup).Version.ToString()}'
+ ]
+ this.log.silly('Running', ps, checkModuleArgs)
+ const [cErr] = await this.execFile(ps, checkModuleArgs)
+ if (cErr) {
+ this.addLog('VSSetup module doesn\'t seem to exist. You can install it via: "Install-Module VSSetup -Scope CurrentUser"')
+ this.log.silly('VSSetup error = %j', cErr && (cErr.stack || cErr))
+ return null
+ }
+ const filterArg = vcInstallDir !== undefined ? `| where {$_.InstallationPath -eq '${vcInstallDir}' }` : ''
+ const psArgs = [
+ '-NoProfile',
+ '-Command',
+ `&{Get-VSSetupInstance ${filterArg} | ConvertTo-Json -Depth 3}`
+ ]
+
+ this.log.silly('Running', ps, psArgs)
+ const [err, stdout, stderr] = await this.execFile(ps, psArgs)
+ let parsedData = this.parseData(err, stdout, stderr)
+ if (parsedData === null) {
+ return null
+ }
+ this.log.silly('Parsed data', parsedData)
+ if (!Array.isArray(parsedData)) {
+ // if there are only 1 result, then Powershell will output non-array
+ parsedData = [parsedData]
+ }
+ // normalize output
+ parsedData = parsedData.map((info) => {
+ info.path = info.InstallationPath
+ info.version = `${info.InstallationVersion.Major}.${info.InstallationVersion.Minor}.${info.InstallationVersion.Build}.${info.InstallationVersion.Revision}`
+ info.packages = info.Packages.map((p) => p.Id)
+ return info
+ })
+ // pass for further processing
+ return this.processData(parsedData, supportedYears)
+ }
+
+ // Invoke the PowerShell script to get information about Visual Studio 2019
+ // or newer installations
+ async findVisualStudio2019OrNewer () {
+ return this.findNewVS([2019, 2022])
+ }
+
+ // Invoke the PowerShell script to get information about Visual Studio 2017
+ async findVisualStudio2017 () {
+ if (this.nodeSemver.major >= 22) {
+ this.addLog(
+ 'not looking for VS2017 as it is only supported up to Node.js 21')
+ return null
+ }
+ return this.findNewVS([2017])
+ }
+
// Invoke the PowerShell script to get information about Visual Studio 2017
// or newer installations
- async findVisualStudio2017OrNewer () {
+ async findNewVS (supportedYears) {
const ps = path.join(process.env.SystemRoot, 'System32',
'WindowsPowerShell', 'v1.0', 'powershell.exe')
const csFile = path.join(__dirname, 'Find-VisualStudio.cs')
@@ -128,24 +206,35 @@ class VisualStudioFinder {
]
this.log.silly('Running', ps, psArgs)
- const [err, stdout, stderr] = await execFile(ps, psArgs, { encoding: 'utf8' })
- return this.parseData(err, stdout, stderr)
+ const [err, stdout, stderr] = await this.execFile(ps, psArgs)
+ const parsedData = this.parseData(err, stdout, stderr, { checkIsArray: true })
+ if (parsedData === null) {
+ return null
+ }
+ return this.processData(parsedData, supportedYears)
}
- // Parse the output of the PowerShell script and look for an installation
- // of Visual Studio 2017 or newer to use
- parseData (err, stdout, stderr) {
+ // Parse the output of the PowerShell script, make sanity checks
+ parseData (err, stdout, stderr, sanityCheckOptions) {
+ const defaultOptions = {
+ checkIsArray: false
+ }
+
+ // Merging provided options with the default options
+ const sanityOptions = { ...defaultOptions, ...sanityCheckOptions }
+
this.log.silly('PS stderr = %j', stderr)
- const failPowershell = () => {
+ const failPowershell = (failureDetails) => {
this.addLog(
- 'could not use PowerShell to find Visual Studio 2017 or newer, try re-running with \'--loglevel silly\' for more details')
+ `could not use PowerShell to find Visual Studio 2017 or newer, try re-running with '--loglevel silly' for more details. \n
+ Failure details: ${failureDetails}`)
return null
}
if (err) {
this.log.silly('PS err = %j', err && (err.stack || err))
- return failPowershell()
+ return failPowershell(`${err}`.substring(0, 40))
}
let vsInfo
@@ -157,11 +246,16 @@ class VisualStudioFinder {
return failPowershell()
}
- if (!Array.isArray(vsInfo)) {
+ if (sanityOptions.checkIsArray && !Array.isArray(vsInfo)) {
this.log.silly('PS stdout = %j', stdout)
- return failPowershell()
+ return failPowershell('Expected array as output of the PS script')
}
+ return vsInfo
+ }
+ // Process parsed data containing information about VS installations
+ // Look for the required parts, extract and output them back
+ processData (vsInfo, supportedYears) {
vsInfo = vsInfo.map((info) => {
this.log.silly(`processing installation: "${info.path}"`)
info.path = path.resolve(info.path)
@@ -175,11 +269,12 @@ class VisualStudioFinder {
this.log.silly('vsInfo:', vsInfo)
// Remove future versions or errors parsing version number
+ // Also remove any unsupported versions
vsInfo = vsInfo.filter((info) => {
- if (info.versionYear) {
+ if (info.versionYear && supportedYears.indexOf(info.versionYear) !== -1) {
return true
}
- this.addLog(`unknown version "${info.version}" found at "${info.path}"`)
+ this.addLog(`${info.versionYear ? 'unsupported' : 'unknown'} version "${info.version}" found at "${info.path}"`)
return false
})
@@ -438,6 +533,10 @@ class VisualStudioFinder {
return true
}
+
+ async execFile (exec, args) {
+ return await execFile(exec, args, { encoding: 'utf8' })
+ }
}
module.exports = VisualStudioFinder
diff --git a/node_modules/node-gyp/package.json b/node_modules/node-gyp/package.json
index 80c63f2e72c3d..95f012fa5daf7 100644
--- a/node_modules/node-gyp/package.json
+++ b/node_modules/node-gyp/package.json
@@ -11,7 +11,7 @@
"bindings",
"gyp"
],
- "version": "10.0.1",
+ "version": "10.1.0",
"installVersion": 11,
"author": "Nathan Rajlich (http://tootallnate.net)",
"repository": {
diff --git a/node_modules/node-gyp/release-please-config.json b/node_modules/node-gyp/release-please-config.json
new file mode 100644
index 0000000000000..94b8f8110e881
--- /dev/null
+++ b/node_modules/node-gyp/release-please-config.json
@@ -0,0 +1,40 @@
+{
+ "packages": {
+ ".": {
+ "include-component-in-tag": false,
+ "release-type": "node",
+ "changelog-sections": [
+ { "type": "feat", "section": "Features", "hidden": false },
+ { "type": "fix", "section": "Bug Fixes", "hidden": false },
+ { "type": "bin", "section": "Core", "hidden": false },
+ { "type": "gyp", "section": "Core", "hidden": false },
+ { "type": "lib", "section": "Core", "hidden": false },
+ { "type": "src", "section": "Core", "hidden": false },
+ { "type": "test", "section": "Tests", "hidden": false },
+ { "type": "build", "section": "Core", "hidden": false },
+ { "type": "clean", "section": "Core", "hidden": false },
+ { "type": "configure", "section": "Core", "hidden": false },
+ { "type": "install", "section": "Core", "hidden": false },
+ { "type": "list", "section": "Core", "hidden": false },
+ { "type": "rebuild", "section": "Core", "hidden": false },
+ { "type": "remove", "section": "Core", "hidden": false },
+ { "type": "deps", "section": "Core", "hidden": false },
+ { "type": "python", "section": "Core", "hidden": false },
+ { "type": "lin", "section": "Core", "hidden": false },
+ { "type": "linux", "section": "Core", "hidden": false },
+ { "type": "mac", "section": "Core", "hidden": false },
+ { "type": "macos", "section": "Core", "hidden": false },
+ { "type": "win", "section": "Core", "hidden": false },
+ { "type": "windows", "section": "Core", "hidden": false },
+ { "type": "zos", "section": "Core", "hidden": false },
+ { "type": "doc", "section": "Doc", "hidden": false },
+ { "type": "docs", "section": "Doc", "hidden": false },
+ { "type": "readme", "section": "Doc", "hidden": false },
+ { "type": "chore", "section": "Miscellaneous", "hidden": false },
+ { "type": "refactor", "section": "Miscellaneous", "hidden": false },
+ { "type": "ci", "section": "Miscellaneous", "hidden": false },
+ { "type": "meta", "section": "Miscellaneous", "hidden": false }
+ ]
+ }
+ }
+}
diff --git a/package-lock.json b/package-lock.json
index b0b44b8a8cd73..528b725bae6fa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -130,7 +130,7 @@
"minipass": "^7.0.4",
"minipass-pipeline": "^1.2.4",
"ms": "^2.1.2",
- "node-gyp": "^10.0.1",
+ "node-gyp": "^10.1.0",
"nopt": "^7.2.0",
"normalize-package-data": "^6.0.0",
"npm-audit-report": "^5.0.0",
@@ -9898,9 +9898,9 @@
}
},
"node_modules/node-gyp": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz",
- "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==",
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz",
+ "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==",
"inBundle": true,
"dependencies": {
"env-paths": "^2.2.0",
diff --git a/package.json b/package.json
index 4a18d5d0ef9f8..237cdd006f020 100644
--- a/package.json
+++ b/package.json
@@ -93,7 +93,7 @@
"minipass": "^7.0.4",
"minipass-pipeline": "^1.2.4",
"ms": "^2.1.2",
- "node-gyp": "^10.0.1",
+ "node-gyp": "^10.1.0",
"nopt": "^7.2.0",
"normalize-package-data": "^6.0.0",
"npm-audit-report": "^5.0.0",