diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 6b71940..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - "env": { - "commonjs": true, - "es2020": true, - "node": true, - "mocha": true - }, - "extends": [ - "eslint:recommended" - ], - "parserOptions": { - "ecmaVersion": 11 - }, - "rules": { - } -}; diff --git a/CHANGELOG.md b/CHANGELOG.md index 2431f02..dff957b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. ### Changed - Updated dependencies - Switched from vercel/pkg to yao-pkg/pkg as vercel has deprecated pkg - +- Updated to ESLint v9 and added formatting rules using @stylistic/eslint-plugin ## [3.0.0] - 2024-02-24 ### Changed diff --git a/bin/cli.js b/bin/cli.js index 43dfa94..e8ef6fc 100644 --- a/bin/cli.js +++ b/bin/cli.js @@ -4,14 +4,14 @@ const { queue } = require('async'); const { Command } = require('commander'); const cliProgress = require('cli-progress'); const prettyBytes = require('pretty-bytes'); -const package = require('../package'); +const { version, name } = require('../package'); const utility = require('../lib/utility'); const api = require('../lib/index'); const cli = new Command() - .version(package.version, '-v, --version', 'output the current version and exit') - .name(package.name) + .version(version, '-v, --version', 'output the current version and exit') + .name(name) .usage('-u -p -f [additional-options]') .helpOption('-h, --help', 'output this help message and exit') .requiredOption('-u, --username ', 'your Apple ID') @@ -32,7 +32,6 @@ function formatValue(v, options, type) { } async function runUpload(ctx) { - let exitCode = 0; const progressBar = new cliProgress.Bar({ @@ -43,7 +42,6 @@ async function runUpload(ctx) { }, cliProgress.Presets.shades_classic); try { - // Handle URLs to ipa file. if (fileUrlRegex.test(ctx.filePath)) { ctx.originalFilePath = ctx.filePath; @@ -52,14 +50,15 @@ async function runUpload(ctx) { let started = false; ctx.filePath = await utility.downloadTempFile(ctx.filePath, (current, total) => { let { speed, eta } = utility.formatSpeedAndEta(current, total, Date.now() - transferStartTime); - !started ? progressBar.start(total, current, { task: 'Downloading', speed, etas: eta }) + !started + ? progressBar.start(total, current, { task: 'Downloading', speed, etas: eta }) : progressBar.update(current, { speed, etas: eta }); started = true; }); progressBar.stop(); } catch (err) { - throw new Error(`Could not download file: ${err.message}`) + throw new Error(`Could not download file: ${err.message}`); } ctx.usingTempFile = true; } @@ -77,7 +76,7 @@ async function runUpload(ctx) { } catch (err) { console.error(err.message); - throw new Error('Failed to extract Bundle ID and version, are you supplying a valid IPA-file?') + throw new Error('Failed to extract Bundle ID and version, are you supplying a valid IPA-file?'); } // Authenticate with Apple. @@ -109,7 +108,7 @@ async function runUpload(ctx) { // Start uploading. for (let reservation of reservations) { - let tasks = reservation.operations.map(operation => ({ ctx, reservation, operation })); + let tasks = reservation.operations.map((operation) => ({ ctx, reservation, operation })); q.push(tasks, () => { let { speed, eta } = utility.formatSpeedAndEta(ctx.bytesSent, ctx.metadataSize + ctx.fileSize, Date.now() - ctx.transferStartTime); progressBar.update(ctx.bytesSent, { speed, etas: eta }); @@ -145,7 +144,6 @@ async function runUpload(ctx) { } async function run() { - // Parse command line params cli.parse(process.argv); @@ -164,7 +162,6 @@ async function run() { } function stop(signal) { - // Fix to make sure cursor gets restored to visible state when exiting mid progress. process.stderr.write('\u001B[?25h'); diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..3fb761e --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,32 @@ +const js = require('@eslint/js'); +const globals = require('globals'); +const stylistic = require('@stylistic/eslint-plugin'); +const jsdoc = require('eslint-plugin-jsdoc'); + +module.exports = [ + js.configs.recommended, + stylistic.configs.customize({ + indent: 2, + quotes: 'single', + quoteProps: 'as-needed', + arrowParens: true, + semi: true, + }), + { + files: ['**/*.js'], + plugins: { + jsdoc, + }, + rules: { + 'jsdoc/no-undefined-types': 1, + }, + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + globals: { + ...globals.node, + ...globals.mocha, + }, + }, + }, +]; diff --git a/lib/index.js b/lib/index.js index 166c68e..4eaa9be 100644 --- a/lib/index.js +++ b/lib/index.js @@ -12,7 +12,7 @@ const MAX_BODY_LENGTH = 1024 ** 3; /** * Construct error message using application error string and response object. * @param {String} message Application error message - * @param {Object|undefined} response Response object from remote request, + * @param {Object|undefined} response Response object from remote request, * used to extract error message if any. * @returns {Error} An error that can be thrown. */ @@ -25,7 +25,6 @@ function constructError(message, response) { } async function generateMetadata(ctx) { - let metaText = await utility.readFile(path.join(__dirname, '../assets/metadata_template.xml')); const fileStats = await utility.getFileStats(ctx.fileHandle); @@ -53,15 +52,15 @@ async function makeSoftwareServiceRequest(ctx, method, params) { const requestId = utility.generateIDString(); const request = { - jsonrpc: "2.0", + jsonrpc: '2.0', method, id: requestId, - params + params, }; const headers = { 'User-Agent': USER_AGENT, - 'Content-Type': 'application/json' + 'Content-Type': 'application/json', }; const json = JSON.stringify(request); @@ -77,7 +76,7 @@ async function makeSoftwareServiceRequest(ctx, method, params) { let res = await axios.post( SOFTWARE_SERVICE_URL, json, - { headers } + { headers }, ); return res.data.result; @@ -87,15 +86,15 @@ async function makeProducerServiceRequest(ctx, method, params) { const requestId = utility.generateIDString(); const request = { - jsonrpc: "2.0", + jsonrpc: '2.0', method, id: requestId, - params + params, }; const headers = { 'User-Agent': USER_AGENT, - 'Content-Type': 'application/json' + 'Content-Type': 'application/json', }; const json = JSON.stringify(request); @@ -111,7 +110,7 @@ async function makeProducerServiceRequest(ctx, method, params) { let res = await axios.post( PRODUCER_SERVICE_URL, json, - { headers } + { headers }, ); return res.data.result; @@ -120,7 +119,7 @@ async function makeProducerServiceRequest(ctx, method, params) { async function authenticateForSession(ctx) { let res = await makeProducerServiceRequest(ctx, 'authenticateForSession', { Username: ctx.username, - Password: ctx.password + Password: ctx.password, }); if (res.SessionId && res.SharedSecret) { @@ -137,7 +136,7 @@ async function lookupSoftwareForBundleId(ctx) { Application: 'altool', ApplicationBundleId: 'com.apple.itunes.altool', BundleId: ctx.bundleId, - Version: '4.0.1 (1182)' + Version: '4.0.1 (1182)', }); if (!res.Success || res.Attributes.length < 1) { @@ -155,7 +154,7 @@ async function validateMetadata(ctx) { BaseVersion: '2.0.0', Files: [ ctx.fileName, - 'metadata.xml' + 'metadata.xml', ], iTMSTransporterMode: 'upload', MetadataChecksum: ctx.metadataChecksum, @@ -164,19 +163,19 @@ async function validateMetadata(ctx) { app_platform: 'ios', apple_id: ctx.appleId, asset_types: [ - 'bundle' + 'bundle', ], bundle_identifier: ctx.bundleId, bundle_short_version_string: ctx.bundleShortVersion, bundle_version: ctx.bundleVersion, device_id: '', packageVersion: 'software5.4', - primary_bundle_identifier: '' + primary_bundle_identifier: '', }, PackageName: ctx.packageName, PackageSize: ctx.fileSize + ctx.metadataSize, Username: ctx.username, - Version: '2.0.0' + Version: '2.0.0', }); if (!res.Success) { @@ -191,7 +190,7 @@ async function validateAssets(ctx) { AssetDescriptionsCompressed: [], Files: [ ctx.fileName, - 'metadata.xml' + 'metadata.xml', ], iTMSTransporterMode: 'upload', MetadataChecksum: ctx.metadataChecksum, @@ -200,21 +199,21 @@ async function validateAssets(ctx) { app_platform: 'ios', apple_id: ctx.appleId, asset_types: [ - 'bundle' + 'bundle', ], bundle_identifier: ctx.bundleId, bundle_short_version_string: ctx.bundleShortVersion, bundle_version: ctx.bundleVersion, device_id: '', packageVersion: 'software5.4', - primary_bundle_identifier: '' + primary_bundle_identifier: '', }, PackageName: ctx.packageName, PackageSize: ctx.fileSize + ctx.metadataSize, StreamingInfoList: [], Transport: 'HTTP', Username: ctx.username, - Version: '2.0.0' + Version: '2.0.0', }); if (!res.Success) { @@ -232,7 +231,7 @@ async function clientChecksumCompleted(ctx) { iTMSTransporterMode: 'upload', NewPackageName: ctx.packageName, Username: ctx.username, - Version: '2.0.0' + Version: '2.0.0', }); if (!res.Success) { @@ -250,7 +249,7 @@ async function createReservation(ctx) { checksumAlgorithm: 'MD5', contentType: 'application/xml', fileName: 'metadata.xml', - fileSize: ctx.metadataSize + fileSize: ctx.metadataSize, }, { checksum: ctx.fileChecksum, @@ -258,13 +257,13 @@ async function createReservation(ctx) { contentType: 'application/octet-stream', fileName: ctx.fileName, fileSize: ctx.fileSize, - uti: 'com.apple.ipa' - } + uti: 'com.apple.ipa', + }, ], iTMSTransporterMode: 'upload', NewPackageName: ctx.packageName, Username: ctx.username, - Version: '2.0.0' + Version: '2.0.0', }); if (!res.Success) { @@ -275,7 +274,6 @@ async function createReservation(ctx) { } async function executeOperation({ ctx, reservation, operation }) { - let data; if (reservation.file === 'metadata.xml') { @@ -300,7 +298,7 @@ async function executeOperation({ ctx, reservation, operation }) { }, operation.headers), validateStatus: null, maxBodyLength: MAX_BODY_LENGTH, - data + data, }); } catch (err) { @@ -321,10 +319,10 @@ async function commitReservation(ctx, reservation) { iTMSTransporterMode: 'upload', NewPackageName: ctx.packageName, reservations: [ - reservation.id + reservation.id, ], Username: ctx.username, - Version: '2.0.0' + Version: '2.0.0', }); if (!res.Success) { @@ -338,7 +336,7 @@ async function uploadDoneWithArguments(ctx) { BaseVersion: '2.0.0', FileSizeInfo: { [ctx.fileName]: ctx.fileSize, - "metadata.xml": ctx.metadataSize + 'metadata.xml': ctx.metadataSize, }, ClientChecksumInfo: [ { @@ -346,8 +344,8 @@ async function uploadDoneWithArguments(ctx) { CalculationTime: 100, FileLastModified: ctx.fileModifiedTime, Filename: ctx.fileName, - fileSize: ctx.fileSize - } + fileSize: ctx.fileSize, + }, ], StatisticsArray: [], StreamingInfoList: [], @@ -358,7 +356,7 @@ async function uploadDoneWithArguments(ctx) { TransferTime: ctx.transferTime, NumberBytesTransferred: ctx.fileSize + ctx.metadataSize, Username: ctx.username, - Version: '2.0.0' + Version: '2.0.0', }); if (!res.Success) { @@ -381,5 +379,5 @@ module.exports = { createReservation, executeOperation, commitReservation, - uploadDoneWithArguments + uploadDoneWithArguments, }; diff --git a/lib/utility.js b/lib/utility.js index a94214c..7e236dc 100644 --- a/lib/utility.js +++ b/lib/utility.js @@ -5,7 +5,7 @@ const crypto = require('crypto'); const stream = require('stream'); const zlib = require('zlib'); const axios = require('axios'); -const yauzl = require("yauzl"); +const yauzl = require('yauzl'); const plist = require('simple-plist'); const prettyBytes = require('pretty-bytes'); const concat = require('concat-stream'); @@ -13,43 +13,43 @@ const { promisify } = require('util'); const INFO_PLIST_FILE_PATTERN = /^Payload\/[^/]*.app\/Info\.plist$/; -exports.generateIDString = function() { +exports.generateIDString = function () { // YYYYMMDDHHmmss-sss return new Date().toISOString().replace(/-|:|T|Z/g, '').replace('.', '-'); -} +}; -exports.makeSessionDigest = function(sessionId, requestChecksum, requestId, sharedSecret) { +exports.makeSessionDigest = function (sessionId, requestChecksum, requestId, sharedSecret) { return crypto.createHash('md5') .update(sessionId) .update(requestChecksum) .update(requestId) .update(sharedSecret) .digest('hex'); -} +}; -exports.openFile = function(path, flags = 'r') { +exports.openFile = function (path, flags = 'r') { return new Promise((resolve, reject) => { fs.open(path, flags, (err, fd) => { if (err) return reject(err); resolve(fd); }); }); -} +}; -exports.closeFile = function(fd) { +exports.closeFile = function (fd) { return new Promise((resolve, reject) => { fs.close(fd, (err) => { if (err) return reject(err); resolve(); }); }); -} +}; -exports.readFileDataFromZip = function(fd, fileNamePattern) { +exports.readFileDataFromZip = function (fd, fileNamePattern) { return new Promise((resolve, reject) => { yauzl.fromFd(fd, { autoClose: false, lazyEntries: true }, (err, zipFile) => { if (err) return reject(err); - zipFile.on("error", reject); + zipFile.on('error', reject); zipFile.on('entry', (entry) => { if (fileNamePattern.test(entry.fileName)) { zipFile.openReadStream(entry, (err, stream) => { @@ -67,16 +67,15 @@ exports.readFileDataFromZip = function(fd, fileNamePattern) { zipFile.readEntry(); }); }); -} - -exports.extractBundleIdAndVersion = async function(fd) { +}; +exports.extractBundleIdAndVersion = async function (fd) { let data; - + try { data = await exports.readFileDataFromZip(fd, INFO_PLIST_FILE_PATTERN); } - catch (err) { + catch { // Ignore this error, handled below. } @@ -88,34 +87,34 @@ exports.extractBundleIdAndVersion = async function(fd) { try { infoPlist = plist.parse(data, 'Info.plist'); } - catch (err) { + catch { throw new Error('Failed to parse Info.plist'); } if (infoPlist && infoPlist.CFBundleIdentifier && infoPlist.CFBundleVersion && infoPlist.CFBundleShortVersionString) { - return { + return { bundleId: infoPlist.CFBundleIdentifier, bundleVersion: infoPlist.CFBundleVersion, - bundleShortVersion: infoPlist.CFBundleShortVersionString + bundleShortVersion: infoPlist.CFBundleShortVersionString, }; } throw new Error('Bundle info not found in Info.plist'); -} +}; -exports.ensureTempDir = async function() { +exports.ensureTempDir = async function () { const tempDir = path.join(os.tmpdir(), 'ios-uploader'); await fs.promises.mkdir(tempDir, { recursive: true }); return tempDir; -} +}; -exports.downloadTempFile = async function(fileUrl, onProgress = () => {}) { +exports.downloadTempFile = async function (fileUrl, onProgress = () => { }) { const res = await axios.get(fileUrl, { responseType: 'stream', }); let newFilePath = path.join( - await exports.ensureTempDir(), - Math.random().toString(16).substr(2, 8) + '.ipa' + await exports.ensureTempDir(), + Math.random().toString(16).substr(2, 8) + '.ipa', ); const writer = fs.createWriteStream(newFilePath); @@ -125,47 +124,47 @@ exports.downloadTempFile = async function(fileUrl, onProgress = () => {}) { onProgress(0, contentLength); res.data.on('data', (chunk) => onProgress(downloaded += chunk.length, contentLength)); } - + res.data.pipe(writer); await promisify(stream.finished)(writer); return newFilePath; -} +}; -exports.removeTempFile = async function(filePath) { +exports.removeTempFile = async function (filePath) { await fs.promises.unlink(filePath); -} +}; -exports.getFileStats = function(fd) { +exports.getFileStats = function (fd) { return new Promise((resolve, reject) => { fs.fstat(fd, (err, stats) => { if (err) return reject(err); resolve(stats); }); }); -} +}; -exports.readFile = function(path, encoding = 'utf-8') { +exports.readFile = function (path, encoding = 'utf-8') { return new Promise((resolve, reject) => { fs.readFile(path, encoding, (err, f) => { if (err) return reject(err); resolve(f); }); }); -} +}; -exports.getFileMD5 = function(fd) { +exports.getFileMD5 = function (fd) { return new Promise((resolve, reject) => { const output = crypto.createHash('md5'); const input = fs.createReadStream('', { fd, start: 0, autoClose: false }); - input.on('error', err => reject(err)); + input.on('error', (err) => reject(err)); output.once('readable', () => { resolve(output.read().toString('hex')); }); input.pipe(output); }); -} +}; -exports.getFilePart = function(fd, offset, length) { +exports.getFilePart = function (fd, offset, length) { return new Promise((resolve, reject) => { let buffer = Buffer.allocUnsafe(length); fs.read(fd, buffer, 0, length, offset, (err) => { @@ -173,28 +172,28 @@ exports.getFilePart = function(fd, offset, length) { resolve(buffer); }); }); -} +}; -exports.getStringMD5 = function(text) { - return crypto.createHash('md5').update(text).digest("hex"); -} +exports.getStringMD5 = function (text) { + return crypto.createHash('md5').update(text).digest('hex'); +}; -exports.getStringMD5Buffer = function(text) { +exports.getStringMD5Buffer = function (text) { return crypto.createHash('md5').update(text).digest(); -} +}; -exports.bufferToGZBase64 = function(buf) { +exports.bufferToGZBase64 = function (buf) { return new Promise((resolve, reject) => { zlib.gzip(buf, (err, res) => { if (err) return reject(err); resolve(res.toString('base64')); - }) + }); }); -} +}; -exports.formatSpeedAndEta = function(bytes, total, duration) { +exports.formatSpeedAndEta = function (bytes, total, duration) { return { speed: prettyBytes(Math.round((bytes / duration) * 1000)) + '/s', - eta: Math.round(((total - bytes) / (bytes / duration)) / 1000) + 's' + eta: Math.round(((total - bytes) / (bytes / duration)) / 1000) + 's', }; -} +}; diff --git a/package-lock.json b/package-lock.json index 60b04a2..e625f32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,8 +22,10 @@ "ios-uploader": "bin/cli.js" }, "devDependencies": { + "@stylistic/eslint-plugin": "^1.7.2", "@yao-pkg/pkg": "^5.11.5", - "eslint": "^8.57.0", + "eslint": "^9.0.0", + "eslint-plugin-jsdoc": "^48.2.3", "mocha": "^10.4.0", "nock": "^13.5.4", "nyc": "^15.1.0", @@ -584,6 +586,20 @@ "node": ">=6.9.0" } }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz", + "integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==", + "dev": true, + "dependencies": { + "comment-parser": "1.4.1", + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -609,15 +625,15 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", + "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -625,28 +641,28 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.0.0.tgz", + "integrity": "sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.12.3.tgz", + "integrity": "sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -908,12 +924,298 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "node_modules/@stylistic/eslint-plugin": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-1.7.2.tgz", + "integrity": "sha512-TesaPR4AOCeD4unwu9gZCdTe8SsUpykriICuwXV8GFBgESuVbfVp+S8g6xTWe9ntVR803bNMtnr2UhxHW0iFqg==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "1.7.2", + "@stylistic/eslint-plugin-jsx": "1.7.2", + "@stylistic/eslint-plugin-plus": "1.7.2", + "@stylistic/eslint-plugin-ts": "1.7.2", + "@types/eslint": "^8.56.8" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-js": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-1.7.2.tgz", + "integrity": "sha512-ZYX7C5p7zlHbACwFLU+lISVh6tdcRP/++PWegh2Sy0UgMT5kU0XkPa2tKWEtJYzZmPhJxu9LxbnWcnE/tTwSDQ==", + "dev": true, + "dependencies": { + "@types/eslint": "^8.56.8", + "acorn": "^8.11.3", + "escape-string-regexp": "^4.0.0", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-js/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-jsx": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-jsx/-/eslint-plugin-jsx-1.7.2.tgz", + "integrity": "sha512-lNZR5PR0HLJPs+kY0y8fy6KroKlYqA5PwsYWpVYWzqZWiL5jgAeUo4s9yLFYjJjzildJ5MsTVMy/xP81Qz6GXg==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "^1.7.2", + "@types/eslint": "^8.56.8", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-jsx/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@stylistic/eslint-plugin-plus": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-plus/-/eslint-plugin-plus-1.7.2.tgz", + "integrity": "sha512-luUfRVbBVtt0+/FNt8/76BANJEzb/nHWasHD7UUjyMrch2U9xUKpObrkTCzqBuisKek+uFupwGjqXqDP07+fQw==", + "dev": true, + "dependencies": { + "@types/eslint": "^8.56.8", + "@typescript-eslint/utils": "^6.21.0" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@stylistic/eslint-plugin-plus/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@stylistic/eslint-plugin-ts": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-1.7.2.tgz", + "integrity": "sha512-szX89YPocwCe4T0eT3alj7MwEzDHt5+B+kb/vQfSSLIjI9CGgoWrgj50zU8PtaDctTh4ZieFBzU/lRmkSUo0RQ==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "1.7.2", + "@types/eslint": "^8.56.8", + "@typescript-eslint/utils": "^6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.9", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.9.tgz", + "integrity": "sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@xmldom/xmldom": { "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", @@ -1091,6 +1393,15 @@ "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1307,6 +1618,18 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -1489,6 +1812,15 @@ "node": ">=18" } }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -1650,18 +1982,6 @@ "node": ">=8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/electron-to-chromium": { "version": "1.4.738", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.738.tgz", @@ -1710,41 +2030,37 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.0.0.tgz", + "integrity": "sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/eslintrc": "^3.0.2", + "@eslint/js": "9.0.0", + "@humanwhocodes/config-array": "^0.12.3", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -1758,23 +2074,46 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-plugin-jsdoc": { + "version": "48.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.3.tgz", + "integrity": "sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==", + "dev": true, + "dependencies": { + "@es-joy/jsdoccomment": "~0.42.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.5.0", + "is-builtin-module": "^3.2.1", + "semver": "^7.6.0", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1792,18 +2131,42 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", "dev": true, "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.11.3", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1929,15 +2292,15 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -1995,17 +2358,16 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { @@ -2255,15 +2617,12 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2496,6 +2855,21 @@ "node": ">=8" } }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-core-module": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", @@ -2751,6 +3125,15 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -4183,6 +4566,28 @@ "node": ">=8" } }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -4408,6 +4813,18 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -4441,18 +4858,6 @@ "node": ">=4" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -4467,6 +4872,20 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", diff --git a/package.json b/package.json index 1fddb58..ad0c9eb 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "scripts": { "start": "node bin/cli.js", "build": "pkg --out-path build --compress Brotli .", - "lint": "eslint ./bin/*.js ./lib/*.js", + "lint": "eslint --max-warnings 0 ./bin/*.js ./lib/*.js", + "fix": "eslint --fix ./bin/*.js ./lib/*.js", "test": "nyc --reporter=text mocha", "coverage": "nyc --reporter=lcov mocha" }, @@ -36,8 +37,10 @@ "yauzl": "^3.1.2" }, "devDependencies": { + "@stylistic/eslint-plugin": "^1.7.2", "@yao-pkg/pkg": "^5.11.5", - "eslint": "^8.57.0", + "eslint": "^9.0.0", + "eslint-plugin-jsdoc": "^48.2.3", "mocha": "^10.4.0", "nock": "^13.5.4", "nyc": "^15.1.0",