diff --git a/eslint.config.mjs b/eslint.config.mjs index d4b5e597..be56a02f 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -3,6 +3,9 @@ import { fileURLToPath } from "node:url"; import js from "@eslint/js"; import { FlatCompat } from "@eslint/eslintrc"; +import tseslint from 'typescript-eslint'; + + const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const compat = new FlatCompat({ @@ -11,9 +14,25 @@ const compat = new FlatCompat({ allConfig: js.configs.all }); -export default [...compat.extends("scality"), { - languageOptions: { - ecmaVersion: 2020, - sourceType: "script", +export default tseslint.config( + ...compat.extends('scality'), + ...tseslint.configs.recommended, + { + ignores: [ + '**/.vscode', + '**/vendor/*.js', + '**/build', + '**/coverage', + '**/dist', + '**/node_modules', + '**/package', + '**/lib', + '**/scripts', + '**/eslint.config.mjs', + ], + rules: { + // CucumberJS steps start with an uppercase + 'new-cap': 'off', + }, }, -}]; +); diff --git a/lib/RequestLogger.js b/lib/RequestLogger.js index db8b17d5..c8ad2e54 100644 --- a/lib/RequestLogger.js +++ b/lib/RequestLogger.js @@ -1,2 +1,2 @@ -'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/lib/hdcontroller.js b/lib/hdcontroller.js index 680a9cf9..30a12183 100644 --- a/lib/hdcontroller.js +++ b/lib/hdcontroller.js @@ -1,15 +1,15 @@ 'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); +Object.defineProperty(exports, "__esModule", { value: true }); exports.HDProxydClient = exports.HDProxydError = void 0; -const assert = require('assert'); -const async = require('async'); -const http = require('http'); -const werelogs = require('werelog'); -const httpagent1 = require('httpagent'); -const shuffle1 = require('./shuffle'); +const assert = require("assert"); +const async = require("async"); +const http = require("http"); +const werelogs = require("werelogs"); +const httpagent_1 = require("httpagent"); +const shuffle_1 = require("./shuffle"); class HDProxydError extends Error { - constructor(...args) { - super(...args); + constructor() { + super(...arguments); this.isExpected = false; } } @@ -33,7 +33,7 @@ function _createRequest(req, log, callback) { return callback(error); } return callback(undefined, response); - }).on('error', err => { + }).on('error', (err) => { if (!callbackCalled) { callbackCalled = true; return callback(err); @@ -74,10 +74,10 @@ class HDProxydClient { const options = opts || {}; this.bootstrap = opts.bootstrap === undefined ? [['localhost', '18888']] : _parseBootstrapList(opts.bootstrap); - this.bootstrap = (0, shuffle1.shuffle)(this.bootstrap); + this.bootstrap = (0, shuffle_1.shuffle)(this.bootstrap); this.path = '/store/'; this.setCurrentBootstrap(this.bootstrap[0]); - this.httpAgent = new httpagent1.http.Agent({ + this.httpAgent = new httpagent_1.http.Agent({ freeSocketTimeout: 60 * 1000, timeout: 2 * 60 * 1000, }); @@ -351,7 +351,7 @@ class HDProxydClient { done(err); } }, {}, payload); - }, err => { + }, (err) => { if (err) { callback(err); } @@ -373,7 +373,7 @@ class HDProxydClient { hostname: currentBootstrap[0], port: currentBootstrap[1], method: 'GET', - path: '/metrics', + path: '/metrics', // XXX headers: { 'X-Scal-Request-Uids': logger.getSerializedUids(), }, diff --git a/lib/shuffle.js b/lib/shuffle.js index c0208098..d6d8b801 100644 --- a/lib/shuffle.js +++ b/lib/shuffle.js @@ -1,7 +1,7 @@ 'use strict'; -Object.defineProperty(exports, '__esModule', { value: true }); -exports.shuffle = void 0; -const cryptoLib = require('crypto'); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.shuffle = shuffle; +const cryptoLib = require("crypto"); const randomBytes = cryptoLib.randomBytes; /* * This set of function allows us to create an efficient shuffle @@ -57,14 +57,14 @@ function randomRange(min, max) { * @return {Array} - The sorted array */ function shuffle(array) { - const arrCopy = array.slice(); // Create a shallow copy of the array - if (arrCopy.length === 1) { - return arrCopy; + if (array.length === 1) { + return array; } - for (let i = arrCopy.length - 1; i > 0; i--) { + for (let i = array.length - 1; i > 0; i--) { const randIndex = randomRange(0, i); - [arrCopy[randIndex], arrCopy[i]] = [arrCopy[i], arrCopy[randIndex]]; + const randIndexVal = array[randIndex]; + [array[randIndex], array[i]] = [array[i], array[randIndex]]; // eslint-disable-line no-param-reassign + array[i] = randIndexVal; // eslint-disable-line no-param-reassign } - return arrCopy; + return array; } -exports.shuffle = shuffle; diff --git a/package.json b/package.json index c11f1d41..a9cac171 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "build": "tsc --strict ", "coverage": "nyc --check-coverage --exclude 'tests/*' --lines=90 --reporter=text --reporter=html --reporter=lcov npm test tests/", "jsdoc": "jsdoc src/ tests/ -d docs/jsdoc", - "lint": "eslint $(git ls-files '*.js')", + "lint": "eslint $(git ls-files '*.ts')", "test": "mocha --require ts-node/register --use_strict --check-leaks --recursive tests/**/*.ts", "get-version": "echo $npm_package_version" }, @@ -55,7 +55,8 @@ "nyc": "^17.1.0", "sinon": "^19.0.2", "ts-node": "^10.9.2", - "typescript": "^5.6.2" + "typescript": "^5.6.2", + "typescript-eslint": "^8.7.0" }, "license": "Apache-2.0", "bugs": { diff --git a/src/RequestLogger.ts b/src/RequestLogger.ts index 3af4767f..2d28ed25 100644 --- a/src/RequestLogger.ts +++ b/src/RequestLogger.ts @@ -1,11 +1,11 @@ // tslint:disable-next-line: interface-name export declare interface RequestLogger { - new(logger: any, logLevel: string, dumpThreshold: string, endLevel: string, uids?: string[] | string): any; + new(logger , logLevel: string, dumpThreshold: string, endLevel: string, uids?: string[] | string); getUids(): string[]; getSerializedUids(): string; - trace(msg: string, data?: any): void; - debug(msg: string, data?: any): void; - info(msg: string, data?: any): void; - warn(msg: string, data?: any): void; - error(msg: string, data?: any): void; + trace(msg: string, data?): void; + debug(msg: string, data?): void; + info(msg: string, data?): void; + warn(msg: string, data?): void; + error(msg: string, data?): void; } diff --git a/src/hdcontroller.ts b/src/hdcontroller.ts index 70e3d213..8967d1b2 100644 --- a/src/hdcontroller.ts +++ b/src/hdcontroller.ts @@ -1,14 +1,15 @@ -'use strict'; // eslint-disable-line strict +'use strict'; -import assert = require('assert'); -import async = require('async'); -import http = require('http'); -import werelogs = require('werelogs'); +import * as assert from 'assert'; +import * as async from 'async'; +import * as http from 'http'; +import * as werelogs from 'werelogs'; import { http as httpAgent } from 'httpagent'; import { Stream } from 'stream'; import { RequestLogger } from './RequestLogger'; -import { shuffle } from './shuffle'; +import { shuffle } from './shuffle'; + export class HDProxydError extends Error { public code: number | string | undefined; @@ -26,7 +27,7 @@ type HDProxydClientDeleteCallback = (error?: HDProxydError) => void; */ function _createRequest(req: http.RequestOptions, log: RequestLogger, callback: HDProxydCallback): http.ClientRequest { let callbackCalled = false; - const request = http.request(req, (response) => { + const request = http.request(req, response => { callbackCalled = true; // Get range returns a 206 // Concurrent deletes on hdproxyd/immutable keys returns 423 @@ -36,7 +37,7 @@ function _createRequest(req: http.RequestOptions, log: RequestLogger, callback: error.code = response.statusCode; error.isExpected = true; log.debug('got expected response code:', - { statusCode: response.statusCode }); + { statusCode: response.statusCode }); response.resume(); // Drain the response stream return callback(error); } @@ -49,6 +50,7 @@ function _createRequest(req: http.RequestOptions, log: RequestLogger, callback: if (err.code !== 'ERR_SOCKET_TIMEOUT') { log.error('got socket error after response', { err }); } + return null; }); // disable nagle algorithm @@ -65,20 +67,20 @@ function _createRequest(req: http.RequestOptions, log: RequestLogger, callback: * maintain. */ function _parseBootstrapList(list: string[]): string[][] { - return list.map((value) => value.split(':')); + return list.map(value => value.split(':')); } // tslint:disable-next-line: interface-name export interface HDProxydOptions { bootstrap: string[]; - logApi: any; + logApi; } export class HDProxydClient { private path: string; public bootstrap: string[][]; private httpAgent: http.Agent; - private logging: RequestLogger | any; + private logging: RequestLogger; private current: string[] = ['', '']; /** * This represent our interface with the hdproxyd server. @@ -121,11 +123,11 @@ export class HDProxydClient { * for the Logger object * @return {undefined} */ - private setupLogging(logApi: any): void { + private setupLogging(logApi): void { this.logging = new (logApi || werelogs).Logger('HDProxydClient'); } - private createLogger(reqUids?: any): RequestLogger { + private createLogger(reqUids?): RequestLogger { return reqUids ? this.logging.newRequestLoggerFromSerializedUids(reqUids) : this.logging.newRequestLogger(); @@ -167,7 +169,7 @@ export class HDProxydClient { * This creates a default request for hdproxyd */ private _createRequestHeader(method: string, headers: {[key: string]: string}|undefined, - key: string, params: any, log: any): object { + key: string, params, log): object { const reqHeaders = headers || {}; const currentBootstrap: string[] = this.getCurrentBootstrap(); @@ -177,9 +179,9 @@ export class HDProxydClient { reqHeaders['X-Scal-Request-Uids'] = reqUids; reqHeaders['X-Scal-Trace-Ids'] = reqUids; if (params && params.range) { - /* eslint-disable dot-notation */ + reqHeaders.Range = `bytes=${params.range[0]}-${params.range[1]}`; - /* eslint-enable dot-notation */ + } let realPath: string; if (key === '/job/delete') { @@ -198,8 +200,8 @@ export class HDProxydClient { } private _failover(method: string, stream: Stream|null, size: number, key: string, - tries: number, log: any, callback: HDProxydCallback, params?: any, - payload?: any): void { + tries: number, log, callback: HDProxydCallback, params?, + payload?): void { const args = params === undefined ? {} : params; let counter = tries; log.debug('sending request to hdproxyd', { method, key, args, counter }); @@ -220,12 +222,12 @@ export class HDProxydClient { } if (++counter >= this.bootstrap.length) { log.errorEnd('failover tried too many times, giving up', - { retries: counter }); + { retries: counter }); return callback(err); } return this._shiftCurrentBootstrapToEnd(log) ._failover(method, stream, size, key, counter, log, - callback, params); + callback, params); } receivedResponse = true; log.end().debug('request received response'); @@ -238,12 +240,12 @@ export class HDProxydClient { * creation and its sending. */ private _handleRequest(method: string, stream: Stream|null, - size: number, key: string, log: any, - callback: HDProxydCallback, params: any, - payload: any): void { + size: number, key: string, log, + callback: HDProxydCallback, params, + payload): void { const headers = params.headers ? params.headers : {}; const req = this._createRequestHeader(method, headers, key, params, - log); + log); const host = this.getCurrentBootstrap(); const isBatchDelete = key === '/job/delete'; if (stream) { @@ -271,7 +273,7 @@ export class HDProxydClient { contentLength: size, })); stream.pipe(request); - stream.on('error', (err) => { + stream.on('error', err => { log.error('error from readable stream', { error: err, method: '_handleRequest', @@ -309,7 +311,7 @@ export class HDProxydClient { * @param {HDProxydClient~putCallback} callback - callback * @returns {undefined} */ - public put(stream: Stream, size: number, params: any, reqUids: string, callback: HDProxydClientPutCallback): void { + public put(stream: Stream, size: number, params, reqUids: string, callback: HDProxydClientPutCallback): void { const log = this.createLogger(reqUids); this._failover('POST', stream, size, '', 0, log, (err?: HDProxydError, response?: http.IncomingMessage) => { if (response) { @@ -322,9 +324,8 @@ export class HDProxydClient { return callback(new HDProxydError('no key returned')); } const key = response.headers['scal-key'] as string; - response.on('end', () => { - return callback(undefined, key); - }); + response.on('end', () => callback(undefined, key)); + return null; }, params); } @@ -377,7 +378,7 @@ export class HDProxydClient { */ public batchDelete(list: {keys: string[]}, reqUids: string, callback: HDProxydClientDeleteCallback): void { assert.strictEqual(typeof list, 'object'); - assert(list.keys.every((k) => typeof k === 'string')); + assert(list.keys.every(k => typeof k === 'string')); // split the list into batches of 1000 each const batches = []; while (list.keys.length > 0) { @@ -413,18 +414,18 @@ export class HDProxydClient { * @param {SproxydClient-healthcheckCallback} callback - callback * @returns {void} */ - public healthcheck(log: RequestLogger, callback: HDProxydCallback): void { + public healthcheck(log: RequestLogger, callback: HDProxydCallback): void { const logger = log || this.createLogger(); const currentBootstrap = this.getCurrentBootstrap(); const req = { - hostname: currentBootstrap[0], - port: currentBootstrap[1], - method: 'GET', - path: '/metrics', // XXX - headers: { - 'X-Scal-Request-Uids': logger.getSerializedUids(), - }, - agent: this.httpAgent, + hostname: currentBootstrap[0], + port: currentBootstrap[1], + method: 'GET', + path: '/metrics', // XXX + headers: { + 'X-Scal-Request-Uids': logger.getSerializedUids(), + }, + agent: this.httpAgent, }; const request = _createRequest(req, logger, callback); request.end(); diff --git a/src/shuffle.ts b/src/shuffle.ts index 86ea8765..c186d0fc 100644 --- a/src/shuffle.ts +++ b/src/shuffle.ts @@ -1,8 +1,8 @@ -'use strict'; // eslint-disable-line strict +'use strict'; -import crypto = require('crypto'); +import * as cryptoLib from 'crypto'; -const randomBytes = crypto.randomBytes; +const randomBytes = cryptoLib.randomBytes; /* * This set of function allows us to create an efficient shuffle @@ -24,7 +24,7 @@ function nextBytes(numBytes: number): Buffer { try { return randomBytes(numBytes); } catch (ex) { - throw new Error('Insufficient entropy'); + throw new Error(`Insufficient entropy: ${ex.message}`); } } @@ -59,7 +59,7 @@ function randomRange(min: number, max: number): number { * @param {Array} array - Any type of array * @return {Array} - The sorted array */ -export function shuffle(array: any[]): any[] { +export function shuffle(array) { if (array.length === 1) { return array; } diff --git a/tests/unit/hd.ts b/tests/unit/hd.ts index 65b258c4..96daec5c 100644 --- a/tests/unit/hd.ts +++ b/tests/unit/hd.ts @@ -1,14 +1,13 @@ -'use strict'; // eslint-disable-line strict +'use strict'; import * as assert from 'assert'; -import * as sinon from "sinon"; +import * as sinon from 'sinon'; import * as nock from 'nock'; import * as stream from 'stream'; -import http = require('http'); +import * as http from 'http'; import { HDProxydClient, HDProxydError, HDProxydOptions } from '../../src/hdcontroller'; import { shuffle } from '../../src/shuffle'; import {setTimeout} from 'timers/promises'; -import { URL } from 'url'; describe('HD Controller client', () => { describe('test init', () => { @@ -18,14 +17,14 @@ describe('HD Controller client', () => { } as HDProxydOptions); assert.ok(h, 'cannot create object'); assert.ok(h.getCurrentBootstrap()[0] === '1.2.3.4', - 'cannot retrieve bootstrap'); + 'cannot retrieve bootstrap'); }); }); describe('test shuffle', () => { it('should be randomized', () => { shuffle(['a']); shuffle(['a', 'b', 'c']); - shuffle(Array.from({length: 100000}).map((x) => 'X')); + shuffle(Array.from({length: 100000}).fill('X')); }); }); describe('basic request test', () => { @@ -33,10 +32,10 @@ describe('HD Controller client', () => { bootstrap: ['1.2.3.4:12345'], } as HDProxydOptions); - it('should be postable', (done) => { + it('should be postable', done => { nock('http://1.2.3.4:12345') - .post('/store/') - .reply(200, 'body', {'Scal-Key': 'testing'}); + .post('/store/') + .reply(200, 'body', {'Scal-Key': 'testing'}); const upStream = new stream.Readable(); upStream.push('upload'); upStream.push(null); @@ -45,249 +44,246 @@ describe('HD Controller client', () => { owner: 'test', // tslint:disable-next-line: object-literal-sort-keys namespace: 'nspace'}, 'nope', - (err: Error, key: string) => { - if (err) { - done(err); - return; - } - if (key !== 'testing') { - done(Error('wrong key returned')); - return; - } + (err: HDProxydError | undefined, key: string | undefined) => { + if (err) { done(err); - }); + return; + } + if (key !== 'testing') { + done(Error('wrong key returned')); + return; + } + done(err); }); - it('should be readable', (done) => { - nock('http://1.2.3.4:12345') + }); + it('should be readable', done => { + nock('http://1.2.3.4:12345') .get('/store/testing') .reply(200, 'bodyReturned'); - h.get('testing', null, '', (err: Error, st: stream.Stream) => { - let data = ''; - st.on('data', (chunk) => {data += chunk; }); - st.on('end', () => { - assert(data === 'bodyReturned', 'wrong data: ' + data); - done(err); - }); + h.get('testing', [], '', (err: HDProxydError | undefined, st: stream.Stream | undefined) => { + let data = ''; + st?.on('data', chunk => {data += chunk; }); + st?.on('end', () => { + assert(data === 'bodyReturned', `wrong data: ${ data}`); + done(err); }); }); - it('should be deletable', (done) => { - nock('http://1.2.3.4:12345') + }); + it('should be deletable', done => { + nock('http://1.2.3.4:12345') .delete('/store/testing') .reply(200, 'body'); - h.delete('testing', '', (err) => { - done(err); - }); + h.delete('testing', '', err => { + done(err); }); - it('should respond ok on healthcheck', (done) => { - nock('http://1.2.3.4:12345') + }); + it('should respond ok on healthcheck', done => { + nock('http://1.2.3.4:12345') .get('/metrics') .reply(200, 'body'); - h.healthcheck(undefined, done); - }); - it('should be batch deletable', (done) => { - nock('http://1.2.3.4:12345') + h.healthcheck(undefined, done); + }); + it('should be batch deletable', done => { + nock('http://1.2.3.4:12345') .post('/job/delete', ['testing']) // Will verify that the body is ok .reply(200, 'body'); - h.batchDelete({keys: ['testing']}, '', (err: HDProxydError) => { - if (err) { - done(Error('unexpected error ' + err)); - return; - } - done(); - }); + h.batchDelete({keys: ['testing']}, '', err => { + if (err) { + done(Error(`unexpected error ${ err}`)); + return; + } + done(); }); }); + }); describe('error', () => { - it('should react properly on an error', (done) => { - nock('http://1.2.3.4:12345') + it('should react properly on an error', done => { + nock('http://1.2.3.4:12345') .get('/store/testing') .replyWithError(Error('test')); - const h = new HDProxydClient({ - bootstrap: ['1.2.3.4:12345'], - } as HDProxydOptions); - h.get('testing', [], '', (err) => { - if (!err) { - done(Error('no error received')); - } - done(); - }); + const h = new HDProxydClient({ + bootstrap: ['1.2.3.4:12345'], + } as HDProxydOptions); + h.get('testing', [], '', err => { + if (!err) { + done(Error('no error received')); + } + done(); }); + }); - it('should drain the response pipe in case of error', (done) => { - nock('http://1.2.3.4:12345') + it('should drain the response pipe in case of error', done => { + nock('http://1.2.3.4:12345') .post('/store/') - .reply(500, function () { + .reply(500, () => { const upStream = new stream.Readable(); upStream.push('upload'); upStream.push(null); //upStream.on("close", () => {received = true;}); return upStream; - }); - const upStream = new stream.Readable(); - upStream.push('upload'); - upStream.push(null); + }); + const upStream = new stream.Readable(); + upStream.push('upload'); + upStream.push(null); - const h = new HDProxydClient({ - bootstrap: ['1.2.3.4:12345'], - } as HDProxydOptions); + const h = new HDProxydClient({ + bootstrap: ['1.2.3.4:12345'], + } as HDProxydOptions); - // Let's replace http.request by a new capturing CB - let received: boolean = false; - const prev = http.request; - sinon.replace(http, "request", (v, cb) => { - return prev(v, (response) => { - response.on("end", () => {received = true;}); - return cb(response) - })}); + // Let's replace http.request by a new capturing CB + let received: boolean = false; + const prev = http.request; + sinon.replace(http, 'request', (v, cb) => prev(v, response => { + response.on('end', () => {received = true;}); + return cb(response); + })); - h.put(upStream, 6, { - bucketName: 'test', - owner: 'test', - // tslint:disable-next-line: object-literal-sort-keys - namespace: 'nspace'}, 'nope', - async (err: HDProxydError|undefined , key: string|undefined) => { - // Remove fake http.request - sinon.restore(); - if (!err) { - done(Error('error expected, got success')); - return; - } + h.put(upStream, 6, { + bucketName: 'test', + owner: 'test', + // tslint:disable-next-line: object-literal-sort-keys + namespace: 'nspace'}, 'nope', + async (err: HDProxydError|undefined) => { + // Remove fake http.request + sinon.restore(); + if (!err) { + done(Error('error expected, got success')); + return; + } - // Let's give it a few scheduler runs - // to make events are consumed - await setTimeout(100); - if (!received) { - done(Error("stream was not consumed")); - return; - } - done(); - }); - }); + // Let's give it a few scheduler runs + // to make events are consumed + await setTimeout(100); + if (!received) { + done(Error('stream was not consumed')); + return; + } + done(); + }); }); + }); describe('failover test', () => { - it('should raise an error if key is not returned', (done) => { - let received = false; - nock('http://1.2.3.4:12345') + it('should raise an error if key is not returned', done => { + let received = false; + nock('http://1.2.3.4:12345') .post('/store/') .reply(500, () => { received = true; }); - nock('http://1.2.3.5:12345') + nock('http://1.2.3.5:12345') .post('/store/') .reply(200, 'body', {'Scal-Key': 'testing'}); - const h = new HDProxydClient({ - bootstrap: ['1.2.3.4:12345', '1.2.3.5:12345'], - } as HDProxydOptions); - h.bootstrap = [['1.2.3.4', '12345'], ['1.2.3.5', '12345']]; - h.setCurrentBootstrap(h.bootstrap[0]); - const upStream = new stream.Readable(); - upStream.push('upload'); - upStream.push(null); - h.put(upStream, 6, {bucketName: + const h = new HDProxydClient({ + bootstrap: ['1.2.3.4:12345', '1.2.3.5:12345'], + } as HDProxydOptions); + h.bootstrap = [['1.2.3.4', '12345'], ['1.2.3.5', '12345']]; + h.setCurrentBootstrap(h.bootstrap[0]); + const upStream = new stream.Readable(); + upStream.push('upload'); + upStream.push(null); + h.put(upStream, 6, {bucketName: 'test', owner: // tslint:disable-next-line: object-literal-sort-keys 'test', namespace: 'nspace'}, 'nope', - (err: HDProxydError, key: string) => { - if (key !== 'testing') { - done(Error('wrong key or no key received')); - return; - } - if (received === false) { - done(Error('first server did not receive anything')); - return; - } - done(err); - }); - }); + (err , key) => { + if (key !== 'testing') { + done(Error('wrong key or no key received')); + return; + } + if (received === false) { + done(Error('first server did not receive anything')); + return; + } + done(err); }); + }); + }); describe('wrong key returned', () => { - it('should raise an error if key is not returned', (done) => { - nock('http://1.2.3.4:12345') + it('should raise an error if key is not returned', done => { + nock('http://1.2.3.4:12345') .post('/store/') .reply(200, 'body', {'Scal-NotKey': 'testing'}); - const h = new HDProxydClient({ - bootstrap: ['1.2.3.4:12345'], - } as HDProxydOptions); - const upStream = new stream.Readable(); - upStream.push('upload'); - upStream.push(null); - h.put(upStream, 6, { - bucketName: 'test', - owner: 'test', - // tslint:disable-next-line: object-literal-sort-keys - namespace: 'nspace'}, 'nope', - (err: HDProxydError, key: string) => { - if (!err) { - done(err); - return; - } - done(); - }); - }); + const h = new HDProxydClient({ + bootstrap: ['1.2.3.4:12345'], + } as HDProxydOptions); + const upStream = new stream.Readable(); + upStream.push('upload'); + upStream.push(null); + h.put(upStream, 6, { + bucketName: 'test', + owner: 'test', + // tslint:disable-next-line: object-literal-sort-keys + namespace: 'nspace'}, 'nope', err => { + if (!err) { + done(err); + return; + } + done(); }); + }); + }); describe('404 test', () => { - it('should NOT be POSTed', (done) => { - nock('http://1.2.3.4:12345') + it('should NOT be POSTed', done => { + nock('http://1.2.3.4:12345') .post('/store/') .reply(404, 'body', {'Scal-Key': 'testing'}); - const h = new HDProxydClient({ - bootstrap: ['1.2.3.4:12345'], - } as HDProxydOptions); - const upStream = new stream.Readable(); - upStream.push('upload'); - upStream.push(null); - h.put(upStream, 6, { - bucketName: 'test', - owner: 'test', - // tslint:disable-next-line: object-literal-sort-keys - namespace: 'nspace'}, 'nope', - (err: HDProxydError, key: string) => { - if (!err) { - done(Error('expected error')); - return; - } - if (err.code !== 404) { - done(Error('wrong code returned')); - return; - } - done(); - }); - }); - it('should NOT be readable', (done) => { - nock('http://1.2.3.4:12345') - .get('/store/testing') - .reply(404, 'bodyReturned'); - const h = new HDProxydClient({ - bootstrap: ['1.2.3.4:12345'], - } as HDProxydOptions); - h.get('testing', null, '', (err: HDProxydError, st: stream.Stream) => { - if (!err) { - done(Error('expected error')); - return; - } - if (err.code !== 404) { - done(Error('wrong code returned ' + err)); - return; - } - done(); - }); - }); - it('should NOT be deletable', (done) => { - nock('http://1.2.3.4:12345') - .delete('/store/testing') - .reply(404, 'body'); - const h = new HDProxydClient({ - bootstrap: ['1.2.3.4:12345'], - } as HDProxydOptions); - h.delete('testing', '', (err: HDProxydError) => { - if (!err) { - done(Error('expected error')); - return; - } - if (err.code !== 404) { - done(Error('wrong code returned')); - return; - } - done(); - }); - }); + const h = new HDProxydClient({ + bootstrap: ['1.2.3.4:12345'], + } as HDProxydOptions); + const upStream = new stream.Readable(); + upStream.push('upload'); + upStream.push(null); + h.put(upStream, 6, { + bucketName: 'test', + owner: 'test', + // tslint:disable-next-line: object-literal-sort-keys + namespace: 'nspace'}, 'nope', err => { + if (!err) { + done(Error('expected error')); + return; + } + if (err.code !== 404) { + done(Error('wrong code returned')); + return; + } + done(); + }); + }); + it('should NOT be readable', done => { + nock('http://1.2.3.4:12345') + .get('/store/testing') + .reply(404, 'bodyReturned'); + const h = new HDProxydClient({ + bootstrap: ['1.2.3.4:12345'], + } as HDProxydOptions); + h.get('testing', [], '', err => { + if (!err) { + done(Error('expected error')); + return; + } + if (err.code !== 404) { + done(Error(`wrong code returned ${ err }`)); + return; + } + done(); }); + }); + it('should NOT be deletable', done => { + nock('http://1.2.3.4:12345') + .delete('/store/testing') + .reply(404, 'body'); + const h = new HDProxydClient({ + bootstrap: ['1.2.3.4:12345'], + } as HDProxydOptions); + h.delete('testing', '', err => { + if (!err) { + done(Error('expected error')); + return; + } + if (err.code !== 404) { + done(Error('wrong code returned')); + return; + } + done(); + }); + }); }); +}); diff --git a/yarn.lock b/yarn.lock index 6d7741df..44dea575 100644 --- a/yarn.lock +++ b/yarn.lock @@ -346,14 +346,14 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.11.0": +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0": version "4.11.1" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== @@ -493,12 +493,12 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -672,6 +672,87 @@ resolved "https://registry.yarnpkg.com/@types/webgl-ext/-/webgl-ext-0.0.30.tgz#0ce498c16a41a23d15289e0b844d945b25f0fb9d" integrity sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg== +"@typescript-eslint/eslint-plugin@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz#d0070f206daad26253bf00ca5b80f9b54f9e2dd0" + integrity sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.7.0" + "@typescript-eslint/type-utils" "8.7.0" + "@typescript-eslint/utils" "8.7.0" + "@typescript-eslint/visitor-keys" "8.7.0" + graphemer "^1.4.0" + ignore "^5.3.1" + natural-compare "^1.4.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/parser@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.7.0.tgz#a567b0890d13db72c7348e1d88442ea8ab4e9173" + integrity sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ== + dependencies: + "@typescript-eslint/scope-manager" "8.7.0" + "@typescript-eslint/types" "8.7.0" + "@typescript-eslint/typescript-estree" "8.7.0" + "@typescript-eslint/visitor-keys" "8.7.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz#90ee7bf9bc982b9260b93347c01a8bc2b595e0b8" + integrity sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg== + dependencies: + "@typescript-eslint/types" "8.7.0" + "@typescript-eslint/visitor-keys" "8.7.0" + +"@typescript-eslint/type-utils@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz#d56b104183bdcffcc434a23d1ce26cde5e42df93" + integrity sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ== + dependencies: + "@typescript-eslint/typescript-estree" "8.7.0" + "@typescript-eslint/utils" "8.7.0" + debug "^4.3.4" + ts-api-utils "^1.3.0" + +"@typescript-eslint/types@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.7.0.tgz#21d987201c07b69ce7ddc03451d7196e5445ad19" + integrity sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w== + +"@typescript-eslint/typescript-estree@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz#6c7db6baa4380b937fa81466c546d052f362d0e8" + integrity sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg== + dependencies: + "@typescript-eslint/types" "8.7.0" + "@typescript-eslint/visitor-keys" "8.7.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^1.3.0" + +"@typescript-eslint/utils@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.7.0.tgz#cef3f70708b5b5fd7ed8672fc14714472bd8a011" + integrity sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.7.0" + "@typescript-eslint/types" "8.7.0" + "@typescript-eslint/typescript-estree" "8.7.0" + +"@typescript-eslint/visitor-keys@8.7.0": + version "8.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz#5e46f1777f9d69360a883c1a56ac3c511c9659a8" + integrity sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ== + dependencies: + "@typescript-eslint/types" "8.7.0" + eslint-visitor-keys "^3.4.3" + "@webgpu/types@0.1.16": version "0.1.16" resolved "https://registry.yarnpkg.com/@webgpu/types/-/types-0.1.16.tgz#1f05497b95b7c013facf7035c8e21784645f5cc4" @@ -1065,7 +1146,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@~3.0.2: +braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== @@ -2003,7 +2084,7 @@ debounce@^1.2.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.5: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== @@ -2389,7 +2470,7 @@ eslint-scope@^8.0.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0: +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== @@ -2589,6 +2670,17 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -2864,6 +2956,13 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" @@ -2871,13 +2970,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - glob@^7.1.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -2947,6 +3039,11 @@ graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -3192,7 +3289,7 @@ ieee754@^1.1.13, ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.2.0: +ignore@^5.2.0, ignore@^5.3.1: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== @@ -4014,6 +4111,19 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -4090,6 +4200,13 @@ minimatch@^5.0.1, minimatch@^5.1.6: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -4755,7 +4872,7 @@ picocolors@^1.0.0, picocolors@^1.1.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== -picomatch@^2.0.4, picomatch@^2.2.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -5265,7 +5382,7 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: +semver@^7.0.0, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -5836,6 +5953,11 @@ transform-ast@^2.4.0: merge-source-map "1.0.4" nanobench "^2.1.1" +ts-api-utils@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + ts-node@^10.9.2: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" @@ -5956,6 +6078,15 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typescript-eslint@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.7.0.tgz#6c84f94013a0cc0074da7d639c2644eae20c3171" + integrity sha512-nEHbEYJyHwsuf7c3V3RS7Saq+1+la3i0ieR3qP0yjqWSzVmh8Drp47uOl9LjbPANac4S7EFSqvcYIKXUUwIfIQ== + dependencies: + "@typescript-eslint/eslint-plugin" "8.7.0" + "@typescript-eslint/parser" "8.7.0" + "@typescript-eslint/utils" "8.7.0" + typescript@^5.6.2: version "5.6.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0"