From 6d8526a469fa58d10bf3791b0e277d26ff603032 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Mon, 11 May 2026 18:11:02 +0530 Subject: [PATCH 01/34] SK-2812: Public interface cleanup --- CHANGELOG.md | 52 +++ src/error/index.ts | 8 +- src/service-account/client/index.ts | 4 +- src/service-account/index.ts | 59 +-- src/utils/index.ts | 32 +- src/utils/validations/index.ts | 25 +- src/vault/client/index.ts | 6 +- src/vault/controller/detect/index.ts | 1 + src/vault/controller/vault/index.ts | 14 +- .../deidentify-file/bleep-audio/index.ts | 16 +- src/vault/model/options/detokenize/index.ts | 10 +- src/vault/model/options/fileUpload/index.ts | 9 +- src/vault/model/options/get/index.ts | 10 +- src/vault/model/request/file-upload/index.ts | 13 +- .../model/response/deidentify-file/index.ts | 10 +- .../model/response/deidentify-text/index.ts | 5 + src/vault/model/response/delete/index.ts | 2 +- src/vault/model/response/insert/index.ts | 4 +- test/error/skyflow-error.test.js | 48 +++ test/service-account/token.test.js | 119 +++++- test/utils/validations.test.js | 65 ++- test/vault/controller/vault.test.js | 93 ++++- test/vault/utils/utils.test.js | 372 +++++++++++++++++- 23 files changed, 842 insertions(+), 135 deletions(-) create mode 100644 test/error/skyflow-error.test.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d40eb52..bf38d7d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,3 +3,55 @@ All notable changes to this project will be documented as part of the release notes. See [Github](https://github.com/skyflowapi/skyflow-node/releases) or [npm](https://www.npmjs.com/package/skyflow-node?activeTab=versions) for more details on each released version. + +## [Unreleased] — Public Interface Cleanup (v2) + +### Breaking Changes + +#### Credential field renames +The credentials JSON object now uses camelCase keys. The old ALL_CAPS variants are accepted for backward compatibility but will be removed in a future release. + +| Old key | New key | +|---|---| +| `clientID` | `clientId` | +| `keyID` | `keyId` | +| `tokenURI` | `tokenUri` | + +**Migration:** +```diff +- { clientID: '...', keyID: '...', tokenURI: '...' } ++ { clientId: '...', keyId: '...', tokenUri: '...' } +``` + +#### `BearerTokenOptions.roleIDs` → `roleIds` +```diff +- generateBearerToken(path, { roleIDs: ['role1'] }) ++ generateBearerToken(path, { roleIds: ['role1'] }) +``` + +#### `SkyflowError.error.request_ID` → `requestId` +```diff +- error.error.request_ID ++ error.error.requestId +``` + +#### `FileUploadRequest` — `skyflowId` removed from constructor +`skyflowId` is no longer a positional argument. Set it via `FileUploadOptions.setSkyflowId()` instead. +```diff +- new FileUploadRequest(table, skyflowId, columnName) ++ const req = new FileUploadRequest(table, columnName) ++ const opts = new FileUploadOptions() ++ opts.setSkyflowId(skyflowId) +``` + +#### `DetokenizeOptions` / `GetOptions` — `downloadURL` → `downloadUrl` +```diff +- options.setDownloadURL(true) ++ options.setDownloadUrl(true) +``` + +### Behavior Changes + +- **`insertedFields` always array**: `InsertResponse.insertedFields` is now `Array` (never `null`). An empty array is returned when there are no successful records. +- **Fail-fast validation**: `insert()` now throws `SkyflowError` (EMPTY_FIELD) before any network call when a record field value is `null`, `undefined`, or `""`. Values `0`, `false`, and `0.0` remain valid. +- **`errors` always present**: All response objects (`Insert`, `Update`, `Get`, `Delete`, `Query`, `Tokenize`, `DeidentifyText`, `DeidentifyFile`) always include an `errors` field — `null` when there are no errors, never absent. diff --git a/src/error/index.ts b/src/error/index.ts index 81e633f8..b53d2fd2 100644 --- a/src/error/index.ts +++ b/src/error/index.ts @@ -6,10 +6,10 @@ class SkyflowError extends Error { constructor(errorCode: ISkyflowError, args: Array = []) { const formattedError = { - http_status: errorCode?.http_status || BAD_REQUEST, - details: errorCode?.details || [], - request_ID: errorCode?.request_ID || null, - grpc_code: errorCode?.grpc_code || null, + http_status: errorCode.http_status || BAD_REQUEST, + details: errorCode.details || [], + requestId: errorCode.requestId || null, + grpc_code: errorCode.grpc_code || null, http_code: errorCode.http_code, message: args?.length > 0 ? parameterizedString(errorCode.message, ...args) diff --git a/src/service-account/client/index.ts b/src/service-account/client/index.ts index 77289fda..834fca56 100644 --- a/src/service-account/client/index.ts +++ b/src/service-account/client/index.ts @@ -5,9 +5,9 @@ class Client { authApi: Authentication; - constructor(tokenURI: string) { + constructor(tokenUri: string) { this.authApi = new Authentication({ - baseUrl: tokenURI, + baseUrl: tokenUri, token:'' }); } diff --git a/src/service-account/index.ts b/src/service-account/index.ts index a42f7d45..57a6225a 100644 --- a/src/service-account/index.ts +++ b/src/service-account/index.ts @@ -11,7 +11,7 @@ import { WithRawResponse } from '../ _generated_/rest/core'; export type BearerTokenOptions = { ctx?: string | Record, - roleIDs?: string[], + roleIds?: string[], logLevel?: LogLevel, tokenUri?: string, } @@ -83,18 +83,18 @@ function getToken(credentials, options?: BearerTokenOptions): Promise { const claims = { iss: JWT.ISSUER_SDK, - key: credentialsObj.keyID, - aud: credentialsObj.tokenURI, + key: credentialsObj.keyId, + aud: credentialsObj.tokenUri, exp: expiryTime, - sub: credentialsObj.clientID, + sub: credentialsObj.clientId, tok: token, ...(options && options.ctx ? { ctx: options.ctx } : {}), }; @@ -310,23 +310,23 @@ function generateSignedDataTokensFromCreds(credentials, options: SignedDataToken function failureResponse(err: ServiceAccountResponseError, options?: BearerTokenOptions) { return new Promise((_, reject) => { if (err.rawResponse) { - const requestId = err?.rawResponse?.headers?.get(HTTP_HEADER.X_REQUEST_ID); - const contentType = err?.rawResponse?.headers?.get(HTTP_HEADER.CONTENT_TYPE_LOWER); + const requestId = err.rawResponse.headers?.get(HTTP_HEADER.X_REQUEST_ID); + const contentType = err.rawResponse.headers?.get(HTTP_HEADER.CONTENT_TYPE_LOWER); if (contentType && contentType.includes(CONTENT_TYPE.APPLICATION_JSON)) { - let description = err?.body?.error?.message ?? err?.body; + let description = err.body?.error?.message ?? err.body; printLog(description, MessageType.ERROR, options?.logLevel); reject(new SkyflowError({ - http_code: err?.body?.error?.http_code, + http_code: err.body?.error?.http_code, message: description, - request_ID: requestId, + requestId: requestId, })); } else if (contentType && contentType.includes(CONTENT_TYPE.TEXT_PLAIN)) { - let description = err?.body; + let description = err.body; printLog(description, MessageType.ERROR, options?.logLevel); reject(new SkyflowError({ - http_code: err?.body?.error?.http_code, + http_code: err.body?.error?.http_code, message: description, - request_ID: requestId + requestId: requestId })); } else { let description = logs.errorLogs.ERROR_OCCURED; @@ -334,7 +334,7 @@ function failureResponse(err: ServiceAccountResponseError, options?: BearerToken reject(new SkyflowError({ http_code: err.response?.status, message: description, - request_ID: requestId + requestId: requestId })); } } else { @@ -372,13 +372,22 @@ function signedDataTokenSuccessResponse(res: SignedDataTokensResponse[], logLeve }) } -export function getRolesForScopedToken(roleIDs: string[]) { +export function getRolesForScopedToken(roleIds: string[]) { let str = '' - roleIDs?.forEach((role) => { + roleIds?.forEach((role) => { str = str + JWT.ROLE_PREFIX + role + " " }) return str; } +function normalizeCredentials(obj: any): any { + return { + ...obj, + clientId: obj.clientId ?? obj.clientID, + keyId: obj.keyId ?? obj.keyID, + tokenUri: obj.tokenUri ?? obj.tokenURI, + }; +} + export { generateBearerToken, generateBearerTokenFromCreds, generateSignedDataTokens, generateSignedDataTokensFromCreds, getToken, successResponse, failureResponse }; \ No newline at end of file diff --git a/src/utils/index.ts b/src/utils/index.ts index cf63f537..22c4a2fa 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -309,7 +309,7 @@ export interface ISkyflowError { grpc_code?: string | number | null, http_code: string | number | null | undefined, message: string, - request_ID?: string | null, + requestId?: string | null, details?: Array | null, } @@ -326,33 +326,33 @@ export interface AuthInfo { type: AuthType } -export function getVaultURL(clusterID: string, env: Env) { +export function getVaultURL(clusterId: string, env: Env) { switch (env) { case Env.PROD: - return `https://${clusterID}.vault.skyflowapis.com`; + return `https://${clusterId}.vault.skyflowapis.com`; case Env.SANDBOX: - return `https://${clusterID}.vault.skyflowapis-preview.com`; + return `https://${clusterId}.vault.skyflowapis-preview.com`; case Env.DEV: - return `https://${clusterID}.vault.skyflowapis.dev`; + return `https://${clusterId}.vault.skyflowapis.dev`; case Env.STAGE: - return `https://${clusterID}.vault.skyflowapis.tech`; + return `https://${clusterId}.vault.skyflowapis.tech`; default: - return `https://${clusterID}.vault.skyflowapis.com`; + return `https://${clusterId}.vault.skyflowapis.com`; } } -export function getConnectionBaseURL(clusterID: string, env: Env) { +export function getConnectionBaseURL(clusterId: string, env: Env) { switch (env) { case Env.PROD: - return `https://${clusterID}.gateway.skyflowapis.com`; + return `https://${clusterId}.gateway.skyflowapis.com`; case Env.SANDBOX: - return `https://${clusterID}.gateway.skyflowapis-preview.com`; + return `https://${clusterId}.gateway.skyflowapis-preview.com`; case Env.DEV: - return `https://${clusterID}.gateway.skyflowapis.dev`; + return `https://${clusterId}.gateway.skyflowapis.dev`; case Env.STAGE: - return `https://${clusterID}.gateway.skyflowapis.tech`; + return `https://${clusterId}.gateway.skyflowapis.tech`; default: - return `https://${clusterID}.gateway.skyflowapis.com`; + return `https://${clusterId}.gateway.skyflowapis.com`; } } @@ -376,7 +376,7 @@ export async function getToken(credentials: Credentials, logLevel?: LogLevel): P printLog(logs.infoLogs.USING_CREDENTIALS_STRING, MessageType.LOG, logLevel); const options: any = { - roleIDs: stringCred.roles, + roleIds: stringCred.roles, ctx: stringCred.context, logLevel, }; @@ -393,7 +393,7 @@ export async function getToken(credentials: Credentials, logLevel?: LogLevel): P printLog(logs.infoLogs.USING_PATH, MessageType.LOG, logLevel); const options: any = { - roleIDs: pathCred.roles, + roleIds: pathCred.roles, ctx: pathCred.context, logLevel, }; @@ -505,7 +505,7 @@ export const printLog = (message: string, messageType: MessageType, logLevel: Lo const { showDebugLogs, showInfoLogs, showWarnLogs, showErrorLogs, } = LogLevelOptions[logLevel]; - const version = sdkDetails?.version ? `v${sdkDetails?.version}` : ''; + const version = sdkDetails.version ? `v${sdkDetails.version}` : ''; if (messageType === MessageType.LOG && showDebugLogs) { // eslint-disable-next-line no-console console.log(`DEBUG: [Skyflow Node SDK ${version}] ` + message); diff --git a/src/utils/validations/index.ts b/src/utils/validations/index.ts index 402f3b04..c730e4b0 100644 --- a/src/utils/validations/index.ts +++ b/src/utils/validations/index.ts @@ -77,8 +77,14 @@ function isValidCredentialsString(credentialsString: string) { if (credentialsString && typeof credentialsString === 'string') { try { let credentialsObj = JSON.parse("{}") - credentialsObj = JSON.parse(credentialsString); - if (credentialsObj?.clientID === null || credentialsObj?.keyID === null || credentialsObj?.clientID === null) { + const parsed = JSON.parse(credentialsString); + credentialsObj = { + ...parsed, + clientId: parsed.clientId ?? parsed.clientID, + keyId: parsed.keyId ?? parsed.keyID, + tokenUri: parsed.tokenUri ?? parsed.tokenURI, + }; + if (credentialsObj?.clientId === null || credentialsObj?.keyId === null || credentialsObj?.tokenUri === null) { return false; } return true; @@ -668,8 +674,8 @@ export const validateGetOptions = (getOptions?: GetOptions) => { throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_LIMIT, [typeof getOptions?.getLimit()]); } - if (getOptions?.getDownloadURL && getOptions?.getDownloadURL() && typeof getOptions.getDownloadURL() !== 'boolean') { - throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_DOWNLOAD_URL, [typeof getOptions?.getDownloadURL()]); + if (getOptions?.getDownloadUrl && getOptions?.getDownloadUrl() && typeof getOptions.getDownloadUrl() !== 'boolean') { + throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_DOWNLOAD_URL, [typeof getOptions?.getDownloadUrl()]); } if (getOptions?.getColumnName && getOptions?.getColumnName() && typeof getOptions.getColumnName() !== 'string') { @@ -810,8 +816,8 @@ export const validateDetokenizeOptions = (detokenizeOptions?: DetokenizeOptions) throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_CONTINUE_ON_ERROR, [typeof detokenizeOptions?.getContinueOnError()]); } - if (detokenizeOptions?.getDownloadURL && detokenizeOptions?.getDownloadURL() && typeof detokenizeOptions.getDownloadURL() !== 'boolean') { - throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_DOWNLOAD_URL, [typeof detokenizeOptions?.getDownloadURL()]); + if (detokenizeOptions?.getDownloadUrl && detokenizeOptions?.getDownloadUrl() && typeof detokenizeOptions.getDownloadUrl() !== 'boolean') { + throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_DOWNLOAD_URL, [typeof detokenizeOptions?.getDownloadUrl()]); } } @@ -878,7 +884,7 @@ export const validateTokenizeRequest = (tokenizeRequest: TokenizeRequest, logLev if (typeof data !== 'object') { throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_DATA_IN_TOKENIZE, [index]); } - if (!data.value) { + if (data.value === null || data.value === undefined || data.value === '') { throw new SkyflowError(SKYFLOW_ERROR_CODE.EMPTY_VALUE_IN_TOKENIZE, [index]); } if (typeof data.value !== 'string' || data.value.trim().length === 0) { @@ -952,12 +958,13 @@ export const validateUploadFileRequest = (fileRequest: FileUploadRequest, option throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TABLE_IN_UPLOAD_FILE); } - if (!fileRequest?.skyflowId || !Object.prototype.hasOwnProperty.call(fileRequest, '_skyflowId')) { + const effectiveSkyflowId = options?.getSkyflowId(); + if (!effectiveSkyflowId) { printLog(logs.errorLogs.EMPTY_SKYFLOW_ID_IN_FILE_UPLOAD, MessageType.ERROR, logLevel); throw new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_SKYFLOW_ID_IN_UPLOAD_FILE); } - if (typeof fileRequest?.skyflowId !== 'string' || fileRequest.skyflowId.trim().length === 0) { + if (typeof effectiveSkyflowId !== 'string' || effectiveSkyflowId.trim().length === 0) { printLog(logs.errorLogs.INVALID_SKYFLOW_ID_IN_FILE_UPLOAD, MessageType.ERROR, logLevel); throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_SKYFLOW_ID_IN_UPLOAD_FILE); } diff --git a/src/vault/client/index.ts b/src/vault/client/index.ts index 1f57df63..e2f24d3d 100644 --- a/src/vault/client/index.ts +++ b/src/vault/client/index.ts @@ -52,9 +52,9 @@ class VaultClient { this.logLevel = logLevel || LogLevel.ERROR; } - updateClientConfig(clusterID: string, vaultId: string, individualCredentials?: Credentials, skyflowCredentials?: Credentials, logLevel?: LogLevel) { + updateClientConfig(clusterId: string, vaultId: string, individualCredentials?: Credentials, skyflowCredentials?: Credentials, logLevel?: LogLevel) { this.updateTriggered = true; - this.initializeClient(clusterID, vaultId, individualCredentials, skyflowCredentials, logLevel); + this.initializeClient(clusterId, vaultId, individualCredentials, skyflowCredentials, logLevel); } private initConfig(authInfo: AuthInfo) { @@ -355,7 +355,7 @@ class VaultClient { reject(new SkyflowError({ http_code: isNewError ? (err?.statusCode ?? err?.body?.error?.http_code ?? HTTP_STATUS_CODE.BAD_REQUEST) : err?.body?.error?.http_code ?? HTTP_STATUS_CODE.BAD_REQUEST, message: description, - request_ID: requestId, + requestId: requestId, grpc_code: grpcCode, http_status: httpStatus, details: details, diff --git a/src/vault/controller/detect/index.ts b/src/vault/controller/detect/index.ts index bd85bb87..805451ea 100644 --- a/src/vault/controller/detect/index.ts +++ b/src/vault/controller/detect/index.ts @@ -456,6 +456,7 @@ class DetectController { })), wordCount: records.word_count, charCount: records.character_count, + errors: null, }; } diff --git a/src/vault/controller/vault/index.ts b/src/vault/controller/vault/index.ts index 62f644ee..1cce723f 100644 --- a/src/vault/controller/vault/index.ts +++ b/src/vault/controller/vault/index.ts @@ -91,19 +91,19 @@ class VaultController { }; if (!records || !Array.isArray(records) || records.length === 0) { - return new InsertResponse({ insertedFields:null, errors: null }); + return new InsertResponse({ insertedFields: [], errors: null }); } records.forEach((record: Record, index: number) => { if (this.isSuccess(record)) { - + this.processSuccess(record, index, response); } else { this.processError(record, index, requestId, response); } }); - return new InsertResponse({ insertedFields: response.success.length>0 ? response.success : null, errors: response.errors.length>0 ? response.errors : null }); + return new InsertResponse({ insertedFields: response.success, errors: response.errors.length>0 ? response.errors : null }); } private isSuccess(record: Record): boolean { @@ -166,7 +166,7 @@ class VaultController { resolve(data) break; case TYPES.DELETE: - resolve(new DeleteResponse({ deletedIds: data?.RecordIDResponse, errors: null }) as T); + resolve(new DeleteResponse({ deletedIds: data?.RecordIDResponse ?? [], errors: null }) as T); break; } }).catch((error: any) => { @@ -373,7 +373,7 @@ class VaultController { fields: options?.getFields(), offset: options?.getOffset(), limit: options?.getLimit(), - downloadURL: options?.getDownloadURL(), + downloadURL: options?.getDownloadUrl(), column_name: columnName, column_values: columnValues, order_by: options?.getOrderBy(), @@ -440,7 +440,7 @@ class VaultController { const uploadFileV2Request: UploadFileV2Request = { columnName:request.columnName, tableName: request.table, - skyflowID: request.skyflowId, + skyflowID: options?.getSkyflowId(), returnFileMetadata: false, } @@ -517,7 +517,7 @@ class VaultController { validateDetokenizeRequest(request, options, this.client.getLogLevel()); const fields = request.data.map(record => ({ token: record.token, redaction: record?.redactionType || RedactionType.DEFAULT })) as Array; - const detokenizePayload: V1DetokenizePayload = { detokenizationParameters: fields, continueOnError: options?.getContinueOnError(), downloadURL: options?.getDownloadURL() }; + const detokenizePayload: V1DetokenizePayload = { detokenizationParameters: fields, continueOnError: options?.getContinueOnError(), downloadURL: options?.getDownloadUrl() }; this.handleRequest>>( (headers: Records.RequestOptions | undefined) => this.client.tokensAPI.recordServiceDetokenize(this.client.vaultId, detokenizePayload, headers).withRawResponse(), diff --git a/src/vault/model/options/deidentify-file/bleep-audio/index.ts b/src/vault/model/options/deidentify-file/bleep-audio/index.ts index d494e631..849b20e1 100644 --- a/src/vault/model/options/deidentify-file/bleep-audio/index.ts +++ b/src/vault/model/options/deidentify-file/bleep-audio/index.ts @@ -2,8 +2,8 @@ export class Bleep { private _gain?: number; private _frequency?: number; - private _start_padding?: number; - private _stop_padding?: number; + private _startPadding?: number; + private _stopPadding?: number; getGain(): number | undefined { return this._gain; @@ -18,15 +18,15 @@ export class Bleep { this._frequency = frequency; } getStartPadding(): number | undefined { - return this._start_padding; + return this._startPadding; } - setStartPadding(start_padding: number) { - this._start_padding = start_padding; + setStartPadding(startPadding: number) { + this._startPadding = startPadding; } getStopPadding(): number | undefined { - return this._stop_padding; + return this._stopPadding; } - setStopPadding(stop_padding: number) { - this._stop_padding = stop_padding; + setStopPadding(stopPadding: number) { + this._stopPadding = stopPadding; } } \ No newline at end of file diff --git a/src/vault/model/options/detokenize/index.ts b/src/vault/model/options/detokenize/index.ts index ed97b977..fcf0850c 100644 --- a/src/vault/model/options/detokenize/index.ts +++ b/src/vault/model/options/detokenize/index.ts @@ -2,7 +2,7 @@ class DetokenizeOptions { // Fields with default values private continueOnError?: boolean; - private downloadURL?: boolean; + private downloadUrl?: boolean; // Constructor constructor() { } @@ -12,8 +12,8 @@ class DetokenizeOptions { this.continueOnError = continueOnError; } - setDownloadURL(downloadURL: boolean) { - this.downloadURL = downloadURL; + setDownloadUrl(downloadUrl: boolean) { + this.downloadUrl = downloadUrl; } // Getters @@ -21,8 +21,8 @@ class DetokenizeOptions { return this.continueOnError; } - getDownloadURL(): boolean | undefined { - return this.downloadURL; + getDownloadUrl(): boolean | undefined { + return this.downloadUrl; } } diff --git a/src/vault/model/options/fileUpload/index.ts b/src/vault/model/options/fileUpload/index.ts index 1b0563a0..bd44772f 100644 --- a/src/vault/model/options/fileUpload/index.ts +++ b/src/vault/model/options/fileUpload/index.ts @@ -5,6 +5,7 @@ class FileUploadOptions { private base64?: string; private fileObject?: File; private fileName?: string; + private skyflowId?: string; // Constructor constructor() { } @@ -25,7 +26,9 @@ class FileUploadOptions { this.fileName = fileName; } - + setSkyflowId(skyflowId: string): void { + this.skyflowId = skyflowId; + } // Getters getFilePath(): string | undefined { @@ -43,6 +46,10 @@ class FileUploadOptions { getFileName(): string | undefined { return this.fileName; } + + getSkyflowId(): string | undefined { + return this.skyflowId; + } } diff --git a/src/vault/model/options/get/index.ts b/src/vault/model/options/get/index.ts index bd8a5fc4..41870985 100644 --- a/src/vault/model/options/get/index.ts +++ b/src/vault/model/options/get/index.ts @@ -8,7 +8,7 @@ class GetOptions { private fields?: Array; private offset?: string; private limit?: string; - private downloadURL?: boolean; + private downloadUrl?: boolean; private columnName?: string; private columnValues?: Array; private orderBy?: OrderByEnum; @@ -37,8 +37,8 @@ class GetOptions { this.limit = limit; } - setDownloadURL(downloadURL: boolean) { - this.downloadURL = downloadURL; + setDownloadUrl(downloadUrl: boolean) { + this.downloadUrl = downloadUrl; } setColumnName(columnName: string) { @@ -74,8 +74,8 @@ class GetOptions { return this.limit; } - getDownloadURL(): boolean | undefined { - return this.downloadURL; + getDownloadUrl(): boolean | undefined { + return this.downloadUrl; } getColumnName(): string | undefined { diff --git a/src/vault/model/request/file-upload/index.ts b/src/vault/model/request/file-upload/index.ts index 3c000def..39345b2a 100644 --- a/src/vault/model/request/file-upload/index.ts +++ b/src/vault/model/request/file-upload/index.ts @@ -2,15 +2,13 @@ class FileUploadRequest { private _table: string; - private _skyflowId: string; private _columnName: string; // Constructor - constructor(table: string, skyflowId: string, columnName: string) { + constructor(table: string, columnName: string) { this._table = table; - this._skyflowId = skyflowId; this._columnName = columnName; - } + } // Getters and Setters public get table(): string { @@ -20,13 +18,6 @@ class FileUploadRequest { this._table = value; } - public get skyflowId(): string { - return this._skyflowId; - } - public set skyflowId(value: string) { - this._skyflowId = value; - } - public get columnName(): string { return this._columnName; } diff --git a/src/vault/model/response/deidentify-file/index.ts b/src/vault/model/response/deidentify-file/index.ts index 47b2c937..b39af6d8 100644 --- a/src/vault/model/response/deidentify-file/index.ts +++ b/src/vault/model/response/deidentify-file/index.ts @@ -1,3 +1,5 @@ +import { SkyflowRecordError } from "../../../../utils"; + class DeidentifyFileResponse { // fields fileBase64?: string; @@ -16,8 +18,9 @@ class DeidentifyFileResponse { slideCount?: number; runId?: string; status?: string; + errors: Array | null; - constructor({ + constructor({ fileBase64, file, type, @@ -30,7 +33,8 @@ class DeidentifyFileResponse { slideCount, entities, runId, - status + status, + errors, } :{ fileBase64?: string; file?: File; @@ -48,6 +52,7 @@ class DeidentifyFileResponse { }>; runId?: string; status?: string; + errors?: Array | null; }) { this.fileBase64 = fileBase64; this.file = file; @@ -62,6 +67,7 @@ class DeidentifyFileResponse { this.entities = entities; this.runId = runId; this.status = status; + this.errors = errors ?? null; } } diff --git a/src/vault/model/response/deidentify-text/index.ts b/src/vault/model/response/deidentify-text/index.ts index e9655a83..8beca5d9 100644 --- a/src/vault/model/response/deidentify-text/index.ts +++ b/src/vault/model/response/deidentify-text/index.ts @@ -1,6 +1,7 @@ //imports import { IndexRange } from "../../../types"; +import { SkyflowRecordError } from "../../../../utils"; class DeidentifyTextResponse { //fields @@ -15,12 +16,14 @@ class DeidentifyTextResponse { }>; wordCount: number; charCount: number; + errors: Array | null; constructor({ processedText, entities, wordCount, charCount, + errors, }: { processedText: string; entities: Array<{ @@ -33,11 +36,13 @@ class DeidentifyTextResponse { }>; wordCount: number; charCount: number; + errors?: Array | null; }) { this.processedText = processedText; this.entities = entities; this.wordCount = wordCount; this.charCount = charCount; + this.errors = errors ?? null; } //getters and setters diff --git a/src/vault/model/response/delete/index.ts b/src/vault/model/response/delete/index.ts index b325491d..489384fe 100644 --- a/src/vault/model/response/delete/index.ts +++ b/src/vault/model/response/delete/index.ts @@ -6,7 +6,7 @@ class DeleteResponse { //fields - deletedIds?: Array; + deletedIds: Array; errors: Array | null; diff --git a/src/vault/model/response/insert/index.ts b/src/vault/model/response/insert/index.ts index f840eb13..4fe99507 100644 --- a/src/vault/model/response/insert/index.ts +++ b/src/vault/model/response/insert/index.ts @@ -5,11 +5,11 @@ import { InsertResponseType } from "../../../types"; class InsertResponse { //fields - insertedFields: Array | null; + insertedFields: Array; errors: Array | null; - constructor({ insertedFields, errors }: { insertedFields: Array | null, errors: Array | null }) { + constructor({ insertedFields, errors }: { insertedFields: Array, errors: Array | null }) { this.insertedFields = insertedFields; this.errors = errors; } diff --git a/test/error/skyflow-error.test.js b/test/error/skyflow-error.test.js new file mode 100644 index 00000000..fec8fb0c --- /dev/null +++ b/test/error/skyflow-error.test.js @@ -0,0 +1,48 @@ +import SkyflowError from '../../src/error'; + +describe('SkyflowError', () => { + test('uses defaults when optional fields absent', () => { + const err = new SkyflowError({ http_code: 400, message: 'test error' }); + expect(err).toBeInstanceOf(Error); + expect(err.error.http_code).toBe(400); + expect(err.error.http_status).toBe('Bad Request'); + expect(err.error.details).toEqual([]); + expect(err.error.requestId).toBeNull(); + expect(err.error.grpc_code).toBeNull(); + expect(err.message).toBe('test error'); + }); + + test('uses provided http_status, details, requestId, grpc_code', () => { + const err = new SkyflowError({ + http_code: 500, + message: 'server error', + http_status: 'Internal Server Error', + details: [{ issue: 'db down' }], + requestId: 'req-abc-123', + grpc_code: 13, + }); + expect(err.error.http_status).toBe('Internal Server Error'); + expect(err.error.details).toEqual([{ issue: 'db down' }]); + expect(err.error.requestId).toBe('req-abc-123'); + expect(err.error.grpc_code).toBe(13); + }); + + test('formats message with args', () => { + const err = new SkyflowError( + { http_code: 400, message: 'invalid record at index %s1' }, + [2] + ); + expect(err.message).toBe('invalid record at index 2'); + expect(err.error.message).toBe('invalid record at index 2'); + }); + + test('uses message directly when no args', () => { + const err = new SkyflowError({ http_code: 400, message: 'plain message' }, []); + expect(err.message).toBe('plain message'); + }); + + test('uses message directly when args is null', () => { + const err = new SkyflowError({ http_code: 400, message: 'null args message' }, null); + expect(err.message).toBe('null args message'); + }); +}); diff --git a/test/service-account/token.test.js b/test/service-account/token.test.js index 0da4582b..3dc66cd4 100644 --- a/test/service-account/token.test.js +++ b/test/service-account/token.test.js @@ -138,7 +138,7 @@ describe("Context and Scoped Token Options Tests", () => { message: errorMessages.INVALID_CREDENTIALS_STRING, }); try { - await generateBearerTokenFromCreds(credentials, { roleIDs: [] }); + await generateBearerTokenFromCreds(credentials, { roleIds: [] }); } catch (err) { expect(err.message).toBe(expectedError.message); } @@ -150,14 +150,14 @@ describe("Context and Scoped Token Options Tests", () => { message: errorMessages.INVALID_CREDENTIALS_STRING, }); try { - await generateBearerTokenFromCreds(credentials, { roleIDs: true }); + await generateBearerTokenFromCreds(credentials, { roleIds: true }); } catch (err) { expect(err.message).toBe(expectedError.message); } }); test("Empty roleID array passed to generate scoped token (without context)", async () => { - const options = { roleIDs: [] }; + const options = { roleIds: [] }; try { await generateBearerTokenFromCreds(credsWithoutContext, options); } catch (err) { @@ -166,7 +166,7 @@ describe("Context and Scoped Token Options Tests", () => { }); test("Invalid type passed to generate scoped token (without context)", async () => { - const options = { roleIDs: true }; + const options = { roleIds: true }; try { await generateBearerTokenFromCreds(credsWithoutContext, options); } catch (err) { @@ -490,4 +490,115 @@ describe('getToken and getSignedTokens tokenUri override tests', () => { const invalidOptions = { dataTokens: ['datatoken1'], tokenUri: "not-a-valid-url" }; await expect(generateSignedDataTokensFromCreds(validCredsString, invalidOptions)).rejects.toThrow(); }); + + test("outer catch triggered when jwt.sign throws", async () => { + jest.spyOn(jwt, 'sign').mockImplementationOnce(() => { throw new Error('jwt sign failed'); }); + const validCreds = JSON.stringify({ + clientID: 'test-client-id', + keyID: 'test-key-id', + tokenURI: 'https://test-token-uri.com', + privateKey: 'some-key', + }); + await expect(getToken(validCreds)).rejects.toBeDefined(); + }); + + test("withRawResponse rejection triggers lines 152-154", async () => { + const Client = jest.requireMock('../../src/service-account/client').default; + Client.mockImplementationOnce(() => ({ + authApi: { + authenticationServiceGetAuthToken: jest.fn(() => ({ + withRawResponse: jest.fn().mockRejectedValueOnce(new Error('API rejection')) + })) + } + })); + const validCreds = JSON.stringify({ + clientID: 'test-client-id', + keyID: 'test-key-id', + tokenURI: 'https://test-token-uri.com', + privateKey: 'some-key', + }); + await expect(getToken(validCreds)).rejects.toBeDefined(); + }); + + test("ctx option provided covers line 108 truthy branch", async () => { + const Client = jest.requireMock('../../src/service-account/client').default; + Client.mockImplementationOnce(() => ({ + authApi: { + authenticationServiceGetAuthToken: jest.fn(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: { accessToken: 'mocked_access_token', tokenType: 'Bearer' }, + rawResponse: { headers: { get: jest.fn().mockReturnValue('req-id') } } + }) + })) + } + })); + const validCreds = JSON.stringify({ + clientID: 'test-client-id', + keyID: 'test-key-id', + tokenURI: 'https://test-token-uri.com', + privateKey: 'some-key', + }); + const result = await getToken(validCreds, { logLevel: LogLevel.OFF, ctx: 'test-context' }); + expect(result).toBeDefined(); + }); + + test("roleIds option provided covers line 130 binary-expr right side", async () => { + const Client = jest.requireMock('../../src/service-account/client').default; + Client.mockImplementationOnce(() => ({ + authApi: { + authenticationServiceGetAuthToken: jest.fn(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: { accessToken: 'mocked_access_token', tokenType: 'Bearer' }, + rawResponse: { headers: { get: jest.fn().mockReturnValue('req-id') } } + }) + })) + } + })); + const validCreds = JSON.stringify({ + clientID: 'test-client-id', + keyID: 'test-key-id', + tokenURI: 'https://test-token-uri.com', + privateKey: 'some-key', + }); + const result = await getToken(validCreds, { logLevel: LogLevel.OFF, roleIds: ['role1', 'role2'] }); + expect(result).toBeDefined(); + }); +}); + +describe('failureResponse with rawResponse', () => { + const makeHeaders = (contentType) => ({ + get: (key) => key === 'content-type' ? contentType : 'request-id-123' + }); + + test("handles application/json content type", async () => { + const err = { + rawResponse: { headers: makeHeaders('application/json') }, + body: { error: { message: 'Server Error', http_code: 500 } }, + }; + await expect(failureResponse(err)).rejects.toBeDefined(); + }); + + test("handles application/json with null body (fallback to body)", async () => { + const err = { + rawResponse: { headers: makeHeaders('application/json') }, + body: 'raw body string', + }; + await expect(failureResponse(err)).rejects.toBeDefined(); + }); + + test("handles text/plain content type", async () => { + const err = { + rawResponse: { headers: makeHeaders('text/plain') }, + body: 'plain text error message', + }; + await expect(failureResponse(err)).rejects.toBeDefined(); + }); + + test("handles unknown content type", async () => { + const err = { + rawResponse: { headers: makeHeaders('application/xml') }, + response: { status: 503 }, + }; + await expect(failureResponse(err)).rejects.toBeDefined(); + }); }); diff --git a/test/utils/validations.test.js b/test/utils/validations.test.js index f360c874..52874cf6 100644 --- a/test/utils/validations.test.js +++ b/test/utils/validations.test.js @@ -1256,7 +1256,7 @@ test('should throw error when table name is invalid', () => { // Test different log levels test('should work with different log levels', () => { const request = { - _table: 'users', + _table: 'users', table: 'users', data: [{ field: 'value' }] }; @@ -1265,6 +1265,46 @@ test('should throw error when table name is invalid', () => { expect(() => validateInsertRequest(request, undefined, LogLevel.WARN)).not.toThrow(); expect(() => validateInsertRequest(request, undefined, LogLevel.ERROR)).not.toThrow(); }); + + describe('fail-fast validation: null/undefined/empty field values', () => { + const baseRequest = (data) => ({ _table: 'users', table: 'users', data }); + + test('throws EMPTY_FIELD for null field value', () => { + expect(() => validateInsertRequest(baseRequest([{ card: null }]))) + .toThrow(SKYFLOW_ERROR_CODE.EMPTY_FIELD); + }); + + test('throws EMPTY_FIELD for undefined field value', () => { + expect(() => validateInsertRequest(baseRequest([{ card: undefined }]))) + .toThrow(SKYFLOW_ERROR_CODE.EMPTY_FIELD); + }); + + test('throws EMPTY_FIELD for empty string field value', () => { + expect(() => validateInsertRequest(baseRequest([{ card: '' }]))) + .toThrow(SKYFLOW_ERROR_CODE.EMPTY_FIELD); + }); + + test('throws EMPTY_FIELD when one of multiple fields is null', () => { + expect(() => validateInsertRequest(baseRequest([{ name: 'John', ssn: null }]))) + .toThrow(SKYFLOW_ERROR_CODE.EMPTY_FIELD); + }); + + test('does not throw for 0 (valid falsy value)', () => { + expect(() => validateInsertRequest(baseRequest([{ amount: 0 }]))).not.toThrow(); + }); + + test('does not throw for false (valid falsy value)', () => { + expect(() => validateInsertRequest(baseRequest([{ active: false }]))).not.toThrow(); + }); + + test('does not throw for 0.0 (valid falsy value)', () => { + expect(() => validateInsertRequest(baseRequest([{ score: 0.0 }]))).not.toThrow(); + }); + + test('does not throw for valid string fields', () => { + expect(() => validateInsertRequest(baseRequest([{ card: '4111111111111111', name: 'Alice' }]))).not.toThrow(); + }); + }); }); @@ -2018,7 +2058,7 @@ describe('validateDetokenizeRequest', () => { test('should validate downloadURL option', () => { const options = { - getDownloadURL: () => 'not-a-boolean' + getDownloadUrl: () => 'not-a-boolean' }; expect(() => validateDetokenizeRequest(validRequest, options)) .toThrow(SKYFLOW_ERROR_CODE.INVALID_DOWNLOAD_URL); @@ -2067,7 +2107,7 @@ describe('validateDetokenizeRequest', () => { }; const options = { getContinueOnError: () => true, - getDownloadURL: () => false + getDownloadUrl: () => false }; expect(() => validateDetokenizeRequest(request, options)).not.toThrow(); }); @@ -2591,15 +2631,14 @@ describe('validateUploadFileRequest', () => { const request = { _table: 'users', table: 'users', - _skyflowId: 'id1', - skyflowId: 'id1', _columnName: 'file_column', columnName: 'file_column' }; const options = { getFilePath: () => '/valid/path/to/file.txt', getBase64: () => null, - getFileObject: () => null + getFileObject: () => null, + getSkyflowId: () => 'id1' }; expect(() => validateUploadFileRequest(request, options)).not.toThrow(); }); @@ -2608,8 +2647,6 @@ describe('validateUploadFileRequest', () => { const request = { _table: 'users', table: 'users', - _skyflowId: 'id1', - skyflowId: 'id1', _columnName: 'file_column', columnName: 'file_column' }; @@ -2617,7 +2654,8 @@ describe('validateUploadFileRequest', () => { getFilePath: () => null, getBase64: () => 'valid-base64', getFileName: () => 'file.txt', - getFileObject: () => null + getFileObject: () => null, + getSkyflowId: () => 'id1' }; expect(() => validateUploadFileRequest(request, options)).not.toThrow(); }); @@ -2626,8 +2664,6 @@ describe('validateUploadFileRequest', () => { const request = { _table: 'users', table: 'users', - _skyflowId: 'id1', - skyflowId: 'id1', _columnName: 'file_column', columnName: 'file_column' }; @@ -2635,7 +2671,8 @@ describe('validateUploadFileRequest', () => { const options = { getFilePath: () => null, getBase64: () => null, - getFileObject: () => mockFile + getFileObject: () => mockFile, + getSkyflowId: () => 'id1' }; expect(() => validateUploadFileRequest(request, options)).not.toThrow(); }); @@ -3859,7 +3896,7 @@ describe('validateGetRequest/validateGetColumnRequest - validateGetOptions', () // Test downloadURL validation test('should throw error when downloadURL is not boolean', () => { const options = { - getDownloadURL: () => 'not-a-boolean' + getDownloadUrl: () => 'not-a-boolean' }; expect(() => validateGetRequest(validGetRequest, options)) .toThrow(SKYFLOW_ERROR_CODE.INVALID_DOWNLOAD_URL); @@ -3950,7 +3987,7 @@ describe('validateGetRequest/validateGetColumnRequest - validateGetOptions', () getRedactionType: () => 'REDACTED', getOffset: () => '0', getLimit: () => '10', - getDownloadURL: () => false, + getDownloadUrl: () => false, getColumnName: () => 'column1', getOrderBy: () => OrderByEnum.ASCENDING, getFields: () => ['field1', 'field2'], diff --git a/test/vault/controller/vault.test.js b/test/vault/controller/vault.test.js index 03ef4de2..278654b4 100644 --- a/test/vault/controller/vault.test.js +++ b/test/vault/controller/vault.test.js @@ -318,7 +318,7 @@ describe('VaultController insert method', () => { const response = await vaultController.insert(mockRequest, mockOptions); expect(mockVaultClient.vaultAPI.recordServiceBatchOperation).toHaveBeenCalled(); - expect(response.insertedFields).toBe(null); + expect(response.insertedFields).toEqual([]); }); test('should reject insert records with batch insert', async () => { @@ -346,7 +346,7 @@ describe('VaultController insert method', () => { const response = await vaultController.insert(mockRequest, mockOptions); expect(mockVaultClient.vaultAPI.recordServiceBatchOperation).toHaveBeenCalled(); - expect(response.insertedFields).toStrictEqual(null); + expect(response.insertedFields).toEqual([]); }); test('should handle validation errors', async () => { @@ -419,6 +419,73 @@ describe('VaultController insert method', () => { expect(error).toBeDefined(); } }); + + test('insertedFields is always array when bulk insert returns records', async () => { + validateInsertRequest.mockImplementation(() => {}); + const mockRequest = { data: [{ field1: 'value1' }], table: 'testTable' }; + const mockOptions = { + getContinueOnError: jest.fn().mockReturnValue(false), + getReturnTokens: jest.fn().mockReturnValue(true), + getUpsertColumn: jest.fn().mockReturnValue(''), + getHomogeneous: jest.fn().mockReturnValue(false), + getTokenMode: jest.fn().mockReturnValue(''), + getTokens: jest.fn().mockReturnValue([]) + }; + mockVaultClient.vaultAPI.recordServiceInsertRecord.mockImplementation(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: { records: [{ skyflow_id: 'id123', tokens: {} }] }, + rawResponse: { headers: { get: jest.fn().mockReturnValue('req-id') } }, + }), + })); + const response = await vaultController.insert(mockRequest, mockOptions); + expect(Array.isArray(response.insertedFields)).toBe(true); + expect(response.insertedFields).toHaveLength(1); + }); + + test('insertedFields is empty array when batch insert response is empty', async () => { + validateInsertRequest.mockImplementation(() => {}); + const mockRequest = { data: [{ field1: 'value1' }], table: 'testTable' }; + const mockOptions = { + getContinueOnError: jest.fn().mockReturnValue(true), + getReturnTokens: jest.fn().mockReturnValue(false), + getUpsertColumn: jest.fn().mockReturnValue(''), + getHomogeneous: jest.fn().mockReturnValue(false), + getTokenMode: jest.fn().mockReturnValue(''), + getTokens: jest.fn().mockReturnValue([]) + }; + mockVaultClient.vaultAPI.recordServiceBatchOperation.mockImplementation(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: { responses: [] }, + rawResponse: { headers: { get: jest.fn().mockReturnValue('req-id') } }, + }), + })); + const response = await vaultController.insert(mockRequest, mockOptions); + expect(Array.isArray(response.insertedFields)).toBe(true); + expect(response.insertedFields).toHaveLength(0); + }); + + test('insertedFields is array and errors is null on full batch success', async () => { + validateInsertRequest.mockImplementation(() => {}); + const mockRequest = { data: [{ field1: 'value1' }], table: 'testTable' }; + const mockOptions = { + getContinueOnError: jest.fn().mockReturnValue(true), + getReturnTokens: jest.fn().mockReturnValue(false), + getUpsertColumn: jest.fn().mockReturnValue(''), + getHomogeneous: jest.fn().mockReturnValue(false), + getTokenMode: jest.fn().mockReturnValue(''), + getTokens: jest.fn().mockReturnValue([]) + }; + mockVaultClient.vaultAPI.recordServiceBatchOperation.mockImplementation(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: { responses: [{ Body: { records: [{ skyflow_id: 'id123' }] }, Status: 200 }] }, + rawResponse: { headers: { get: jest.fn().mockReturnValue('req-id') } }, + }), + })); + const response = await vaultController.insert(mockRequest, mockOptions); + expect(Array.isArray(response.insertedFields)).toBe(true); + expect(response.insertedFields[0].skyflowId).toBe('id123'); + expect(response.errors).toBeNull(); + }); }); describe('VaultController detokenize method', () => { @@ -455,7 +522,7 @@ describe('VaultController detokenize method', () => { }; const mockOptions = { getContinueOnError: jest.fn().mockReturnValue(true), - getDownloadURL: jest.fn().mockReturnValue(false) + getDownloadUrl: jest.fn().mockReturnValue(false) }; const mockDetokenizeResponse = { records: [ @@ -497,7 +564,7 @@ describe('VaultController detokenize method', () => { }; const mockOptions = { getContinueOnError: jest.fn().mockReturnValue(false), - getDownloadURL: jest.fn().mockReturnValue(true) + getDownloadUrl: jest.fn().mockReturnValue(true) }; const mockDetokenizeResponse = { records: [ @@ -578,7 +645,7 @@ describe('VaultController detokenize method', () => { }; const mockOptions = { getContinueOnError: jest.fn().mockReturnValue(true), - getDownloadURL: jest.fn().mockReturnValue(false) + getDownloadUrl: jest.fn().mockReturnValue(false) }; const mockDetokenizeResponse = { records: {} @@ -618,7 +685,7 @@ describe('VaultController detokenize method', () => { const mockOptions = { getContinueOnError: jest.fn().mockReturnValue(true), - getDownloadURL: jest.fn().mockReturnValue(false) + getDownloadUrl: jest.fn().mockReturnValue(false) }; validateDetokenizeRequest.mockImplementation(() => { @@ -643,7 +710,7 @@ describe('VaultController detokenize method', () => { }; const mockOptions = { getContinueOnError: jest.fn().mockReturnValue(true), - getDownloadURL: jest.fn().mockReturnValue(false) + getDownloadUrl: jest.fn().mockReturnValue(false) }; validateDetokenizeRequest.mockImplementation(() => { @@ -676,7 +743,7 @@ describe('VaultController detokenize method', () => { }; const mockOptions = { getContinueOnError: jest.fn().mockReturnValue(true), - getDownloadURL: jest.fn().mockReturnValue(false) + getDownloadUrl: jest.fn().mockReturnValue(false) }; validateDetokenizeRequest.mockImplementation(() => { @@ -712,7 +779,7 @@ describe('VaultController detokenize method', () => { }; const mockOptions = { getContinueOnError: jest.fn().mockReturnValue(true), - getDownloadURL: jest.fn().mockReturnValue(false) + getDownloadUrl: jest.fn().mockReturnValue(false) }; validateDetokenizeRequest.mockImplementation(() => { throw new Error('Validation error'); @@ -1343,7 +1410,6 @@ describe('VaultController uploadFile method', () => { test('should successfully upload file using filePath', async () => { const mockRequest = { table: 'testTable', - skyflowId: 'id123', columnName: 'testColumn', }; const mockOptions = { @@ -1351,6 +1417,7 @@ describe('VaultController uploadFile method', () => { getBase64: jest.fn(), getFileObject: jest.fn(), getFileName: jest.fn(), + getSkyflowId: jest.fn().mockReturnValue('id123'), }; const mockFileBuffer = Buffer.from('file content'); const mockFileName = 'file.json'; @@ -1377,7 +1444,6 @@ describe('VaultController uploadFile method', () => { test('should successfully upload file using base64', async () => { const mockRequest = { table: 'testTable', - skyflowId: 'id123', columnName: 'testColumn', }; const mockOptions = { @@ -1385,6 +1451,7 @@ describe('VaultController uploadFile method', () => { getBase64: jest.fn().mockReturnValue('base64string'), getFileObject: jest.fn(), getFileName: jest.fn().mockReturnValue('file.json'), + getSkyflowId: jest.fn().mockReturnValue('id123'), }; const mockBuffer = Buffer.from('base64string', 'base64'); const mockResponseData = { skyflowID: 'id123' }; @@ -1406,7 +1473,6 @@ describe('VaultController uploadFile method', () => { test('should successfully upload file using fileObject', async () => { const mockRequest = { table: 'testTable', - skyflowId: 'id123', columnName: 'testColumn', }; const mockFileObject = new File(['file content'], 'file.json', { type: 'application/json' }); @@ -1415,6 +1481,7 @@ describe('VaultController uploadFile method', () => { getBase64: jest.fn(), getFileObject: jest.fn().mockReturnValue(mockFileObject), getFileName: jest.fn(), + getSkyflowId: jest.fn().mockReturnValue('id123'), }; const mockResponseData = { skyflowID: 'id123' }; mockVaultClient.vaultAPI.uploadFileV2.mockImplementation(() => ({ @@ -1536,7 +1603,7 @@ describe('VaultController get method', () => { getFields: jest.fn().mockReturnValue(true), getOffset: jest.fn().mockReturnValue(true), getLimit: jest.fn().mockReturnValue(true), - getDownloadURL: jest.fn().mockReturnValue(true), + getDownloadUrl: jest.fn().mockReturnValue(true), getOrderBy: jest.fn().mockReturnValue(true) }; diff --git a/test/vault/utils/utils.test.js b/test/vault/utils/utils.test.js index a81d38d1..81888e5b 100644 --- a/test/vault/utils/utils.test.js +++ b/test/vault/utils/utils.test.js @@ -1,6 +1,6 @@ /* eslint-disable camelcase */ import errorMessages from "../../../src/error/messages"; -import { Env, getConnectionBaseURL, getVaultURL, validateToken, isValidURL, fillUrlWithPathAndQueryParams, generateSDKMetrics, printLog, getToken, getBearerToken, MessageType, LogLevel, objectToXML } from "../../../src/utils"; +import { Env, getConnectionBaseURL, getVaultURL, validateToken, isValidURL, fillUrlWithPathAndQueryParams, generateSDKMetrics, printLog, getToken, getBearerToken, getBaseUrl, removeSDKVersion, parameterizedString, MessageType, LogLevel, objectToXML } from "../../../src/utils"; import jwt_decode from 'jwt-decode'; import os from 'os'; import { generateBearerTokenFromCreds, generateBearerToken } from '../../../src/service-account'; @@ -403,7 +403,7 @@ describe('getToken', () => { expect(result).toEqual(mockToken); expect(generateBearerTokenFromCreds).toHaveBeenCalledWith('someCredentials', { - roleIDs: credentials.roles, + roleIds: credentials.roles, ctx: credentials.context, logLevel, }); @@ -423,7 +423,7 @@ describe('getToken', () => { expect(result).toEqual(mockToken); expect(generateBearerToken).toHaveBeenCalledWith('/some/path', { - roleIDs: credentials.roles, + roleIds: credentials.roles, ctx: credentials.context, logLevel, }); @@ -528,6 +528,372 @@ describe('getBearerToken', () => { expect(result).toEqual({"key": "generatedToken", "type": "TOKEN"}); }); + + test('should throw error for invalid API key (does not start with sky-)', async () => { + const credentials = { + apiKey: 'invalid-api-key' + }; + + await expect(getBearerToken(credentials, logLevel)) + .rejects + .toThrow(); + }); +}); + +describe('getBaseUrl', () => { + test('should return base URL for valid https URL', () => { + expect(getBaseUrl('https://example.skyflowapis.com/vault/v1/vaults')).toBe('https://example.skyflowapis.com'); + }); + + test('should return empty string for invalid URL', () => { + expect(getBaseUrl('not-a-valid-url')).toBe(''); + }); +}); + +describe('removeSDKVersion', () => { + test('should strip SDK version from message', () => { + const msg = 'Skyflow Node SDK v2.0.4 some error occurred'; + expect(removeSDKVersion(msg)).toBe('some error occurred'); + }); + + test('should return unchanged message when no SDK version present', () => { + const msg = 'plain error message'; + expect(removeSDKVersion(msg)).toBe('plain error message'); + }); +}); + +describe('parameterizedString', () => { + test('returns empty string when message is falsy', () => { + expect(parameterizedString('')).toBe(''); + expect(parameterizedString(null)).toBe(''); + }); + + test('replaces %sN placeholders with args', () => { + expect(parameterizedString('value at %s1 is %s2', 'index0', 'hello')).toBe('value at index0 is hello'); + }); +}); + +describe('printLog version fallback', () => { + afterEach(() => { + jest.restoreAllMocks(); + }); + + test('uses empty version when sdkDetails.version is undefined', () => { + const origDescriptor = Object.getOwnPropertyDescriptor(sdkDetails, 'version'); + Object.defineProperty(sdkDetails, 'version', { value: undefined, writable: true, configurable: true }); + const consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); + printLog('test msg', MessageType.LOG, LogLevel.DEBUG); + expect(consoleSpy).toHaveBeenCalledWith('DEBUG: [Skyflow Node SDK ] test msg'); + Object.defineProperty(sdkDetails, 'version', origDescriptor); + }); +}); + +describe('generateSDKMetrics branch coverage', () => { + afterEach(() => { + jest.restoreAllMocks(); + }); + + test('uses empty strings when sdkDetails name and version are falsy', () => { + const origName = Object.getOwnPropertyDescriptor(sdkDetails, 'name'); + const origVersion = Object.getOwnPropertyDescriptor(sdkDetails, 'version'); + Object.defineProperty(sdkDetails, 'name', { value: '', writable: true, configurable: true }); + Object.defineProperty(sdkDetails, 'version', { value: '', writable: true, configurable: true }); + const metrics = generateSDKMetrics(); + expect(metrics.sdk_name_version).toBe(''); + Object.defineProperty(sdkDetails, 'name', origName); + Object.defineProperty(sdkDetails, 'version', origVersion); + }); + + test('uses empty string for clientDeviceModel when process.platform is undefined', () => { + const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform'); + const origArch = Object.getOwnPropertyDescriptor(process, 'arch'); + Object.defineProperty(process, 'platform', { value: undefined, writable: true, configurable: true }); + Object.defineProperty(process, 'arch', { value: undefined, writable: true, configurable: true }); + jest.spyOn(os, 'release').mockReturnValue('5.4.0'); + jest.spyOn(os, 'platform').mockReturnValue('linux'); + const metrics = generateSDKMetrics(); + expect(metrics.sdk_client_device_model).toBe(' '); + Object.defineProperty(process, 'platform', origPlatform); + Object.defineProperty(process, 'arch', origArch); + }); + + test('uses empty string for clientOSDetails when os.platform returns empty', () => { + jest.spyOn(os, 'release').mockReturnValue('5.4.0'); + jest.spyOn(os, 'platform').mockReturnValue(''); + const metrics = generateSDKMetrics(); + expect(metrics.sdk_client_os_details).toBe(''); + }); +}); + +describe('objectToXML', () => { + const { objectToXML } = require('../../../src/utils'); + + test('should convert simple object to XML with default root', () => { + const obj = { name: 'John', age: 30 }; + const result = objectToXML(obj); + + expect(result).toBe('John30'); + }); + + test('should convert simple object to XML with custom root name', () => { + const obj = { name: 'John', age: 30 }; + const result = objectToXML(obj, 'person'); + + expect(result).toBe('John30'); + }); + + test('should convert nested object to XML', () => { + const obj = { + user: { + name: 'John', + details: { + age: 30, + city: 'New York' + } + } + }; + const result = objectToXML(obj); + + expect(result).toContain(''); + expect(result).toContain('John'); + expect(result).toContain('
'); + expect(result).toContain('30'); + expect(result).toContain('New York'); + expect(result).toContain('
'); + expect(result).toContain('
'); + }); + + test('should convert array to XML with repeated elements', () => { + const obj = { + items: ['apple', 'banana', 'cherry'] + }; + const result = objectToXML(obj); + + expect(result).toContain('apple'); + expect(result).toContain('banana'); + expect(result).toContain('cherry'); + }); + + test('should handle null values', () => { + const obj = { name: 'John', middleName: null }; + const result = objectToXML(obj); + + expect(result).toContain('John'); + expect(result).toContain(''); + }); + + test('should handle undefined values', () => { + const obj = { name: 'John', middleName: undefined }; + const result = objectToXML(obj); + + expect(result).toContain('John'); + expect(result).toContain(''); + }); + + test('should escape special XML characters', () => { + const obj = { + text: 'This & that < > " \' are special' + }; + const result = objectToXML(obj); + + expect(result).toContain('&'); + expect(result).toContain('<'); + expect(result).toContain('>'); + expect(result).toContain('"'); + expect(result).toContain('''); + }); + + test('should handle ampersand character', () => { + const obj = { company: 'AT&T' }; + const result = objectToXML(obj); + + expect(result).toContain('AT&T'); + }); + + test('should handle less than and greater than characters', () => { + const obj = { expression: '5 < 10 > 3' }; + const result = objectToXML(obj); + + expect(result).toContain('5 < 10 > 3'); + }); + + test('should handle quotes and apostrophes', () => { + const obj = { text: 'He said "Hello" and it\'s true' }; + const result = objectToXML(obj); + + expect(result).toContain('"'); + expect(result).toContain('''); + }); + + test('should handle boolean values', () => { + const obj = { isActive: true, isDeleted: false }; + const result = objectToXML(obj); + + expect(result).toContain('true'); + expect(result).toContain('false'); + }); + + test('should handle numeric values', () => { + const obj = { age: 30, price: 99.99, negative: -5 }; + const result = objectToXML(obj); + + expect(result).toContain('30'); + expect(result).toContain('99.99'); + expect(result).toContain('-5'); + }); + + test('should handle empty object', () => { + const obj = {}; + const result = objectToXML(obj); + + expect(result).toBe(''); + }); + + test('should handle empty string values', () => { + const obj = { name: '' }; + const result = objectToXML(obj); + + expect(result).toContain(''); + }); + + test('should handle complex nested structure', () => { + const obj = { + order: { + id: 123, + customer: { + name: 'John Doe', + email: 'john@example.com' + }, + items: ['item1', 'item2'], + total: 99.99 + } + }; + const result = objectToXML(obj); + + expect(result).toContain(''); + expect(result).toContain('123'); + expect(result).toContain(''); + expect(result).toContain('John Doe'); + expect(result).toContain('john@example.com'); + expect(result).toContain(''); + expect(result).toContain('item1'); + expect(result).toContain('item2'); + expect(result).toContain('99.99'); + expect(result).toContain(''); + }); + + test('should handle array of objects', () => { + const obj = { + users: [ + { name: 'John', age: 30 }, + { name: 'Jane', age: 25 } + ] + }; + const result = objectToXML(obj); + + expect(result).toContain(''); + expect(result).toContain('John'); + expect(result).toContain('30'); + expect(result).toContain('Jane'); + expect(result).toContain('25'); + expect(result).toContain(''); + }); + + test('should handle mixed types in nested structure', () => { + const obj = { + data: { + string: 'text', + number: 42, + boolean: true, + null: null, + array: [1, 2, 3] + } + }; + const result = objectToXML(obj); + + expect(result).toContain('text'); + expect(result).toContain('42'); + expect(result).toContain('true'); + expect(result).toContain(''); + expect(result).toContain('1'); + expect(result).toContain('2'); + expect(result).toContain('3'); + }); + + test('should include XML declaration', () => { + const obj = { test: 'value' }; + const result = objectToXML(obj); + + expect(result.startsWith('')).toBe(true); + }); + + test('should handle objects with multiple root-level keys', () => { + const obj = { + firstName: 'John', + lastName: 'Doe', + age: 30 + }; + const result = objectToXML(obj, 'person'); + + expect(result).toContain(''); + expect(result).toContain('John'); + expect(result).toContain('Doe'); + expect(result).toContain('30'); + expect(result).toContain(''); + }); + + test('should handle deeply nested objects', () => { + const obj = { + level1: { + level2: { + level3: { + level4: { + value: 'deep' + } + } + } + } + }; + const result = objectToXML(obj); + + expect(result).toContain(''); + expect(result).toContain(''); + expect(result).toContain(''); + expect(result).toContain(''); + expect(result).toContain('deep'); + expect(result).toContain(''); + expect(result).toContain(''); + expect(result).toContain(''); + expect(result).toContain(''); + }); + + test('should handle empty arrays', () => { + const obj = { items: [] }; + const result = objectToXML(obj); + + // Empty array should not produce any items elements + expect(result).toBe(''); + }); + + test('should convert numbers to strings', () => { + const obj = { zero: 0, negative: -100, float: 3.14159 }; + const result = objectToXML(obj); + + expect(result).toContain('0'); + expect(result).toContain('-100'); + expect(result).toContain('3.14159'); + }); + + test('should handle special characters in keys and values', () => { + const obj = { + 'data-id': 'test-123', + value: 'special & chars < >' + }; + const result = objectToXML(obj); + + expect(result).toContain('test-123'); + expect(result).toContain('special & chars < >'); + }); }); describe('objectToXML', () => { From 1891eb9bdf501b7e0bb3f9abe3cc7a7198ba28b5 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Mon, 11 May 2026 18:25:11 +0530 Subject: [PATCH 02/34] SK-2812: Updated change log --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf38d7d0..d7811f17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,14 @@ The credentials JSON object now uses camelCase keys. The old ALL_CAPS variants a + options.setDownloadUrl(true) ``` +#### `Bleep` — `start_padding` / `stop_padding` → `startPadding` / `stopPadding` +```diff +- bleep.setStartPadding(start_padding) +- bleep.setStopPadding(stop_padding) ++ bleep.setStartPadding(startPadding) ++ bleep.setStopPadding(stopPadding) +``` + ### Behavior Changes - **`insertedFields` always array**: `InsertResponse.insertedFields` is now `Array` (never `null`). An empty array is returned when there are no successful records. From 09770ad612329ea892ec0fa22c092f82958bbabf Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Mon, 11 May 2026 19:32:53 +0530 Subject: [PATCH 03/34] SK-2812: updated skyflowId --- src/vault/controller/vault/index.ts | 10 +++--- test/vault/controller/vault.test.js | 48 +++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/vault/controller/vault/index.ts b/src/vault/controller/vault/index.ts index 1cce723f..e1aecdc9 100644 --- a/src/vault/controller/vault/index.ts +++ b/src/vault/controller/vault/index.ts @@ -389,9 +389,11 @@ class VaultController { TYPES.GET ).then(response => { printLog(logs.infoLogs.GET_SUCCESS, MessageType.LOG, this.client.getLogLevel()); - const processedRecords = response.records.map(record => ({ - ...(typeof record.fields === 'object' && record.fields !== null ? record.fields : {}), - })); + const processedRecords = response.records.map(record => { + const fields = typeof record.fields === 'object' && record.fields !== null ? record.fields as Record : {}; + const { skyflow_id, ...rest } = fields; + return { ...(skyflow_id !== undefined ? { skyflowId: skyflow_id } : {}), ...rest }; + }); resolve(new GetResponse({ data: processedRecords, errors: null })); }) .catch(error => { @@ -490,7 +492,7 @@ class VaultController { printLog(logs.infoLogs.QUERY_SUCCESS, MessageType.LOG, this.client.getLogLevel()); const processedRecords = response.records.map(record => ({ ...(typeof record.fields === 'object' && record.fields !== null ? record.fields : {}), - tokenized_data: { + tokenizedData: { ...(typeof record.tokens === 'object' && record.tokens !== null ? record.tokens : {}), }, })); diff --git a/test/vault/controller/vault.test.js b/test/vault/controller/vault.test.js index 278654b4..4615cc9a 100644 --- a/test/vault/controller/vault.test.js +++ b/test/vault/controller/vault.test.js @@ -1078,6 +1078,34 @@ describe('VaultController query method', () => { expect(response.errors).toBe(null); }); + test('should normalize skyflow_id to skyflowId in query response', async () => { + const mockRequest = { + query: 'SELECT * FROM table WHERE id=1', + }; + const mockResponseData = { + records: [{ + fields: { skyflow_id: 'id123', id: '1' }, + tokens: { id: 'token123' }, + }] + }; + + mockVaultClient.queryAPI.queryServiceExecuteQuery.mockImplementation(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: mockResponseData, + rawResponse: { headers: { get: jest.fn().mockReturnValue('request-id-123') } } + }) + })); + + const response = await vaultController.query(mockRequest); + + expect(response).toBeInstanceOf(QueryResponse); + expect(response.fields[0].skyflowId).toBe('id123'); + expect(response.fields[0].skyflow_id).toBeUndefined(); + expect(response.fields[0].id).toBe('1'); + expect(response.fields[0].tokenizedData.id).toBe('token123'); + expect(response.errors).toBe(null); + }); + test('should successfully query records as null', async () => { const mockRequest = { query: 'SELECT * FROM table WHERE id=1', @@ -1703,6 +1731,26 @@ describe('VaultController get method', () => { await expect(vaultController.get(mockRequest)).rejects.toEqual(errorResponse); }); + test('should normalize skyflow_id to skyflowId in response', async () => { + const mockRequest = createGetRequest(['id1']); + const mockResponseData = { records: [{ fields: { skyflow_id: 'id123', field1: 'value1' } }] }; + + mockVaultClient.vaultAPI.recordServiceBulkGetRecord.mockImplementation(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: mockResponseData, + rawResponse: { headers: { get: jest.fn().mockReturnValue('request-id-123') } } + }) + })); + + const response = await vaultController.get(mockRequest); + + expect(response).toBeInstanceOf(GetResponse); + expect(response.data[0].skyflowId).toBe('id123'); + expect(response.data[0].skyflow_id).toBeUndefined(); + expect(response.data[0].field1).toBe('value1'); + expect(response.errors).toBeNull(); + }); + test('should handle undefined parameters correctly', async () => { const mockRequest = createGetRequest(undefined); // Pass undefined IDs const mockResponseData = [{ fields: { field1: 'value1' } }]; From a25fca891f2929c372cc7efdae76118be3e35a80 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 12 May 2026 15:51:09 +0530 Subject: [PATCH 04/34] SK-2812: Snapshots updated --- api-report/skyflow-node.api.md | 1122 ++++++++++++++++++++++++++++++++ 1 file changed, 1122 insertions(+) create mode 100644 api-report/skyflow-node.api.md diff --git a/api-report/skyflow-node.api.md b/api-report/skyflow-node.api.md new file mode 100644 index 00000000..9d9878ff --- /dev/null +++ b/api-report/skyflow-node.api.md @@ -0,0 +1,1122 @@ +## API Report File for "skyflow-node" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import { Blob as Blob_2 } from 'buffer'; +import * as fs from 'fs'; + +// @public (undocumented) +export interface ApiKeyCredentials { + // (undocumented) + apiKey: string; +} + +// @public (undocumented) +export type BearerTokenOptions = { + ctx?: string | Record; + roleIds?: string[]; + logLevel?: LogLevel; +}; + +// @public (undocumented) +export class Bleep { + // (undocumented) + getFrequency(): number | undefined; + // (undocumented) + getGain(): number | undefined; + // (undocumented) + getStartPadding(): number | undefined; + // (undocumented) + getStopPadding(): number | undefined; + // (undocumented) + setFrequency(frequency: number): void; + // (undocumented) + setGain(gain: number): void; + // (undocumented) + setStartPadding(startPadding: number): void; + // (undocumented) + setStopPadding(stopPadding: number): void; +} + +// @public (undocumented) +export interface ConnectionConfig { + // (undocumented) + connectionId: string; + // (undocumented) + connectionUrl: string; + // (undocumented) + credentials?: Credentials; +} + +// @public (undocumented) +export type Credentials = TokenCredentials | PathCredentials | StringCredentials | ApiKeyCredentials; + +// @public (undocumented) +export class DeidentifyFileOptions { + constructor(); + // (undocumented) + getAllowRegexList(): string[] | undefined; + // (undocumented) + getBleep(): Bleep | undefined; + // (undocumented) + getEntities(): string[] | undefined; + // (undocumented) + getMaskingMethod(): MaskingMethod | undefined; + // (undocumented) + getMaxResolution(): number | undefined; + // (undocumented) + getOutputDirectory(): string | undefined; + // (undocumented) + getOutputOcrText(): boolean | undefined; + // (undocumented) + getOutputProcessedAudio(): boolean | undefined; + // (undocumented) + getOutputProcessedImage(): boolean | undefined; + // (undocumented) + getOutputTranscription(): DetectOutputTranscription | undefined; + // (undocumented) + getPixelDensity(): number | undefined; + // (undocumented) + getRestrictRegexList(): string[] | undefined; + // (undocumented) + getTokenFormat(): TokenFormat | undefined; + // (undocumented) + getTransformations(): Transformations | undefined; + // (undocumented) + getWaitTime(): number | undefined; + // (undocumented) + setAllowRegexList(allowRegexList: string[]): void; + // (undocumented) + setBleep(bleep: Bleep | undefined): void; + // (undocumented) + setEntities(entities: DetectEntities[]): void; + // (undocumented) + setMaskingMethod(maskingMethod: MaskingMethod | undefined): void; + // (undocumented) + setMaxResolution(maxResolution: number | undefined): void; + // (undocumented) + setOutputDirectory(outputDirectory: string | undefined): void; + // (undocumented) + setOutputOcrText(outputOcrText: boolean | undefined): void; + // (undocumented) + setOutputProcessedAudio(outputProcessedAudio: boolean | undefined): void; + // (undocumented) + setOutputProcessedImage(value: boolean | undefined): void; + // (undocumented) + setOutputTranscription(outputTranscription: DetectOutputTranscription | undefined): void; + // (undocumented) + setPixelDensity(pixelDensity: number | undefined): void; + // (undocumented) + setRestrictRegexList(restrictRegexList: string[]): void; + // (undocumented) + setTokenFormat(tokenFormat: TokenFormat): void; + // (undocumented) + setTransformations(transformations: Transformations): void; + // (undocumented) + setWaitTime(waitTime: number | undefined): void; +} + +// @public (undocumented) +export class DeidentifyFileRequest { + constructor(file: FileInput); + // (undocumented) + getFile(): FileInput; + // (undocumented) + setFile(file: FileInput): void; +} + +// @public (undocumented) +export class DeidentifyFileResponse { + constructor(input: { + fileBase64?: string; + file?: File; + type?: string; + extension?: string; + wordCount?: number; + charCount?: number; + sizeInKb?: number; + durationInSeconds?: number; + pageCount?: number; + slideCount?: number; + entities?: Array<{ + file: string; + extension: string; + }>; + runId?: string; + status?: string; + errors?: Array | null; + }); + // (undocumented) + charCount?: number; + // (undocumented) + durationInSeconds?: number; + // (undocumented) + entities?: Array<{ + file: string; + extension: string; + }>; + // (undocumented) + errors: Array | null; + // (undocumented) + extension?: string; + // (undocumented) + file?: File; + // (undocumented) + fileBase64?: string; + // (undocumented) + pageCount?: number; + // (undocumented) + runId?: string; + // (undocumented) + sizeInKb?: number; + // (undocumented) + slideCount?: number; + // (undocumented) + status?: string; + // (undocumented) + type?: string; + // (undocumented) + wordCount?: number; +} + +// @public (undocumented) +export class DeidentifyTextOptions { + // (undocumented) + getAllowRegexList(): string[] | undefined; + // (undocumented) + getEntities(): DetectEntities[] | undefined; + // (undocumented) + getRestrictRegexList(): string[] | undefined; + // (undocumented) + getTokenFormat(): TokenFormat | undefined; + // (undocumented) + getTransformations(): Transformations | undefined; + // (undocumented) + setAllowRegexList(allowRegexList: string[]): void; + // (undocumented) + setEntities(entities: DetectEntities[]): void; + // (undocumented) + setRestrictRegexList(restrictRegexList: string[]): void; + // (undocumented) + setTokenFormat(tokenFormat: TokenFormat): void; + // (undocumented) + setTransformations(transformations: Transformations): void; +} + +// @public (undocumented) +export class DeidentifyTextRequest { + constructor(text: string); + // (undocumented) + get text(): string; + set text(value: string); +} + +// @public (undocumented) +export class DeidentifyTextResponse { + constructor(input: { + processedText: string; + entities: Array<{ + token?: string; + value?: string; + textIndex?: IndexRange; + processedIndex?: IndexRange; + entity?: string; + scores?: Record; + }>; + wordCount: number; + charCount: number; + errors?: Array | null; + }); + // (undocumented) + charCount: number; + // (undocumented) + entities: Array<{ + token?: string; + value?: string; + textIndex?: IndexRange; + processedIndex?: IndexRange; + entity?: string; + scores?: Record; + }>; + // (undocumented) + errors: Array | null; + // (undocumented) + processedText: string; + // (undocumented) + wordCount: number; +} + +// @public (undocumented) +export class DeleteRequest { + constructor(table: string, deleteIds: Array); + // (undocumented) + get ids(): Array; + set ids(value: Array); + // (undocumented) + get table(): string; + set table(value: string); +} + +// @public (undocumented) +export class DeleteResponse { + constructor(input: { + deletedIds: Array; + errors: Array | null; + }); + // (undocumented) + deletedIds: Array; + // (undocumented) + errors: Array | null; +} + +// @public (undocumented) +export enum DetectEntities { + // (undocumented) + ACCOUNT_NUMBER = "account_number", + // (undocumented) + AGE = "age", + // (undocumented) + ALL = "all", + // (undocumented) + BANK_ACCOUNT = "bank_account", + // (undocumented) + BLOOD_TYPE = "blood_type", + // (undocumented) + CONDITION = "condition", + // (undocumented) + CORPORATE_ACTION = "corporate_action", + // (undocumented) + CREDIT_CARD = "credit_card", + // (undocumented) + CREDIT_CARD_EXPIRATION = "credit_card_expiration", + // (undocumented) + CVV = "cvv", + // (undocumented) + DATE = "date", + // (undocumented) + DATE_INTERVAL = "date_interval", + // (undocumented) + DAY = "day", + // (undocumented) + DOB = "dob", + // (undocumented) + DOSE = "dose", + // (undocumented) + DRIVER_LICENSE = "driver_license", + // (undocumented) + DRUG = "drug", + // (undocumented) + DURATION = "duration", + // (undocumented) + EFFECT = "effect", + // (undocumented) + EMAIL_ADDRESS = "email_address", + // (undocumented) + EVENT = "event", + // (undocumented) + FILENAME = "filename", + // (undocumented) + FINANCIAL_METRIC = "financial_metric", + // (undocumented) + GENDER = "gender", + // (undocumented) + HEALTHCARE_NUMBER = "healthcare_number", + // (undocumented) + INJURY = "injury", + // (undocumented) + IP_ADDRESS = "ip_address", + // (undocumented) + LANGUAGE = "language", + // (undocumented) + LOCATION = "location", + // (undocumented) + LOCATION_ADDRESS = "location_address", + // (undocumented) + LOCATION_ADDRESS_STREET = "location_address_street", + // (undocumented) + LOCATION_CITY = "location_city", + // (undocumented) + LOCATION_COORDINATE = "location_coordinate", + // (undocumented) + LOCATION_COUNTRY = "location_country", + // (undocumented) + LOCATION_STATE = "location_state", + // (undocumented) + LOCATION_ZIP = "location_zip", + // (undocumented) + MARITAL_STATUS = "marital_status", + // (undocumented) + MEDICAL_CODE = "medical_code", + // (undocumented) + MEDICAL_PROCESS = "medical_process", + // (undocumented) + MONEY = "money", + // (undocumented) + MONTH = "month", + // (undocumented) + NAME = "name", + // (undocumented) + NAME_FAMILY = "name_family", + // (undocumented) + NAME_GIVEN = "name_given", + // (undocumented) + NAME_MEDICAL_PROFESSIONAL = "name_medical_professional", + // (undocumented) + NUMERICAL_PII = "numerical_pii", + // (undocumented) + OCCUPATION = "occupation", + // (undocumented) + ORGANIZATION = "organization", + // (undocumented) + ORGANIZATION_ID = "organization_id", + // (undocumented) + ORGANIZATION_MEDICAL_FACILITY = "organization_medical_facility", + // (undocumented) + ORIGIN = "origin", + // (undocumented) + PASSPORT_NUMBER = "passport_number", + // (undocumented) + PASSWORD = "password", + // (undocumented) + PHONE_NUMBER = "phone_number", + // (undocumented) + PHYSICAL_ATTRIBUTE = "physical_attribute", + // (undocumented) + POLITICAL_AFFILIATION = "political_affiliation", + // (undocumented) + PRODUCT = "product", + // (undocumented) + PROJECT = "project", + // (undocumented) + RELIGION = "religion", + // (undocumented) + ROUTING_NUMBER = "routing_number", + // (undocumented) + SEXUALITY = "sexuality", + // (undocumented) + SSN = "ssn", + // (undocumented) + STATISTICS = "statistics", + // (undocumented) + TIME = "time", + // (undocumented) + TREND = "trend", + // (undocumented) + URL = "url", + // (undocumented) + USERNAME = "username", + // (undocumented) + VEHICLE_ID = "vehicle_id", + // (undocumented) + ZODIAC_SIGN = "zodiac_sign" +} + +// @public (undocumented) +export enum DetectOutputTranscription { + // (undocumented) + DIARIZED_TRANSCRIPTION = "diarized_transcription", + // (undocumented) + MEDICAL_DIARIZED_TRANSCRIPTION = "medical_diarized_transcription", + // (undocumented) + MEDICAL_TRANSCRIPTION = "medical_transcription", + // (undocumented) + PLAINTEXT_TRANSCRIPTION = "plaintext_transcription", + // (undocumented) + TRANSCRIPTION = "transcription" +} + +// @public (undocumented) +export interface DetokenizeData { + // (undocumented) + redactionType?: RedactionType; + // (undocumented) + token: string; +} + +// @public (undocumented) +export class DetokenizeOptions { + constructor(); + // (undocumented) + getContinueOnError(): boolean | undefined; + // (undocumented) + getDownloadUrl(): boolean | undefined; + // (undocumented) + setContinueOnError(continueOnError: boolean): void; + // (undocumented) + setDownloadUrl(downloadUrl: boolean): void; +} + +// @public (undocumented) +export class DetokenizeRequest { + constructor(data: DetokenizeData[]); + // (undocumented) + get data(): DetokenizeData[]; + set data(value: DetokenizeData[]); +} + +// @public (undocumented) +export class DetokenizeResponse { + constructor(input: { + detokenizedFields: Array | null; + errors: Array | null; + }); + // Warning: (ae-forgotten-export) The symbol "SuccessDetokenizeResponse" needs to be exported by the entry point index.d.ts + // + // (undocumented) + detokenizedFields: Array | null; + // (undocumented) + errors: Array | null; +} + +// @public (undocumented) +export enum Env { + // (undocumented) + DEV = "DEV", + // (undocumented) + PROD = "PROD", + // (undocumented) + SANDBOX = "SANDBOX", + // (undocumented) + STAGE = "STAGE" +} + +// Warning: (ae-forgotten-export) The symbol "Filepath" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "FileObject" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export type FileInput = Filepath | FileObject; + +// @public (undocumented) +export class FileUploadOptions { + constructor(); + // (undocumented) + getBase64(): string | undefined; + // (undocumented) + getFileName(): string | undefined; + // (undocumented) + getFileObject(): File | undefined; + // (undocumented) + getFilePath(): string | undefined; + // (undocumented) + getSkyflowId(): string | undefined; + // (undocumented) + setBase64(base64: string): void; + // (undocumented) + setFileName(fileName: string): void; + // (undocumented) + setFileObject(fileObject: File): void; + // (undocumented) + setFilePath(filePath: string): void; + // (undocumented) + setSkyflowId(skyflowId: string): void; +} + +// @public (undocumented) +export class FileUploadRequest { + constructor(table: string, columnName: string); + // (undocumented) + get columnName(): string; + set columnName(value: string); + // (undocumented) + get table(): string; + set table(value: string); +} + +// @public (undocumented) +export class FileUploadResponse { + constructor(input: { + skyflowId: string; + errors: Array | null; + }); + // (undocumented) + errors: Array | null; + // (undocumented) + skyflowId: string; +} + +// Warning: (ae-forgotten-export) The symbol "TokenResponse" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export function generateBearerToken(credentialsFilePath: string, options?: BearerTokenOptions): Promise; + +// @public (undocumented) +export function generateBearerTokenFromCreds(credentials: any, options?: BearerTokenOptions): Promise; + +// Warning: (ae-forgotten-export) The symbol "SignedDataTokensResponse" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export function generateSignedDataTokens(credentialsFilePath: string, options: SignedDataTokensOptions): Promise; + +// @public (undocumented) +export function generateSignedDataTokensFromCreds(credentials: any, options: SignedDataTokensOptions): Promise; + +// @public (undocumented) +export type GenerateTokenOptions = { + logLevel?: LogLevel; +}; + +// @public (undocumented) +export class GetColumnRequest { + constructor(table: string, _columnName: string, _columnValues: Array); + // (undocumented) + get columnName(): string; + set columnName(value: string); + // (undocumented) + get columnValues(): Array; + set columnValues(value: Array); + // (undocumented) + get table(): string; + set table(value: string); +} + +// @public (undocumented) +export class GetDetectRunRequest { + constructor(runId: string); + // (undocumented) + get runId(): string; + set runId(value: string); +} + +// @public (undocumented) +export class GetOptions { + constructor(); + // (undocumented) + getColumnName(): string | undefined; + // (undocumented) + getColumnValues(): Array | undefined; + // (undocumented) + getDownloadUrl(): boolean | undefined; + // (undocumented) + getFields(): Array | undefined; + // (undocumented) + getLimit(): string | undefined; + // (undocumented) + getOffset(): string | undefined; + // (undocumented) + getOrderBy(): OrderByEnum | undefined; + // (undocumented) + getRedactionType(): RedactionType | undefined; + // (undocumented) + getReturnTokens(): boolean | undefined; + // (undocumented) + setColumnName(columnName: string): void; + // (undocumented) + setColumnValues(columnValues: Array): void; + // (undocumented) + setDownloadUrl(downloadUrl: boolean): void; + // (undocumented) + setFields(fields: Array): void; + // (undocumented) + setLimit(limit: string): void; + // (undocumented) + setOffset(offset: string): void; + // (undocumented) + setOrderBy(orderBy: OrderByEnum): void; + // (undocumented) + setRedactionType(redactionType: RedactionType): void; + // (undocumented) + setReturnTokens(returnTokens: boolean): void; +} + +// @public (undocumented) +export class GetRequest { + constructor(table: string, _ids: Array); + // (undocumented) + get ids(): Array; + set ids(value: Array); + // (undocumented) + get table(): string; + set table(value: string); +} + +// @public (undocumented) +export class GetResponse { + constructor(input: { + data: Array; + errors: Array | null; + }); + // (undocumented) + data: Array; + // (undocumented) + errors: Array | null; +} + +// @public (undocumented) +export interface GetResponseData { + // (undocumented) + [key: string]: unknown; +} + +// @public (undocumented) +export interface IndexRange { + // (undocumented) + end?: number; + // (undocumented) + start?: number; +} + +// @public (undocumented) +export class InsertOptions { + constructor(); + // (undocumented) + getContinueOnError(): boolean | undefined; + // (undocumented) + getHomogeneous(): boolean | undefined; + // (undocumented) + getReturnTokens(): boolean | undefined; + // (undocumented) + getTokenMode(): TokenMode | undefined; + // (undocumented) + getTokens(): Array> | undefined; + // (undocumented) + getUpsertColumn(): string | undefined; + // (undocumented) + setContinueOnError(continueOnError: boolean): void; + // (undocumented) + setHomogeneous(homogeneous: boolean): void; + // (undocumented) + setReturnTokens(returnTokens: boolean): void; + // (undocumented) + setTokenMode(tokenMode: TokenMode): void; + // (undocumented) + setTokens(tokens: Array>): void; + // (undocumented) + setUpsertColumn(upsert: string): void; +} + +// @public (undocumented) +export class InsertRequest { + constructor(table: string, data: Record[]); + // (undocumented) + get data(): Record[]; + set data(data: Record[]); + // (undocumented) + get table(): string; + set table(value: string); +} + +// @public (undocumented) +export class InsertResponse { + constructor(input: { + insertedFields: Array; + errors: Array | null; + }); + // (undocumented) + errors: Array | null; + // (undocumented) + insertedFields: Array; +} + +// @public (undocumented) +export interface InsertResponseType { + // (undocumented) + [key: string]: unknown; + // (undocumented) + skyflowId: string; +} + +// @public (undocumented) +export class InvokeConnectionRequest { + constructor(method: RequestMethod, body?: StringKeyValueMapType, headers?: StringKeyValueMapType, pathParams?: StringKeyValueMapType, queryParams?: StringKeyValueMapType); + // (undocumented) + body?: StringKeyValueMapType; + // (undocumented) + headers?: StringKeyValueMapType; + // (undocumented) + method: RequestMethod; + // (undocumented) + pathParams?: StringKeyValueMapType; + // (undocumented) + queryParams?: StringKeyValueMapType; +} + +// @public (undocumented) +export class InvokeConnectionResponse { + constructor(input: { + data?: object; + metadata?: Record; + errors: Array | null; + }); + // (undocumented) + data?: Object; + // (undocumented) + errors: Array | null; + // (undocumented) + metadata?: Record; +} + +// @public (undocumented) +export function isExpired(token: string): boolean; + +// @public (undocumented) +export enum LogLevel { + // (undocumented) + DEBUG = "DEBUG", + // (undocumented) + ERROR = "ERROR", + // (undocumented) + INFO = "INFO", + // (undocumented) + OFF = "OFF", + // (undocumented) + WARN = "WARN" +} + +// @public (undocumented) +export enum MaskingMethod { + // (undocumented) + Blackbox = "blackbox", + // (undocumented) + Blur = "blur" +} + +// @public (undocumented) +export enum OrderByEnum { + // (undocumented) + ASCENDING = "ASCENDING", + // (undocumented) + DESCENDING = "DESCENDING", + // (undocumented) + NONE = "NONE" +} + +// @public (undocumented) +export interface PathCredentials { + // (undocumented) + context?: string | Record; + // (undocumented) + path: string; + // (undocumented) + roles?: Array; +} + +// @public (undocumented) +export class QueryRequest { + constructor(query: string); + // (undocumented) + get query(): string; + set query(value: string); +} + +// @public (undocumented) +export class QueryResponse { + constructor(input: { + fields: Array; + errors: Array | null; + }); + // (undocumented) + errors: Array | null; + // (undocumented) + fields: Array; +} + +// @public (undocumented) +export interface QueryResponseType { + // (undocumented) + [key: string]: unknown; +} + +// @public (undocumented) +export enum RedactionType { + // (undocumented) + DEFAULT = "DEFAULT", + // (undocumented) + MASKED = "MASKED", + // (undocumented) + PLAIN_TEXT = "PLAIN_TEXT", + // (undocumented) + REDACTED = "REDACTED" +} + +// @public (undocumented) +export class ReidentifyTextOptions { + // (undocumented) + getMaskedEntities(): DetectEntities[] | undefined; + // (undocumented) + getPlainTextEntities(): DetectEntities[] | undefined; + // (undocumented) + getRedactedEntities(): DetectEntities[] | undefined; + // (undocumented) + setMaskedEntities(maskedEntities: DetectEntities[]): void; + // (undocumented) + setPlainTextEntities(plainTextEntities: DetectEntities[]): void; + // (undocumented) + setRedactedEntities(redactedEntities: DetectEntities[]): void; +} + +// @public (undocumented) +export class ReidentifyTextRequest { + constructor(text: string); + // (undocumented) + get text(): string; + set text(value: string); +} + +// @public (undocumented) +export class ReidentifyTextResponse { + constructor(input: { + processedText: string; + }); + // (undocumented) + processedText: string; +} + +// @public (undocumented) +export enum RequestMethod { + // (undocumented) + GET = "GET", + // (undocumented) + PATCH = "PATCH", + // (undocumented) + POST = "POST", + // (undocumented) + PUT = "PUT" +} + +// @public (undocumented) +export type SignedDataTokensOptions = { + dataTokens: string[]; + timeToLive?: number; + ctx?: string | Record; + logLevel?: LogLevel; +}; + +// @public (undocumented) +export class Skyflow { + constructor(config: SkyflowConfig); + // (undocumented) + addConnectionConfig(config: ConnectionConfig): void; + // (undocumented) + addVaultConfig(config: VaultConfig): void; + // Warning: (ae-forgotten-export) The symbol "ConnectionController" needs to be exported by the entry point index.d.ts + // + // (undocumented) + connection(connectionId?: string): ConnectionController; + // Warning: (ae-forgotten-export) The symbol "DetectController" needs to be exported by the entry point index.d.ts + // + // (undocumented) + detect(vaultId?: string): DetectController; + // (undocumented) + getConnectionConfig(connectionId: string): ConnectionConfig | VaultConfig; + // (undocumented) + getLogLevel(): LogLevel; + // (undocumented) + getSkyflowCredentials(): Credentials | undefined; + // (undocumented) + getVaultConfig(vaultId: string): ConnectionConfig | VaultConfig; + // (undocumented) + removeConnectionConfig(connectionId: string): void; + // (undocumented) + removeVaultConfig(vaultId: string): void; + // (undocumented) + setLogLevel(logLevel: LogLevel): void; + // (undocumented) + updateConnectionConfig(config: ConnectionConfig): void; + // (undocumented) + updateSkyflowCredentials(credentials: Credentials): void; + // (undocumented) + updateVaultConfig(config: VaultConfig): void; + // Warning: (ae-forgotten-export) The symbol "VaultController" needs to be exported by the entry point index.d.ts + // + // (undocumented) + vault(vaultId?: string): VaultController; +} + +// @public (undocumented) +export interface SkyflowConfig { + // (undocumented) + connectionConfigs?: ConnectionConfig[]; + // (undocumented) + logLevel?: LogLevel; + // (undocumented) + skyflowCredentials?: Credentials; + // (undocumented) + vaultConfigs?: VaultConfig[]; +} + +// @public (undocumented) +export class SkyflowError extends Error { + constructor(errorCode: ISkyflowError, args?: Array); + // Warning: (ae-forgotten-export) The symbol "ISkyflowError" needs to be exported by the entry point index.d.ts + // + // (undocumented) + error?: ISkyflowError; +} + +// @public (undocumented) +export interface SkyflowRecordError { + // (undocumented) + error: string; + // (undocumented) + httpCode?: string | number | null; + // (undocumented) + requestId: string | null; + // (undocumented) + requestIndex?: number | null; + // (undocumented) + token?: string | null; +} + +// @public (undocumented) +export interface StringCredentials { + // (undocumented) + context?: string | Record; + // (undocumented) + credentialsString: string; + // (undocumented) + roles?: Array; +} + +// @public (undocumented) +export interface StringKeyValueMapType { + // (undocumented) + [key: string]: object | string; +} + +// @public (undocumented) +export interface TokenCredentials { + // (undocumented) + token: string; +} + +// @public (undocumented) +export class TokenFormat { + // (undocumented) + getDefault(): string | undefined; + // (undocumented) + getEntityOnly(): string[] | undefined; + // (undocumented) + getEntityUniqueCounter(): string[] | undefined; + // (undocumented) + getVaultToken(): string[] | undefined; + // (undocumented) + setDefault(defaultToken: TokenType): void; + // (undocumented) + setEntityOnly(entityOnly: DetectEntities[]): void; + // (undocumented) + setEntityUniqueCounter(entityUniqueCounter: DetectEntities[]): void; + // (undocumented) + setVaultToken(vaultToken: DetectEntities[]): void; +} + +// @public (undocumented) +export class TokenizeRequest { + constructor(values: Array); + // (undocumented) + get values(): Array; + set values(value: Array); +} + +// @public (undocumented) +export interface TokenizeRequestType { + // (undocumented) + columnGroup: string; + // (undocumented) + value: string; +} + +// @public (undocumented) +export class TokenizeResponse { + constructor(input: { + tokens: Array; + errors: Array | null; + }); + // (undocumented) + errors: Array | null; + // (undocumented) + tokens: Array; +} + +// @public (undocumented) +export enum TokenMode { + // (undocumented) + DISABLE = "DISABLE", + // (undocumented) + ENABLE = "ENABLE", + // (undocumented) + ENABLE_STRICT = "ENABLE_STRICT" +} + +// @public (undocumented) +export enum TokenType { + // (undocumented) + ENTITY_ONLY = "entity_only", + // (undocumented) + ENTITY_UNIQUE_COUNTER = "entity_unq_counter", + // (undocumented) + VAULT_TOKEN = "vault_token" +} + +// @public (undocumented) +export class Transformations { + // (undocumented) + getShiftDays(): { + max: number; + min: number; + entities: DetectEntities[]; + } | undefined; + // (undocumented) + setShiftDays(shiftDays: { + max: number; + min: number; + entities: DetectEntities[]; + }): void; +} + +// @public (undocumented) +export class UpdateOptions { + constructor(); + // (undocumented) + getReturnTokens(): boolean | undefined; + // (undocumented) + getTokenMode(): TokenMode | undefined; + // (undocumented) + getTokens(): Record | undefined; + // (undocumented) + setReturnTokens(returnTokens: boolean): void; + // (undocumented) + setTokenMode(tokenMode: TokenMode): void; + // (undocumented) + setTokens(tokens: Record): void; +} + +// @public (undocumented) +export class UpdateRequest { + constructor(table: string, data: Record); + // (undocumented) + get data(): Record; + set data(value: Record); + // (undocumented) + get table(): string; + set table(value: string); +} + +// @public (undocumented) +export class UpdateResponse { + constructor(input: { + updatedField: InsertResponseType; + errors: Array | null; + }); + // (undocumented) + errors: Array | null; + // (undocumented) + updatedField: InsertResponseType; +} + +// @public (undocumented) +export interface VaultConfig { + // (undocumented) + clusterId: string; + // (undocumented) + credentials?: Credentials; + // (undocumented) + env?: Env; + // (undocumented) + vaultId: string; +} + +// (No @packageDocumentation comment for this package) + +``` From d4f06601128bd57e009d476509d9439d0d8a7cd8 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Wed, 13 May 2026 17:27:04 +0530 Subject: [PATCH 05/34] SK-2812: Updated new changes --- src/service-account/index.ts | 4 +-- src/vault/controller/vault/index.ts | 14 +++++------ src/vault/types/index.ts | 4 +-- test/utils/validations.test.js | 39 ----------------------------- test/vault/controller/vault.test.js | 6 ++--- 5 files changed, 14 insertions(+), 53 deletions(-) diff --git a/src/service-account/index.ts b/src/service-account/index.ts index 57a6225a..081bcd3a 100644 --- a/src/service-account/index.ts +++ b/src/service-account/index.ts @@ -108,7 +108,7 @@ function getToken(credentials, options?: BearerTokenOptions): Promise { response.success.push({ - skyflow_id: String(field?.skyflow_id), - request_index: index, + skyflowId: String(field?.skyflow_id), + requestIndex: index, ...(typeof field?.tokens === 'object' && field?.tokens !== null ? field.tokens : {}) }); }); @@ -213,7 +213,7 @@ class VaultController { private parseBulkInsertResponse(records: Record[]): InsertResponse { const insertedFields: InsertResponseType[] = records.map(record => ({ - skyflow_id: String(record.skyflow_id), + skyflowId: String(record.skyflow_id), ...(typeof record.tokens === 'object' && record.tokens !== null ? record.tokens : {}) })); return new InsertResponse({ insertedFields, errors: null }); @@ -278,7 +278,7 @@ class VaultController { byot: strictMode }; - this.handleRequest( + this.handleRequest( (headers: Records.RequestOptions | undefined) => this.client.vaultAPI.recordServiceUpdateRecord( this.client.vaultId, request.table, @@ -290,7 +290,7 @@ class VaultController { ).then(data => { printLog(logs.infoLogs.UPDATE_SUCCESS, MessageType.LOG, this.client.getLogLevel()); const updatedRecord = { - skyflow_id: data.skyflow_id, + skyflowId: data.skyflow_id ?? '', ...data?.tokens }; resolve(new UpdateResponse({ updatedField: updatedRecord, errors: null })); diff --git a/src/vault/types/index.ts b/src/vault/types/index.ts index 36c5e997..b08ed635 100644 --- a/src/vault/types/index.ts +++ b/src/vault/types/index.ts @@ -40,7 +40,7 @@ export interface ClientObj { } export interface InsertResponseType { - skyflow_id: string; + skyflowId: string; [key: string]: unknown; } @@ -169,7 +169,7 @@ export interface DetectFileResponse { requestId: string; } export interface SkyflowIdResponse { - skyflow_id: string; + skyflowId: string; } export interface TokensResponse extends SkyflowIdResponse { diff --git a/test/utils/validations.test.js b/test/utils/validations.test.js index 52874cf6..3f15866a 100644 --- a/test/utils/validations.test.js +++ b/test/utils/validations.test.js @@ -1266,45 +1266,6 @@ test('should throw error when table name is invalid', () => { expect(() => validateInsertRequest(request, undefined, LogLevel.ERROR)).not.toThrow(); }); - describe('fail-fast validation: null/undefined/empty field values', () => { - const baseRequest = (data) => ({ _table: 'users', table: 'users', data }); - - test('throws EMPTY_FIELD for null field value', () => { - expect(() => validateInsertRequest(baseRequest([{ card: null }]))) - .toThrow(SKYFLOW_ERROR_CODE.EMPTY_FIELD); - }); - - test('throws EMPTY_FIELD for undefined field value', () => { - expect(() => validateInsertRequest(baseRequest([{ card: undefined }]))) - .toThrow(SKYFLOW_ERROR_CODE.EMPTY_FIELD); - }); - - test('throws EMPTY_FIELD for empty string field value', () => { - expect(() => validateInsertRequest(baseRequest([{ card: '' }]))) - .toThrow(SKYFLOW_ERROR_CODE.EMPTY_FIELD); - }); - - test('throws EMPTY_FIELD when one of multiple fields is null', () => { - expect(() => validateInsertRequest(baseRequest([{ name: 'John', ssn: null }]))) - .toThrow(SKYFLOW_ERROR_CODE.EMPTY_FIELD); - }); - - test('does not throw for 0 (valid falsy value)', () => { - expect(() => validateInsertRequest(baseRequest([{ amount: 0 }]))).not.toThrow(); - }); - - test('does not throw for false (valid falsy value)', () => { - expect(() => validateInsertRequest(baseRequest([{ active: false }]))).not.toThrow(); - }); - - test('does not throw for 0.0 (valid falsy value)', () => { - expect(() => validateInsertRequest(baseRequest([{ score: 0.0 }]))).not.toThrow(); - }); - - test('does not throw for valid string fields', () => { - expect(() => validateInsertRequest(baseRequest([{ card: '4111111111111111', name: 'Alice' }]))).not.toThrow(); - }); - }); }); diff --git a/test/vault/controller/vault.test.js b/test/vault/controller/vault.test.js index 4615cc9a..2bb7dddb 100644 --- a/test/vault/controller/vault.test.js +++ b/test/vault/controller/vault.test.js @@ -1249,7 +1249,7 @@ describe('VaultController update method', () => { expect.any(Object) // Headers ); expect(response).toBeInstanceOf(UpdateResponse); - expect(response.updatedField.skyflow_id).toBe('id123'); + expect(response.updatedField.skyflowId).toBe('id123'); expect(response.updatedField.field1).toBe('token123'); expect(response.errors).toBeNull(); }); @@ -1280,7 +1280,7 @@ describe('VaultController update method', () => { expect.any(Object) // Headers ); expect(response).toBeInstanceOf(UpdateResponse); - expect(response.updatedField.skyflow_id).toBe('id123'); + expect(response.updatedField.skyflowId).toBe('id123'); expect(response.updatedField.field1).toBe('token123'); expect(response.errors).toBeNull(); }); @@ -1314,7 +1314,7 @@ describe('VaultController update method', () => { expect.any(Object) // Headers ); expect(response).toBeInstanceOf(UpdateResponse); - expect(response.updatedField.skyflow_id).toBe('id123'); + expect(response.updatedField.skyflowId).toBe('id123'); expect(response.updatedField.field1).toBe('token123'); expect(response.errors).toBeNull(); }); From 730b6552f55cb93e6722d50ab32370a297c20f4e Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Wed, 13 May 2026 18:42:08 +0530 Subject: [PATCH 06/34] SK-2812: updated package-lock --- package-lock.json | 4899 +++++++++++++++++--------- src/utils/validations/index.ts | 2 +- src/vault/controller/detect/index.ts | 25 +- src/vault/controller/vault/index.ts | 7 +- 4 files changed, 3348 insertions(+), 1585 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5bba127b..308d0272 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "skyflow-node", - "version": "2.0.2-dev.2a81ccd", + "version": "2.0.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "skyflow-node", - "version": "2.0.2-dev.2a81ccd", + "version": "2.0.4", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.1", @@ -29,6 +29,7 @@ "@babel/preset-env": "^7.25.8", "@babel/preset-typescript": "^7.25.7", "@eslint/js": "^9.39.2", + "@microsoft/api-extractor": "^7.58.5", "@types/jest": "^29.5.14", "@types/jsonwebtoken": "^9.0.6", "@types/node": "^18.19.70", @@ -49,28 +50,14 @@ "webpack": "^5.97.1" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -79,9 +66,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", - "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", "dev": true, "license": "MIT", "engines": { @@ -89,22 +76,22 @@ } }, "node_modules/@babel/core": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", - "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helpers": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -120,16 +107,16 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -137,26 +124,26 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", - "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -167,18 +154,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.3.tgz", + "integrity": "sha512-RpLYy2sb51oNLjuu1iD3bwBqCBWUzjO0ocp+iaCP/lJtb2CPLcnC2Fftw+4sAzaMELGeWTgExSKADbdo0GFVzA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", + "@babel/traverse": "^7.29.0", "semver": "^6.3.1" }, "engines": { @@ -189,14 +176,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -207,60 +194,70 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", - "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.11" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", - "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -283,9 +280,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, "license": "MIT", "engines": { @@ -311,15 +308,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -353,9 +350,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -373,42 +370,42 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", - "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", - "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -418,14 +415,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -466,6 +463,23 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.3.tgz", + "integrity": "sha512-SRS46DFR4HqzUzCVgi90/xMoL+zeBDBvWdKYXSEzh79kXswNFEglUpMKxR04//dPqwYXWUBJ3mpUd933ru9Kmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", @@ -485,14 +499,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -502,15 +516,15 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.27.1.tgz", - "integrity": "sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", + "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-decorators": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -588,13 +602,13 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", - "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -604,13 +618,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -620,13 +634,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -662,13 +676,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -788,13 +802,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -837,15 +851,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -855,14 +869,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { @@ -889,13 +903,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", - "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -905,14 +919,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -922,14 +936,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -939,18 +953,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -959,24 +973,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -986,13 +991,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", - "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1002,14 +1008,14 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1035,14 +1041,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1067,14 +1073,31 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1135,13 +1158,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1167,13 +1190,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1216,14 +1239,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1233,16 +1256,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.29.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.4.tgz", + "integrity": "sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" }, "engines": { "node": ">=6.9.0" @@ -1269,14 +1292,14 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1302,13 +1325,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1318,13 +1341,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1350,16 +1373,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.2.tgz", - "integrity": "sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1" + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1386,13 +1410,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1402,13 +1426,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1419,9 +1443,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", - "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "dev": true, "license": "MIT", "dependencies": { @@ -1435,14 +1459,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1452,15 +1476,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1486,13 +1510,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", - "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1502,14 +1526,14 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1535,17 +1559,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.1.tgz", - "integrity": "sha512-TqGF3desVsTcp3WrJGj4HfKokfCXCLcHpt4PJF0D8/iT6LPd9RS82Upw3KPeyr6B22Lfd3DO8MVrmp0oRkUDdw==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz", + "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", "semver": "^6.3.1" }, "engines": { @@ -1572,13 +1596,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { @@ -1637,17 +1661,17 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", - "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1" + "@babel/plugin-syntax-typescript": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1673,14 +1697,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1707,14 +1731,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -1724,80 +1748,82 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "version": "7.29.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.5.tgz", + "integrity": "sha512-/69t2aEzGKHD76DyLbHysF/QH2LJOB8iFnYO37unDTKBTubzcMRv0f3H5EiN1Q6ajOd/eB7dAInF0qdFVS06kA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", + "@babel/compat-data": "^7.29.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", - "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", - "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", - "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.4", "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", "semver": "^6.3.1" }, "engines": { @@ -1807,6 +1833,20 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", @@ -1823,9 +1863,9 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", - "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", "dev": true, "license": "MIT", "dependencies": { @@ -1833,7 +1873,7 @@ "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.27.1" + "@babel/plugin-transform-typescript": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1843,66 +1883,57 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1916,92 +1947,103 @@ "license": "MIT" }, "node_modules/@cspell/cspell-bundled-dicts": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.3.1.tgz", - "integrity": "sha512-vL94iLjEzPTBAoc4v4iY87jUNDYvhG7S3Lkxc9Jdcyk+aeXnoqYK7mCRFOSPSbB2pT2bugX6S6ZaLKVMpY73gA==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.8.0.tgz", + "integrity": "sha512-MpXFpVyBPfJQ1YuVotljqUaGf6lWuf+fuWBBgs0PHFYTSjRPWuIxviAaCDnup/CJLLH60xQL4IlcQe4TOjzljw==", "dev": true, "license": "MIT", "dependencies": { "@cspell/dict-ada": "^4.1.1", "@cspell/dict-al": "^1.1.1", - "@cspell/dict-aws": "^4.0.15", + "@cspell/dict-aws": "^4.0.17", "@cspell/dict-bash": "^4.2.2", - "@cspell/dict-companies": "^3.2.7", - "@cspell/dict-cpp": "^6.0.14", + "@cspell/dict-companies": "^3.2.11", + "@cspell/dict-cpp": "^7.0.2", "@cspell/dict-cryptocurrencies": "^5.0.5", - "@cspell/dict-csharp": "^4.0.7", - "@cspell/dict-css": "^4.0.18", - "@cspell/dict-dart": "^2.3.1", - "@cspell/dict-data-science": "^2.0.11", - "@cspell/dict-django": "^4.1.5", - "@cspell/dict-docker": "^1.1.16", - "@cspell/dict-dotnet": "^5.0.10", + "@cspell/dict-csharp": "^4.0.8", + "@cspell/dict-css": "^4.1.1", + "@cspell/dict-dart": "^2.3.2", + "@cspell/dict-data-science": "^2.0.13", + "@cspell/dict-django": "^4.1.6", + "@cspell/dict-docker": "^1.1.17", + "@cspell/dict-dotnet": "^5.0.13", "@cspell/dict-elixir": "^4.0.8", - "@cspell/dict-en_us": "^4.4.24", - "@cspell/dict-en-common-misspellings": "^2.1.8", - "@cspell/dict-en-gb-mit": "^3.1.14", - "@cspell/dict-filetypes": "^3.0.14", + "@cspell/dict-en_us": "^4.4.33", + "@cspell/dict-en-common-misspellings": "^2.1.12", + "@cspell/dict-en-gb-mit": "^3.1.22", + "@cspell/dict-filetypes": "^3.0.18", "@cspell/dict-flutter": "^1.1.1", - "@cspell/dict-fonts": "^4.0.5", + "@cspell/dict-fonts": "^4.0.6", "@cspell/dict-fsharp": "^1.1.1", - "@cspell/dict-fullstack": "^3.2.7", + "@cspell/dict-fullstack": "^3.2.9", "@cspell/dict-gaming-terms": "^1.1.2", - "@cspell/dict-git": "^3.0.7", - "@cspell/dict-golang": "^6.0.24", + "@cspell/dict-git": "^3.1.0", + "@cspell/dict-golang": "^6.0.26", "@cspell/dict-google": "^1.0.9", "@cspell/dict-haskell": "^4.0.6", - "@cspell/dict-html": "^4.0.12", - "@cspell/dict-html-symbol-entities": "^4.0.4", + "@cspell/dict-html": "^4.0.15", + "@cspell/dict-html-symbol-entities": "^4.0.5", "@cspell/dict-java": "^5.0.12", "@cspell/dict-julia": "^1.1.1", "@cspell/dict-k8s": "^1.0.12", "@cspell/dict-kotlin": "^1.1.1", - "@cspell/dict-latex": "^4.0.4", + "@cspell/dict-latex": "^5.1.0", "@cspell/dict-lorem-ipsum": "^4.0.5", "@cspell/dict-lua": "^4.0.8", "@cspell/dict-makefile": "^1.0.5", - "@cspell/dict-markdown": "^2.0.12", - "@cspell/dict-monkeyc": "^1.0.11", - "@cspell/dict-node": "^5.0.8", - "@cspell/dict-npm": "^5.2.20", - "@cspell/dict-php": "^4.1.0", + "@cspell/dict-markdown": "^2.0.16", + "@cspell/dict-monkeyc": "^1.0.12", + "@cspell/dict-node": "^5.0.9", + "@cspell/dict-npm": "^5.2.38", + "@cspell/dict-php": "^4.1.1", "@cspell/dict-powershell": "^5.0.15", - "@cspell/dict-public-licenses": "^2.0.15", - "@cspell/dict-python": "^4.2.21", + "@cspell/dict-public-licenses": "^2.0.16", + "@cspell/dict-python": "^4.2.26", "@cspell/dict-r": "^2.1.1", - "@cspell/dict-ruby": "^5.0.9", - "@cspell/dict-rust": "^4.0.12", - "@cspell/dict-scala": "^5.0.8", + "@cspell/dict-ruby": "^5.1.1", + "@cspell/dict-rust": "^4.1.2", + "@cspell/dict-scala": "^5.0.9", "@cspell/dict-shell": "^1.1.2", - "@cspell/dict-software-terms": "^5.1.11", + "@cspell/dict-software-terms": "^5.2.2", "@cspell/dict-sql": "^2.2.1", "@cspell/dict-svelte": "^1.0.7", "@cspell/dict-swift": "^2.0.6", "@cspell/dict-terraform": "^1.1.3", "@cspell/dict-typescript": "^3.2.3", - "@cspell/dict-vue": "^3.0.5" + "@cspell/dict-vue": "^3.0.5", + "@cspell/dict-zig": "^1.0.0" }, "engines": { "node": ">=20" } }, "node_modules/@cspell/cspell-json-reporter": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.3.1.tgz", - "integrity": "sha512-XvMupq2jV3lRMEaiFXrsfR3xrvMQ4Im194dRZ02D2qdtYtKV9jErms/OhGmfs1YNLrQaTyDKAAyZLRxhJSmL3g==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.8.0.tgz", + "integrity": "sha512-nqUaSo9T7l8KrE22gc7ZIs+zvP7ak1i7JqGdRs8sGvh2Ijqj43qYQLePgb1b/vm8a1bavnc51m+vf05hpd3g3Q==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/cspell-types": "9.3.1" + "@cspell/cspell-types": "9.8.0" }, "engines": { "node": ">=20" } }, + "node_modules/@cspell/cspell-performance-monitor": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-performance-monitor/-/cspell-performance-monitor-9.8.0.tgz", + "integrity": "sha512-IsrXYzn23yJICIQ915ACdf+2lNEcFNTu5BIQt3khHOsGVvZ9/AZYpu9Dk825vUyZG7RHg2Oi6dYNiJtULG4ouQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18" + } + }, "node_modules/@cspell/cspell-pipe": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.3.1.tgz", - "integrity": "sha512-MqCoUDwq2z4dn5fYMFrLYHjQyueqhvCNyztPS2ifhXJiEyr/YV61cLvQh/HoZlFmBSL7ViMXjejtL29LTLOEzA==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-9.8.0.tgz", + "integrity": "sha512-ISEUD8PHYkd2Ktafc6hFfIXdGKYUvthA09NbwwZsWmOqYyk4wWKHZKqyyxD+BcrFwOyMOJcD8OEvIjkRQp2SJw==", "dev": true, "license": "MIT", "engines": { @@ -2009,22 +2051,22 @@ } }, "node_modules/@cspell/cspell-resolver": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.3.1.tgz", - "integrity": "sha512-HpgvmgZO+fCF9syPAX+XJRPYya4w3UFA5T8Uj0Ic19tjwoCgtj2F1SMAqr3iah97xH/9bh9tSHdfa7HIWD1J+Q==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-9.8.0.tgz", + "integrity": "sha512-PZJj56BZpKfMxOzWkyt7b+aIXObe+8Ku/zLI4xDXPSuQPENbHBFHfPIZx68CyGEkanKxZ1ewKVx/FT1FUy+wDA==", "dev": true, "license": "MIT", "dependencies": { - "global-directory": "^4.0.1" + "global-directory": "^5.0.0" }, "engines": { "node": ">=20" } }, "node_modules/@cspell/cspell-service-bus": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.3.1.tgz", - "integrity": "sha512-mbCuHzcLIrvEOAcWxFmF+cgdIEWEs8bEkUTPA62EjQcQ8RzH82jVUPYDqPGJ7bThoinG/Xfk90EqHgh1b1kEOw==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-9.8.0.tgz", + "integrity": "sha512-P45sd2nqwcqhulBBbQnZB/JNcobecTrP4Ky3vmEq0cprsvavc+ZoHF9U2Ql5ghMSUzjrF2n1aNzZ8cH4IlsnKg==", "dev": true, "license": "MIT", "engines": { @@ -2032,15 +2074,28 @@ } }, "node_modules/@cspell/cspell-types": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.3.1.tgz", - "integrity": "sha512-6KBVCN5dEk1+p0RP27DCjmtVNUmn0q+Zovthr35dmKOom2vNgAzFapneXIlir6jWSdKZ8b/5qbwbdhL0ATai5w==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-9.8.0.tgz", + "integrity": "sha512-7Ge4UD6SCA49Tcc3+GTlz3Xn4cqVUAXtDO0u9IeHvJgkN3Me2Rw2GB/CtGmhKST3YeEeZMX7ww09TdHMUJlehw==", "dev": true, "license": "MIT", "engines": { "node": ">=20" } }, + "node_modules/@cspell/cspell-worker": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/cspell-worker/-/cspell-worker-9.8.0.tgz", + "integrity": "sha512-W8FLdE3MXPLbWtAXciILQhk9CHd6Mt+HRjZHM8m+dwE1Bc2TAjUai8kIxsdhHUq58p7gYY2ekr5sg1uYOUgTAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cspell-lib": "9.8.0" + }, + "engines": { + "node": ">=20.18" + } + }, "node_modules/@cspell/dict-ada": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.1.1.tgz", @@ -2056,9 +2111,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-aws": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.15.tgz", - "integrity": "sha512-aPY7VVR5Os4rz36EaqXBAEy14wR4Rqv+leCJ2Ug/Gd0IglJpM30LalF3e2eJChnjje3vWoEC0Rz3+e5gpZG+Kg==", + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.17.tgz", + "integrity": "sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w==", "dev": true, "license": "MIT" }, @@ -2073,16 +2128,16 @@ } }, "node_modules/@cspell/dict-companies": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.7.tgz", - "integrity": "sha512-fEyr3LmpFKTaD0LcRhB4lfW1AmULYBqzg4gWAV0dQCv06l+TsA+JQ+3pZJbUcoaZirtgsgT3dL3RUjmGPhUH0A==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.11.tgz", + "integrity": "sha512-0cmafbcz2pTHXLd59eLR1gvDvN6aWAOM0+cIL4LLF9GX9yB2iKDNrKsvs4tJRqutoaTdwNFBbV0FYv+6iCtebQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-cpp": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-6.0.14.tgz", - "integrity": "sha512-dkmpSwvVfVdtoZ4mW/CK2Ep1v8mJlp6uiKpMNbSMOdJl4kq28nQS4vKNIX3B2bJa0Ha5iHHu+1mNjiLeO3g7Xg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-7.0.2.tgz", + "integrity": "sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA==", "dev": true, "license": "MIT" }, @@ -2094,51 +2149,51 @@ "license": "MIT" }, "node_modules/@cspell/dict-csharp": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.7.tgz", - "integrity": "sha512-H16Hpu8O/1/lgijFt2lOk4/nnldFtQ4t8QHbyqphqZZVE5aS4J/zD/WvduqnLY21aKhZS6jo/xF5PX9jyqPKUA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.8.tgz", + "integrity": "sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-css": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.18.tgz", - "integrity": "sha512-EF77RqROHL+4LhMGW5NTeKqfUd/e4OOv6EDFQ/UQQiFyWuqkEKyEz0NDILxOFxWUEVdjT2GQ2cC7t12B6pESwg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.1.1.tgz", + "integrity": "sha512-y/Vgo6qY08e1t9OqR56qjoFLBCpi4QfWMf2qzD1l9omRZwvSMQGRPz4x0bxkkkU4oocMAeztjzCsmLew//c/8w==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-dart": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.3.1.tgz", - "integrity": "sha512-xoiGnULEcWdodXI6EwVyqpZmpOoh8RA2Xk9BNdR7DLamV/QMvEYn8KJ7NlRiTSauJKPNkHHQ5EVHRM6sTS7jdg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.3.2.tgz", + "integrity": "sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-data-science": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.11.tgz", - "integrity": "sha512-Dt+83nVCcF+dQyvFSaZjCKt1H5KbsVJFtH2X7VUfmIzQu8xCnV1fUmkhBzGJ+NiFs99Oy9JA6I9EjeqExzXk7g==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.13.tgz", + "integrity": "sha512-l1HMEhBJkPmw4I2YGVu2eBSKM89K9pVF+N6qIr5Uo5H3O979jVodtuwP8I7LyPrJnC6nz28oxeGRCLh9xC5CVA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-django": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.5.tgz", - "integrity": "sha512-AvTWu99doU3T8ifoMYOMLW2CXKvyKLukPh1auOPwFGHzueWYvBBN+OxF8wF7XwjTBMMeRleVdLh3aWCDEX/ZWg==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.6.tgz", + "integrity": "sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-docker": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.16.tgz", - "integrity": "sha512-UiVQ5RmCg6j0qGIxrBnai3pIB+aYKL3zaJGvXk1O/ertTKJif9RZikKXCEgqhaCYMweM4fuLqWSVmw3hU164Iw==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.17.tgz", + "integrity": "sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-dotnet": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.10.tgz", - "integrity": "sha512-ooar8BP/RBNP1gzYfJPStKEmpWy4uv/7JCq6FOnJLeD1yyfG3d/LFMVMwiJo+XWz025cxtkM3wuaikBWzCqkmg==", + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.13.tgz", + "integrity": "sha512-xPp7jMnFpOri7tzmqmm/dXMolXz1t2bhNqxYkOyMqXhvs08oc7BFs+EsbDY0X7hqiISgeFZGNqn0dOCr+ncPYw==", "dev": true, "license": "MIT" }, @@ -2150,30 +2205,30 @@ "license": "MIT" }, "node_modules/@cspell/dict-en_us": { - "version": "4.4.24", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.24.tgz", - "integrity": "sha512-JE+/H2YicHJTneRmgH4GSI21rS+1yGZVl1jfOQgl8iHLC+yTTMtCvueNDMK94CgJACzYAoCsQB70MqiFJJfjLQ==", + "version": "4.4.33", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.33.tgz", + "integrity": "sha512-zWftVqfUStDA37wO1ZNDN1qMJOfcxELa8ucHW8W8wBAZY3TK5Nb6deLogCK/IJi/Qljf30dwwuqqv84Qqle9Tw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-en-common-misspellings": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.8.tgz", - "integrity": "sha512-vDsjRFPQGuAADAiitf82z9Mz3DcqKZi6V5hPAEIFkLLKjFVBcjUsSq59SfL59ElIFb76MtBO0BLifdEbBj+DoQ==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.12.tgz", + "integrity": "sha512-14Eu6QGqyksqOd4fYPuRb58lK1Va7FQK9XxFsRKnZU8LhL3N+kj7YKDW+7aIaAN/0WGEqslGP6lGbQzNti8Akw==", "dev": true, "license": "CC BY-SA 4.0" }, "node_modules/@cspell/dict-en-gb-mit": { - "version": "3.1.14", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.14.tgz", - "integrity": "sha512-b+vEerlHP6rnNf30tmTJb7JZnOq4WAslYUvexOz/L3gDna9YJN3bAnwRJ3At3bdcOcMG7PTv3Pi+C73IR22lNg==", + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.22.tgz", + "integrity": "sha512-xE5Vg6gGdMkZ1Ep6z9SJMMioGkkT1GbxS5Mm0U3Ey1/H68P0G7cJcyiVr1CARxFbLqKE4QUpoV1o6jz1Z5Yl9Q==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-filetypes": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.14.tgz", - "integrity": "sha512-KSXaSMYYNMLLdHEnju1DyRRH3eQWPRYRnOXpuHUdOh2jC44VgQoxyMU7oB3NAhDhZKBPCihabzECsAGFbdKfEA==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.18.tgz", + "integrity": "sha512-yU7RKD/x1IWmDLzWeiItMwgV+6bUcU/af23uS0+uGiFUbsY1qWV/D4rxlAAO6Z7no3J2z8aZOkYIOvUrJq0Rcw==", "dev": true, "license": "MIT" }, @@ -2185,9 +2240,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-fonts": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.5.tgz", - "integrity": "sha512-BbpkX10DUX/xzHs6lb7yzDf/LPjwYIBJHJlUXSBXDtK/1HaeS+Wqol4Mlm2+NAgZ7ikIE5DQMViTgBUY3ezNoQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.6.tgz", + "integrity": "sha512-aR/0csY01dNb0A1tw/UmN9rKgHruUxsYsvXu6YlSBJFu60s26SKr/k1o4LavpHTQ+lznlYMqAvuxGkE4Flliqw==", "dev": true, "license": "MIT" }, @@ -2199,9 +2254,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-fullstack": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.7.tgz", - "integrity": "sha512-IxEk2YAwAJKYCUEgEeOg3QvTL4XLlyArJElFuMQevU1dPgHgzWElFevN5lsTFnvMFA1riYsVinqJJX0BanCFEg==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.9.tgz", + "integrity": "sha512-diZX+usW5aZ4/b2T0QM/H/Wl9aNMbdODa1Jq0ReBr/jazmNeWjd+PyqeVgzd1joEaHY+SAnjrf/i9CwKd2ZtWQ==", "dev": true, "license": "MIT" }, @@ -2213,16 +2268,16 @@ "license": "MIT" }, "node_modules/@cspell/dict-git": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.0.7.tgz", - "integrity": "sha512-odOwVKgfxCQfiSb+nblQZc4ErXmnWEnv8XwkaI4sNJ7cNmojnvogYVeMqkXPjvfrgEcizEEA4URRD2Ms5PDk1w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.1.0.tgz", + "integrity": "sha512-KEt9zGkxqGy2q1nwH4CbyqTSv5nadpn8BAlDnzlRcnL0Xb3LX9xTgSGShKvzb0bw35lHoYyLWN2ZKAqbC4pgGQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-golang": { - "version": "6.0.24", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.24.tgz", - "integrity": "sha512-rY7PlC3MsHozmjrZWi0HQPUl0BVCV0+mwK0rnMT7pOIXqOe4tWCYMULDIsEk4F0gbIxb5badd2dkCPDYjLnDgA==", + "version": "6.0.26", + "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.26.tgz", + "integrity": "sha512-YKA7Xm5KeOd14v5SQ4ll6afe9VSy3a2DWM7L9uBq4u3lXToRBQ1W5PRa+/Q9udd+DTURyVVnQ+7b9cnOlNxaRg==", "dev": true, "license": "MIT" }, @@ -2241,16 +2296,16 @@ "license": "MIT" }, "node_modules/@cspell/dict-html": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.12.tgz", - "integrity": "sha512-JFffQ1dDVEyJq6tCDWv0r/RqkdSnV43P2F/3jJ9rwLgdsOIXwQbXrz6QDlvQLVvNSnORH9KjDtenFTGDyzfCaA==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.15.tgz", + "integrity": "sha512-GJYnYKoD9fmo2OI0aySEGZOjThnx3upSUvV7mmqUu8oG+mGgzqm82P/f7OqsuvTaInZZwZbo+PwJQd/yHcyFIw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-html-symbol-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.4.tgz", - "integrity": "sha512-afea+0rGPDeOV9gdO06UW183Qg6wRhWVkgCFwiO3bDupAoyXRuvupbb5nUyqSTsLXIKL8u8uXQlJ9pkz07oVXw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz", + "integrity": "sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==", "dev": true, "license": "MIT" }, @@ -2283,9 +2338,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-latex": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-4.0.4.tgz", - "integrity": "sha512-YdTQhnTINEEm/LZgTzr9Voz4mzdOXH7YX+bSFs3hnkUHCUUtX/mhKgf1CFvZ0YNM2afjhQcmLaR9bDQVyYBvpA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-5.1.0.tgz", + "integrity": "sha512-qxT4guhysyBt0gzoliXYEBYinkAdEtR2M7goRaUH0a7ltCsoqqAeEV8aXYRIdZGcV77gYSobvu3jJL038tlPAw==", "dev": true, "license": "MIT" }, @@ -2311,43 +2366,43 @@ "license": "MIT" }, "node_modules/@cspell/dict-markdown": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.12.tgz", - "integrity": "sha512-ufwoliPijAgWkD/ivAMC+A9QD895xKiJRF/fwwknQb7kt7NozTLKFAOBtXGPJAB4UjhGBpYEJVo2elQ0FCAH9A==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.16.tgz", + "integrity": "sha512-976RRqKv6cwhrxdFCQP2DdnBVB86BF57oQtPHy4Zbf4jF/i2Oy29MCrxirnOBalS1W6KQeto7NdfDXRAwkK4PQ==", "dev": true, "license": "MIT", "peerDependencies": { - "@cspell/dict-css": "^4.0.18", - "@cspell/dict-html": "^4.0.12", - "@cspell/dict-html-symbol-entities": "^4.0.4", + "@cspell/dict-css": "^4.1.1", + "@cspell/dict-html": "^4.0.15", + "@cspell/dict-html-symbol-entities": "^4.0.5", "@cspell/dict-typescript": "^3.2.3" } }, "node_modules/@cspell/dict-monkeyc": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.11.tgz", - "integrity": "sha512-7Q1Ncu0urALI6dPTrEbSTd//UK0qjRBeaxhnm8uY5fgYNFYAG+u4gtnTIo59S6Bw5P++4H3DiIDYoQdY/lha8w==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.12.tgz", + "integrity": "sha512-MN7Vs11TdP5mbdNFQP5x2Ac8zOBm97ARg6zM5Sb53YQt/eMvXOMvrep7+/+8NJXs0jkp70bBzjqU4APcqBFNAw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-node": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.8.tgz", - "integrity": "sha512-AirZcN2i84ynev3p2/1NCPEhnNsHKMz9zciTngGoqpdItUb2bDt1nJBjwlsrFI78GZRph/VaqTVFwYikmncpXg==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.9.tgz", + "integrity": "sha512-hO+ga+uYZ/WA4OtiMEyKt5rDUlUyu3nXMf8KVEeqq2msYvAPdldKBGH7lGONg6R/rPhv53Rb+0Y1SLdoK1+7wQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-npm": { - "version": "5.2.20", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.20.tgz", - "integrity": "sha512-tJRv1qEdW3f8fxK/D2huoqkSvM6ogz55hAt9RTdB7tZy57wio9Tkj+xfi2DIeOlmf6e94c6pNPZIC/o5rclMhw==", + "version": "5.2.38", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.38.tgz", + "integrity": "sha512-21ucGRPYYhr91C2cDBoMPTrcIOStQv33xOqJB0JLoC5LAs2Sfj9EoPGhGb+gIFVHz6Ia7JQWE2SJsOVFJD1wmg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-php": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.1.0.tgz", - "integrity": "sha512-dTDeabyOj7eFvn2Q4Za3uVXM2+SzeFMqX8ly2P0XTo4AzbCmI2hulFD/QIADwWmwiRrInbbf8cxwFHNIYrXl4w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.1.1.tgz", + "integrity": "sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA==", "dev": true, "license": "MIT" }, @@ -2359,20 +2414,20 @@ "license": "MIT" }, "node_modules/@cspell/dict-public-licenses": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.15.tgz", - "integrity": "sha512-cJEOs901H13Pfy0fl4dCD1U+xpWIMaEPq8MeYU83FfDZvellAuSo4GqWCripfIqlhns/L6+UZEIJSOZnjgy7Wg==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.16.tgz", + "integrity": "sha512-EQRrPvEOmwhwWezV+W7LjXbIBjiy6y/shrET6Qcpnk3XANTzfvWflf9PnJ5kId/oKWvihFy0za0AV1JHd03pSQ==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-python": { - "version": "4.2.21", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.21.tgz", - "integrity": "sha512-M9OgwXWhpZqEZqKU2psB2DFsT8q5SwEahkQeIpNIRWIErjwG7I9yYhhfvPz6s5gMCMhhb3hqcPJTnmdgqGrQyg==", + "version": "4.2.26", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.26.tgz", + "integrity": "sha512-hbjN6BjlSgZOG2dA2DtvYNGBM5Aq0i0dHaZjMOI9K/9vRicVvKbcCiBSSrR3b+jwjhQL5ff7HwG5xFaaci0GQA==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/dict-data-science": "^2.0.11" + "@cspell/dict-data-science": "^2.0.13" } }, "node_modules/@cspell/dict-r": { @@ -2383,23 +2438,23 @@ "license": "MIT" }, "node_modules/@cspell/dict-ruby": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.0.9.tgz", - "integrity": "sha512-H2vMcERMcANvQshAdrVx0XoWaNX8zmmiQN11dZZTQAZaNJ0xatdJoSqY8C8uhEMW89bfgpN+NQgGuDXW2vmXEw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.1.1.tgz", + "integrity": "sha512-LHrp84oEV6q1ZxPPyj4z+FdKyq1XAKYPtmGptrd+uwHbrF/Ns5+fy6gtSi7pS+uc0zk3JdO9w/tPK+8N1/7WUA==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-rust": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.0.12.tgz", - "integrity": "sha512-z2QiH+q9UlNhobBJArvILRxV8Jz0pKIK7gqu4TgmEYyjiu1TvnGZ1tbYHeu9w3I/wOP6UMDoCBTty5AlYfW0mw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.1.2.tgz", + "integrity": "sha512-O1FHrumYcO+HZti3dHfBPUdnDFkI+nbYK3pxYmiM1sr+G0ebOd6qchmswS0Wsc6ZdEVNiPYJY/gZQR6jfW3uOg==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-scala": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.8.tgz", - "integrity": "sha512-YdftVmumv8IZq9zu1gn2U7A4bfM2yj9Vaupydotyjuc+EEZZSqAafTpvW/jKLWji2TgybM1L2IhmV0s/Iv9BTw==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.9.tgz", + "integrity": "sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==", "dev": true, "license": "MIT" }, @@ -2411,9 +2466,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-software-terms": { - "version": "5.1.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.1.11.tgz", - "integrity": "sha512-xwARdlp6o81BK7uNl4qR5CmLBXuc9xWyEeEwzeAw/8SkBdYheVQO6F1Fey2iqMRDT9LAb5Znbg83pJVpLjgBjg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.2.2.tgz", + "integrity": "sha512-0CaYd6TAsKtEoA7tNswm1iptEblTzEe3UG8beG2cpSTHk7afWIVMtJLgXDv0f/Li67Lf3Z1Jf3JeXR7GsJ2TRw==", "dev": true, "license": "MIT" }, @@ -2459,14 +2514,21 @@ "dev": true, "license": "MIT" }, + "node_modules/@cspell/dict-zig": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cspell/dict-zig/-/dict-zig-1.0.0.tgz", + "integrity": "sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@cspell/dynamic-import": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.3.1.tgz", - "integrity": "sha512-pjdCtlXio1Zov2Xd74CNdhwQ0OQU1+fYbT1YrdYJFplW+OeHze9eEPRgCKzMRSXr3s8La+dfrdtWVr0LhLTTvA==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-9.8.0.tgz", + "integrity": "sha512-wMgb32lqG9g6lCipUQsY9Bk5idXPDz7wvzOqEsU1M2HmNYmdE1wfPoRpfQfsVL965iG3+6h8QLr2+8FKpweFEQ==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/url": "9.3.1", + "@cspell/url": "9.8.0", "import-meta-resolve": "^4.2.0" }, "engines": { @@ -2474,19 +2536,29 @@ } }, "node_modules/@cspell/filetypes": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.3.1.tgz", - "integrity": "sha512-8VghfXnR2SIBs7jFG0G2MI6ixQM0tcnFU/WqgxZJPOjPSX+kpCuzePijG3ueiMhIWztHg+NM+nQiQGREcuX0vA==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-9.8.0.tgz", + "integrity": "sha512-yHvtYn9qt6zykua77sNzTcf7HrG/dpo/+2pCMGSrfSrQypSNT6FUFvMS04W7kwhP86U1GkCjppNykXuoH3cqug==", "dev": true, "license": "MIT", "engines": { "node": ">=20" } }, + "node_modules/@cspell/rpc": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/rpc/-/rpc-9.8.0.tgz", + "integrity": "sha512-t4lHEa254W+PePXNQ1noW7QhQxz/mhsJ9X8LEt0ILzBbPWCJzN+JuaM7EiolIPiwxtfxpMwKx9482kt4eTja7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18" + } + }, "node_modules/@cspell/strong-weak-map": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.3.1.tgz", - "integrity": "sha512-HNFyN9AXI2b6pC6p/VhJgDPw0rg0CTVHhQcleb3e2RsU72QnNv9DltcYR59y1igwJ+w5VP2sYh2TWYvBPTeMlg==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-9.8.0.tgz", + "integrity": "sha512-HocksAqZ0JcWA5oWO7TIlOCftXVGkPGzbeFlCRRrjJpZmYQH+4NdeEXyQC6T89NGocp45td/CgyBcAaFMy1N9w==", "dev": true, "license": "MIT", "engines": { @@ -2494,9 +2566,9 @@ } }, "node_modules/@cspell/url": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.3.1.tgz", - "integrity": "sha512-4MlTvq2neLV9IRDNIxcA6ef6bvUqqA8avbotnmD4X6p1IzMOvVLvQ8t6UMr4pKzpe+c5Ph33Y+C+mcwK3rk/BQ==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@cspell/url/-/url-9.8.0.tgz", + "integrity": "sha512-LY1lFiZLTQF/ma1ilfKmRmFmEOw0RfYhyl0UMhY7/d93b+kiDMhxP/9Qir4+5LyiRncaE3++ZcWno9Hya+ssRg==", "dev": true, "license": "MIT", "engines": { @@ -2504,10 +2576,11 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -2526,6 +2599,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2538,31 +2612,65 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "dependencies": { - "@eslint/core": "^0.17.0" + "license": "MIT" + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2573,6 +2681,7 @@ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -2581,19 +2690,20 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -2604,10 +2714,11 @@ } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2619,17 +2730,30 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -2637,29 +2761,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2672,6 +2799,7 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -2681,6 +2809,7 @@ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" @@ -2690,32 +2819,49 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -2729,6 +2875,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -2754,10 +2901,80 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", "dev": true, "license": "MIT", "engines": { @@ -2782,6 +2999,52 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", @@ -2830,6 +3093,52 @@ } } }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", @@ -2951,29 +3260,75 @@ } } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "color-convert": "^2.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3038,6 +3393,52 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", @@ -3056,35 +3457,78 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { @@ -3092,9 +3536,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", "dependencies": { @@ -3103,16 +3547,16 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -3120,10 +3564,191 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@microsoft/api-extractor": { + "version": "7.58.7", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.58.7.tgz", + "integrity": "sha512-yK6OycD46gIzLRpj6ueVUWPk1ACSpkN1LBo05gY1qPTylbWyUCanXfH7+VgkI5LJrJoRSQR5F04XuCffCXLOBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.33.8", + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.23.1", + "@rushstack/rig-package": "0.7.3", + "@rushstack/terminal": "0.24.0", + "@rushstack/ts-command-line": "5.3.9", + "diff": "~8.0.2", + "minimatch": "10.2.3", + "resolve": "~1.22.1", + "semver": "~7.7.4", + "source-map": "~0.6.1", + "typescript": "5.9.3" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.33.8", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.33.8.tgz", + "integrity": "sha512-aIcoQggPyer3B6Ze3usz0YWC/oBwUHfRH5ETUsr+oT2BRA6SfTJl7IKPcPZkX4UR+PohowzW4uMxsvjrn8vm+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "~0.16.0", + "@microsoft/tsdoc-config": "~0.18.1", + "@rushstack/node-core-library": "5.23.1" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz", + "integrity": "sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz", + "integrity": "sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.16.0", + "ajv": "~8.18.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@rushstack/node-core-library": { + "version": "5.23.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.23.1.tgz", + "integrity": "sha512-wlKmIKIYCKuCASbITvOxLZXepPbwXvrv7S6ig6XNWFchSyhL/E2txmVXspHY49Wu2dzf7nI27a2k/yV5BA3EiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "~8.18.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.7.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.2.1.tgz", + "integrity": "sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.7.3.tgz", + "integrity": "sha512-aAA518n6wxxjCfnTAOjQnm7ngNE0FVHxHAw2pxKlIhxrMn0XQjGcXKF0oKWpjBgJOmsaJpVob/v+zr3zxgPWuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jju": "~1.4.0", + "resolve": "~1.22.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.24.0.tgz", + "integrity": "sha512-8ZQS4MMaGsv27EXCBiH7WMPkRZrffeDoIevs6z9TM5dzqiY6+Hn4evfK/G+gvgBTjfvfkHIZPQQmalmI2sM4TQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/node-core-library": "5.23.1", + "@rushstack/problem-matcher": "0.2.1", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.3.9.tgz", + "integrity": "sha512-GIHqU+sRGQ3LGWAZu1O+9Yh++qwtyNIIGuNbcWHJjBTm2qRez0cwINUHZ+pQLR8UuzZDcMajrDaNbUYoaL/XtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/terminal": "0.24.0", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, @@ -3148,15 +3773,22 @@ } }, "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", + "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", "dev": true, "license": "MIT", "engines": { "node": ">= 10" } }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -3193,13 +3825,13 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.20.7" + "@babel/types": "^7.28.2" } }, "node_modules/@types/eslint": { @@ -3225,9 +3857,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, @@ -3299,9 +3931,9 @@ "license": "MIT" }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz", - "integrity": "sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==", + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", "dev": true, "license": "MIT", "dependencies": { @@ -3321,37 +3953,37 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", - "form-data": "^4.0.0" + "form-data": "^4.0.4" } }, "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", "dev": true, "license": "MIT" }, "node_modules/@types/readable-stream": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.18.tgz", - "integrity": "sha512-21jK/1j+Wg+7jVw1xnSwy/2Q1VgVjWuFssbYGTREPUBeZ+rqVFl2udq0IkxzPC0ZhOzVceUbyIACFZKLqKEBlA==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.23.tgz", + "integrity": "sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" + "@types/node": "*" } }, "node_modules/@types/stack-utils": { @@ -3376,9 +4008,9 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -3393,19 +4025,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.0.tgz", - "integrity": "sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.50.0", - "@typescript-eslint/type-utils": "8.50.0", - "@typescript-eslint/utils": "8.50.0", - "@typescript-eslint/visitor-keys": "8.50.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3415,9 +4048,9 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.50.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { @@ -3425,21 +4058,23 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.0.tgz", - "integrity": "sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.50.0", - "@typescript-eslint/types": "8.50.0", - "@typescript-eslint/typescript-estree": "8.50.0", - "@typescript-eslint/visitor-keys": "8.50.0", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3449,19 +4084,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.0.tgz", - "integrity": "sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.50.0", - "@typescript-eslint/types": "^8.50.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3471,17 +4107,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.0.tgz", - "integrity": "sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.0", - "@typescript-eslint/visitor-keys": "8.50.0" + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3492,10 +4129,11 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.0.tgz", - "integrity": "sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3504,20 +4142,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.0.tgz", - "integrity": "sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.0", - "@typescript-eslint/typescript-estree": "8.50.0", - "@typescript-eslint/utils": "8.50.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3527,15 +4166,16 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.0.tgz", - "integrity": "sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3545,20 +4185,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.0.tgz", - "integrity": "sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/project-service": "8.50.0", - "@typescript-eslint/tsconfig-utils": "8.50.0", - "@typescript-eslint/types": "8.50.0", - "@typescript-eslint/visitor-keys": "8.50.0", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3568,38 +4209,15 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3608,15 +4226,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.0.tgz", - "integrity": "sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.50.0", - "@typescript-eslint/types": "8.50.0", - "@typescript-eslint/typescript-estree": "8.50.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3626,18 +4245,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz", - "integrity": "sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.50.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3647,6 +4267,19 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", @@ -3843,10 +4476,11 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3865,19 +4499,33 @@ "acorn-walk": "^8.0.2" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, "license": "MIT", "dependencies": { @@ -3901,9 +4549,9 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", "dependencies": { @@ -3917,10 +4565,25 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3965,26 +4628,26 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -4004,6 +4667,19 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -4021,13 +4697,6 @@ "dev": true, "license": "MIT" }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4056,6 +4725,52 @@ "@babel/core": "^7.8.0" } }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -4107,14 +4822,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", "semver": "^6.3.1" }, "peerDependencies": { @@ -4122,36 +4837,36 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" + "@babel/helper-define-polyfill-provider": "^0.6.8" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", "dev": true, "license": "MIT", "dependencies": { @@ -4172,7 +4887,7 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "node_modules/babel-preset-jest": { @@ -4193,11 +4908,14 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/base64-js": { "version": "1.5.1", @@ -4219,15 +4937,30 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", + "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -4244,9 +4977,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, "funding": [ { @@ -4264,10 +4997,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -4326,7 +5060,8 @@ "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" }, "node_modules/buffer-from": { "version": "1.1.2", @@ -4385,9 +5120,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001717", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz", - "integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==", + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", "dev": true, "funding": [ { @@ -4406,17 +5141,13 @@ "license": "CC-BY-4.0" }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -4438,19 +5169,6 @@ "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, - "node_modules/chalk-template/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -4495,9 +5213,9 @@ "license": "MIT" }, "node_modules/clear-module": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.2.tgz", - "integrity": "sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.1.3.tgz", + "integrity": "sha512-XdLrg7BnbXKntyrbs2dNjDN9CVoTQ+WV0i7jT5/r9ahzAaSDSzC9e2OVZB/QVwbxBb1/1AeObzjlxsYk5HFvww==", "dev": true, "license": "MIT", "dependencies": { @@ -4538,9 +5256,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, @@ -4577,21 +5295,23 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=20" + } }, "node_modules/comment-json": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.4.1.tgz", - "integrity": "sha512-r1To31BQD5060QdkC+Iheai7gHwoSZobzunqkf2/kQ6xIAfJyrKNAFUwdKvkK7Qgu7pVTKQEa7ok7Ed3ycAJgg==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.6.2.tgz", + "integrity": "sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==", "dev": true, "license": "MIT", "dependencies": { "array-timsort": "^1.0.3", - "core-util-is": "^1.0.3", "esprima": "^4.0.1" }, "engines": { @@ -4613,26 +5333,19 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", - "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.24.4" + "browserslist": "^4.28.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT" - }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -4655,6 +5368,52 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -4671,29 +5430,32 @@ } }, "node_modules/cspell": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-9.3.1.tgz", - "integrity": "sha512-E6hbLdBx0GO4AVm/MxXhw/k4rPCqlvTx4OQUT7VtRdM6DsAhf+CZzuyXlzfkXESlUUNj0VGaZPPMC0e0NLsfsg==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-9.8.0.tgz", + "integrity": "sha512-qL0VErMSn8BDxaPxcV+9uenffgjPS+5Jfz+m4rCsvYjzLwr7AaaJBWWSV2UiAe/4cturae8n8qzxiGnbbazkRw==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/cspell-json-reporter": "9.3.1", - "@cspell/cspell-pipe": "9.3.1", - "@cspell/cspell-types": "9.3.1", - "@cspell/dynamic-import": "9.3.1", - "@cspell/url": "9.3.1", + "@cspell/cspell-json-reporter": "9.8.0", + "@cspell/cspell-performance-monitor": "9.8.0", + "@cspell/cspell-pipe": "9.8.0", + "@cspell/cspell-types": "9.8.0", + "@cspell/cspell-worker": "9.8.0", + "@cspell/dynamic-import": "9.8.0", + "@cspell/url": "9.8.0", + "ansi-regex": "^6.2.2", "chalk": "^5.6.2", "chalk-template": "^1.1.2", - "commander": "^14.0.2", - "cspell-config-lib": "9.3.1", - "cspell-dictionary": "9.3.1", - "cspell-gitignore": "9.3.1", - "cspell-glob": "9.3.1", - "cspell-io": "9.3.1", - "cspell-lib": "9.3.1", + "commander": "^14.0.3", + "cspell-config-lib": "9.8.0", + "cspell-dictionary": "9.8.0", + "cspell-gitignore": "9.8.0", + "cspell-glob": "9.8.0", + "cspell-io": "9.8.0", + "cspell-lib": "9.8.0", "fast-json-stable-stringify": "^2.1.0", - "flatted": "^3.3.3", - "semver": "^7.7.3", + "flatted": "^3.4.2", + "semver": "^7.7.4", "tinyglobby": "^0.2.15" }, "bin": { @@ -4701,54 +5463,55 @@ "cspell-esm": "bin.mjs" }, "engines": { - "node": ">=20" + "node": ">=20.18" }, "funding": { "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" } }, "node_modules/cspell-config-lib": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.3.1.tgz", - "integrity": "sha512-Mdm7FtXkiBzVigGY4jd/DVELai8XUkgV7E74l14VVnveyBHE1EnYD8g4COVE8qglCuSQnTtsuI1gqBlJkcLSzg==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-9.8.0.tgz", + "integrity": "sha512-gMJBAgYPvvO+uDFLUcGWaTu6/e+r8mm4GD4rQfWa/yV4F9fj+yOYLIMZqLWRvT1moHZX1FxyVvUbJcmZ1gfebg==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/cspell-types": "9.3.1", - "comment-json": "^4.4.1", - "smol-toml": "^1.4.2", - "yaml": "^2.8.1" + "@cspell/cspell-types": "9.8.0", + "comment-json": "^4.6.2", + "smol-toml": "^1.6.1", + "yaml": "^2.8.3" }, "engines": { "node": ">=20" } }, "node_modules/cspell-dictionary": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.3.1.tgz", - "integrity": "sha512-px5qCUZqfCG2bBjkxSueLFRHCW0Vl2Joszfj36IPAyZJCO+OjBzHvXcitbFwwy5LDfxyXTTY307Asumzi5IAqA==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-9.8.0.tgz", + "integrity": "sha512-QW4hdkWcrxZA1QNqi26U0S/U3/V+tKCm7JaaesEJW2F6Ao+23AbHVwidyAVtXaEhGkn6PxB+epKrrAa6nE69qA==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/cspell-pipe": "9.3.1", - "@cspell/cspell-types": "9.3.1", - "cspell-trie-lib": "9.3.1", - "fast-equals": "^5.3.2" + "@cspell/cspell-performance-monitor": "9.8.0", + "@cspell/cspell-pipe": "9.8.0", + "@cspell/cspell-types": "9.8.0", + "cspell-trie-lib": "9.8.0", + "fast-equals": "^6.0.0" }, "engines": { "node": ">=20" } }, "node_modules/cspell-gitignore": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-9.3.1.tgz", - "integrity": "sha512-C56uKvx71QtsKu6JBxZDFYZHxx8ILh0mLYDStmXPRpGDYsDCC19sEnd+z8+HTXJZ1i5jxIqitQKtiCSXTREA+g==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-9.8.0.tgz", + "integrity": "sha512-SDUa1DmSfT20+JH7XtyzcEL9KfurneoR/XbmlrtPQZP/LUHXh3yz4x/0vFIkEFXNWdSckY0QdWTz8DaxClCf4Q==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/url": "9.3.1", - "cspell-glob": "9.3.1", - "cspell-io": "9.3.1" + "@cspell/url": "9.8.0", + "cspell-glob": "9.8.0", + "cspell-io": "9.8.0" }, "bin": { "cspell-gitignore": "bin.mjs" @@ -4758,41 +5521,28 @@ } }, "node_modules/cspell-glob": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.3.1.tgz", - "integrity": "sha512-pyo8ySo90U4WaayjrnefU7kPA1pFL8ok4BDnlKJ5MwRqzVPIwV003Op0hnRYEEUdNyjRR4kU6GshMEkTrSlB7Q==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-9.8.0.tgz", + "integrity": "sha512-Uvj/iHXs+jpsJyIEnhEoJTWXb1GVyZ9T05L5JFtZfsQNXrh8SRDQPscjxbg4okKr63N7WevfioQum/snHNYvmw==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/url": "9.3.1", - "picomatch": "^4.0.3" + "@cspell/url": "9.8.0", + "picomatch": "^4.0.4" }, "engines": { "node": ">=20" } }, - "node_modules/cspell-glob/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/cspell-grammar": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.3.1.tgz", - "integrity": "sha512-SZR5IfrMZK0pgVP5U48yoHvkfiCbmGkwwTGGomEXpVYev/7fG9wupZKt2YXfvATiuQmcZ9hFW4fPLZbpJckPfA==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-9.8.0.tgz", + "integrity": "sha512-01XMq2vhPS0Gvxnfed9uvOwH+3cXddHYxW0PwCE+SZdcC6TN8yM6glByuLt1qFustAmQVE5GSr7uAY9o4pZQRg==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/cspell-pipe": "9.3.1", - "@cspell/cspell-types": "9.3.1" + "@cspell/cspell-pipe": "9.8.0", + "@cspell/cspell-types": "9.8.0" }, "bin": { "cspell-grammar": "bin.mjs" @@ -4802,42 +5552,44 @@ } }, "node_modules/cspell-io": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.3.1.tgz", - "integrity": "sha512-ZL5IVJiNHU3bkJh1+Zgmx5i0NaUIondJZ7vIlYlO55Llz8mtIoSp7Cn2j9tURfRP/Q0BZOE6M841Tiich0mqPA==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-9.8.0.tgz", + "integrity": "sha512-JINaEWQEzR4f2upwdZOFcft+nBvQgizJfrOLszxG3p+BIzljnGklqE/nUtLFZpBu0oMJvuM/Fd+GsWor0yP7Xw==", "dev": true, "license": "MIT", "dependencies": { - "@cspell/cspell-service-bus": "9.3.1", - "@cspell/url": "9.3.1" + "@cspell/cspell-service-bus": "9.8.0", + "@cspell/url": "9.8.0" }, "engines": { "node": ">=20" } }, "node_modules/cspell-lib": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.3.1.tgz", - "integrity": "sha512-3P+PW6EZgztP0eUDHeUzi4ro6IqH927n59BAR6djo58eAMgwbyZUYtXYXVOxlyhWqiVjL/hjb8hiqzTt1YQFEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-bundled-dicts": "9.3.1", - "@cspell/cspell-pipe": "9.3.1", - "@cspell/cspell-resolver": "9.3.1", - "@cspell/cspell-types": "9.3.1", - "@cspell/dynamic-import": "9.3.1", - "@cspell/filetypes": "9.3.1", - "@cspell/strong-weak-map": "9.3.1", - "@cspell/url": "9.3.1", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-9.8.0.tgz", + "integrity": "sha512-G2TtPcye5QE5ev3YgWq42UOJLpTZ6naO/47oIm+jmeSYbgnbcOSThnEE7uMycx+TTNOz/vJVFpZmQyt0bWCftw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspell/cspell-bundled-dicts": "9.8.0", + "@cspell/cspell-performance-monitor": "9.8.0", + "@cspell/cspell-pipe": "9.8.0", + "@cspell/cspell-resolver": "9.8.0", + "@cspell/cspell-types": "9.8.0", + "@cspell/dynamic-import": "9.8.0", + "@cspell/filetypes": "9.8.0", + "@cspell/rpc": "9.8.0", + "@cspell/strong-weak-map": "9.8.0", + "@cspell/url": "9.8.0", "clear-module": "^4.1.2", - "cspell-config-lib": "9.3.1", - "cspell-dictionary": "9.3.1", - "cspell-glob": "9.3.1", - "cspell-grammar": "9.3.1", - "cspell-io": "9.3.1", - "cspell-trie-lib": "9.3.1", - "env-paths": "^3.0.0", + "cspell-config-lib": "9.8.0", + "cspell-dictionary": "9.8.0", + "cspell-glob": "9.8.0", + "cspell-grammar": "9.8.0", + "cspell-io": "9.8.0", + "cspell-trie-lib": "9.8.0", + "env-paths": "^4.0.0", "gensequence": "^8.0.8", "import-fresh": "^3.3.1", "resolve-from": "^5.0.0", @@ -4850,47 +5602,22 @@ } }, "node_modules/cspell-trie-lib": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.3.1.tgz", - "integrity": "sha512-PfHk6hX2e+OF4t3qxA/Y95FScEAPM7fQGsDaq+U0AqT8vsdtVou+VVS43ILBiCDYBDn2WUjWBTKYBGk2t1oKGQ==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.8.0.tgz", + "integrity": "sha512-GXIyqxya8QLp6SjKsAN9w3apvt1Ww7GKcZvTBaP76OfLoyb1QC6unwmObY2cZs1manCntGwHrgU6vFNuXnTzpw==", "dev": true, "license": "MIT", - "dependencies": { - "@cspell/cspell-pipe": "9.3.1", - "@cspell/cspell-types": "9.3.1", - "gensequence": "^8.0.8" - }, "engines": { "node": ">=20" - } - }, - "node_modules/cspell/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cspell/node_modules/commander": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", - "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" + "peerDependencies": { + "@cspell/cspell-types": "9.8.0" } }, "node_modules/cspell/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, "license": "ISC", "bin": { @@ -4943,9 +5670,9 @@ } }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -4961,16 +5688,16 @@ } }, "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "dev": true, "license": "MIT" }, "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -4986,7 +5713,8 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", @@ -5017,6 +5745,16 @@ "node": ">=8" } }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -5042,9 +5780,9 @@ } }, "node_modules/dotenv": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -5071,30 +5809,15 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, "license": "Apache-2.0", "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" + "safe-buffer": "^5.0.1" } }, "node_modules/electron-to-chromium": { - "version": "1.5.151", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.151.tgz", - "integrity": "sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==", + "version": "1.5.354", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.354.tgz", + "integrity": "sha512-JaBHwWcfIdmSAfWM5l3uwjGd431j8YEMikZ+K/2nXVuBqJKyZ0f+2h4n4JY5AyNiZmnY9qQr2RU3v9DxDmHMNg==", "dev": true, "license": "ISC" }, @@ -5119,23 +5842,23 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.21.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz", + "integrity": "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5146,22 +5869,25 @@ } }, "node_modules/env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz", + "integrity": "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==", "dev": true, "license": "MIT", + "dependencies": { + "is-safe-filename": "^0.1.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5187,9 +5913,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", "dev": true, "license": "MIT" }, @@ -5231,13 +5957,16 @@ } }, "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/escodegen": { @@ -5263,24 +5992,25 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", + "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -5299,7 +6029,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -5322,27 +6052,20 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { @@ -5350,6 +6073,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -5358,10 +6082,11 @@ } }, "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5373,84 +6098,88 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { - "p-locate": "^5.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/espree": { @@ -5458,6 +6187,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", @@ -5485,10 +6215,11 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -5605,9 +6336,9 @@ "license": "MIT" }, "node_modules/fast-equals": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.3.3.tgz", - "integrity": "sha512-/boTcHZeIAQ2r/tL11voclBHDeP9WPxLt+tyAbVSyyXuUFyh0Tne7gJZTqGbxnvj79TjLdCXLOY7UIPhyG5MTw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.0.tgz", + "integrity": "sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==", "dev": true, "license": "MIT", "engines": { @@ -5625,12 +6356,13 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ { @@ -5654,11 +6386,30 @@ "bser": "2.1.1" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "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, + "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" }, @@ -5666,39 +6417,6 @@ "node": ">=16.0.0" } }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -5713,17 +6431,20 @@ } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { @@ -5731,6 +6452,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -5740,16 +6462,16 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -5763,9 +6485,9 @@ } }, "node_modules/form-data-encoder": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", - "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", + "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", "license": "MIT", "engines": { "node": ">= 18" @@ -5780,6 +6502,21 @@ "node": ">= 18" } }, + "node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5787,6 +6524,21 @@ "dev": true, "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -5890,7 +6642,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -5913,6 +6665,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -5927,20 +6680,51 @@ "dev": true, "license": "BSD-2-Clause" }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { - "ini": "4.1.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" + } + }, + "node_modules/global-directory": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", + "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "6.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globals": { @@ -5948,6 +6732,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -5974,6 +6759,28 @@ "dev": true, "license": "ISC" }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6012,9 +6819,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -6120,6 +6927,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -6164,6 +6972,16 @@ "node": ">=4" } }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", @@ -6225,13 +7043,13 @@ "license": "ISC" }, "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "dev": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/is-arrayish": { @@ -6242,13 +7060,13 @@ "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -6262,6 +7080,7 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6291,6 +7110,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -6315,6 +7135,19 @@ "dev": true, "license": "MIT" }, + "node_modules/is-safe-filename": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz", + "integrity": "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -6363,9 +7196,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, "license": "ISC", "bin": { @@ -6390,6 +7223,19 @@ "node": ">=10" } }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -6406,9 +7252,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6419,25 +7265,6 @@ "node": ">=8" } }, - "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -6512,6 +7339,52 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-cli": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", @@ -6546,6 +7419,52 @@ } } }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -6592,6 +7511,52 @@ } } }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", @@ -6608,6 +7573,52 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-docblock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", @@ -6638,17 +7649,63 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/jsdom": "^20.0.0", + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0", @@ -6750,6 +7807,52 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", @@ -6771,6 +7874,52 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", @@ -6849,6 +7998,52 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", @@ -6882,6 +8077,52 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runtime": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", @@ -6916,6 +8157,52 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", @@ -6948,10 +8235,43 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, "license": "ISC", "bin": { @@ -6961,6 +8281,19 @@ "node": ">=10" } }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -6979,6 +8312,65 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", @@ -6997,6 +8389,22 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -7010,6 +8418,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", @@ -7030,6 +8468,52 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -7046,21 +8530,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } + "license": "MIT" }, "node_modules/js-base64": { "version": "3.7.7", @@ -7076,19 +8551,25 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/jsdom": { "version": "20.0.3", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", @@ -7152,7 +8633,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -7172,7 +8654,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", @@ -7187,10 +8670,24 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", "dependencies": { "jws": "^4.0.1", "lodash.includes": "^4.3.0", @@ -7209,9 +8706,9 @@ } }, "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -7224,6 +8721,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -7234,6 +8732,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" @@ -7242,13 +8741,15 @@ "node_modules/jwt-decode": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", - "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==", + "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -7278,6 +8779,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -7294,26 +8796,33 @@ "license": "MIT" }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", "dev": true, "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash.debounce": { @@ -7370,7 +8879,8 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.once": { "version": "4.1.1", @@ -7405,9 +8915,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, "license": "ISC", "bin": { @@ -7464,6 +8974,19 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -7496,16 +9019,29 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", + "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/ms": { @@ -7578,9 +9114,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", "dev": true, "license": "MIT" }, @@ -7608,9 +9144,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", "dev": true, "license": "MIT" }, @@ -7657,6 +9193,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -7686,29 +9223,16 @@ } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7814,13 +9338,13 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -7849,11 +9373,68 @@ "node": ">=8" } }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -7889,19 +9470,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -7966,9 +9534,10 @@ "license": "MIT" }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" }, @@ -7986,16 +9555,6 @@ "dev": true, "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -8027,9 +9586,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, "license": "MIT", "dependencies": { @@ -8040,18 +9599,18 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -8065,31 +9624,18 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8118,13 +9664,14 @@ "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -8172,9 +9719,23 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, "node_modules/safer-buffer": { @@ -8198,9 +9759,9 @@ } }, "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "license": "MIT", "dependencies": { @@ -8217,6 +9778,24 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -8227,16 +9806,6 @@ "semver": "bin/semver.js" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8280,13 +9849,13 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -8357,9 +9926,9 @@ } }, "node_modules/smol-toml": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.0.tgz", - "integrity": "sha512-Jjsa8LZ+DyLbZ7gVi9d18bS8oxq0PQrTlVDfvYXgh7gxLwbW9QWgvakHD+hBLUtr5NahfStd8LQLGSPchaEJ8Q==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", + "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -8410,34 +9979,34 @@ "node": ">=10" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } }, "node_modules/string-length": { "version": "4.0.2", @@ -8481,6 +10050,16 @@ "node": ">=8" } }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -8515,16 +10094,19 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -8548,24 +10130,28 @@ "license": "MIT" }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.47.1.tgz", + "integrity": "sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -8577,16 +10163,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -8600,12 +10185,39 @@ "webpack": "^5.1.0" }, "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, "@swc/core": { "optional": true }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, "esbuild": { "optional": true }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, "uglify-js": { "optional": true } @@ -8626,21 +10238,12 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } + "license": "MIT" }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", @@ -8668,52 +10271,52 @@ "node": ">=8" } }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "node_modules/test-exclude/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "engines": { + "node": "*" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, "engines": { - "node": ">=12" + "node": ">=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/tmpl": { @@ -8752,6 +10355,16 @@ "node": ">=6" } }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/tr46": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", @@ -8766,10 +10379,11 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.12" }, @@ -8778,21 +10392,20 @@ } }, "node_modules/ts-jest": { - "version": "29.3.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.2.tgz", - "integrity": "sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==", + "version": "29.4.9", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.9.tgz", + "integrity": "sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==", "dev": true, "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", - "ejs": "^3.1.10", "fast-json-stable-stringify": "^2.1.0", - "jest-util": "^29.0.0", + "handlebars": "^4.7.9", "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.7.1", - "type-fest": "^4.39.1", + "semver": "^7.7.4", + "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, "bin": { @@ -8803,11 +10416,12 @@ }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <7" }, "peerDependenciesMeta": { "@babel/core": { @@ -8824,13 +10438,16 @@ }, "esbuild": { "optional": true + }, + "jest-util": { + "optional": true } } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, "license": "ISC", "bin": { @@ -8854,9 +10471,9 @@ } }, "node_modules/ts-loader": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", - "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", + "version": "9.5.7", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.7.tgz", + "integrity": "sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==", "dev": true, "license": "MIT", "dependencies": { @@ -8874,10 +10491,43 @@ "webpack": "^5.0.0" } }, + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/ts-loader/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "dev": true, "license": "ISC", "bin": { @@ -8888,13 +10538,26 @@ } }, "node_modules/ts-loader/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">= 12" + } + }, + "node_modules/ts-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/type-check": { @@ -8902,6 +10565,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -8947,15 +10611,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.0.tgz", - "integrity": "sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", + "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.50.0", - "@typescript-eslint/parser": "8.50.0", - "@typescript-eslint/typescript-estree": "8.50.0", - "@typescript-eslint/utils": "8.50.0" + "@typescript-eslint/eslint-plugin": "8.59.3", + "@typescript-eslint/parser": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8965,15 +10630,30 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" } }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", @@ -9000,9 +10680,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, "license": "MIT", "engines": { @@ -9010,9 +10690,9 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, "license": "MIT", "engines": { @@ -9020,19 +10700,19 @@ } }, "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -9065,6 +10745,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -9139,9 +10820,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "license": "MIT", "dependencies": { @@ -9163,36 +10844,36 @@ } }, "node_modules/webpack": { - "version": "5.99.8", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.8.tgz", - "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==", + "version": "5.106.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", + "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", + "loader-runner": "^4.3.1", + "mime-db": "^1.54.0", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" }, "bin": { "webpack": "bin/webpack.js" @@ -9211,19 +10892,54 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", + "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "dev": true, "license": "MIT", "dependencies": { @@ -9278,10 +10994,18 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -9300,6 +11024,22 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9322,9 +11062,9 @@ } }, "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.1.tgz", + "integrity": "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==", "dev": true, "license": "MIT", "engines": { @@ -9391,9 +11131,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, "license": "ISC", "bin": { @@ -9401,6 +11141,9 @@ }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { diff --git a/src/utils/validations/index.ts b/src/utils/validations/index.ts index c730e4b0..1f1d703f 100644 --- a/src/utils/validations/index.ts +++ b/src/utils/validations/index.ts @@ -644,7 +644,7 @@ export const validateUpdateRequest = (updateRequest: UpdateRequest, updateOption throw new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_SKYFLOW_ID_IN_UPDATE); } - if (updateRequest?.data[SKYFLOW.ID] && typeof updateRequest.data[SKYFLOW.ID] !== 'string' || (updateRequest.data[SKYFLOW.ID] as string).trim().length === 0) { + if (typeof updateRequest.data[SKYFLOW.ID] !== 'string' || (updateRequest.data[SKYFLOW.ID] as string).trim().length === 0) { printLog(logs.errorLogs.INVALID_SKYFLOW_ID_IN_UPDATE, MessageType.ERROR, logLevel); throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_SKYFLOW_ID_IN_UPDATE); } diff --git a/src/vault/controller/detect/index.ts b/src/vault/controller/detect/index.ts index 805451ea..a8d76ffb 100644 --- a/src/vault/controller/detect/index.ts +++ b/src/vault/controller/detect/index.ts @@ -372,6 +372,8 @@ class DetectController { } else if (response.status?.toUpperCase() === DETECT_STATUS.FAILED) { reject(new SkyflowError(SKYFLOW_ERROR_CODE.INTERNAL_SERVER_ERROR, [response.message])); + } else { + reject(new SkyflowError(SKYFLOW_ERROR_CODE.INTERNAL_SERVER_ERROR, [response.message])); } }) .catch((error) => { @@ -590,9 +592,8 @@ class DetectController { }); } - deidentifyFile(request: DeidentifyFileRequest, options?: DeidentifyFileOptions): Promise { - return new Promise(async (resolve, reject) => { - try { + async deidentifyFile(request: DeidentifyFileRequest, options?: DeidentifyFileOptions): Promise { + try { printLog(logs.infoLogs.DETECT_FILE_TRIGGERED, MessageType.LOG, this.client.getLogLevel()); printLog(logs.infoLogs.VALIDATE_DETECT_FILE_INPUT, MessageType.LOG, this.client.getLogLevel()); validateDeidentifyFileRequest(request, options, this.client.getLogLevel()); @@ -730,6 +731,24 @@ class DetectController { reject(error); } }); + const { data, runId } = await promiseReq; + if(runId && data.status === DETECT_STATUS.IN_PROGRESS) { + return new DeidentifyFileResponse({ + runId: runId, + status: data.status, + }); + } + const fullResponse = data as DeidentifyFileDetectRunResponse; + if (options?.getOutputDirectory() && fullResponse.status === DETECT_STATUS.SUCCESS) { + this.processDeidentifyFileResponse(fullResponse, options.getOutputDirectory() as string, fileBaseName); + } + const deidentifiedFileResponse = this.parseDeidentifyFileResponse(fullResponse, runId, fullResponse.status); + return deidentifiedFileResponse; + } catch (error) { + if (error instanceof Error) + printLog(removeSDKVersion(error.message), MessageType.ERROR, this.client.getLogLevel()); + throw error; + } } } diff --git a/src/vault/controller/vault/index.ts b/src/vault/controller/vault/index.ts index 0f0363bc..4cebde3e 100644 --- a/src/vault/controller/vault/index.ts +++ b/src/vault/controller/vault/index.ts @@ -268,9 +268,10 @@ class VaultController { // Validation checks validateUpdateRequest(request, options, this.client.getLogLevel()); - const skyflowId = request.data[SKYFLOW.ID]; - delete request.data[SKYFLOW.ID]; - const record = { fields: request.data, tokens: options?.getTokens() }; + const data = { ...request.data }; + const skyflowId = data[SKYFLOW.ID]; + delete data[SKYFLOW.ID]; + const record = { fields: data, tokens: options?.getTokens() }; const strictMode = options?.getTokenMode() ? options?.getTokenMode() : V1Byot.Disable; const updateData: RecordServiceUpdateRecordBody = { record: record, From 424ccda181f0e75cb9c28ec538978c7dbb8295f8 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Wed, 13 May 2026 18:57:04 +0530 Subject: [PATCH 07/34] SK-2812: ESLint fix --- api-report/skyflow-node.api.md | 8 ++++++++ eslint.config.mjs | 1 + src/vault/controller/vault/index.ts | 21 +++++++++++++-------- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/api-report/skyflow-node.api.md b/api-report/skyflow-node.api.md index 9d9878ff..eb12e53a 100644 --- a/api-report/skyflow-node.api.md +++ b/api-report/skyflow-node.api.md @@ -18,6 +18,7 @@ export type BearerTokenOptions = { ctx?: string | Record; roleIds?: string[]; logLevel?: LogLevel; + tokenUri?: string; }; // @public (undocumented) @@ -790,6 +791,8 @@ export interface PathCredentials { path: string; // (undocumented) roles?: Array; + // (undocumented) + tokenUri?: string; } // @public (undocumented) @@ -881,6 +884,7 @@ export type SignedDataTokensOptions = { timeToLive?: number; ctx?: string | Record; logLevel?: LogLevel; + tokenUri?: string; }; // @public (undocumented) @@ -915,6 +919,8 @@ export class Skyflow { // (undocumented) updateConnectionConfig(config: ConnectionConfig): void; // (undocumented) + updateLogLevel(logLevel: LogLevel): Skyflow; + // (undocumented) updateSkyflowCredentials(credentials: Credentials): void; // (undocumented) updateVaultConfig(config: VaultConfig): void; @@ -967,6 +973,8 @@ export interface StringCredentials { credentialsString: string; // (undocumented) roles?: Array; + // (undocumented) + tokenUri?: string; } // @public (undocumented) diff --git a/eslint.config.mjs b/eslint.config.mjs index 3f25a466..7d4fde46 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -44,6 +44,7 @@ export default tseslint.config( "node_modules/", "dist/", "coverage/", + "lib/", "src/ _generated_/", "test/**", "samples/**", diff --git a/src/vault/controller/vault/index.ts b/src/vault/controller/vault/index.ts index 4cebde3e..f8c2ac7b 100644 --- a/src/vault/controller/vault/index.ts +++ b/src/vault/controller/vault/index.ts @@ -392,8 +392,8 @@ class VaultController { printLog(logs.infoLogs.GET_SUCCESS, MessageType.LOG, this.client.getLogLevel()); const processedRecords = response.records.map(record => { const fields = typeof record.fields === 'object' && record.fields !== null ? record.fields as Record : {}; - const { skyflow_id, ...rest } = fields; - return { ...(skyflow_id !== undefined ? { skyflowId: skyflow_id } : {}), ...rest }; + const { skyflow_id: skyflowIdValue, ...rest } = fields; + return { ...(skyflowIdValue !== undefined ? { skyflowId: skyflowIdValue } : {}), ...rest }; }); resolve(new GetResponse({ data: processedRecords, errors: null })); }) @@ -491,12 +491,17 @@ class VaultController { TYPES.QUERY ).then(response => { printLog(logs.infoLogs.QUERY_SUCCESS, MessageType.LOG, this.client.getLogLevel()); - const processedRecords = response.records.map(record => ({ - ...(typeof record.fields === 'object' && record.fields !== null ? record.fields : {}), - tokenizedData: { - ...(typeof record.tokens === 'object' && record.tokens !== null ? record.tokens : {}), - }, - })); + const processedRecords = response.records.map(record => { + const fields = typeof record.fields === 'object' && record.fields !== null ? record.fields as Record : {}; + const { skyflow_id: skyflowIdValue, ...rest } = fields; + return { + ...(skyflowIdValue !== undefined ? { skyflowId: skyflowIdValue } : {}), + ...rest, + tokenizedData: { + ...(typeof record.tokens === 'object' && record.tokens !== null ? record.tokens : {}), + }, + }; + }); resolve(new QueryResponse({ fields: processedRecords, errors: null })); }) .catch(error => { From 086dc18f2f26748698da09f6f88bee0e0ac41a5f Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Wed, 13 May 2026 19:16:20 +0530 Subject: [PATCH 08/34] SK-2812: Fixed test cases --- test/service-account/token.test.js | 90 ++++++++++++++++++++++++++--- test/vault/controller/vault.test.js | 2 +- 2 files changed, 83 insertions(+), 9 deletions(-) diff --git a/test/service-account/token.test.js b/test/service-account/token.test.js index 3dc66cd4..6d0a0162 100644 --- a/test/service-account/token.test.js +++ b/test/service-account/token.test.js @@ -14,6 +14,14 @@ import errorMessages from '../../src/error/messages'; import jwt from 'jsonwebtoken'; import { LogLevel } from "../../src"; +const validCredentials = { + clientID: "test-client-id", + keyID: "test-key-id", + tokenURI: "https://test-token-uri.com", + privateKey: "KEY", + data: "DATA", +}; + jest.mock('../../src/service-account/client', () => { return { __esModule: true, @@ -121,7 +129,7 @@ describe("File Validity Tests", () => { }); describe("Context and Scoped Token Options Tests", () => { - const credsWithoutContext = process.env.SA_WITHOUT_CONTEXT; + const credsWithoutContext = process.env.SA_WITHOUT_CONTEXT || JSON.stringify(validCredentials); const credentials = { clientID: "test-client-id", @@ -336,13 +344,6 @@ describe('Signed Data Token Generation Test', () => { describe('getToken Tests', () => { let mockClient; - const validCredentials = { - clientID: "test-client-id", - keyID: "test-key-id", - tokenURI: "https://test-token-uri.com", - privateKey: "KEY", - data: "DATA", - }; const credentials = { clientID: "test-client-id", keyID: "test-key-id", @@ -601,4 +602,77 @@ describe('failureResponse with rawResponse', () => { }; await expect(failureResponse(err)).rejects.toBeDefined(); }); + + test("should use tokenUri from options if provided and valid", async () => { + const validCredsString = JSON.stringify(validCredentials); + const validTokenOptions = { tokenUri: "https://override-token-uri.com" }; + const signSpy = jest.spyOn(jwt, 'sign').mockReturnValue('mocked_token'); + const getBaseUrlSpy = jest.spyOn(require('../../src/utils'), 'getBaseUrl'); + await getToken(validCredsString, validTokenOptions); + expect(getBaseUrlSpy).toHaveBeenCalledWith(validTokenOptions.tokenUri); + signSpy.mockRestore(); + getBaseUrlSpy.mockRestore(); + }); + + test("should throw error if tokenUri in options is invalid", async () => { + const validCredsString = JSON.stringify(validCredentials); + const invalidOptions = { tokenUri: "not-a-valid-url" }; + await expect(getToken(validCredsString, invalidOptions)).rejects.toThrow(); + }); +}); + + +describe('getToken and getSignedTokens tokenUri override tests', () => { + const validCreds = { + clientID: "test-client-id", + keyID: "test-key-id", + tokenURI: "https://original-token-uri.com", + privateKey: "KEY", + data: "DATA", + }; + + const validCredsString = JSON.stringify(validCreds); + + const validSignedTokenOptions = { + dataTokens: ['datatoken1'], + tokenUri: "https://override-token-uri.com" + }; + + const validTokenOptions = { + tokenUri: "https://override-token-uri.com" + }; + + beforeEach(() => { + jest.spyOn(jwt, 'sign').mockReturnValue('mocked_token'); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + test('getToken uses tokenUri from options if provided', async () => { + const getBaseUrlSpy = jest.spyOn(require('../../src/utils'), 'getBaseUrl'); + await getToken(validCredsString, validTokenOptions); + expect(getBaseUrlSpy).toHaveBeenCalledWith(validTokenOptions.tokenUri); + }); + + test('generateSignedDataTokensFromCreds uses tokenUri from options if provided', async () => { + let capturedClaims = null; + jest.spyOn(jwt, 'sign').mockImplementation((claims, key, opts) => { + capturedClaims = claims; + return 'mocked_token'; + }); + await generateSignedDataTokensFromCreds(validCredsString, validSignedTokenOptions); + expect(capturedClaims.aud).toBe(validSignedTokenOptions.tokenUri); + }); + + test('getToken throws error if tokenUri in options is invalid', async () => { + const invalidOptions = { tokenUri: "not-a-valid-url" }; + await expect(getToken(validCredsString, invalidOptions)).rejects.toThrow(); + }); + + test('generateSignedDataTokensFromCreds throws error if tokenUri in options is invalid', async () => { + const invalidOptions = { dataTokens: ['datatoken1'], tokenUri: "not-a-valid-url" }; + await expect(generateSignedDataTokensFromCreds(validCredsString, invalidOptions)).rejects.toThrow(); + }); }); diff --git a/test/vault/controller/vault.test.js b/test/vault/controller/vault.test.js index 2bb7dddb..cea3e766 100644 --- a/test/vault/controller/vault.test.js +++ b/test/vault/controller/vault.test.js @@ -1074,7 +1074,7 @@ describe('VaultController query method', () => { expect(response).toBeInstanceOf(QueryResponse); expect(response.fields).toHaveLength(1); expect(response.fields[0].id).toBe('1'); - expect(response.fields[0].tokenized_data.id).toBe('token123'); + expect(response.fields[0].tokenizedData.id).toBe('token123'); expect(response.errors).toBe(null); }); From d7e7a21f0ce58f342d7aeed05ddfa302196a6cfc Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Thu, 14 May 2026 10:11:49 +0530 Subject: [PATCH 09/34] SK-2812: Updated samples --- README.md | 8 ++++---- .../service-account/bearer-token-expiry-example.ts | 2 +- samples/vault-api/detokenzie-records.ts | 2 +- samples/vault-api/insert-continue-on-error.ts | 13 +++++-------- samples/vault-api/insert-records.ts | 13 ++++++------- samples/vault-api/query-records.ts | 8 ++++++++ 6 files changed, 25 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index a1bc7449..01eb4edc 100644 --- a/README.md +++ b/README.md @@ -201,7 +201,7 @@ Upgrade from `skyflow-node` v1 using the dedicated guide in [docs/migrate_to_v2. ## Vault -The [Vault](https://docs.skyflow.com/docs/vaults) performs operations on the vault such as inserting records, detokenizing tokens, retrieving tokens for list of `skyflow_id`'s and to invoke the Connection. +The [Vault](https://docs.skyflow.com/docs/vaults) performs operations on the vault such as inserting records, detokenizing tokens, retrieving tokens for list of `skyflowId`s and to invoke the Connection. ### Insert and tokenize data: `.insert(request)` @@ -271,7 +271,7 @@ const detokenizeRequest = new DetokenizeRequest([ const detokenizeOptions = new DetokenizeOptions(); detokenizeOptions.setContinueOnError(true); -detokenizeOptions.setDownloadURL(false); +detokenizeOptions.setDownloadUrl(false); const response: DetokenizeResponse = await skyflowClient .vault(primaryVaultConfig.vaultId) @@ -857,11 +857,11 @@ Alternatively, you can also send the entire credentials as string by using `gene #### Generate bearer tokens scoped to certain roles -Generate bearer tokens with access limited to a specific role by specifying the appropriate roleID when using a service account with multiple roles. Use this to limit access for services with multiple responsibilities, such as segregating access for billing and analytics. Generated bearer tokens are valid for 60 minutes and can only execute operations permitted by the permissions associated with the designated role. +Generate bearer tokens with access limited to a specific role by specifying the appropriate roleId when using a service account with multiple roles. Use this to limit access for services with multiple responsibilities, such as segregating access for billing and analytics. Generated bearer tokens are valid for 60 minutes and can only execute operations permitted by the permissions associated with the designated role. ```ts const options = { - roleIDs: ['roleID1', 'roleID2'], + roleIds: ['roleId1', 'roleId2'], }; ``` diff --git a/samples/service-account/bearer-token-expiry-example.ts b/samples/service-account/bearer-token-expiry-example.ts index e86f453d..fc98bd3b 100644 --- a/samples/service-account/bearer-token-expiry-example.ts +++ b/samples/service-account/bearer-token-expiry-example.ts @@ -42,7 +42,7 @@ async function detokenizeData(skyflowClient: Skyflow, vaultId: string) { // Configuring detokenization options const detokenizeOptions: DetokenizeOptions = new DetokenizeOptions(); detokenizeOptions.setContinueOnError(false); // Stop on error - detokenizeOptions.setDownloadURL(false); // Disable download URL generation + detokenizeOptions.setDownloadUrl(false); // Disable download URL generation // Sending the detokenization request and receiving the response const response: DetokenizeResponse = await skyflowClient diff --git a/samples/vault-api/detokenzie-records.ts b/samples/vault-api/detokenzie-records.ts index b94587c3..6b7b243e 100644 --- a/samples/vault-api/detokenzie-records.ts +++ b/samples/vault-api/detokenzie-records.ts @@ -67,7 +67,7 @@ async function performDetokenization() { // Configure Detokenize Options const detokenizeOptions: DetokenizeOptions = new DetokenizeOptions(); detokenizeOptions.setContinueOnError(true); // Continue processing on errors - detokenizeOptions.setDownloadURL(false); // Disable download URL generation + detokenizeOptions.setDownloadUrl(false); // Disable download URL generation // Step 5: Perform Detokenization const response: DetokenizeResponse = await skyflowClient diff --git a/samples/vault-api/insert-continue-on-error.ts b/samples/vault-api/insert-continue-on-error.ts index 3a630864..483d35f6 100644 --- a/samples/vault-api/insert-continue-on-error.ts +++ b/samples/vault-api/insert-continue-on-error.ts @@ -9,7 +9,6 @@ import { SkyflowConfig, SkyflowError, InsertResponse, - ApiKeyCredentials, SkyflowRecordError } from 'skyflow-node'; @@ -71,18 +70,17 @@ async function performSecureDataInsertion() { .insert(insertReq, insertOptions); + // insertedFields is always an array; errors is null when no errors if ( - response.insertedFields && response.insertedFields.length === 0 && - Array.isArray(response.errors) && + response.errors !== null && response.errors.length > 0 ) { //handle insert response failure console.error("Insert failed: ", response.errors); } else if ( - response.insertedFields && response.insertedFields.length > 0 && - Array.isArray(response.errors) && + response.errors !== null && response.errors.length > 0 ) { // handle partial response @@ -95,9 +93,8 @@ async function performSecureDataInsertion() { if(response.errors!=null) { for (let i=0; i < response.errors.length; i++) { - let error: SkyflowRecordError = response.errors[i]; - console.log('Skyflow Record Error:', error); - // Handle error + const recordError: SkyflowRecordError = response.errors[i]; + console.log('Skyflow Record Error:', recordError); } } diff --git a/samples/vault-api/insert-records.ts b/samples/vault-api/insert-records.ts index 0879c5da..9ddf8966 100644 --- a/samples/vault-api/insert-records.ts +++ b/samples/vault-api/insert-records.ts @@ -68,13 +68,12 @@ async function performSecureDataInsertion() { .vault(primaryVaultConfig.vaultId) .insert(insertReq, insertOptions); - // Handle Successful Response - if(response.insertedFields!=null) { - for(let i = 0; i < response.insertedFields.length; i++) { - const field: InsertResponseType = response.insertedFields[i]; - console.log('Inserted Field: ',field); - // Handle filed - } + console.log(response); + + // Handle Successful Response — insertedFields is always an array + for(let i = 0; i < response.insertedFields.length; i++) { + const field: InsertResponseType = response.insertedFields[i]; + console.log('Inserted Field: ', field); } } catch (error) { diff --git a/samples/vault-api/query-records.ts b/samples/vault-api/query-records.ts index f50b36c6..1c27daa6 100644 --- a/samples/vault-api/query-records.ts +++ b/samples/vault-api/query-records.ts @@ -54,7 +54,15 @@ async function executeQuery() { .query(queryRequest); // Handle Successful Response + // fields, tokenizedData, and errors are always present in QueryResponse console.log('Query Result:', response); + response.fields.forEach(record => { + console.log('Fields:', record); + console.log('Tokenized Data:', record.tokenizedData); + }); + if (response.errors !== null) { + console.error('Query Errors:', response.errors); + } } catch (error) { // Comprehensive Error Handling From 4cc6d2d9150bb8b5e29acdd3f85d5eaa5b0981db Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Thu, 14 May 2026 12:04:54 +0530 Subject: [PATCH 10/34] SK-2812:Updated env --- samples/vault-api/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/vault-api/.env b/samples/vault-api/.env index 43d37b47..d4d3922a 100644 --- a/samples/vault-api/.env +++ b/samples/vault-api/.env @@ -1 +1 @@ -SKYFLOW_CREDENTIALS={ clientID: '', clientName: '', keyID: '', tokenURI: '', privateKey: '' } \ No newline at end of file +SKYFLOW_CREDENTIALS='{"clientId":"test-client-id","keyId":"test-key-id","tokenUri":"https://test-token-uri.com","privateKey":"test-private-key","data":"test-data"}' \ No newline at end of file From 36ed4ea6b090b6dbc2b3daa5645f85b426bd1a91 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Fri, 15 May 2026 14:53:49 +0530 Subject: [PATCH 11/34] SK-2812: Implemneted Deprecation strategies --- src/error/index.ts | 14 +++++++++- src/service-account/index.ts | 13 ++++++++++ src/utils/validations/index.ts | 2 +- src/utils/warn-once.ts | 10 ++++++++ src/vault/controller/vault/index.ts | 21 ++++++++++++--- src/vault/model/options/detokenize/index.ts | 13 ++++++++++ src/vault/model/options/get/index.ts | 13 ++++++++++ src/vault/model/request/file-upload/index.ts | 27 ++++++++++++++++++-- src/vault/model/response/delete/index.ts | 3 +++ src/vault/model/response/insert/index.ts | 3 +++ src/vault/types/index.ts | 2 ++ 11 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 src/utils/warn-once.ts diff --git a/src/error/index.ts b/src/error/index.ts index b53d2fd2..ce26373c 100644 --- a/src/error/index.ts +++ b/src/error/index.ts @@ -1,11 +1,12 @@ import { BAD_REQUEST, ISkyflowError, parameterizedString } from "../utils"; +import { warnOnce } from "../utils/warn-once"; class SkyflowError extends Error { error?: ISkyflowError; constructor(errorCode: ISkyflowError, args: Array = []) { - const formattedError = { + const formattedError: any = { http_status: errorCode.http_status || BAD_REQUEST, details: errorCode.details || [], requestId: errorCode.requestId || null, @@ -15,6 +16,17 @@ class SkyflowError extends Error { ? parameterizedString(errorCode.message, ...args) : errorCode.message, }; + + // Deprecated alias — remove after v3 + Object.defineProperty(formattedError, 'request_ID', { + get() { + warnOnce('SkyflowError.error.request_ID is deprecated, use requestId'); + return this.requestId; + }, + enumerable: false, + configurable: true, + }); + super(formattedError.message); this.error = formattedError; } diff --git a/src/service-account/index.ts b/src/service-account/index.ts index 081bcd3a..559995ce 100644 --- a/src/service-account/index.ts +++ b/src/service-account/index.ts @@ -8,9 +8,21 @@ import SkyflowError from '../error'; import SKYFLOW_ERROR_CODE from '../error/codes'; import { ServiceAccountResponseError } from '../vault/types'; import { WithRawResponse } from '../ _generated_/rest/core'; +import { warnOnce } from '../utils/warn-once'; + +function normalizeTokenOptions(options?: BearerTokenOptions): BearerTokenOptions | undefined { + if (!options) return options; + if (options.roleIDs !== undefined && options.roleIds === undefined) { + warnOnce('BearerTokenOptions.roleIDs is deprecated, use roleIds', options.logLevel); + return { ...options, roleIds: options.roleIDs }; + } + return options; +} export type BearerTokenOptions = { ctx?: string | Record, + /** @deprecated Use roleIds instead. Will be removed in v3. */ + roleIDs?: string[], roleIds?: string[], logLevel?: LogLevel, tokenUri?: string, @@ -71,6 +83,7 @@ function generateBearerTokenFromCreds(credentials, options?: BearerTokenOptions) } function getToken(credentials, options?: BearerTokenOptions): Promise { + options = normalizeTokenOptions(options); return new Promise((resolve, reject) => { printLog(logs.infoLogs.GENERATE_BEARER_TOKEN_TRIGGERED, MessageType.LOG, options?.logLevel); try { diff --git a/src/utils/validations/index.ts b/src/utils/validations/index.ts index 1f1d703f..877a96c0 100644 --- a/src/utils/validations/index.ts +++ b/src/utils/validations/index.ts @@ -958,7 +958,7 @@ export const validateUploadFileRequest = (fileRequest: FileUploadRequest, option throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TABLE_IN_UPLOAD_FILE); } - const effectiveSkyflowId = options?.getSkyflowId(); + const effectiveSkyflowId = options?.getSkyflowId() ?? fileRequest._legacySkyflowId; if (!effectiveSkyflowId) { printLog(logs.errorLogs.EMPTY_SKYFLOW_ID_IN_FILE_UPLOAD, MessageType.ERROR, logLevel); throw new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_SKYFLOW_ID_IN_UPLOAD_FILE); diff --git a/src/utils/warn-once.ts b/src/utils/warn-once.ts new file mode 100644 index 00000000..58837908 --- /dev/null +++ b/src/utils/warn-once.ts @@ -0,0 +1,10 @@ +import { LogLevel, MessageType, printLog } from './index'; + +const warned = new Set(); + +export function warnOnce(message: string, logLevel: LogLevel = LogLevel.WARN): void { + if (!warned.has(message)) { + warned.add(message); + printLog(message, MessageType.WARN, logLevel); + } +} diff --git a/src/vault/controller/vault/index.ts b/src/vault/controller/vault/index.ts index f8c2ac7b..2d66bbdc 100644 --- a/src/vault/controller/vault/index.ts +++ b/src/vault/controller/vault/index.ts @@ -25,6 +25,7 @@ import { InsertResponseType, ParsedDetokenizeResponse, ParsedInsertBatchResponse import { generateSDKMetrics, getBearerToken, MessageType, parameterizedString, printLog, TYPES, SDK, removeSDKVersion, RedactionType, SKYFLOW, SkyflowRecordError, HTTP_STATUS_CODE, HTTP_HEADER, CONTENT_TYPE, ENCODING_TYPE } from '../../../utils'; import GetColumnRequest from '../../model/request/get-column'; import logs from '../../../utils/logs'; +import { warnOnce } from '../../../utils/warn-once'; import VaultClient from '../../client'; import { validateDeleteRequest, validateDetokenizeRequest, validateGetColumnRequest, validateGetRequest, validateInsertRequest, validateQueryRequest, validateTokenizeRequest, validateUpdateRequest, validateUploadFileRequest } from '../../../utils/validations'; import path from 'path'; @@ -390,10 +391,17 @@ class VaultController { TYPES.GET ).then(response => { printLog(logs.infoLogs.GET_SUCCESS, MessageType.LOG, this.client.getLogLevel()); + const logLevel = this.client.getLogLevel(); const processedRecords = response.records.map(record => { const fields = typeof record.fields === 'object' && record.fields !== null ? record.fields as Record : {}; const { skyflow_id: skyflowIdValue, ...rest } = fields; - return { ...(skyflowIdValue !== undefined ? { skyflowId: skyflowIdValue } : {}), ...rest }; + const result: any = { ...(skyflowIdValue !== undefined ? { skyflowId: skyflowIdValue } : {}), ...rest }; + Object.defineProperty(result, 'skyflow_id', { + get() { warnOnce('record.skyflow_id is deprecated, use record.skyflowId', logLevel); return this.skyflowId; }, + enumerable: false, + configurable: true, + }); + return result; }); resolve(new GetResponse({ data: processedRecords, errors: null })); }) @@ -443,7 +451,7 @@ class VaultController { const uploadFileV2Request: UploadFileV2Request = { columnName:request.columnName, tableName: request.table, - skyflowID: options?.getSkyflowId(), + skyflowID: options?.getSkyflowId() ?? request._legacySkyflowId, returnFileMetadata: false, } @@ -491,16 +499,23 @@ class VaultController { TYPES.QUERY ).then(response => { printLog(logs.infoLogs.QUERY_SUCCESS, MessageType.LOG, this.client.getLogLevel()); + const logLevel = this.client.getLogLevel(); const processedRecords = response.records.map(record => { const fields = typeof record.fields === 'object' && record.fields !== null ? record.fields as Record : {}; const { skyflow_id: skyflowIdValue, ...rest } = fields; - return { + const result: any = { ...(skyflowIdValue !== undefined ? { skyflowId: skyflowIdValue } : {}), ...rest, tokenizedData: { ...(typeof record.tokens === 'object' && record.tokens !== null ? record.tokens : {}), }, }; + Object.defineProperty(result, 'skyflow_id', { + get() { warnOnce('record.skyflow_id is deprecated, use record.skyflowId', logLevel); return this.skyflowId; }, + enumerable: false, + configurable: true, + }); + return result; }); resolve(new QueryResponse({ fields: processedRecords, errors: null })); }) diff --git a/src/vault/model/options/detokenize/index.ts b/src/vault/model/options/detokenize/index.ts index fcf0850c..c99d8b7c 100644 --- a/src/vault/model/options/detokenize/index.ts +++ b/src/vault/model/options/detokenize/index.ts @@ -1,3 +1,4 @@ +import { warnOnce } from '../../../../utils/warn-once'; class DetokenizeOptions { // Fields with default values @@ -16,6 +17,12 @@ class DetokenizeOptions { this.downloadUrl = downloadUrl; } + /** @deprecated Use setDownloadUrl() instead. Will be removed in v3. */ + setDownloadURL(downloadURL: boolean) { + warnOnce('DetokenizeOptions.setDownloadURL() is deprecated, use setDownloadUrl()'); + this.setDownloadUrl(downloadURL); + } + // Getters getContinueOnError(): boolean | undefined { return this.continueOnError; @@ -24,6 +31,12 @@ class DetokenizeOptions { getDownloadUrl(): boolean | undefined { return this.downloadUrl; } + + /** @deprecated Use getDownloadUrl() instead. Will be removed in v3. */ + getDownloadURL(): boolean | undefined { + warnOnce('DetokenizeOptions.getDownloadURL() is deprecated, use getDownloadUrl()'); + return this.getDownloadUrl(); + } } diff --git a/src/vault/model/options/get/index.ts b/src/vault/model/options/get/index.ts index 41870985..19876063 100644 --- a/src/vault/model/options/get/index.ts +++ b/src/vault/model/options/get/index.ts @@ -1,5 +1,6 @@ // Imports import { OrderByEnum, RedactionType } from "../../../../utils"; +import { warnOnce } from '../../../../utils/warn-once'; class GetOptions { // Fields @@ -41,6 +42,12 @@ class GetOptions { this.downloadUrl = downloadUrl; } + /** @deprecated Use setDownloadUrl() instead. Will be removed in v3. */ + setDownloadURL(downloadURL: boolean) { + warnOnce('GetOptions.setDownloadURL() is deprecated, use setDownloadUrl()'); + this.setDownloadUrl(downloadURL); + } + setColumnName(columnName: string) { this.columnName = columnName; } @@ -78,6 +85,12 @@ class GetOptions { return this.downloadUrl; } + /** @deprecated Use getDownloadUrl() instead. Will be removed in v3. */ + getDownloadURL(): boolean | undefined { + warnOnce('GetOptions.getDownloadURL() is deprecated, use getDownloadUrl()'); + return this.getDownloadUrl(); + } + getColumnName(): string | undefined { return this.columnName; } diff --git a/src/vault/model/request/file-upload/index.ts b/src/vault/model/request/file-upload/index.ts index 39345b2a..21bdb702 100644 --- a/src/vault/model/request/file-upload/index.ts +++ b/src/vault/model/request/file-upload/index.ts @@ -1,13 +1,24 @@ // Imports +import { warnOnce } from '../../../../utils/warn-once'; class FileUploadRequest { private _table: string; private _columnName: string; + _legacySkyflowId?: string; // Constructor - constructor(table: string, columnName: string) { + constructor(table: string, columnNameOrSkyflowId: string, columnName?: string) { this._table = table; - this._columnName = columnName; + + if (columnName !== undefined) { + // OLD: (table, skyflowId, columnName) + warnOnce('FileUploadRequest 3-arg constructor is deprecated. Use FileUploadOptions.setSkyflowId() instead.'); + this._legacySkyflowId = columnNameOrSkyflowId; + this._columnName = columnName; + } else { + // NEW: (table, columnName) + this._columnName = columnNameOrSkyflowId; + } } // Getters and Setters @@ -24,6 +35,18 @@ class FileUploadRequest { public set columnName(value: string) { this._columnName = value; } + + /** @deprecated Use FileUploadOptions.setSkyflowId() instead. Will be removed in v3. */ + public get skyflowId(): string { + warnOnce('FileUploadRequest.skyflowId is deprecated. Use FileUploadOptions.setSkyflowId()'); + return this._legacySkyflowId ?? ''; + } + + /** @deprecated Use FileUploadOptions.setSkyflowId() instead. Will be removed in v3. */ + public set skyflowId(value: string) { + warnOnce('FileUploadRequest.skyflowId is deprecated. Use FileUploadOptions.setSkyflowId()'); + this._legacySkyflowId = value; + } } export default FileUploadRequest; \ No newline at end of file diff --git a/src/vault/model/response/delete/index.ts b/src/vault/model/response/delete/index.ts index 489384fe..737176bb 100644 --- a/src/vault/model/response/delete/index.ts +++ b/src/vault/model/response/delete/index.ts @@ -10,6 +10,9 @@ class DeleteResponse { errors: Array | null; + /** + * @deprecated Passing undefined for deletedIds is no longer supported. Pass empty array [] instead. + */ constructor({ deletedIds, errors }: { deletedIds: Array, errors: Array | null}) { this.deletedIds = deletedIds; this.errors = errors; diff --git a/src/vault/model/response/insert/index.ts b/src/vault/model/response/insert/index.ts index 4fe99507..c50dafdf 100644 --- a/src/vault/model/response/insert/index.ts +++ b/src/vault/model/response/insert/index.ts @@ -9,6 +9,9 @@ class InsertResponse { errors: Array | null; + /** + * @deprecated Passing null for insertedFields is no longer supported. Pass empty array [] instead. + */ constructor({ insertedFields, errors }: { insertedFields: Array, errors: Array | null }) { this.insertedFields = insertedFields; this.errors = errors; diff --git a/src/vault/types/index.ts b/src/vault/types/index.ts index b08ed635..6f789278 100644 --- a/src/vault/types/index.ts +++ b/src/vault/types/index.ts @@ -170,6 +170,8 @@ export interface DetectFileResponse { } export interface SkyflowIdResponse { skyflowId: string; + /** @deprecated Renamed to skyflowId. Will be removed in v3. */ + skyflow_id?: never; } export interface TokensResponse extends SkyflowIdResponse { From 4e459814b337e13293ca27ff42eea8c0e71b34fd Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Fri, 15 May 2026 15:28:27 +0530 Subject: [PATCH 12/34] SK-2812: Fixed test cases --- api-report/skyflow-node.api.md | 14 +++++++++++++- src/utils/validations/index.ts | 2 +- src/vault/controller/vault/index.ts | 2 +- src/vault/model/request/file-upload/index.ts | 2 +- test/vault/controller/vault.test.js | 4 ++-- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/api-report/skyflow-node.api.md b/api-report/skyflow-node.api.md index eb12e53a..5bf2af89 100644 --- a/api-report/skyflow-node.api.md +++ b/api-report/skyflow-node.api.md @@ -16,6 +16,7 @@ export interface ApiKeyCredentials { // @public (undocumented) export type BearerTokenOptions = { ctx?: string | Record; + roleIDs?: string[]; roleIds?: string[]; logLevel?: LogLevel; tokenUri?: string; @@ -442,10 +443,14 @@ export class DetokenizeOptions { // (undocumented) getContinueOnError(): boolean | undefined; // (undocumented) + getDownloadURL(): boolean | undefined; + // (undocumented) getDownloadUrl(): boolean | undefined; // (undocumented) setContinueOnError(continueOnError: boolean): void; // (undocumented) + setDownloadURL(downloadURL: boolean): void; + // (undocumented) setDownloadUrl(downloadUrl: boolean): void; } @@ -516,11 +521,14 @@ export class FileUploadOptions { // @public (undocumented) export class FileUploadRequest { - constructor(table: string, columnName: string); + constructor(table: string, columnNameOrSkyflowId: string, columnName?: string); // (undocumented) get columnName(): string; set columnName(value: string); // (undocumented) + get skyflowId(): string; + set skyflowId(value: string); + // (undocumented) get table(): string; set table(value: string); } @@ -588,6 +596,8 @@ export class GetOptions { // (undocumented) getColumnValues(): Array | undefined; // (undocumented) + getDownloadURL(): boolean | undefined; + // (undocumented) getDownloadUrl(): boolean | undefined; // (undocumented) getFields(): Array | undefined; @@ -606,6 +616,8 @@ export class GetOptions { // (undocumented) setColumnValues(columnValues: Array): void; // (undocumented) + setDownloadURL(downloadURL: boolean): void; + // (undocumented) setDownloadUrl(downloadUrl: boolean): void; // (undocumented) setFields(fields: Array): void; diff --git a/src/utils/validations/index.ts b/src/utils/validations/index.ts index 877a96c0..5973ed8c 100644 --- a/src/utils/validations/index.ts +++ b/src/utils/validations/index.ts @@ -958,7 +958,7 @@ export const validateUploadFileRequest = (fileRequest: FileUploadRequest, option throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TABLE_IN_UPLOAD_FILE); } - const effectiveSkyflowId = options?.getSkyflowId() ?? fileRequest._legacySkyflowId; + const effectiveSkyflowId = options?.getSkyflowId() ?? (fileRequest as any)._legacySkyflowId; if (!effectiveSkyflowId) { printLog(logs.errorLogs.EMPTY_SKYFLOW_ID_IN_FILE_UPLOAD, MessageType.ERROR, logLevel); throw new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_SKYFLOW_ID_IN_UPLOAD_FILE); diff --git a/src/vault/controller/vault/index.ts b/src/vault/controller/vault/index.ts index 2d66bbdc..df400e50 100644 --- a/src/vault/controller/vault/index.ts +++ b/src/vault/controller/vault/index.ts @@ -451,7 +451,7 @@ class VaultController { const uploadFileV2Request: UploadFileV2Request = { columnName:request.columnName, tableName: request.table, - skyflowID: options?.getSkyflowId() ?? request._legacySkyflowId, + skyflowID: options?.getSkyflowId() ?? (request as any)._legacySkyflowId, returnFileMetadata: false, } diff --git a/src/vault/model/request/file-upload/index.ts b/src/vault/model/request/file-upload/index.ts index 21bdb702..ece06e79 100644 --- a/src/vault/model/request/file-upload/index.ts +++ b/src/vault/model/request/file-upload/index.ts @@ -4,7 +4,7 @@ import { warnOnce } from '../../../../utils/warn-once'; class FileUploadRequest { private _table: string; private _columnName: string; - _legacySkyflowId?: string; + private _legacySkyflowId?: string; // Constructor constructor(table: string, columnNameOrSkyflowId: string, columnName?: string) { diff --git a/test/vault/controller/vault.test.js b/test/vault/controller/vault.test.js index cea3e766..2a5224a8 100644 --- a/test/vault/controller/vault.test.js +++ b/test/vault/controller/vault.test.js @@ -1100,7 +1100,7 @@ describe('VaultController query method', () => { expect(response).toBeInstanceOf(QueryResponse); expect(response.fields[0].skyflowId).toBe('id123'); - expect(response.fields[0].skyflow_id).toBeUndefined(); + expect(response.fields[0].skyflow_id).toBe('id123'); // deprecated shim expect(response.fields[0].id).toBe('1'); expect(response.fields[0].tokenizedData.id).toBe('token123'); expect(response.errors).toBe(null); @@ -1746,7 +1746,7 @@ describe('VaultController get method', () => { expect(response).toBeInstanceOf(GetResponse); expect(response.data[0].skyflowId).toBe('id123'); - expect(response.data[0].skyflow_id).toBeUndefined(); + expect(response.data[0].skyflow_id).toBe('id123'); // deprecated shim expect(response.data[0].field1).toBe('value1'); expect(response.errors).toBeNull(); }); From a7b221b5fd9d62be85ff895d32b5e2c74c7842d4 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Fri, 15 May 2026 18:06:28 +0530 Subject: [PATCH 13/34] SK-2812: Updated Readme and Changelog --- CHANGELOG.md | 60 ---------------------------------------------------- README.md | 6 +++--- 2 files changed, 3 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7811f17..0d40eb52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,63 +3,3 @@ All notable changes to this project will be documented as part of the release notes. See [Github](https://github.com/skyflowapi/skyflow-node/releases) or [npm](https://www.npmjs.com/package/skyflow-node?activeTab=versions) for more details on each released version. - -## [Unreleased] — Public Interface Cleanup (v2) - -### Breaking Changes - -#### Credential field renames -The credentials JSON object now uses camelCase keys. The old ALL_CAPS variants are accepted for backward compatibility but will be removed in a future release. - -| Old key | New key | -|---|---| -| `clientID` | `clientId` | -| `keyID` | `keyId` | -| `tokenURI` | `tokenUri` | - -**Migration:** -```diff -- { clientID: '...', keyID: '...', tokenURI: '...' } -+ { clientId: '...', keyId: '...', tokenUri: '...' } -``` - -#### `BearerTokenOptions.roleIDs` → `roleIds` -```diff -- generateBearerToken(path, { roleIDs: ['role1'] }) -+ generateBearerToken(path, { roleIds: ['role1'] }) -``` - -#### `SkyflowError.error.request_ID` → `requestId` -```diff -- error.error.request_ID -+ error.error.requestId -``` - -#### `FileUploadRequest` — `skyflowId` removed from constructor -`skyflowId` is no longer a positional argument. Set it via `FileUploadOptions.setSkyflowId()` instead. -```diff -- new FileUploadRequest(table, skyflowId, columnName) -+ const req = new FileUploadRequest(table, columnName) -+ const opts = new FileUploadOptions() -+ opts.setSkyflowId(skyflowId) -``` - -#### `DetokenizeOptions` / `GetOptions` — `downloadURL` → `downloadUrl` -```diff -- options.setDownloadURL(true) -+ options.setDownloadUrl(true) -``` - -#### `Bleep` — `start_padding` / `stop_padding` → `startPadding` / `stopPadding` -```diff -- bleep.setStartPadding(start_padding) -- bleep.setStopPadding(stop_padding) -+ bleep.setStartPadding(startPadding) -+ bleep.setStopPadding(stopPadding) -``` - -### Behavior Changes - -- **`insertedFields` always array**: `InsertResponse.insertedFields` is now `Array` (never `null`). An empty array is returned when there are no successful records. -- **Fail-fast validation**: `insert()` now throws `SkyflowError` (EMPTY_FIELD) before any network call when a record field value is `null`, `undefined`, or `""`. Values `0`, `false`, and `0.0` remain valid. -- **`errors` always present**: All response objects (`Insert`, `Update`, `Get`, `Delete`, `Query`, `Tokenize`, `DeidentifyText`, `DeidentifyFile`) always include an `errors` field — `null` when there are no errors, never absent. diff --git a/README.md b/README.md index 01eb4edc..15a13a45 100644 --- a/README.md +++ b/README.md @@ -465,7 +465,7 @@ Refer to [Query your data](https://docs.skyflow.com/query-data/) and [Execute Qu ### Upload File -Upload files to a Skyflow vault using the `uploadFile` method. Create a file upload request with the `FileUploadRequest` class, which accepts parameters such as the table name, column name, and Skyflow ID. Configure upload options with the `FileUploadOptions` class, which accepts the file object as shown below: +Upload files to a Skyflow vault using the `uploadFile` method. Create a file upload request with the `FileUploadRequest` class, which accepts the table name and column name. Set the Skyflow ID via `FileUploadOptions.setSkyflowId()`. Configure upload options with the `FileUploadOptions` class, which accepts the file object as shown below: ```typescript // Please use Node version 20 & above to run file upload @@ -479,19 +479,19 @@ import * as fs from "fs"; // Prepare File Upload Data const tableName: string = "table-name"; // Table name -const skyflowId: string = "skyflow-id"; // Skyflow ID of the record const columnName: string = "column-name"; // Column name to store file +const skyflowId: string = "skyflow-id"; // Skyflow ID of the record const filePath: string = "file-path"; // Path to the file for upload // Create File Upload Request const uploadReq: FileUploadRequest = new FileUploadRequest( tableName, - skyflowId, columnName, ); // Configure FileUpload Options const uploadOptions: FileUploadOptions = new FileUploadOptions(); +uploadOptions.setSkyflowId(skyflowId); // Set the Skyflow ID via options const buffer = fs.readFileSync(filePath); // Set any one of FilePath, Base64 or FileObject in FileUploadOptions uploadOptions.setFileObject(new File([buffer], filePath)); // Set a File object From 2b8918568736d2c3de3e14500f5924dd2ea98372 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Mon, 18 May 2026 17:08:58 +0530 Subject: [PATCH 14/34] SK-2812: Fixed deprecation message format --- src/error/index.ts | 5 +- src/service-account/index.ts | 85 +++++++++----------- src/vault/controller/vault/index.ts | 37 +++------ src/vault/model/options/detokenize/index.ts | 6 +- src/vault/model/options/get/index.ts | 7 +- src/vault/model/request/file-upload/index.ts | 9 ++- 6 files changed, 62 insertions(+), 87 deletions(-) diff --git a/src/error/index.ts b/src/error/index.ts index ce26373c..847a4867 100644 --- a/src/error/index.ts +++ b/src/error/index.ts @@ -1,5 +1,4 @@ -import { BAD_REQUEST, ISkyflowError, parameterizedString } from "../utils"; -import { warnOnce } from "../utils/warn-once"; +import { BAD_REQUEST, ISkyflowError, LogLevel, MessageType, parameterizedString, printLog } from "../utils"; class SkyflowError extends Error { @@ -20,7 +19,7 @@ class SkyflowError extends Error { // Deprecated alias — remove after v3 Object.defineProperty(formattedError, 'request_ID', { get() { - warnOnce('SkyflowError.error.request_ID is deprecated, use requestId'); + printLog("[DEPRECATED] Property 'request_ID' is deprecated and will be removed in an upcoming release. Use 'requestId' instead.", MessageType.WARN, LogLevel.WARN); return this.requestId; }, enumerable: false, diff --git a/src/service-account/index.ts b/src/service-account/index.ts index 559995ce..e04b714b 100644 --- a/src/service-account/index.ts +++ b/src/service-account/index.ts @@ -8,12 +8,11 @@ import SkyflowError from '../error'; import SKYFLOW_ERROR_CODE from '../error/codes'; import { ServiceAccountResponseError } from '../vault/types'; import { WithRawResponse } from '../ _generated_/rest/core'; -import { warnOnce } from '../utils/warn-once'; function normalizeTokenOptions(options?: BearerTokenOptions): BearerTokenOptions | undefined { if (!options) return options; if (options.roleIDs !== undefined && options.roleIds === undefined) { - warnOnce('BearerTokenOptions.roleIDs is deprecated, use roleIds', options.logLevel); + printLog("[DEPRECATED] Property 'roleIDs' is deprecated and will be removed in an upcoming release. Use 'roleIds' instead.", MessageType.WARN, options.logLevel); return { ...options, roleIds: options.roleIDs }; } return options; @@ -56,20 +55,20 @@ function generateBearerToken(credentialsFilePath: string, options?: BearerTokenO if (!fs.existsSync(credentialsFilePath)) { printLog(parameterizedString(logs.errorLogs.FILE_NOT_FOUND, [credentialsFilePath]), MessageType.ERROR, options?.logLevel); - reject(new SkyflowError(SKYFLOW_ERROR_CODE.FILE_NOT_FOUND, [credentialsFilePath])); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.FILE_NOT_FOUND, [credentialsFilePath])); } credentials = fs.readFileSync(credentialsFilePath, ENCODING_TYPE.UTF8); if (credentials === '') { printLog(logs.errorLogs.EMPTY_FILE, MessageType.ERROR, options?.logLevel); - reject(new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_JSON_FILE, [credentialsFilePath])) + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_JSON_FILE, [credentialsFilePath])) } try { JSON.parse(credentials); } catch (e) { printLog(logs.errorLogs.NOT_A_VALID_JSON, MessageType.ERROR, options?.logLevel); - reject(new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_JSON_FILE, [credentialsFilePath])); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_JSON_FILE, [credentialsFilePath])); } getToken(credentials, options).then((res) => { @@ -89,21 +88,21 @@ function getToken(credentials, options?: BearerTokenOptions): Promise { printLog(logs.infoLogs.GENERATE_SIGNED_DATA_TOKENS_TRIGGERED, MessageType.LOG, options?.logLevel); try { - if (!credentials && credentials == "") { + if (!credentials || credentials === "" || credentials === "{}") { printLog(logs.errorLogs.CREDENTIALS_CONTENT_EMPTY, MessageType.ERROR, options?.logLevel); - reject(new SkyflowError(SKYFLOW_ERROR_CODE.EMPTY_CREDENTIALS_STRING)); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.EMPTY_CREDENTIALS_STRING)); } if (typeof (credentials) !== "string") { printLog(logs.errorLogs.EXPECTED_STRING_PARAMETER, MessageType.ERROR, options?.logLevel); - reject(new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_CREDENTIALS_STRING)); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_CREDENTIALS_STRING)); } - if (options?.dataTokens && options.dataTokens?.length == 0) { - printLog(logs.errorLogs.DATA_TOKENS_EMPTY, MessageType.ERROR, options?.logLevel); - reject(new SkyflowError(SKYFLOW_ERROR_CODE.EMPTY_DATA_TOKENS)); - } - - if (options && options.dataTokens == null || undefined) { + if (!options || options.dataTokens == null) { printLog(logs.errorLogs.DATA_TOKENS_NOT_FOUND, MessageType.ERROR, options?.logLevel); - reject(new SkyflowError(SKYFLOW_ERROR_CODE.EMPTY_DATA_TOKENS)); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.EMPTY_DATA_TOKENS)); } - if (options?.dataTokens && !Array.isArray(options.dataTokens)) { + if (!Array.isArray(options.dataTokens)) { printLog(logs.errorLogs.EXPECTED_DATA_TOKENS_PARAMETER, MessageType.ERROR, options?.logLevel); - reject(new SkyflowError(SKYFLOW_ERROR_CODE.DATA_TOKEN_KEY_TYPE)); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.DATA_TOKEN_KEY_TYPE)); + } + + if (options.dataTokens.length == 0) { + printLog(logs.errorLogs.DATA_TOKENS_EMPTY, MessageType.ERROR, options?.logLevel); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.EMPTY_DATA_TOKENS)); } if (options?.timeToLive && typeof (options.timeToLive) !== "number") { printLog(logs.errorLogs.EXPECTED_TIME_TO_LIVE_PARAMETER, MessageType.ERROR, options?.logLevel); - reject(new SkyflowError(SKYFLOW_ERROR_CODE.TIME_TO_LIVE_KET_TYPE)); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.TIME_TO_LIVE_KET_TYPE)); } let credentialsObj = JSON.parse("{}") @@ -254,7 +253,7 @@ function getSignedTokens(credentials, options: SignedDataTokensOptions): Promise } catch (e) { printLog(logs.errorLogs.NOT_A_VALID_JSON, MessageType.ERROR, options?.logLevel); - reject(new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_JSON_FORMAT)); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_JSON_FORMAT)); } if (options && Object.prototype.hasOwnProperty.call(options, 'tokenUri')) { @@ -290,11 +289,11 @@ function getSignedTokens(credentials, options: SignedDataTokensOptions): Promise if (claims.key == null) { printLog(logs.errorLogs.KEY_ID_NOT_FOUND, MessageType.ERROR, options?.logLevel); - reject(new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_KEY_ID)); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_KEY_ID)); } else if (claims.aud == null) { printLog(logs.errorLogs.TOKEN_URI_NOT_FOUND, MessageType.ERROR, options?.logLevel); - reject(new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_TOKEN_URI)); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_TOKEN_URI)); } else if (credentialsObj.privateKey == null) { printLog(logs.errorLogs.PRIVATE_KEY_NOT_FOUND, MessageType.ERROR, options?.logLevel); @@ -362,12 +361,10 @@ function failureResponse(err: ServiceAccountResponseError, options?: BearerToken function successResponse(res: V1GetAuthTokenResponse, logLevel?: LogLevel): Promise { printLog(logs.infoLogs.GENERATE_BEARER_TOKEN_SUCCESS, MessageType.LOG, logLevel); - return new Promise((resolve, _) => { - resolve({ - accessToken: res.accessToken ?? '', - tokenType: res.tokenType ?? '', - }); - }) + return Promise.resolve({ + accessToken: res.accessToken ?? '', + tokenType: res.tokenType ?? '', + }); } function getSignedDataTokenResponseObject(signedToken, actualToken): SignedDataTokensResponse { @@ -380,9 +377,7 @@ function getSignedDataTokenResponseObject(signedToken, actualToken): SignedDataT function signedDataTokenSuccessResponse(res: SignedDataTokensResponse[], logLevel?: LogLevel): Promise { printLog(logs.infoLogs.GENERATE_SIGNED_DATA_TOKEN_SUCCESS, MessageType.LOG, logLevel); - return new Promise((resolve, _) => { - resolve(res); - }) + return Promise.resolve(res); } export function getRolesForScopedToken(roleIds: string[]) { diff --git a/src/vault/controller/vault/index.ts b/src/vault/controller/vault/index.ts index df400e50..f94f230a 100644 --- a/src/vault/controller/vault/index.ts +++ b/src/vault/controller/vault/index.ts @@ -25,7 +25,6 @@ import { InsertResponseType, ParsedDetokenizeResponse, ParsedInsertBatchResponse import { generateSDKMetrics, getBearerToken, MessageType, parameterizedString, printLog, TYPES, SDK, removeSDKVersion, RedactionType, SKYFLOW, SkyflowRecordError, HTTP_STATUS_CODE, HTTP_HEADER, CONTENT_TYPE, ENCODING_TYPE } from '../../../utils'; import GetColumnRequest from '../../model/request/get-column'; import logs from '../../../utils/logs'; -import { warnOnce } from '../../../utils/warn-once'; import VaultClient from '../../client'; import { validateDeleteRequest, validateDetokenizeRequest, validateGetColumnRequest, validateGetRequest, validateInsertRequest, validateQueryRequest, validateTokenizeRequest, validateUpdateRequest, validateUploadFileRequest } from '../../../utils/validations'; import path from 'path'; @@ -35,6 +34,7 @@ import FileUploadOptions from '../../model/options/fileUpload'; class VaultController { private client: VaultClient; + private static readonly HTTP_OK = 200; constructor(client: VaultClient) { this.client = client; @@ -108,7 +108,7 @@ class VaultController { } private isSuccess(record: Record): boolean { - return record?.Status === 200; + return record?.Status === VaultController.HTTP_OK; } private processSuccess(record: Record, index: number, response: ParsedInsertBatchResponse): void { @@ -139,7 +139,7 @@ class VaultController { response.errors.push(errorObj); } - private handleRequest(apiCall: Function, requestType: string): Promise { + private handleRequest(apiCall: (options: Records.RequestOptions) => Promise<{ data: any; rawResponse: any }>, requestType: string): Promise { return new Promise((resolve, reject) => { printLog(parameterizedString(logs.infoLogs.EMIT_REQUEST, TYPES[requestType]), MessageType.LOG, this.client.getLogLevel()); const sdkHeaders = this.createSdkHeaders(); @@ -395,10 +395,10 @@ class VaultController { const processedRecords = response.records.map(record => { const fields = typeof record.fields === 'object' && record.fields !== null ? record.fields as Record : {}; const { skyflow_id: skyflowIdValue, ...rest } = fields; - const result: any = { ...(skyflowIdValue !== undefined ? { skyflowId: skyflowIdValue } : {}), ...rest }; + const result: Record = { ...(skyflowIdValue !== undefined ? { skyflowId: skyflowIdValue } : {}), ...rest }; Object.defineProperty(result, 'skyflow_id', { - get() { warnOnce('record.skyflow_id is deprecated, use record.skyflowId', logLevel); return this.skyflowId; }, - enumerable: false, + get() { printLog("[DEPRECATED] Property 'skyflow_id' is deprecated and will be removed in an upcoming release. Use 'skyflowId' instead.", MessageType.WARN, logLevel); return this.skyflowId; }, + enumerable: true, configurable: true, }); return result; @@ -503,7 +503,7 @@ class VaultController { const processedRecords = response.records.map(record => { const fields = typeof record.fields === 'object' && record.fields !== null ? record.fields as Record : {}; const { skyflow_id: skyflowIdValue, ...rest } = fields; - const result: any = { + const result: Record = { ...(skyflowIdValue !== undefined ? { skyflowId: skyflowIdValue } : {}), ...rest, tokenizedData: { @@ -511,8 +511,8 @@ class VaultController { }, }; Object.defineProperty(result, 'skyflow_id', { - get() { warnOnce('record.skyflow_id is deprecated, use record.skyflowId', logLevel); return this.skyflowId; }, - enumerable: false, + get() { printLog("[DEPRECATED] Property 'skyflow_id' is deprecated and will be removed in an upcoming release. Use 'skyflowId' instead.", MessageType.WARN, logLevel); return this.skyflowId; }, + enumerable: true, configurable: true, }); return result; @@ -591,25 +591,6 @@ class VaultController { }); } - connection() { - // cache detect object if created - // return detect object using static func - } - - lookUpBin() { - // cache binlookup object if created - // return binlookup object using static func - } - - audit() { - // cache audit object if created - // return audit object using static func - } - - detect() { - // cache detect object if created - // return detect object using static func - } } export default VaultController; \ No newline at end of file diff --git a/src/vault/model/options/detokenize/index.ts b/src/vault/model/options/detokenize/index.ts index c99d8b7c..bd02822c 100644 --- a/src/vault/model/options/detokenize/index.ts +++ b/src/vault/model/options/detokenize/index.ts @@ -1,4 +1,4 @@ -import { warnOnce } from '../../../../utils/warn-once'; +import { LogLevel, MessageType, printLog } from '../../../../utils'; class DetokenizeOptions { // Fields with default values @@ -19,7 +19,7 @@ class DetokenizeOptions { /** @deprecated Use setDownloadUrl() instead. Will be removed in v3. */ setDownloadURL(downloadURL: boolean) { - warnOnce('DetokenizeOptions.setDownloadURL() is deprecated, use setDownloadUrl()'); + printLog("[DEPRECATED] Method 'setDownloadURL()' is deprecated and will be removed in an upcoming release. Use 'setDownloadUrl()' instead.", MessageType.WARN, LogLevel.WARN); this.setDownloadUrl(downloadURL); } @@ -34,7 +34,7 @@ class DetokenizeOptions { /** @deprecated Use getDownloadUrl() instead. Will be removed in v3. */ getDownloadURL(): boolean | undefined { - warnOnce('DetokenizeOptions.getDownloadURL() is deprecated, use getDownloadUrl()'); + printLog("[DEPRECATED] Method 'getDownloadURL()' is deprecated and will be removed in an upcoming release. Use 'getDownloadUrl()' instead.", MessageType.WARN, LogLevel.WARN); return this.getDownloadUrl(); } } diff --git a/src/vault/model/options/get/index.ts b/src/vault/model/options/get/index.ts index 19876063..1c3776f5 100644 --- a/src/vault/model/options/get/index.ts +++ b/src/vault/model/options/get/index.ts @@ -1,6 +1,5 @@ // Imports -import { OrderByEnum, RedactionType } from "../../../../utils"; -import { warnOnce } from '../../../../utils/warn-once'; +import { LogLevel, MessageType, OrderByEnum, printLog, RedactionType } from "../../../../utils"; class GetOptions { // Fields @@ -44,7 +43,7 @@ class GetOptions { /** @deprecated Use setDownloadUrl() instead. Will be removed in v3. */ setDownloadURL(downloadURL: boolean) { - warnOnce('GetOptions.setDownloadURL() is deprecated, use setDownloadUrl()'); + printLog("[DEPRECATED] Method 'setDownloadURL()' is deprecated and will be removed in an upcoming release. Use 'setDownloadUrl()' instead.", MessageType.WARN, LogLevel.WARN); this.setDownloadUrl(downloadURL); } @@ -87,7 +86,7 @@ class GetOptions { /** @deprecated Use getDownloadUrl() instead. Will be removed in v3. */ getDownloadURL(): boolean | undefined { - warnOnce('GetOptions.getDownloadURL() is deprecated, use getDownloadUrl()'); + printLog("[DEPRECATED] Method 'getDownloadURL()' is deprecated and will be removed in an upcoming release. Use 'getDownloadUrl()' instead.", MessageType.WARN, LogLevel.WARN); return this.getDownloadUrl(); } diff --git a/src/vault/model/request/file-upload/index.ts b/src/vault/model/request/file-upload/index.ts index ece06e79..749b851b 100644 --- a/src/vault/model/request/file-upload/index.ts +++ b/src/vault/model/request/file-upload/index.ts @@ -1,5 +1,5 @@ // Imports -import { warnOnce } from '../../../../utils/warn-once'; +import { LogLevel, MessageType, printLog } from '../../../../utils'; class FileUploadRequest { private _table: string; @@ -12,7 +12,8 @@ class FileUploadRequest { if (columnName !== undefined) { // OLD: (table, skyflowId, columnName) - warnOnce('FileUploadRequest 3-arg constructor is deprecated. Use FileUploadOptions.setSkyflowId() instead.'); + printLog("[DEPRECATED] FileUploadRequest(table, skyflowId, columnName) is deprecated and will be removed in a future release. " + + "Use FileUploadRequest(table, columnName) with FileUploadOptions.setSkyflowId(skyflowId) instead.", MessageType.WARN, LogLevel.WARN); this._legacySkyflowId = columnNameOrSkyflowId; this._columnName = columnName; } else { @@ -38,13 +39,13 @@ class FileUploadRequest { /** @deprecated Use FileUploadOptions.setSkyflowId() instead. Will be removed in v3. */ public get skyflowId(): string { - warnOnce('FileUploadRequest.skyflowId is deprecated. Use FileUploadOptions.setSkyflowId()'); + printLog("[DEPRECATED] Property 'skyflowId' of FileUploadRequest is deprecated and will be removed in an upcoming release. Use FileUploadOptions.setSkyflowId() instead.", MessageType.WARN, LogLevel.WARN); return this._legacySkyflowId ?? ''; } /** @deprecated Use FileUploadOptions.setSkyflowId() instead. Will be removed in v3. */ public set skyflowId(value: string) { - warnOnce('FileUploadRequest.skyflowId is deprecated. Use FileUploadOptions.setSkyflowId()'); + printLog("[DEPRECATED] Property 'skyflowId' of FileUploadRequest is deprecated and will be removed in an upcoming release. Use FileUploadOptions.setSkyflowId() instead.", MessageType.WARN, LogLevel.WARN); this._legacySkyflowId = value; } } From ebd26799225b10e06360a84131cbc9ab18d874e8 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Mon, 18 May 2026 19:15:15 +0530 Subject: [PATCH 15/34] SK-2812: Fixed test cases and readme --- CHANGELOG.md | 6 +- README.md | 2 + test/error/skyflow-error.test.js | 52 +++++++ test/service-account/token.test.js | 101 ++++++++++++- test/vault/controller/vault.test.js | 94 +++++++++--- test/vault/model/deprecated.test.js | 222 ++++++++++++++++++++++++++++ 6 files changed, 451 insertions(+), 26 deletions(-) create mode 100644 test/vault/model/deprecated.test.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d40eb52..847514d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog -All notable changes to this project will be documented as part of the release notes. +All notable changes to this project will be documented as part of the release notes. -See [Github](https://github.com/skyflowapi/skyflow-node/releases) or [npm](https://www.npmjs.com/package/skyflow-node?activeTab=versions) for more details on each released version. +See [Github](https://github.com/skyflowapi/skyflow-node/releases) or [npm](https://www.npmjs.com/package/skyflow-node?activeTab=versions) for more details on each released version. + +--- diff --git a/README.md b/README.md index 15a13a45..9348e7d4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Skyflow Node.js SDK +> **Node.js V2.1.x IS NOW AVAILABLE:** A new, improved version of the Skyflow SDK is ready with flexible authentication, multi-vault support, and richer error diagnostics. V1 is in maintenance mode (security patches only) and will reach End of Life on October 31, 2026. We recommend upgrading to v2 — see the **[Migration Guide](docs/migrate_to_v2.md)** for step-by-step instructions. + Securely handle sensitive data at rest, in-transit, and in-use with the Skyflow SDK for Node.js, Deno, Bun, and Cloudflare Workers. [![CI](https://img.shields.io/static/v1?label=CI&message=passing&color=green?style=plastic&logo=github)](https://github.com/skyflowapi/skyflow-node/actions) diff --git a/test/error/skyflow-error.test.js b/test/error/skyflow-error.test.js index fec8fb0c..1342de7d 100644 --- a/test/error/skyflow-error.test.js +++ b/test/error/skyflow-error.test.js @@ -1,3 +1,8 @@ +jest.mock('../../src/service-account/client', () => ({ + __esModule: true, + default: jest.fn(), +})); + import SkyflowError from '../../src/error'; describe('SkyflowError', () => { @@ -46,3 +51,50 @@ describe('SkyflowError', () => { expect(err.message).toBe('null args message'); }); }); + +describe('SkyflowError deprecated request_ID alias', () => { + let warnSpy; + + beforeEach(() => { + warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + }); + + afterEach(() => { + warnSpy.mockRestore(); + }); + + test('request_ID returns same value as requestId', () => { + const err = new SkyflowError({ + http_code: 400, + message: 'test', + requestId: 'req-abc-123', + }); + expect(err.error.request_ID).toBe('req-abc-123'); + expect(err.error.request_ID).toBe(err.error.requestId); + }); + + test('request_ID returns null when requestId not set', () => { + const err = new SkyflowError({ http_code: 400, message: 'test' }); + expect(err.error.request_ID).toBeNull(); + }); + + test('request_ID logs deprecation warning', () => { + const err = new SkyflowError({ + http_code: 400, + message: 'test', + requestId: 'req-xyz', + }); + void err.error.request_ID; + expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('request_ID')); + expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('requestId')); + }); + + test('request_ID is not enumerable', () => { + const err = new SkyflowError({ + http_code: 400, + message: 'test', + requestId: 'req-xyz', + }); + expect(Object.keys(err.error)).not.toContain('request_ID'); + }); +}); diff --git a/test/service-account/token.test.js b/test/service-account/token.test.js index 6d0a0162..52cc183a 100644 --- a/test/service-account/token.test.js +++ b/test/service-account/token.test.js @@ -12,7 +12,7 @@ import { import SkyflowError from '../../src/error'; import errorMessages from '../../src/error/messages'; import jwt from 'jsonwebtoken'; -import { LogLevel } from "../../src"; +import { LogLevel } from "../../src/utils"; const validCredentials = { clientID: "test-client-id", @@ -676,3 +676,102 @@ describe('getToken and getSignedTokens tokenUri override tests', () => { await expect(generateSignedDataTokensFromCreds(validCredsString, invalidOptions)).rejects.toThrow(); }); }); + +describe('deprecated BearerTokenOptions.roleIDs normalization', () => { + let warnSpy; + + beforeEach(() => { + warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {}); + jest.spyOn(jwt, 'sign').mockReturnValue('mocked_token'); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + test('roleIDs is normalized to roleIds and logs deprecation warning', async () => { + const Client = jest.requireMock('../../src/service-account/client').default; + Client.mockImplementationOnce(() => ({ + authApi: { + authenticationServiceGetAuthToken: jest.fn(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: { accessToken: 'mocked_access_token', tokenType: 'Bearer' }, + rawResponse: { + headers: { get: jest.fn().mockReturnValue('req-id') }, + }, + }), + })), + }, + })); + const validCreds = JSON.stringify({ + clientID: 'test-client-id', + keyID: 'test-key-id', + tokenURI: 'https://test-token-uri.com', + privateKey: 'some-key', + }); + const result = await getToken(validCreds, { + logLevel: LogLevel.WARN, + roleIDs: ['role1', 'role2'], + }); + expect(result).toBeDefined(); + expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('roleIDs')); + expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('roleIds')); + }); + + test('roleIDs is not normalized when roleIds is already set', async () => { + const Client = jest.requireMock('../../src/service-account/client').default; + Client.mockImplementationOnce(() => ({ + authApi: { + authenticationServiceGetAuthToken: jest.fn(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: { accessToken: 'mocked_access_token', tokenType: 'Bearer' }, + rawResponse: { + headers: { get: jest.fn().mockReturnValue('req-id') }, + }, + }), + })), + }, + })); + const validCreds = JSON.stringify({ + clientID: 'test-client-id', + keyID: 'test-key-id', + tokenURI: 'https://test-token-uri.com', + privateKey: 'some-key', + }); + const result = await getToken(validCreds, { + logLevel: LogLevel.WARN, + roleIDs: ['role1'], + roleIds: ['role2'], + }); + expect(result).toBeDefined(); + expect(warnSpy).not.toHaveBeenCalledWith( + expect.stringContaining('roleIDs'), + ); + }); + + test('undefined options passes through without normalization', async () => { + const Client = jest.requireMock('../../src/service-account/client').default; + Client.mockImplementationOnce(() => ({ + authApi: { + authenticationServiceGetAuthToken: jest.fn(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: { accessToken: 'mocked_access_token', tokenType: 'Bearer' }, + rawResponse: { + headers: { get: jest.fn().mockReturnValue('req-id') }, + }, + }), + })), + }, + })); + const validCreds = JSON.stringify({ + clientID: 'test-client-id', + keyID: 'test-key-id', + tokenURI: 'https://test-token-uri.com', + privateKey: 'some-key', + }); + await getToken(validCreds); + expect(warnSpy).not.toHaveBeenCalledWith( + expect.stringContaining('roleIDs'), + ); + }); +}); diff --git a/test/vault/controller/vault.test.js b/test/vault/controller/vault.test.js index 2a5224a8..322e44f8 100644 --- a/test/vault/controller/vault.test.js +++ b/test/vault/controller/vault.test.js @@ -35,6 +35,7 @@ jest.mock('../../../src/utils', () => ({ MessageType: { LOG: 'LOG', ERROR: 'ERROR', + WARN: 'WARN', }, RedactionType: { DEFAULT: 'DEFAULT', @@ -114,29 +115,6 @@ describe('VaultController', () => { expect(vaultController.client).toBe(mockVaultClient); }); - test('should have the connection method defined', () => { - const vaultController = new VaultController(mockVaultClient); - expect(vaultController.connection).toBeDefined(); - expect(typeof vaultController.connection).toBe('function'); - }); - - test('should have the lookUpBin method defined', () => { - const vaultController = new VaultController(mockVaultClient); - expect(vaultController.lookUpBin).toBeDefined(); - expect(typeof vaultController.lookUpBin).toBe('function'); - }); - - test('should have the audit method defined', () => { - const vaultController = new VaultController(mockVaultClient); - expect(vaultController.audit).toBeDefined(); - expect(typeof vaultController.audit).toBe('function'); - }); - - test('should have the detect method defined', () => { - const vaultController = new VaultController(mockVaultClient); - expect(vaultController.detect).toBeDefined(); - expect(typeof vaultController.detect).toBe('function'); - }); }); describe('VaultController insert method', () => { @@ -1106,6 +1084,43 @@ describe('VaultController query method', () => { expect(response.errors).toBe(null); }); + test('skyflow_id is enumerable on query response fields', async () => { + const mockRequest = { query: 'SELECT * FROM table WHERE id=1' }; + const mockResponseData = { + records: [{ fields: { skyflow_id: 'id123', id: '1' }, tokens: { id: 'token123' } }] + }; + mockVaultClient.queryAPI.queryServiceExecuteQuery.mockImplementation(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: mockResponseData, + rawResponse: { headers: { get: jest.fn().mockReturnValue('request-id-123') } } + }) + })); + const response = await vaultController.query(mockRequest); + expect(Object.keys(response.fields[0])).toContain('skyflow_id'); + expect(JSON.stringify(response.fields[0])).toContain('"skyflow_id"'); + }); + + test('skyflow_id shim on query response calls printLog with deprecation message', async () => { + const mockRequest = { query: 'SELECT * FROM table WHERE id=1' }; + const mockResponseData = { + records: [{ fields: { skyflow_id: 'id123', id: '1' }, tokens: { id: 'token123' } }] + }; + mockVaultClient.queryAPI.queryServiceExecuteQuery.mockImplementation(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: mockResponseData, + rawResponse: { headers: { get: jest.fn().mockReturnValue('request-id-123') } } + }) + })); + const response = await vaultController.query(mockRequest); + printLog.mockClear(); + void response.fields[0].skyflow_id; + expect(printLog).toHaveBeenCalledWith( + expect.stringContaining('skyflow_id'), + expect.anything(), + expect.anything(), + ); + }); + test('should successfully query records as null', async () => { const mockRequest = { query: 'SELECT * FROM table WHERE id=1', @@ -1751,6 +1766,39 @@ describe('VaultController get method', () => { expect(response.errors).toBeNull(); }); + test('skyflow_id is enumerable on get response records', async () => { + const mockRequest = createGetRequest(['id1']); + const mockResponseData = { records: [{ fields: { skyflow_id: 'id123', field1: 'value1' } }] }; + mockVaultClient.vaultAPI.recordServiceBulkGetRecord.mockImplementation(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: mockResponseData, + rawResponse: { headers: { get: jest.fn().mockReturnValue('request-id-123') } } + }) + })); + const response = await vaultController.get(mockRequest); + expect(Object.keys(response.data[0])).toContain('skyflow_id'); + expect(JSON.stringify(response.data[0])).toContain('"skyflow_id"'); + }); + + test('skyflow_id shim on get response calls printLog with deprecation message', async () => { + const mockRequest = createGetRequest(['id1']); + const mockResponseData = { records: [{ fields: { skyflow_id: 'id123', field1: 'value1' } }] }; + mockVaultClient.vaultAPI.recordServiceBulkGetRecord.mockImplementation(() => ({ + withRawResponse: jest.fn().mockResolvedValueOnce({ + data: mockResponseData, + rawResponse: { headers: { get: jest.fn().mockReturnValue('request-id-123') } } + }) + })); + const response = await vaultController.get(mockRequest); + printLog.mockClear(); + void response.data[0].skyflow_id; + expect(printLog).toHaveBeenCalledWith( + expect.stringContaining('skyflow_id'), + expect.anything(), + expect.anything(), + ); + }); + test('should handle undefined parameters correctly', async () => { const mockRequest = createGetRequest(undefined); // Pass undefined IDs const mockResponseData = [{ fields: { field1: 'value1' } }]; diff --git a/test/vault/model/deprecated.test.js b/test/vault/model/deprecated.test.js new file mode 100644 index 00000000..96557b98 --- /dev/null +++ b/test/vault/model/deprecated.test.js @@ -0,0 +1,222 @@ +jest.mock("../../../src/utils", () => ({ + printLog: jest.fn(), + MessageType: { LOG: "LOG", ERROR: "ERROR", WARN: "WARN" }, + LogLevel: { + DEBUG: "DEBUG", + INFO: "INFO", + WARN: "WARN", + ERROR: "ERROR", + OFF: "OFF", + }, + OrderByEnum: { ASC: "ASC", DESC: "DESC" }, + RedactionType: { + DEFAULT: "DEFAULT", + PLAIN_TEXT: "PLAIN_TEXT", + MASKED: "MASKED", + REDACTED: "REDACTED", + }, +})); + +import { printLog } from "../../../src/utils"; +import DetokenizeOptions from "../../../src/vault/model/options/detokenize"; +import GetOptions from "../../../src/vault/model/options/get"; +import FileUploadRequest from "../../../src/vault/model/request/file-upload"; + +beforeEach(() => { + printLog.mockClear(); +}); + +// ─── NEW API ────────────────────────────────────────────────────────────────── +// These tests cover the canonical (non-deprecated) interface. +// Keep them forever; they document what the API *should* do. + +describe("DetokenizeOptions", () => { + test("setDownloadUrl sets value retrieved by getDownloadUrl", () => { + const opts = new DetokenizeOptions(); + opts.setDownloadUrl(true); + expect(opts.getDownloadUrl()).toBe(true); + }); + + test("setDownloadUrl with false sets value correctly", () => { + const opts = new DetokenizeOptions(); + opts.setDownloadUrl(false); + expect(opts.getDownloadUrl()).toBe(false); + }); + + test("getDownloadUrl returns undefined when not set", () => { + const opts = new DetokenizeOptions(); + expect(opts.getDownloadUrl()).toBeUndefined(); + }); +}); + +describe("GetOptions", () => { + test("setDownloadUrl sets value retrieved by getDownloadUrl", () => { + const opts = new GetOptions(); + opts.setDownloadUrl(true); + expect(opts.getDownloadUrl()).toBe(true); + }); + + test("setDownloadUrl with false sets value correctly", () => { + const opts = new GetOptions(); + opts.setDownloadUrl(false); + expect(opts.getDownloadUrl()).toBe(false); + }); + + test("getDownloadUrl returns undefined when not set", () => { + const opts = new GetOptions(); + expect(opts.getDownloadUrl()).toBeUndefined(); + }); +}); + +describe("FileUploadRequest", () => { + test("2-arg constructor sets table and columnName", () => { + const req = new FileUploadRequest("tbl", "col"); + expect(req.table).toBe("tbl"); + expect(req.columnName).toBe("col"); + }); + + test("2-arg constructor does not log deprecation", () => { + new FileUploadRequest("my_table", "file_col"); + expect(printLog).not.toHaveBeenCalledWith( + expect.stringContaining( + "FileUploadRequest(table, skyflowId, columnName)", + ), + expect.anything(), + expect.anything(), + ); + }); +}); + +// ─── DEPRECATED ─────────────────────────────────────────────────────────────── +// Remove each block below when the corresponding deprecated API is removed. +// The new-API blocks above retain full coverage after deletion. + +describe("DetokenizeOptions deprecated methods", () => { + test("setDownloadURL delegates to setDownloadUrl and logs deprecation", () => { + const opts = new DetokenizeOptions(); + opts.setDownloadURL(true); + expect(opts.getDownloadUrl()).toBe(true); + expect(printLog).toHaveBeenCalledWith( + expect.stringContaining("setDownloadURL"), + expect.anything(), + expect.anything(), + ); + }); + + test("setDownloadURL with false value delegates correctly", () => { + const opts = new DetokenizeOptions(); + opts.setDownloadURL(false); + expect(opts.getDownloadUrl()).toBe(false); + }); + + test("getDownloadURL returns same value as getDownloadUrl and logs deprecation", () => { + const opts = new DetokenizeOptions(); + opts.setDownloadUrl(true); + const result = opts.getDownloadURL(); + expect(result).toBe(true); + expect(printLog).toHaveBeenCalledWith( + expect.stringContaining("getDownloadURL"), + expect.anything(), + expect.anything(), + ); + }); + + test("getDownloadURL returns undefined when not set", () => { + const opts = new DetokenizeOptions(); + expect(opts.getDownloadURL()).toBeUndefined(); + }); +}); + +describe("GetOptions deprecated methods", () => { + test("setDownloadURL delegates to setDownloadUrl and logs deprecation", () => { + const opts = new GetOptions(); + opts.setDownloadURL(true); + expect(opts.getDownloadUrl()).toBe(true); + expect(printLog).toHaveBeenCalledWith( + expect.stringContaining("setDownloadURL"), + expect.anything(), + expect.anything(), + ); + }); + + test("setDownloadURL with false value delegates correctly", () => { + const opts = new GetOptions(); + opts.setDownloadURL(false); + expect(opts.getDownloadUrl()).toBe(false); + }); + + test("getDownloadURL returns same value as getDownloadUrl and logs deprecation", () => { + const opts = new GetOptions(); + opts.setDownloadUrl(true); + const result = opts.getDownloadURL(); + expect(result).toBe(true); + expect(printLog).toHaveBeenCalledWith( + expect.stringContaining("getDownloadURL"), + expect.anything(), + expect.anything(), + ); + }); + + test("getDownloadURL returns undefined when not set", () => { + const opts = new GetOptions(); + expect(opts.getDownloadURL()).toBeUndefined(); + }); +}); + +describe("FileUploadRequest deprecated API", () => { + test("3-arg constructor logs deprecation and routes args correctly", () => { + const req = new FileUploadRequest("my_table", "sky-id-123", "file_col"); + expect(req.table).toBe("my_table"); + expect(req.columnName).toBe("file_col"); + expect(printLog).toHaveBeenCalledWith( + expect.stringContaining( + "FileUploadRequest(table, skyflowId, columnName)", + ), + expect.anything(), + expect.anything(), + ); + }); + + test("skyflowId getter returns legacy value from 3-arg constructor and logs deprecation", () => { + const req = new FileUploadRequest("tbl", "sky-id-456", "col"); + printLog.mockClear(); + expect(req.skyflowId).toBe("sky-id-456"); + expect(printLog).toHaveBeenCalledWith( + expect.stringContaining("'skyflowId' of FileUploadRequest"), + expect.anything(), + expect.anything(), + ); + }); + + test("skyflowId getter returns empty string when not set via 2-arg constructor", () => { + const req = new FileUploadRequest("tbl", "col"); + printLog.mockClear(); + expect(req.skyflowId).toBe(""); + expect(printLog).toHaveBeenCalledWith( + expect.stringContaining("'skyflowId' of FileUploadRequest"), + expect.anything(), + expect.anything(), + ); + }); + + test("skyflowId setter updates value and logs deprecation", () => { + const req = new FileUploadRequest("tbl", "col"); + printLog.mockClear(); + req.skyflowId = "new-id"; + expect(printLog).toHaveBeenCalledWith( + expect.stringContaining("'skyflowId' of FileUploadRequest"), + expect.anything(), + expect.anything(), + ); + printLog.mockClear(); + expect(req.skyflowId).toBe("new-id"); + }); + + test("skyflowId setter overwrites value set by 3-arg constructor", () => { + const req = new FileUploadRequest("tbl", "original-id", "col"); + printLog.mockClear(); + req.skyflowId = "updated-id"; + printLog.mockClear(); + expect(req.skyflowId).toBe("updated-id"); + }); +}); From 20021f023853ec11b965026c63273e59d6abe5ed Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 12:29:18 +0530 Subject: [PATCH 16/34] SK-2812: Fixed code review issues --- src/service-account/index.ts | 4 ++-- src/utils/index.ts | 2 +- src/utils/validations/index.ts | 2 +- src/vault/model/options/deidentify-file/bleep-audio/index.ts | 1 - src/vault/types/index.ts | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/service-account/index.ts b/src/service-account/index.ts index e04b714b..f952022d 100644 --- a/src/service-account/index.ts +++ b/src/service-account/index.ts @@ -146,7 +146,7 @@ function getToken(credentials, options?: BearerTokenOptions): Promise { export interface SkyflowIdResponse { skyflowId: string; /** @deprecated Renamed to skyflowId. Will be removed in v3. */ - skyflow_id?: never; + skyflow_id?: string; } export interface TokensResponse extends SkyflowIdResponse { From db6eae9c88b7913fc048cef32f2ee61af6946f0e Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 12:50:51 +0530 Subject: [PATCH 17/34] SK-2812: Fixed code review issues --- src/service-account/index.ts | 6 ++++-- src/utils/index.ts | 2 ++ src/utils/logs/index.ts | 1 + src/utils/validations/index.ts | 4 ++++ src/vault/types/index.ts | 2 +- 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/service-account/index.ts b/src/service-account/index.ts index f952022d..966367ba 100644 --- a/src/service-account/index.ts +++ b/src/service-account/index.ts @@ -115,7 +115,8 @@ function getToken(credentials, options?: BearerTokenOptions): Promise | null, } diff --git a/src/utils/logs/index.ts b/src/utils/logs/index.ts index 00e0d2ad..4e7cdaa2 100644 --- a/src/utils/logs/index.ts +++ b/src/utils/logs/index.ts @@ -173,6 +173,7 @@ const logs = { INVALID_SKYFLOW_ID_IN_FILE_UPLOAD: "Invalid file upload request. Skyflow Id is required.", EMPTY_RUN_ID: "Invalid Run Id. Run Id can not be empty.", INVALID_RUN_ID: "Invalid Run ID. A Run ID of string type is required.", + INVALID_TOKEN_URI: "Invalid credentials. Token URI must be a string and a valid URL.", DETECT_REQUEST_RESOLVED: 'Detect request is resolved.', DEIDENTIFY_FILE_REQUEST_REJECTED: 'Deidentify file resulted in failure.', DETECT_RUN_REQUEST_REJECTED: 'Detect get run resulted in failure.', diff --git a/src/utils/validations/index.ts b/src/utils/validations/index.ts index 83968980..4881d2c3 100644 --- a/src/utils/validations/index.ts +++ b/src/utils/validations/index.ts @@ -180,6 +180,7 @@ export const validateCredentialsWithId = (credentials: Credentials, type: string } if(Object.prototype.hasOwnProperty.call(pathCred, 'tokenUri')) { if (pathCred.tokenUri === undefined || typeof pathCred.tokenUri !== 'string' || !isValidURL(pathCred.tokenUri)) { + printLog(logs.errorLogs.INVALID_TOKEN_URI, MessageType.ERROR, logLevel); throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TOKEN_URI, [type, typeId, id]); } } @@ -200,6 +201,7 @@ export const validateCredentialsWithId = (credentials: Credentials, type: string } if (Object.prototype.hasOwnProperty.call(stringCred, 'tokenUri')) { if (stringCred.tokenUri === undefined || typeof stringCred.tokenUri !== 'string' || !isValidURL(stringCred.tokenUri)) { + printLog(logs.errorLogs.INVALID_TOKEN_URI, MessageType.ERROR, logLevel); throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TOKEN_URI, [type, typeId, id]); } } @@ -317,6 +319,7 @@ export const validateSkyflowCredentials = (credentials: Credentials, logLevel: L if(Object.prototype.hasOwnProperty.call(pathCred, 'tokenUri')) { if (pathCred.tokenUri === undefined || typeof pathCred.tokenUri !== 'string' || !isValidURL(pathCred.tokenUri)) { + printLog(logs.errorLogs.INVALID_TOKEN_URI, MessageType.ERROR, logLevel); throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TOKEN_URI); } } @@ -338,6 +341,7 @@ export const validateSkyflowCredentials = (credentials: Credentials, logLevel: L } if (Object.prototype.hasOwnProperty.call(stringCred, 'tokenUri')) { if (stringCred.tokenUri === undefined || typeof stringCred.tokenUri !== 'string' || !isValidURL(stringCred.tokenUri)) { + printLog(logs.errorLogs.INVALID_TOKEN_URI, MessageType.ERROR, logLevel); throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TOKEN_URI); } } diff --git a/src/vault/types/index.ts b/src/vault/types/index.ts index afc3b185..47df4531 100644 --- a/src/vault/types/index.ts +++ b/src/vault/types/index.ts @@ -171,7 +171,7 @@ export interface DetectFileResponse { export interface SkyflowIdResponse { skyflowId: string; /** @deprecated Renamed to skyflowId. Will be removed in v3. */ - skyflow_id?: string; + skyflow_id: string; } export interface TokensResponse extends SkyflowIdResponse { From 96f5388e72a887b25569f4a171a00717d8f07b28 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 13:58:02 +0530 Subject: [PATCH 18/34] SK-2812: Fixed critical review comments --- src/error/codes/index.ts | 1 + src/error/messages/index.ts | 1 + src/service-account/index.ts | 56 +++++++++++++++------------------- src/utils/validations/index.ts | 4 +-- 4 files changed, 29 insertions(+), 33 deletions(-) diff --git a/src/error/codes/index.ts b/src/error/codes/index.ts index 29882feb..7340a2de 100644 --- a/src/error/codes/index.ts +++ b/src/error/codes/index.ts @@ -18,6 +18,7 @@ const SKYFLOW_ERROR_CODE = { INVALID_KEY: { http_code: 400, message: errorMessages.INVALID_KEY }, INVALID_CREDENTIALS_FILE_PATH: { http_code: 400, message: errorMessages.INVALID_CREDENTIALS_FILE_PATH }, INVALID_TOKEN_URI: { http_code: 400, message: errorMessages.INVALID_TOKEN_URI }, + INVALID_TOKEN_URI_WITH_ID: { http_code: 400, message: errorMessages.INVALID_TOKEN_URI_WITH_ID }, INVALID_BEARER_TOKEN_WITH_ID: { http_code: 400, message: errorMessages.INVALID_BEARER_TOKEN_WITH_ID }, INVALID_PARSED_CREDENTIALS_STRING_WITH_ID: { http_code: 400, message: errorMessages.INVALID_PARSED_CREDENTIALS_STRING_WITH_ID }, diff --git a/src/error/messages/index.ts b/src/error/messages/index.ts index d097cd86..2b634c84 100644 --- a/src/error/messages/index.ts +++ b/src/error/messages/index.ts @@ -23,6 +23,7 @@ const errorMessages = { INVALID_CREDENTIALS_FILE_PATH: `${errorPrefix} Initialization failed. Invalid skyflow credentials. Expected file path to exists.`, INVALID_TOKEN_URI: `${errorPrefix} Initialization failed. Invalid Skyflow credentials. The token URI must be a string and a valid URL.`, + INVALID_TOKEN_URI_WITH_ID: `${errorPrefix} Initialization failed. Invalid Skyflow credentials. The token URI must be a string and a valid URL for %s1 with %s2 %s3.`, INVALID_KEY: `${errorPrefix} Initialization failed. Invalid skyflow credentials. Specify a valid api key.`, INVALID_PARSED_CREDENTIALS_STRING: `${errorPrefix} Initialization failed. Invalid skyflow credentials. Specify a valid credentials string.`, INVALID_BEARER_TOKEN: `${errorPrefix} Initialization failed. Invalid skyflow credentials. Bearer token is invalid or expired. Specify a valid token.`, diff --git a/src/service-account/index.ts b/src/service-account/index.ts index 966367ba..7f7c3a40 100644 --- a/src/service-account/index.ts +++ b/src/service-account/index.ts @@ -277,37 +277,31 @@ function getSignedTokens(credentials, options: SignedDataTokensOptions): Promise const prefix = JWT.SIGNED_TOKEN_PREFIX; let responseArray: SignedDataTokensResponse[] = []; - if (options && options?.dataTokens) { - options.dataTokens.forEach((token) => { - const claims = { - iss: JWT.ISSUER_SDK, - key: credentialsObj.keyId, - aud: credentialsObj.tokenUri, - exp: expiryTime, - sub: credentialsObj.clientId, - tok: token, - ...(options && options.ctx ? { ctx: options.ctx } : {}), - }; - - if (claims.key == null) { - printLog(logs.errorLogs.KEY_ID_NOT_FOUND, MessageType.ERROR, options?.logLevel); - return reject(new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_KEY_ID)); - } - else if (claims.aud == null) { - printLog(logs.errorLogs.TOKEN_URI_NOT_FOUND, MessageType.ERROR, options?.logLevel); - return reject(new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_TOKEN_URI)); - } - else if (credentialsObj.privateKey == null) { - printLog(logs.errorLogs.PRIVATE_KEY_NOT_FOUND, MessageType.ERROR, options?.logLevel); - return reject(new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_PRIVATE_KEY)); - } - else { - const privateKey = credentialsObj.privateKey.toString(ENCODING_TYPE.UTF8); - const signedJwt = jwt.sign(claims, privateKey, { algorithm: JWT.ALGORITHM_RS256 }); - const responseObject = getSignedDataTokenResponseObject(prefix + signedJwt, token); - responseArray.push(responseObject) - } - }) + for (const token of (options?.dataTokens ?? [])) { + const claims = { + iss: JWT.ISSUER_SDK, + key: credentialsObj.keyId, + aud: credentialsObj.tokenUri, + exp: expiryTime, + sub: credentialsObj.clientId, + tok: token, + ...(options?.ctx ? { ctx: options.ctx } : {}), + }; + + if (claims.key == null) { + printLog(logs.errorLogs.KEY_ID_NOT_FOUND, MessageType.ERROR, options?.logLevel); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_KEY_ID)); + } else if (claims.aud == null) { + printLog(logs.errorLogs.TOKEN_URI_NOT_FOUND, MessageType.ERROR, options?.logLevel); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_TOKEN_URI)); + } else if (credentialsObj.privateKey == null) { + printLog(logs.errorLogs.PRIVATE_KEY_NOT_FOUND, MessageType.ERROR, options?.logLevel); + return reject(new SkyflowError(SKYFLOW_ERROR_CODE.MISSING_PRIVATE_KEY)); + } else { + const privateKey = credentialsObj.privateKey.toString(ENCODING_TYPE.UTF8); + const signedJwt = jwt.sign(claims, privateKey, { algorithm: JWT.ALGORITHM_RS256 }); + responseArray.push(getSignedDataTokenResponseObject(prefix + signedJwt, token)); + } } signedDataTokenSuccessResponse(responseArray, options?.logLevel).then((response) => resolve(response)).catch(err => reject(err)) } diff --git a/src/utils/validations/index.ts b/src/utils/validations/index.ts index 4881d2c3..5ab9c4f6 100644 --- a/src/utils/validations/index.ts +++ b/src/utils/validations/index.ts @@ -181,7 +181,7 @@ export const validateCredentialsWithId = (credentials: Credentials, type: string if(Object.prototype.hasOwnProperty.call(pathCred, 'tokenUri')) { if (pathCred.tokenUri === undefined || typeof pathCred.tokenUri !== 'string' || !isValidURL(pathCred.tokenUri)) { printLog(logs.errorLogs.INVALID_TOKEN_URI, MessageType.ERROR, logLevel); - throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TOKEN_URI, [type, typeId, id]); + throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TOKEN_URI_WITH_ID, [type, typeId, id]); } } } @@ -202,7 +202,7 @@ export const validateCredentialsWithId = (credentials: Credentials, type: string if (Object.prototype.hasOwnProperty.call(stringCred, 'tokenUri')) { if (stringCred.tokenUri === undefined || typeof stringCred.tokenUri !== 'string' || !isValidURL(stringCred.tokenUri)) { printLog(logs.errorLogs.INVALID_TOKEN_URI, MessageType.ERROR, logLevel); - throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TOKEN_URI, [type, typeId, id]); + throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_TOKEN_URI_WITH_ID, [type, typeId, id]); } } } From f086d23a473d8a83d02c6304c678dec827076b4a Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 14:03:48 +0530 Subject: [PATCH 19/34] SK-2812: Fixed Quality issues --- src/error/index.ts | 4 +- src/utils/index.ts | 17 +++--- src/vault/controller/detect/index.ts | 90 +++++++++++----------------- src/vault/controller/vault/index.ts | 4 +- 4 files changed, 46 insertions(+), 69 deletions(-) diff --git a/src/error/index.ts b/src/error/index.ts index 847a4867..bf124bde 100644 --- a/src/error/index.ts +++ b/src/error/index.ts @@ -5,7 +5,7 @@ class SkyflowError extends Error { error?: ISkyflowError; constructor(errorCode: ISkyflowError, args: Array = []) { - const formattedError: any = { + const formattedError: ISkyflowError = { http_status: errorCode.http_status || BAD_REQUEST, details: errorCode.details || [], requestId: errorCode.requestId || null, @@ -22,7 +22,7 @@ class SkyflowError extends Error { printLog("[DEPRECATED] Property 'request_ID' is deprecated and will be removed in an upcoming release. Use 'requestId' instead.", MessageType.WARN, LogLevel.WARN); return this.requestId; }, - enumerable: false, + enumerable: true, configurable: true, }); diff --git a/src/utils/index.ts b/src/utils/index.ts index 9fbbb3da..51eb6f0e 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,6 +1,7 @@ import SkyflowError from "../error"; import * as sdkDetails from "../../package.json"; import { generateBearerToken, generateBearerTokenFromCreds } from "../service-account"; +import type { BearerTokenOptions } from "../service-account"; import Credentials, { ApiKeyCredentials, PathCredentials, StringCredentials, TokenCredentials } from "../vault/config/credentials"; import dotenv from "dotenv"; import logs from "./logs"; @@ -26,7 +27,7 @@ export const BAD_REQUEST = "Bad Request"; export const REQUEST = { ID_KEY: "x-request-id", -}; +} as const; export const CONFIG = { LOGLEVEL: "loglevel", @@ -276,7 +277,6 @@ export const ENCODING_TYPE = { UTF8: 'utf8', BASE64: 'base64', BINARY: 'binary', - UTF_8: 'utf-8', } as const; // JWT Constants @@ -377,16 +377,16 @@ export async function getToken(credentials: Credentials, logLevel?: LogLevel): P const stringCred = credentials as StringCredentials; printLog(logs.infoLogs.USING_CREDENTIALS_STRING, MessageType.LOG, logLevel); - const options: any = { + const options: BearerTokenOptions = { roleIds: stringCred.roles, ctx: stringCred.context, logLevel, }; - + if (stringCred.tokenUri !== undefined) { options.tokenUri = stringCred.tokenUri; } - + return generateBearerTokenFromCreds(stringCred.credentialsString, options); } @@ -394,16 +394,16 @@ export async function getToken(credentials: Credentials, logLevel?: LogLevel): P const pathCred = credentials as PathCredentials; printLog(logs.infoLogs.USING_PATH, MessageType.LOG, logLevel); - const options: any = { + const options: BearerTokenOptions = { roleIds: pathCred.roles, ctx: pathCred.context, logLevel, }; - + if (pathCred.tokenUri !== undefined) { options.tokenUri = pathCred.tokenUri; } - + return generateBearerToken(pathCred.path, options); } @@ -605,6 +605,7 @@ export const isValidURL = (url: string) => { export function objectToXML(obj: any, rootName: string = "root"): string { + if (obj === null || obj === undefined) return ''; function convertToXML(data: any, nodeName: string): string { if (data === null || data === undefined) { return `<${nodeName}/>`; diff --git a/src/vault/controller/detect/index.ts b/src/vault/controller/detect/index.ts index a8d76ffb..e974f961 100644 --- a/src/vault/controller/detect/index.ts +++ b/src/vault/controller/detect/index.ts @@ -282,43 +282,39 @@ class DetectController { } private processDeidentifyFileResponse(response: DeidentifyFileDetectRunResponse, outputDirectory: string, fileBaseName: string) { - try { - // Ensure the output directory exists - if (!fs.existsSync(outputDirectory)) { - fs.mkdirSync(outputDirectory, { recursive: true }); - } + // Ensure the output directory exists + if (!fs.existsSync(outputDirectory)) { + fs.mkdirSync(outputDirectory, { recursive: true }); + } - // Iterate over the output array in the response - response.output.forEach((fileObject: DeidentifyFileOutput, index: number) => { - const { processedFile, processedFileExtension } = fileObject; + // Iterate over the output array in the response + response.output.forEach((fileObject: DeidentifyFileOutput) => { + const { processedFile, processedFileExtension } = fileObject; - if (!processedFile || !processedFileExtension) { - return; - } + if (!processedFile || !processedFileExtension) { + return; + } - // Determine the output file name and path - const outputFileName = `processed-${fileBaseName}.${processedFileExtension}`; - const outputFilePath = path.join(outputDirectory, outputFileName); - - // Handle JSON files - if (processedFileExtension === FILE_EXTENSION.JSON) { - const jsonData = Buffer.from(processedFile, ENCODING_TYPE.BASE64).toString(ENCODING_TYPE.UTF_8); - fs.writeFileSync(outputFilePath, jsonData); - } else if ( processedFileExtension === FILE_EXTENSION.MP3 || processedFileExtension === FILE_EXTENSION.WAV) { - const mp3Data = Buffer.from(processedFile, ENCODING_TYPE.BASE64); - fs.writeFileSync(outputFilePath, mp3Data, { encoding: ENCODING_TYPE.BINARY }); - } else { - // Handle other file types (e.g., images, PDFs, etc.) - this.decodeBase64AndSaveToFile(processedFile, outputFilePath); - } - }); - } catch (error) { - throw error; - } + // Determine the output file name and path + const outputFileName = `processed-${fileBaseName}.${processedFileExtension}`; + const outputFilePath = path.join(outputDirectory, outputFileName); + + // Handle JSON files + if (processedFileExtension === FILE_EXTENSION.JSON) { + const jsonData = Buffer.from(processedFile, ENCODING_TYPE.BASE64).toString(ENCODING_TYPE.UTF8); + fs.writeFileSync(outputFilePath, jsonData); + } else if ( processedFileExtension === FILE_EXTENSION.MP3 || processedFileExtension === FILE_EXTENSION.WAV) { + const mp3Data = Buffer.from(processedFile, ENCODING_TYPE.BASE64); + fs.writeFileSync(outputFilePath, mp3Data, { encoding: ENCODING_TYPE.BINARY }); + } else { + // Handle other file types (e.g., images, PDFs, etc.) + this.decodeBase64AndSaveToFile(processedFile, outputFilePath); + } + }); } private getReqType(format: string): DeidenitfyFileRequestTypes{ - var reqType: DeidenitfyFileRequestTypes + let reqType: DeidenitfyFileRequestTypes if (Object.values(DeidentifyAudioRequestFileDataFormat).includes(format as DeidentifyAudioRequestFileDataFormat)){ reqType = DeidenitfyFileRequestTypes.AUDIO; } else if (format.includes(DeidenitfyFileRequestTypes.PDF.toLowerCase())){ @@ -352,7 +348,7 @@ class DetectController { if (response.status?.toUpperCase() === DETECT_STATUS.IN_PROGRESS ) { if (currentWaitTime >= maxWaitTime) { - resolve({ runId }); // Resolve with runId if max wait time is exceeded + resolve({ data: { status: 'IN_PROGRESS' }, runId }); } else { const nextWaitTime = currentWaitTime * 2; let waitTime = 0; @@ -368,7 +364,7 @@ class DetectController { }, waitTime * 1000); } } else if (response.status?.toUpperCase() === DETECT_STATUS.SUCCESS) { - resolve([response, runId]); // Resolve with the processed file response and runId + resolve({ data: response, runId }); } else if (response.status?.toUpperCase() === DETECT_STATUS.FAILED) { reject(new SkyflowError(SKYFLOW_ERROR_CODE.INTERNAL_SERVER_ERROR, [response.message])); @@ -606,8 +602,11 @@ class DetectController { this.waitTime = options?.getWaitTime() ?? this.waitTime; - var reqType : DeidenitfyFileRequestTypes = this.getReqType(fileExtension); - var promiseReq: Promise<[DeidentifyFileDetectRunResponse, string]>; + const reqType : DeidenitfyFileRequestTypes = this.getReqType(fileExtension); + type PollResult = + | { data: DeidentifyFileDetectRunResponse; runId: string } + | { data: { status: string }; runId: string }; + let promiseReq: Promise; switch (reqType){ case DeidenitfyFileRequestTypes.AUDIO: promiseReq = this.buildAudioRequest(fileObj, options, fileExtension) @@ -710,27 +709,6 @@ class DetectController { break; } - promiseReq.then(([data, runId]) => { - if(runId && data.status === DETECT_STATUS.IN_PROGRESS) { - resolve(new DeidentifyFileResponse({ - runId: runId, - status: data.status, - })); - } - if (options?.getOutputDirectory() && data.status === DETECT_STATUS.SUCCESS) { - this.processDeidentifyFileResponse(data, options.getOutputDirectory() as string, fileBaseName); - } - const deidentifiedFileResponse = this.parseDeidentifyFileResponse(data, runId, data.status); - resolve(deidentifiedFileResponse); - }).catch(error => { - reject(error) - }); - } catch (error) { - if (error instanceof Error) - printLog(removeSDKVersion(error.message), MessageType.ERROR, this.client.getLogLevel()); - reject(error); - } - }); const { data, runId } = await promiseReq; if(runId && data.status === DETECT_STATUS.IN_PROGRESS) { return new DeidentifyFileResponse({ diff --git a/src/vault/controller/vault/index.ts b/src/vault/controller/vault/index.ts index f94f230a..fab51717 100644 --- a/src/vault/controller/vault/index.ts +++ b/src/vault/controller/vault/index.ts @@ -34,8 +34,6 @@ import FileUploadOptions from '../../model/options/fileUpload'; class VaultController { private client: VaultClient; - private static readonly HTTP_OK = 200; - constructor(client: VaultClient) { this.client = client; } @@ -108,7 +106,7 @@ class VaultController { } private isSuccess(record: Record): boolean { - return record?.Status === VaultController.HTTP_OK; + return record?.Status === HTTP_STATUS_CODE.OK; } private processSuccess(record: Record, index: number, response: ParsedInsertBatchResponse): void { From a2ec345a7d1f2bc3223fc107ed2da5cd6c0eaf22 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 14:16:09 +0530 Subject: [PATCH 20/34] SK-2812: Fixed smell issue --- src/error/index.ts | 3 ++- src/service-account/index.ts | 2 +- src/utils/index.ts | 5 +++-- src/utils/logs/index.ts | 7 ++++++ src/vault/controller/connections/index.ts | 12 ++++++---- src/vault/controller/vault/index.ts | 23 ++++++++++---------- src/vault/model/options/detokenize/index.ts | 5 +++-- src/vault/model/options/get/index.ts | 5 +++-- src/vault/model/request/file-upload/index.ts | 8 +++---- 9 files changed, 42 insertions(+), 28 deletions(-) diff --git a/src/error/index.ts b/src/error/index.ts index bf124bde..43743962 100644 --- a/src/error/index.ts +++ b/src/error/index.ts @@ -1,4 +1,5 @@ import { BAD_REQUEST, ISkyflowError, LogLevel, MessageType, parameterizedString, printLog } from "../utils"; +import logs from '../utils/logs'; class SkyflowError extends Error { @@ -19,7 +20,7 @@ class SkyflowError extends Error { // Deprecated alias — remove after v3 Object.defineProperty(formattedError, 'request_ID', { get() { - printLog("[DEPRECATED] Property 'request_ID' is deprecated and will be removed in an upcoming release. Use 'requestId' instead.", MessageType.WARN, LogLevel.WARN); + printLog(logs.warnLogs.DEPRECATED_REQUEST_ID_PROPERTY, MessageType.WARN, LogLevel.WARN); return this.requestId; }, enumerable: true, diff --git a/src/service-account/index.ts b/src/service-account/index.ts index 7f7c3a40..4a060783 100644 --- a/src/service-account/index.ts +++ b/src/service-account/index.ts @@ -12,7 +12,7 @@ import { WithRawResponse } from '../ _generated_/rest/core'; function normalizeTokenOptions(options?: BearerTokenOptions): BearerTokenOptions | undefined { if (!options) return options; if (options.roleIDs !== undefined && options.roleIds === undefined) { - printLog("[DEPRECATED] Property 'roleIDs' is deprecated and will be removed in an upcoming release. Use 'roleIds' instead.", MessageType.WARN, options.logLevel); + printLog(logs.warnLogs.DEPRECATED_ROLE_IDS_PROPERTY, MessageType.WARN, options.logLevel); return { ...options, roleIds: options.roleIDs }; } return options; diff --git a/src/utils/index.ts b/src/utils/index.ts index 51eb6f0e..10d2215c 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -238,9 +238,10 @@ export const CONTENT_TYPE = { } as const; // HTTP Headers +const _CONTENT_TYPE_HEADER = 'Content-Type'; export const HTTP_HEADER = { - CONTENT_TYPE: 'Content-Type', - CONTENT_TYPE_LOWER: 'content-type', + CONTENT_TYPE: _CONTENT_TYPE_HEADER, + CONTENT_TYPE_LOWER: _CONTENT_TYPE_HEADER.toLowerCase(), X_REQUEST_ID: 'x-request-id', ERROR_FROM_CLIENT: 'error-from-client', } as const; diff --git a/src/utils/logs/index.ts b/src/utils/logs/index.ts index 4e7cdaa2..1bf55566 100644 --- a/src/utils/logs/index.ts +++ b/src/utils/logs/index.ts @@ -181,6 +181,13 @@ const logs = { REIDENTIFY_TEXT_REQUEST_REJECTED: 'Reidentify text resulted in failure.', }, warnLogs: { + DEPRECATED_FILE_UPLOAD_CONSTRUCTOR: "[DEPRECATED] FileUploadRequest(table, skyflowId, columnName) is deprecated and will be removed in a future release. Use FileUploadRequest(table, columnName) with FileUploadOptions.setSkyflowId(skyflowId) instead.", + DEPRECATED_FILE_UPLOAD_SKYFLOW_ID: "[DEPRECATED] Property 'skyflowId' of FileUploadRequest is deprecated and will be removed in an upcoming release. Use FileUploadOptions.setSkyflowId() instead.", + DEPRECATED_SET_DOWNLOAD_URL: "[DEPRECATED] Method 'setDownloadURL()' is deprecated and will be removed in an upcoming release. Use 'setDownloadUrl()' instead.", + DEPRECATED_GET_DOWNLOAD_URL: "[DEPRECATED] Method 'getDownloadURL()' is deprecated and will be removed in an upcoming release. Use 'getDownloadUrl()' instead.", + DEPRECATED_SKYFLOW_ID_PROPERTY: "[DEPRECATED] Property 'skyflow_id' is deprecated and will be removed in an upcoming release. Use 'skyflowId' instead.", + DEPRECATED_REQUEST_ID_PROPERTY: "[DEPRECATED] Property 'request_ID' is deprecated and will be removed in an upcoming release. Use 'requestId' instead.", + DEPRECATED_ROLE_IDS_PROPERTY: "[DEPRECATED] Property 'roleIDs' is deprecated and will be removed in an upcoming release. Use 'roleIds' instead.", } }; diff --git a/src/vault/controller/connections/index.ts b/src/vault/controller/connections/index.ts index 72b57548..d709acc1 100644 --- a/src/vault/controller/connections/index.ts +++ b/src/vault/controller/connections/index.ts @@ -153,7 +153,10 @@ class ConnectionController { contentType.includes(CONTENT_TYPE.TEXT_XML) ) { return await response.text(); - } else if (contentType.includes(CONTENT_TYPE.TEXT_HTML)) { + } else if ( + contentType.includes(CONTENT_TYPE.TEXT_HTML) || + contentType.includes(CONTENT_TYPE.TEXT_PLAIN) + ) { return await response.text(); } else if ( contentType.includes(CONTENT_TYPE.APPLICATION_X_WWW_FORM_URLENCODED) @@ -162,8 +165,6 @@ class ConnectionController { return Object.fromEntries(new URLSearchParams(text)); } else if (contentType.includes(CONTENT_TYPE.MULTIPART_FORM_DATA)) { return await response.text(); - } else if (contentType.includes(CONTENT_TYPE.TEXT_PLAIN)) { - return await response.text(); } else { try { return await response.json(); @@ -222,7 +223,10 @@ class ConnectionController { if (invokeRequest.headers) { Object.entries(invokeRequest.headers).forEach(([key, value]) => { const lowerKey = key.toLowerCase(); - if (shouldRemoveContentType && lowerKey === HTTP_HEADER.CONTENT_TYPE.toLowerCase()) { + if ( + shouldRemoveContentType && + lowerKey === HTTP_HEADER.CONTENT_TYPE.toLowerCase() + ) { return; } requestHeaders[key] = diff --git a/src/vault/controller/vault/index.ts b/src/vault/controller/vault/index.ts index fab51717..08ecd2ba 100644 --- a/src/vault/controller/vault/index.ts +++ b/src/vault/controller/vault/index.ts @@ -56,6 +56,15 @@ class VaultController { return []; } + private addDeprecatedSkyflowIdAccessor(result: Record): void { + const logLevel = this.client.getLogLevel(); + Object.defineProperty(result, 'skyflow_id', { + get() { printLog(logs.warnLogs.DEPRECATED_SKYFLOW_ID_PROPERTY, MessageType.WARN, logLevel); return this.skyflowId; }, + enumerable: true, + configurable: true, + }); + } + private parseDetokenizeResponse(records: Record[], requestId: string): ParsedDetokenizeResponse { const response: ParsedDetokenizeResponse = { success: [], @@ -389,16 +398,11 @@ class VaultController { TYPES.GET ).then(response => { printLog(logs.infoLogs.GET_SUCCESS, MessageType.LOG, this.client.getLogLevel()); - const logLevel = this.client.getLogLevel(); const processedRecords = response.records.map(record => { const fields = typeof record.fields === 'object' && record.fields !== null ? record.fields as Record : {}; const { skyflow_id: skyflowIdValue, ...rest } = fields; const result: Record = { ...(skyflowIdValue !== undefined ? { skyflowId: skyflowIdValue } : {}), ...rest }; - Object.defineProperty(result, 'skyflow_id', { - get() { printLog("[DEPRECATED] Property 'skyflow_id' is deprecated and will be removed in an upcoming release. Use 'skyflowId' instead.", MessageType.WARN, logLevel); return this.skyflowId; }, - enumerable: true, - configurable: true, - }); + this.addDeprecatedSkyflowIdAccessor(result); return result; }); resolve(new GetResponse({ data: processedRecords, errors: null })); @@ -497,7 +501,6 @@ class VaultController { TYPES.QUERY ).then(response => { printLog(logs.infoLogs.QUERY_SUCCESS, MessageType.LOG, this.client.getLogLevel()); - const logLevel = this.client.getLogLevel(); const processedRecords = response.records.map(record => { const fields = typeof record.fields === 'object' && record.fields !== null ? record.fields as Record : {}; const { skyflow_id: skyflowIdValue, ...rest } = fields; @@ -508,11 +511,7 @@ class VaultController { ...(typeof record.tokens === 'object' && record.tokens !== null ? record.tokens : {}), }, }; - Object.defineProperty(result, 'skyflow_id', { - get() { printLog("[DEPRECATED] Property 'skyflow_id' is deprecated and will be removed in an upcoming release. Use 'skyflowId' instead.", MessageType.WARN, logLevel); return this.skyflowId; }, - enumerable: true, - configurable: true, - }); + this.addDeprecatedSkyflowIdAccessor(result); return result; }); resolve(new QueryResponse({ fields: processedRecords, errors: null })); diff --git a/src/vault/model/options/detokenize/index.ts b/src/vault/model/options/detokenize/index.ts index bd02822c..3fd1b9f6 100644 --- a/src/vault/model/options/detokenize/index.ts +++ b/src/vault/model/options/detokenize/index.ts @@ -1,4 +1,5 @@ import { LogLevel, MessageType, printLog } from '../../../../utils'; +import logs from '../../../../utils/logs'; class DetokenizeOptions { // Fields with default values @@ -19,7 +20,7 @@ class DetokenizeOptions { /** @deprecated Use setDownloadUrl() instead. Will be removed in v3. */ setDownloadURL(downloadURL: boolean) { - printLog("[DEPRECATED] Method 'setDownloadURL()' is deprecated and will be removed in an upcoming release. Use 'setDownloadUrl()' instead.", MessageType.WARN, LogLevel.WARN); + printLog(logs.warnLogs.DEPRECATED_SET_DOWNLOAD_URL, MessageType.WARN, LogLevel.WARN); this.setDownloadUrl(downloadURL); } @@ -34,7 +35,7 @@ class DetokenizeOptions { /** @deprecated Use getDownloadUrl() instead. Will be removed in v3. */ getDownloadURL(): boolean | undefined { - printLog("[DEPRECATED] Method 'getDownloadURL()' is deprecated and will be removed in an upcoming release. Use 'getDownloadUrl()' instead.", MessageType.WARN, LogLevel.WARN); + printLog(logs.warnLogs.DEPRECATED_GET_DOWNLOAD_URL, MessageType.WARN, LogLevel.WARN); return this.getDownloadUrl(); } } diff --git a/src/vault/model/options/get/index.ts b/src/vault/model/options/get/index.ts index 1c3776f5..a59f3464 100644 --- a/src/vault/model/options/get/index.ts +++ b/src/vault/model/options/get/index.ts @@ -1,5 +1,6 @@ // Imports import { LogLevel, MessageType, OrderByEnum, printLog, RedactionType } from "../../../../utils"; +import logs from '../../../../utils/logs'; class GetOptions { // Fields @@ -43,7 +44,7 @@ class GetOptions { /** @deprecated Use setDownloadUrl() instead. Will be removed in v3. */ setDownloadURL(downloadURL: boolean) { - printLog("[DEPRECATED] Method 'setDownloadURL()' is deprecated and will be removed in an upcoming release. Use 'setDownloadUrl()' instead.", MessageType.WARN, LogLevel.WARN); + printLog(logs.warnLogs.DEPRECATED_SET_DOWNLOAD_URL, MessageType.WARN, LogLevel.WARN); this.setDownloadUrl(downloadURL); } @@ -86,7 +87,7 @@ class GetOptions { /** @deprecated Use getDownloadUrl() instead. Will be removed in v3. */ getDownloadURL(): boolean | undefined { - printLog("[DEPRECATED] Method 'getDownloadURL()' is deprecated and will be removed in an upcoming release. Use 'getDownloadUrl()' instead.", MessageType.WARN, LogLevel.WARN); + printLog(logs.warnLogs.DEPRECATED_GET_DOWNLOAD_URL, MessageType.WARN, LogLevel.WARN); return this.getDownloadUrl(); } diff --git a/src/vault/model/request/file-upload/index.ts b/src/vault/model/request/file-upload/index.ts index 749b851b..770cbe32 100644 --- a/src/vault/model/request/file-upload/index.ts +++ b/src/vault/model/request/file-upload/index.ts @@ -1,5 +1,6 @@ // Imports import { LogLevel, MessageType, printLog } from '../../../../utils'; +import logs from '../../../../utils/logs'; class FileUploadRequest { private _table: string; @@ -12,8 +13,7 @@ class FileUploadRequest { if (columnName !== undefined) { // OLD: (table, skyflowId, columnName) - printLog("[DEPRECATED] FileUploadRequest(table, skyflowId, columnName) is deprecated and will be removed in a future release. " + - "Use FileUploadRequest(table, columnName) with FileUploadOptions.setSkyflowId(skyflowId) instead.", MessageType.WARN, LogLevel.WARN); + printLog(logs.warnLogs.DEPRECATED_FILE_UPLOAD_CONSTRUCTOR, MessageType.WARN, LogLevel.WARN); this._legacySkyflowId = columnNameOrSkyflowId; this._columnName = columnName; } else { @@ -39,13 +39,13 @@ class FileUploadRequest { /** @deprecated Use FileUploadOptions.setSkyflowId() instead. Will be removed in v3. */ public get skyflowId(): string { - printLog("[DEPRECATED] Property 'skyflowId' of FileUploadRequest is deprecated and will be removed in an upcoming release. Use FileUploadOptions.setSkyflowId() instead.", MessageType.WARN, LogLevel.WARN); + printLog(logs.warnLogs.DEPRECATED_FILE_UPLOAD_SKYFLOW_ID, MessageType.WARN, LogLevel.WARN); return this._legacySkyflowId ?? ''; } /** @deprecated Use FileUploadOptions.setSkyflowId() instead. Will be removed in v3. */ public set skyflowId(value: string) { - printLog("[DEPRECATED] Property 'skyflowId' of FileUploadRequest is deprecated and will be removed in an upcoming release. Use FileUploadOptions.setSkyflowId() instead.", MessageType.WARN, LogLevel.WARN); + printLog(logs.warnLogs.DEPRECATED_FILE_UPLOAD_SKYFLOW_ID, MessageType.WARN, LogLevel.WARN); this._legacySkyflowId = value; } } From c1d915d90f0e93874cc915cfb7dfae00c461c10c Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 14:41:28 +0530 Subject: [PATCH 21/34] SK-2812: Fixed xritical review issues --- src/error/index.ts | 2 +- src/vault/controller/connections/index.ts | 2 +- src/vault/controller/detect/index.ts | 78 ++++++++++---------- src/vault/controller/vault/index.ts | 14 ++-- src/vault/model/request/file-upload/index.ts | 5 ++ src/vault/skyflow/index.ts | 1 + 6 files changed, 54 insertions(+), 48 deletions(-) diff --git a/src/error/index.ts b/src/error/index.ts index 43743962..3eabc9e2 100644 --- a/src/error/index.ts +++ b/src/error/index.ts @@ -7,7 +7,7 @@ class SkyflowError extends Error { constructor(errorCode: ISkyflowError, args: Array = []) { const formattedError: ISkyflowError = { - http_status: errorCode.http_status || BAD_REQUEST, + http_status: errorCode.http_status ?? errorCode.http_code ?? BAD_REQUEST, details: errorCode.details || [], requestId: errorCode.requestId || null, grpc_code: errorCode.grpc_code || null, diff --git a/src/vault/controller/connections/index.ts b/src/vault/controller/connections/index.ts index d709acc1..fa93df67 100644 --- a/src/vault/controller/connections/index.ts +++ b/src/vault/controller/connections/index.ts @@ -274,7 +274,7 @@ class ConnectionController { .catch((err) => { printLog( logs.errorLogs.INVOKE_CONNECTION_REQUEST_REJECTED, - MessageType.LOG, + MessageType.ERROR, this.logLevel, ); this.client.failureResponse(err).catch((err) => reject(err)); diff --git a/src/vault/controller/detect/index.ts b/src/vault/controller/detect/index.ts index e974f961..4b3b918e 100644 --- a/src/vault/controller/detect/index.ts +++ b/src/vault/controller/detect/index.ts @@ -30,8 +30,6 @@ import { DeidentifyFileDetectRunResponse, DeidentifyFileOutput, DetectTextRespon class DetectController { private client: VaultClient; - - private waitTime: number = 64; constructor(client: VaultClient) { this.client = client; @@ -49,8 +47,8 @@ class DetectController { return fileType.file as File; } else if ('filePath' in fileType && fileType.filePath) { const filePath = fileType.filePath; - const buffer = fs.readFileSync(filePath); - return new File([buffer], filePath); + const buffer = await fs.promises.readFile(filePath); + return new File([new Uint8Array(buffer)], filePath); } throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_DEIDENTIFY_FILE_REQUEST); } @@ -268,49 +266,38 @@ class DetectController { return genericRequest; } - private decodeBase64AndSaveToFile(base64Data: string, outputFilePath: string) { + private async decodeBase64AndSaveToFile(base64Data: string, outputFilePath: string) { try { - // Decode the base64 string const buffer = Buffer.from(base64Data, ENCODING_TYPE.BASE64); - - // Write the decoded data to the specified file - fs.writeFileSync(outputFilePath, buffer); + await fs.promises.writeFile(outputFilePath, buffer); } catch (error) { throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_DEIDENTIFY_FILE_REQUEST); - } } - private processDeidentifyFileResponse(response: DeidentifyFileDetectRunResponse, outputDirectory: string, fileBaseName: string) { - // Ensure the output directory exists - if (!fs.existsSync(outputDirectory)) { - fs.mkdirSync(outputDirectory, { recursive: true }); - } + private async processDeidentifyFileResponse(response: DeidentifyFileDetectRunResponse, outputDirectory: string, fileBaseName: string) { + await fs.promises.mkdir(outputDirectory, { recursive: true }); - // Iterate over the output array in the response - response.output.forEach((fileObject: DeidentifyFileOutput) => { - const { processedFile, processedFileExtension } = fileObject; + for (const fileObject of response.output) { + const { processedFile, processedFileExtension } = fileObject as DeidentifyFileOutput; if (!processedFile || !processedFileExtension) { - return; + continue; } - // Determine the output file name and path const outputFileName = `processed-${fileBaseName}.${processedFileExtension}`; const outputFilePath = path.join(outputDirectory, outputFileName); - // Handle JSON files if (processedFileExtension === FILE_EXTENSION.JSON) { const jsonData = Buffer.from(processedFile, ENCODING_TYPE.BASE64).toString(ENCODING_TYPE.UTF8); - fs.writeFileSync(outputFilePath, jsonData); - } else if ( processedFileExtension === FILE_EXTENSION.MP3 || processedFileExtension === FILE_EXTENSION.WAV) { + await fs.promises.writeFile(outputFilePath, jsonData); + } else if (processedFileExtension === FILE_EXTENSION.MP3 || processedFileExtension === FILE_EXTENSION.WAV) { const mp3Data = Buffer.from(processedFile, ENCODING_TYPE.BASE64); - fs.writeFileSync(outputFilePath, mp3Data, { encoding: ENCODING_TYPE.BINARY }); + await fs.promises.writeFile(outputFilePath, mp3Data, { encoding: ENCODING_TYPE.BINARY }); } else { - // Handle other file types (e.g., images, PDFs, etc.) - this.decodeBase64AndSaveToFile(processedFile, outputFilePath); + await this.decodeBase64AndSaveToFile(processedFile, outputFilePath); } - }); + } } private getReqType(format: string): DeidenitfyFileRequestTypes{ @@ -379,7 +366,7 @@ class DetectController { poll(); // Start polling } - private handleRequest(apiCall: Function, requestType: string): Promise { + private handleRequest(apiCall: Function, requestType: string, waitTime: number = 64): Promise { return new Promise((resolve, reject) => { printLog(parameterizedString(logs.infoLogs.EMIT_REQUEST, TYPES[requestType]), MessageType.LOG, this.client.getLogLevel()); const sdkHeaders = this.createSdkHeaders(); @@ -401,7 +388,7 @@ class DetectController { vault_id: this.client.vaultId, } - const maxWaitTime = this.waitTime; + const maxWaitTime = waitTime; this.pollForProcessedFile(data?.run_id, req, maxWaitTime, resolve, reject); // Call the extracted polling function break; @@ -487,7 +474,7 @@ class DetectController { file: fileObject.processedFile as string, extension: fileObject.processedFileExtension as string, })), - runId: data.runId ?? data.runId ?? runId, + runId: data.runId ?? runId, status: status, }); } @@ -600,7 +587,7 @@ class DetectController { const fileBaseName = path.parse(fileName).name; const fileExtension = fileName.substring(fileName.lastIndexOf('.') + 1); - this.waitTime = options?.getWaitTime() ?? this.waitTime; + const waitTime = options?.getWaitTime() ?? 64; const reqType : DeidenitfyFileRequestTypes = this.getReqType(fileExtension); type PollResult = @@ -615,7 +602,8 @@ class DetectController { () => this.client.filesAPI.deidentifyAudio( audioReq ).withRawResponse(), - TYPES.DEIDENTIFY_FILE + TYPES.DEIDENTIFY_FILE, + waitTime ); }); break; @@ -626,7 +614,8 @@ class DetectController { () => this.client.filesAPI.deidentifyText( textFileReq ).withRawResponse(), - TYPES.DEIDENTIFY_FILE + TYPES.DEIDENTIFY_FILE, + waitTime ); }); break; @@ -637,7 +626,8 @@ class DetectController { () => this.client.filesAPI.deidentifyPdf( pdfReq ).withRawResponse(), - TYPES.DEIDENTIFY_FILE + TYPES.DEIDENTIFY_FILE, + waitTime ); }); break; @@ -648,7 +638,8 @@ class DetectController { () => this.client.filesAPI.deidentifyImage( imageReq ).withRawResponse(), - TYPES.DEIDENTIFY_FILE + TYPES.DEIDENTIFY_FILE, + waitTime ); }); break; @@ -659,7 +650,8 @@ class DetectController { () => this.client.filesAPI.deidentifyPresentation( pptReq ).withRawResponse(), - TYPES.DEIDENTIFY_FILE + TYPES.DEIDENTIFY_FILE, + waitTime ); }); break; @@ -670,7 +662,8 @@ class DetectController { () => this.client.filesAPI.deidentifySpreadsheet( spreadsheetReq ).withRawResponse(), - TYPES.DEIDENTIFY_FILE + TYPES.DEIDENTIFY_FILE, + waitTime ); }); break; @@ -681,7 +674,8 @@ class DetectController { () => this.client.filesAPI.deidentifyStructuredText( structuredTextReq ).withRawResponse(), - TYPES.DEIDENTIFY_FILE + TYPES.DEIDENTIFY_FILE, + waitTime ); }); break; @@ -692,7 +686,8 @@ class DetectController { () => this.client.filesAPI.deidentifyDocument( documentReq ).withRawResponse(), - TYPES.DEIDENTIFY_FILE + TYPES.DEIDENTIFY_FILE, + waitTime ); }); break; @@ -703,7 +698,8 @@ class DetectController { () => this.client.filesAPI.deidentifyFile( defaultReq ).withRawResponse(), - TYPES.DEIDENTIFY_FILE + TYPES.DEIDENTIFY_FILE, + waitTime ); }); break; @@ -718,7 +714,7 @@ class DetectController { } const fullResponse = data as DeidentifyFileDetectRunResponse; if (options?.getOutputDirectory() && fullResponse.status === DETECT_STATUS.SUCCESS) { - this.processDeidentifyFileResponse(fullResponse, options.getOutputDirectory() as string, fileBaseName); + await this.processDeidentifyFileResponse(fullResponse, options.getOutputDirectory() as string, fileBaseName); } const deidentifiedFileResponse = this.parseDeidentifyFileResponse(fullResponse, runId, fullResponse.status); return deidentifiedFileResponse; diff --git a/src/vault/controller/vault/index.ts b/src/vault/controller/vault/index.ts index 08ecd2ba..9af07709 100644 --- a/src/vault/controller/vault/index.ts +++ b/src/vault/controller/vault/index.ts @@ -30,6 +30,8 @@ import { validateDeleteRequest, validateDetokenizeRequest, validateGetColumnRequ import path from 'path'; import { Records } from '../../../ _generated_/rest/api/resources/records/client/Client'; import FileUploadOptions from '../../model/options/fileUpload'; +import SkyflowError from '../../../error'; +import SKYFLOW_ERROR_CODE from '../../../error/codes'; class VaultController { @@ -176,6 +178,8 @@ class VaultController { case TYPES.DELETE: resolve(new DeleteResponse({ deletedIds: data?.RecordIDResponse ?? [], errors: null }) as T); break; + default: + reject(new SkyflowError(SKYFLOW_ERROR_CODE.INTERNAL_SERVER_ERROR)); } }).catch((error: any) => { printLog(logs.errorLogs[`${requestType}_REQUEST_REJECTED`], MessageType.ERROR, this.client.getLogLevel()); @@ -419,7 +423,7 @@ class VaultController { } uploadFile(request: FileUploadRequest, options?: FileUploadOptions): Promise { - return new Promise((resolve, reject) => { + return new Promise(async (resolve, reject) => { try { printLog(logs.infoLogs.UPLOAD_FILE_TRIGGERED, MessageType.LOG, this.client.getLogLevel()); printLog(logs.infoLogs.VALIDATE_FILE_UPLOAD_INPUT, MessageType.LOG, this.client.getLogLevel()); @@ -432,16 +436,16 @@ class VaultController { let fileName: string | undefined; if(options?.getFilePath()) { - const fileBuffer = fs.readFileSync(options.getFilePath()!); + const fileBuffer = await fs.promises.readFile(options.getFilePath()!); fileName = path.basename(options.getFilePath()!); - fileBlob = new File([fileBuffer], fileName, { + fileBlob = new File([new Uint8Array(fileBuffer)], fileName, { type: CONTENT_TYPE.APPLICATION_JSON }); } else if (options?.getBase64()) { const buffer = Buffer.from(options.getBase64()!, ENCODING_TYPE.BASE64); fileName = options.getFileName()!; - fileBlob = new File([buffer], fileName, { + fileBlob = new File([new Uint8Array(buffer)], fileName, { type: CONTENT_TYPE.APPLICATION_JSON }); } @@ -453,7 +457,7 @@ class VaultController { const uploadFileV2Request: UploadFileV2Request = { columnName:request.columnName, tableName: request.table, - skyflowID: options?.getSkyflowId() ?? (request as any)._legacySkyflowId, + skyflowID: options?.getSkyflowId() ?? request.getLegacySkyflowId(), returnFileMetadata: false, } diff --git a/src/vault/model/request/file-upload/index.ts b/src/vault/model/request/file-upload/index.ts index 770cbe32..2ef75143 100644 --- a/src/vault/model/request/file-upload/index.ts +++ b/src/vault/model/request/file-upload/index.ts @@ -37,6 +37,11 @@ class FileUploadRequest { this._columnName = value; } + /** @internal */ + getLegacySkyflowId(): string | undefined { + return this._legacySkyflowId; + } + /** @deprecated Use FileUploadOptions.setSkyflowId() instead. Will be removed in v3. */ public get skyflowId(): string { printLog(logs.warnLogs.DEPRECATED_FILE_UPLOAD_SKYFLOW_ID, MessageType.WARN, LogLevel.WARN); diff --git a/src/vault/skyflow/index.ts b/src/vault/skyflow/index.ts index b1fef8fd..4968a372 100644 --- a/src/vault/skyflow/index.ts +++ b/src/vault/skyflow/index.ts @@ -251,6 +251,7 @@ class Skyflow { this.throwErrorForUnknownId(clientId, idKey); } + throw new SkyflowError(SKYFLOW_ERROR_CODE.INTERNAL_SERVER_ERROR); } private updateClients(updateType: string) { From 50000ff25cac6b073e7662ef66e575b0a7cb5772 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 15:16:52 +0530 Subject: [PATCH 22/34] SK-2812: Updateed contract and fixed test --- api-report/skyflow-node.api.md | 14 +++++++++----- test/vault/controller/detect.test.js | 22 ++++++++++++---------- test/vault/controller/vault.test.js | 24 ++++++++++++++++++++---- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/api-report/skyflow-node.api.md b/api-report/skyflow-node.api.md index 5bf2af89..0558af28 100644 --- a/api-report/skyflow-node.api.md +++ b/api-report/skyflow-node.api.md @@ -263,6 +263,7 @@ export class DeleteRequest { // @public (undocumented) export class DeleteResponse { + // @deprecated constructor(input: { deletedIds: Array; errors: Array | null; @@ -442,13 +443,13 @@ export class DetokenizeOptions { constructor(); // (undocumented) getContinueOnError(): boolean | undefined; - // (undocumented) + // @deprecated (undocumented) getDownloadURL(): boolean | undefined; // (undocumented) getDownloadUrl(): boolean | undefined; // (undocumented) setContinueOnError(continueOnError: boolean): void; - // (undocumented) + // @deprecated (undocumented) setDownloadURL(downloadURL: boolean): void; // (undocumented) setDownloadUrl(downloadUrl: boolean): void; @@ -525,7 +526,9 @@ export class FileUploadRequest { // (undocumented) get columnName(): string; set columnName(value: string); - // (undocumented) + // @internal (undocumented) + getLegacySkyflowId(): string | undefined; + // @deprecated (undocumented) get skyflowId(): string; set skyflowId(value: string); // (undocumented) @@ -595,7 +598,7 @@ export class GetOptions { getColumnName(): string | undefined; // (undocumented) getColumnValues(): Array | undefined; - // (undocumented) + // @deprecated (undocumented) getDownloadURL(): boolean | undefined; // (undocumented) getDownloadUrl(): boolean | undefined; @@ -615,7 +618,7 @@ export class GetOptions { setColumnName(columnName: string): void; // (undocumented) setColumnValues(columnValues: Array): void; - // (undocumented) + // @deprecated (undocumented) setDownloadURL(downloadURL: boolean): void; // (undocumented) setDownloadUrl(downloadUrl: boolean): void; @@ -712,6 +715,7 @@ export class InsertRequest { // @public (undocumented) export class InsertResponse { + // @deprecated constructor(input: { insertedFields: Array; errors: Array | null; diff --git a/test/vault/controller/detect.test.js b/test/vault/controller/detect.test.js index f062c31f..b9fabff7 100644 --- a/test/vault/controller/detect.test.js +++ b/test/vault/controller/detect.test.js @@ -552,6 +552,9 @@ describe('deidentifyFile', () => { options.setPixelDensity(300); options.setMaxResolution(2000); + // Mock fs.promises.readFile so fake timers don't block on real I/O + jest.spyOn(fs.promises, 'readFile').mockResolvedValue(Buffer.from('dummy pdf content')); + // Mock PDF deidentify API to return a run_id mockVaultClient.filesAPI.deidentifyPdf.mockImplementation(() => ({ withRawResponse: jest.fn().mockResolvedValue({ @@ -939,9 +942,9 @@ describe('deidentifyFile', () => { const options = new DeidentifyFileOptions(); options.setOutputDirectory('/mock/output/directory'); - // 2. Mock File System (using spies to verify calls) - const existsSpy = jest.spyOn(fs, 'existsSync').mockReturnValue(true); - const writeSpy = jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {}); + // 2. Mock File System (source uses fs.promises — spy on async methods) + const mkdirSpy = jest.spyOn(fs.promises, 'mkdir').mockResolvedValue(undefined); + const writeFileSpy = jest.spyOn(fs.promises, 'writeFile').mockResolvedValue(undefined); // 3. Mock deidentifyFile (The specific method causing the TypeError) mockVaultClient.filesAPI.deidentifyFile = jest.fn().mockImplementation(() => ({ @@ -990,8 +993,8 @@ describe('deidentifyFile', () => { expect(result.status).toBe('SUCCESS'); // Verify file system interactions - expect(existsSpy).toHaveBeenCalledWith(expect.stringContaining('/mock/output/directory')); - expect(writeSpy).toHaveBeenCalledWith( + expect(mkdirSpy).toHaveBeenCalledWith('/mock/output/directory', { recursive: true }); + expect(writeFileSpy).toHaveBeenCalledWith( expect.stringContaining('processed-test.txt'), expect.any(Buffer) ); @@ -1076,10 +1079,9 @@ describe('deidentifyFile', () => { // ... (other mock data) }); - // 2. Setup Spies - const existsSpy = jest.spyOn(fs, 'existsSync').mockReturnValue(true); - const mkdirSpy = jest.spyOn(fs, 'mkdirSync').mockImplementation(() => {}); - const writeSpy = jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {}); + // 2. Setup Spies (source uses fs.promises — spy on async methods) + const mkdirSpy = jest.spyOn(fs.promises, 'mkdir').mockResolvedValue(undefined); + const writeSpy = jest.spyOn(fs.promises, 'writeFile').mockResolvedValue(undefined); // 3. START the execution const promise = detectController.deidentifyFile(pdfRequest, mockOptions); @@ -1092,7 +1094,7 @@ describe('deidentifyFile', () => { // Assertions expect(result.extension).toBe('pdf'); - expect(existsSpy).toHaveBeenCalledWith('/mock/output/directory'); + expect(mkdirSpy).toHaveBeenCalledWith('/mock/output/directory', { recursive: true }); expect(writeSpy).toHaveBeenCalledWith( expect.stringContaining('processed-test.pdf'), expect.any(Buffer) diff --git a/test/vault/controller/vault.test.js b/test/vault/controller/vault.test.js index 322e44f8..537c84ac 100644 --- a/test/vault/controller/vault.test.js +++ b/test/vault/controller/vault.test.js @@ -14,7 +14,10 @@ import GetColumnRequest from '../../../src/vault/model/request/get-column'; import SkyflowError from '../../../src/error'; import * as fs from 'fs'; -jest.mock('fs'); +jest.mock('fs', () => ({ + promises: { readFile: jest.fn() }, + readFileSync: jest.fn(), +})); global.FormData = class { data = {}; @@ -73,7 +76,17 @@ jest.mock('../../../src/utils', () => ({ INVOKE_CONNECTION: 'INVOKE_CONNECTION', }, generateSDKMetrics: jest.fn(), - getBearerToken: jest.fn().mockResolvedValue(Promise.resolve('your-bearer-token')) + getBearerToken: jest.fn().mockResolvedValue(Promise.resolve('your-bearer-token')), + HTTP_STATUS_CODE: { + OK: 200, + BAD_REQUEST: 400, + INTERNAL_SERVER_ERROR: 500, + }, + HTTP_HEADER: { + CONTENT_TYPE: 'Content-Type', + X_REQUEST_ID: 'x-request-id', + }, + SkyflowRecordError: {}, })); jest.mock('../../../src/utils/validations', () => ({ @@ -94,7 +107,10 @@ jest.mock('../../../src/utils/logs', () => ({ }, errorLogs: { INSERT_REQUEST_REJECTED: 'INSERT_REJECTED', - } + }, + warnLogs: { + DEPRECATED_SKYFLOW_ID_PROPERTY: "[DEPRECATED] Property 'skyflow_id' is deprecated and will be removed in an upcoming release. Use 'skyflowId' instead.", + }, })); describe('VaultController', () => { @@ -1464,7 +1480,7 @@ describe('VaultController uploadFile method', () => { }; const mockFileBuffer = Buffer.from('file content'); const mockFileName = 'file.json'; - jest.spyOn(mockFs, 'readFileSync').mockReturnValueOnce(mockFileBuffer); + mockFs.promises.readFile.mockResolvedValueOnce(mockFileBuffer); jest.spyOn(mockPath, 'basename').mockReturnValueOnce(mockFileName); const mockResponseData = { skyflowID: 'id123' }; From 1adc43e25719efd671f953aa23c07a88dee4a16e Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 15:53:31 +0530 Subject: [PATCH 23/34] SK-2812: Fixed test case --- src/error/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/error/index.ts b/src/error/index.ts index 3eabc9e2..79f4cfc0 100644 --- a/src/error/index.ts +++ b/src/error/index.ts @@ -7,7 +7,7 @@ class SkyflowError extends Error { constructor(errorCode: ISkyflowError, args: Array = []) { const formattedError: ISkyflowError = { - http_status: errorCode.http_status ?? errorCode.http_code ?? BAD_REQUEST, + http_status: errorCode.http_status ?? BAD_REQUEST, details: errorCode.details || [], requestId: errorCode.requestId || null, grpc_code: errorCode.grpc_code || null, From 2508fb9fedc50ce1c8503daa016d5aff9ade9a12 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 16:02:24 +0530 Subject: [PATCH 24/34] SK-2812: Fix contract snapshot CI failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit removeComments:true stripped @deprecated/@internal JSDoc from .d.ts files, so api-extractor couldn't read them — generating a report that differed from the committed snapshot. Set removeComments:false so JSDoc annotations are preserved in compiled output and api-extractor produces a consistent report across local and CI builds. Also update test to match enumerable:true on the request_ID deprecated alias. Co-Authored-By: Claude Sonnet 4.6 --- test/error/skyflow-error.test.js | 4 ++-- tsconfig.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/error/skyflow-error.test.js b/test/error/skyflow-error.test.js index 1342de7d..60ba5e40 100644 --- a/test/error/skyflow-error.test.js +++ b/test/error/skyflow-error.test.js @@ -89,12 +89,12 @@ describe('SkyflowError deprecated request_ID alias', () => { expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('requestId')); }); - test('request_ID is not enumerable', () => { + test('request_ID is enumerable', () => { const err = new SkyflowError({ http_code: 400, message: 'test', requestId: 'req-xyz', }); - expect(Object.keys(err.error)).not.toContain('request_ID'); + expect(Object.keys(err.error)).toContain('request_ID'); }); }); diff --git a/tsconfig.json b/tsconfig.json index 03e5aeef..5401b3f9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "module": "commonjs", "moduleResolution": "node", - "removeComments": true, + "removeComments": false, "allowSyntheticDefaultImports": true, "allowJs": true, "strict": true, From 816c176e8607db5a0be05541aaae376195b0c904 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 16:06:31 +0530 Subject: [PATCH 25/34] SK-2812: Regenerate API contract snapshot with removeComments:true Previous snapshot was generated with removeComments:false, causing CI mismatch. Regenerated with removeComments:true to match CI build output. Co-Authored-By: Claude Sonnet 4.6 --- api-report/skyflow-node.api.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/api-report/skyflow-node.api.md b/api-report/skyflow-node.api.md index 0558af28..c0da4727 100644 --- a/api-report/skyflow-node.api.md +++ b/api-report/skyflow-node.api.md @@ -263,7 +263,6 @@ export class DeleteRequest { // @public (undocumented) export class DeleteResponse { - // @deprecated constructor(input: { deletedIds: Array; errors: Array | null; @@ -443,13 +442,13 @@ export class DetokenizeOptions { constructor(); // (undocumented) getContinueOnError(): boolean | undefined; - // @deprecated (undocumented) + // (undocumented) getDownloadURL(): boolean | undefined; // (undocumented) getDownloadUrl(): boolean | undefined; // (undocumented) setContinueOnError(continueOnError: boolean): void; - // @deprecated (undocumented) + // (undocumented) setDownloadURL(downloadURL: boolean): void; // (undocumented) setDownloadUrl(downloadUrl: boolean): void; @@ -526,9 +525,9 @@ export class FileUploadRequest { // (undocumented) get columnName(): string; set columnName(value: string); - // @internal (undocumented) + // (undocumented) getLegacySkyflowId(): string | undefined; - // @deprecated (undocumented) + // (undocumented) get skyflowId(): string; set skyflowId(value: string); // (undocumented) @@ -598,7 +597,7 @@ export class GetOptions { getColumnName(): string | undefined; // (undocumented) getColumnValues(): Array | undefined; - // @deprecated (undocumented) + // (undocumented) getDownloadURL(): boolean | undefined; // (undocumented) getDownloadUrl(): boolean | undefined; @@ -618,7 +617,7 @@ export class GetOptions { setColumnName(columnName: string): void; // (undocumented) setColumnValues(columnValues: Array): void; - // @deprecated (undocumented) + // (undocumented) setDownloadURL(downloadURL: boolean): void; // (undocumented) setDownloadUrl(downloadUrl: boolean): void; @@ -715,7 +714,6 @@ export class InsertRequest { // @public (undocumented) export class InsertResponse { - // @deprecated constructor(input: { insertedFields: Array; errors: Array | null; From 02b80c9a9823355ff6a9c0c63ca8da7d91ce6ca5 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 16:08:23 +0530 Subject: [PATCH 26/34] SK-2812: Reverted tsconfig --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 5401b3f9..03e5aeef 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "module": "commonjs", "moduleResolution": "node", - "removeComments": false, + "removeComments": true, "allowSyntheticDefaultImports": true, "allowJs": true, "strict": true, From 20d17e8acd2ade71928ab62e00362a4b61d3a6f8 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 17:28:28 +0530 Subject: [PATCH 27/34] SK-2812: Updated contracts --- api-report/skyflow-node.api.md | 14 ++++++++------ src/error/index.ts | 5 ++--- tsconfig.json | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/api-report/skyflow-node.api.md b/api-report/skyflow-node.api.md index c0da4727..0558af28 100644 --- a/api-report/skyflow-node.api.md +++ b/api-report/skyflow-node.api.md @@ -263,6 +263,7 @@ export class DeleteRequest { // @public (undocumented) export class DeleteResponse { + // @deprecated constructor(input: { deletedIds: Array; errors: Array | null; @@ -442,13 +443,13 @@ export class DetokenizeOptions { constructor(); // (undocumented) getContinueOnError(): boolean | undefined; - // (undocumented) + // @deprecated (undocumented) getDownloadURL(): boolean | undefined; // (undocumented) getDownloadUrl(): boolean | undefined; // (undocumented) setContinueOnError(continueOnError: boolean): void; - // (undocumented) + // @deprecated (undocumented) setDownloadURL(downloadURL: boolean): void; // (undocumented) setDownloadUrl(downloadUrl: boolean): void; @@ -525,9 +526,9 @@ export class FileUploadRequest { // (undocumented) get columnName(): string; set columnName(value: string); - // (undocumented) + // @internal (undocumented) getLegacySkyflowId(): string | undefined; - // (undocumented) + // @deprecated (undocumented) get skyflowId(): string; set skyflowId(value: string); // (undocumented) @@ -597,7 +598,7 @@ export class GetOptions { getColumnName(): string | undefined; // (undocumented) getColumnValues(): Array | undefined; - // (undocumented) + // @deprecated (undocumented) getDownloadURL(): boolean | undefined; // (undocumented) getDownloadUrl(): boolean | undefined; @@ -617,7 +618,7 @@ export class GetOptions { setColumnName(columnName: string): void; // (undocumented) setColumnValues(columnValues: Array): void; - // (undocumented) + // @deprecated (undocumented) setDownloadURL(downloadURL: boolean): void; // (undocumented) setDownloadUrl(downloadUrl: boolean): void; @@ -714,6 +715,7 @@ export class InsertRequest { // @public (undocumented) export class InsertResponse { + // @deprecated constructor(input: { insertedFields: Array; errors: Array | null; diff --git a/src/error/index.ts b/src/error/index.ts index 79f4cfc0..bedc7907 100644 --- a/src/error/index.ts +++ b/src/error/index.ts @@ -1,13 +1,12 @@ import { BAD_REQUEST, ISkyflowError, LogLevel, MessageType, parameterizedString, printLog } from "../utils"; -import logs from '../utils/logs'; class SkyflowError extends Error { error?: ISkyflowError; constructor(errorCode: ISkyflowError, args: Array = []) { - const formattedError: ISkyflowError = { - http_status: errorCode.http_status ?? BAD_REQUEST, + const formattedError: any = { + http_status: errorCode.http_status || BAD_REQUEST, details: errorCode.details || [], requestId: errorCode.requestId || null, grpc_code: errorCode.grpc_code || null, diff --git a/tsconfig.json b/tsconfig.json index 03e5aeef..5401b3f9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "module": "commonjs", "moduleResolution": "node", - "removeComments": true, + "removeComments": false, "allowSyntheticDefaultImports": true, "allowJs": true, "strict": true, From c875b24bda417f11b4ff19018abe529fc8aaaada Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 17:30:37 +0530 Subject: [PATCH 28/34] SK-2812: Fixed test case --- src/error/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/error/index.ts b/src/error/index.ts index bedc7907..00817a03 100644 --- a/src/error/index.ts +++ b/src/error/index.ts @@ -1,4 +1,5 @@ import { BAD_REQUEST, ISkyflowError, LogLevel, MessageType, parameterizedString, printLog } from "../utils"; +import logs from "../utils/logs"; class SkyflowError extends Error { From a6d3b6def65de2a838324507b214bc736195ecdf Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Tue, 19 May 2026 18:00:53 +0530 Subject: [PATCH 29/34] SK-2812: Updated snapshot --- api-extractor.json | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 api-extractor.json diff --git a/api-extractor.json b/api-extractor.json new file mode 100644 index 00000000..80bfdd6d --- /dev/null +++ b/api-extractor.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "projectFolder": ".", + "mainEntryPointFilePath": "/lib/index.d.ts", + "bundledPackages": [], + "compiler": { + "tsconfigFilePath": "/tsconfig.json" + }, + "apiReport": { + "enabled": true, + "reportFolder": "/api-report/", + "reportTempFolder": "/temp/", + "reportFileName": ".api.md" + }, + "docModel": { + "enabled": false + }, + "dtsRollup": { + "enabled": false + }, + "tsdocMetadata": { + "enabled": false + }, + "messages": { + "compilerMessageReporting": { + "default": { + "logLevel": "warning" + } + }, + "extractorMessageReporting": { + "default": { + "logLevel": "warning" + }, + "ae-missing-release-tag": { + "logLevel": "none" + }, + "ae-setter-with-docs": { + "logLevel": "none" + } + }, + "tsdocMessageReporting": { + "default": { + "logLevel": "none" + } + } + } +} From bf0aec515d52c1c3292234b53cf6ae4592243624 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Wed, 20 May 2026 12:17:38 +0530 Subject: [PATCH 30/34] SK-2182: Fixed request_ID missing at some places --- src/utils/index.ts | 2 ++ src/vault/controller/vault/index.ts | 38 +++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/utils/index.ts b/src/utils/index.ts index 10d2215c..c3777aba 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -319,6 +319,8 @@ export interface ISkyflowError { export interface SkyflowRecordError { error: string, requestId: string | null, + /** @deprecated Use requestId instead. Will be removed in v3. */ + request_ID?: string | null, httpCode?: string | number | null, requestIndex?: number | null, token?: string | null, diff --git a/src/vault/controller/vault/index.ts b/src/vault/controller/vault/index.ts index 9af07709..9486076d 100644 --- a/src/vault/controller/vault/index.ts +++ b/src/vault/controller/vault/index.ts @@ -67,6 +67,15 @@ class VaultController { }); } + private addDeprecatedRequestIdAccessor(result: Record): void { + const logLevel = this.client.getLogLevel(); + Object.defineProperty(result, 'request_ID', { + get() { printLog(logs.warnLogs.DEPRECATED_REQUEST_ID_PROPERTY, MessageType.WARN, logLevel); return this.requestId; }, + enumerable: true, + configurable: true, + }); + } + private parseDetokenizeResponse(records: Record[], requestId: string): ParsedDetokenizeResponse { const response: ParsedDetokenizeResponse = { success: [], @@ -79,9 +88,10 @@ class VaultController { if (record.error) { const detokenizeError: SkyflowRecordError = { token: record.token, - error: record.error, + error: record.error, requestId: requestId - } + }; + this.addDeprecatedRequestIdAccessor(detokenizeError as unknown as Record); response.errors.push(detokenizeError); } else { response.success.push({ @@ -124,11 +134,13 @@ class VaultController { const body = record.Body as { records: StringKeyValueMapType[] }; if (body && Array.isArray(body.records)) { body.records.forEach((field: StringKeyValueMapType) => { - response.success.push({ + const result: Record = { skyflowId: String(field?.skyflow_id), requestIndex: index, ...(typeof field?.tokens === 'object' && field?.tokens !== null ? field.tokens : {}) - }); + }; + this.addDeprecatedSkyflowIdAccessor(result); + response.success.push(result as InsertResponseType); }); } } @@ -145,6 +157,7 @@ class VaultController { requestId: requestId ?? null, requestIndex: index ?? null, }; + this.addDeprecatedRequestIdAccessor(errorObj as unknown as Record); response.errors.push(errorObj); } @@ -224,10 +237,14 @@ class VaultController { } private parseBulkInsertResponse(records: Record[]): InsertResponse { - const insertedFields: InsertResponseType[] = records.map(record => ({ - skyflowId: String(record.skyflow_id), - ...(typeof record.tokens === 'object' && record.tokens !== null ? record.tokens : {}) - })); + const insertedFields: InsertResponseType[] = records.map(record => { + const result: Record = { + skyflowId: String(record.skyflow_id), + ...(typeof record.tokens === 'object' && record.tokens !== null ? record.tokens : {}) + }; + this.addDeprecatedSkyflowIdAccessor(result); + return result as InsertResponseType; + }); return new InsertResponse({ insertedFields, errors: null }); } @@ -302,11 +319,12 @@ class VaultController { TYPES.UPDATE ).then(data => { printLog(logs.infoLogs.UPDATE_SUCCESS, MessageType.LOG, this.client.getLogLevel()); - const updatedRecord = { + const updatedRecord: Record = { skyflowId: data.skyflow_id ?? '', ...data?.tokens }; - resolve(new UpdateResponse({ updatedField: updatedRecord, errors: null })); + this.addDeprecatedSkyflowIdAccessor(updatedRecord); + resolve(new UpdateResponse({ updatedField: updatedRecord as InsertResponseType, errors: null })); }) .catch(error => { reject(error); From 334d0193963901c4edc2a11a48438f27102d5833 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Wed, 20 May 2026 13:08:53 +0530 Subject: [PATCH 31/34] SK-2812: Fixed request_ID --- src/vault/controller/connections/index.ts | 9 ++++++++- src/vault/controller/vault/index.ts | 6 ++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/vault/controller/connections/index.ts b/src/vault/controller/connections/index.ts index fa93df67..281e3b03 100644 --- a/src/vault/controller/connections/index.ts +++ b/src/vault/controller/connections/index.ts @@ -264,9 +264,16 @@ class ConnectionController { this.logLevel, ); const requestId = headers?.get(REQUEST.ID_KEY) || ""; + const logLevel = this.logLevel; + const metadata: Record = { requestId }; + Object.defineProperty(metadata, 'request_ID', { + get() { printLog(logs.warnLogs.DEPRECATED_REQUEST_ID_PROPERTY, MessageType.WARN, logLevel); return this.requestId; }, + enumerable: true, + configurable: true, + }); const invokeConnectionResponse = new InvokeConnectionResponse({ data: body, - metadata: { requestId }, + metadata, errors: null, }); resolve(invokeConnectionResponse); diff --git a/src/vault/controller/vault/index.ts b/src/vault/controller/vault/index.ts index 9486076d..01f0bf2f 100644 --- a/src/vault/controller/vault/index.ts +++ b/src/vault/controller/vault/index.ts @@ -488,7 +488,9 @@ class VaultController { TYPES.FILE_UPLOAD ).then(data => { printLog(logs.infoLogs.FILE_UPLOAD_DATA_SUCCESS, MessageType.LOG, this.client.getLogLevel()); - resolve(new FileUploadResponse({ skyflowId: data.skyflowID ?? "", errors: null })); + const fileUploadResp = new FileUploadResponse({ skyflowId: data.skyflowID ?? "", errors: null }); + this.addDeprecatedSkyflowIdAccessor(fileUploadResp as unknown as Record); + resolve(fileUploadResp); }) .catch(error => { reject(error); @@ -597,7 +599,7 @@ class VaultController { TYPES.TOKENIZE ).then(response => { printLog(logs.infoLogs.TOKENIZE_SUCCESS, MessageType.LOG, this.client.getLogLevel()); - resolve(new TokenizeResponse({ tokens: response.records, errors: null })) + resolve(new TokenizeResponse({ tokens: response.records, errors: null })); }) .catch(error => { reject(error); From b5f16bf15805a8766a21ce105dc08ad3c703764a Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Wed, 20 May 2026 14:03:00 +0530 Subject: [PATCH 32/34] SK-2812: Deleted warnonce --- src/service-account/index.ts | 1 + src/utils/validations/index.ts | 2 +- src/utils/warn-once.ts | 10 ---------- src/vault/controller/detect/index.ts | 9 +++++++++ src/vault/types/index.ts | 4 +++- 5 files changed, 14 insertions(+), 12 deletions(-) delete mode 100644 src/utils/warn-once.ts diff --git a/src/service-account/index.ts b/src/service-account/index.ts index 4a060783..5fac799a 100644 --- a/src/service-account/index.ts +++ b/src/service-account/index.ts @@ -15,6 +15,7 @@ function normalizeTokenOptions(options?: BearerTokenOptions): BearerTokenOptions printLog(logs.warnLogs.DEPRECATED_ROLE_IDS_PROPERTY, MessageType.WARN, options.logLevel); return { ...options, roleIds: options.roleIDs }; } + // if both provided, roleIDs is ignored; roleIds takes precedence return options; } diff --git a/src/utils/validations/index.ts b/src/utils/validations/index.ts index 5ab9c4f6..76ba5f77 100644 --- a/src/utils/validations/index.ts +++ b/src/utils/validations/index.ts @@ -84,7 +84,7 @@ function isValidCredentialsString(credentialsString: string) { keyId: parsed.keyId ?? parsed.keyID, tokenUri: parsed.tokenUri ?? parsed.tokenURI, }; - if (credentialsObj?.clientId === null || credentialsObj?.keyId === null || credentialsObj?.tokenUri === null) { + if (credentialsObj?.clientId == null || credentialsObj?.keyId == null || credentialsObj?.tokenUri == null) { return false; } return true; diff --git a/src/utils/warn-once.ts b/src/utils/warn-once.ts deleted file mode 100644 index 58837908..00000000 --- a/src/utils/warn-once.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { LogLevel, MessageType, printLog } from './index'; - -const warned = new Set(); - -export function warnOnce(message: string, logLevel: LogLevel = LogLevel.WARN): void { - if (!warned.has(message)) { - warned.add(message); - printLog(message, MessageType.WARN, logLevel); - } -} diff --git a/src/vault/controller/detect/index.ts b/src/vault/controller/detect/index.ts index 4b3b918e..62045ccc 100644 --- a/src/vault/controller/detect/index.ts +++ b/src/vault/controller/detect/index.ts @@ -285,8 +285,17 @@ class DetectController { continue; } + if (!/^[a-zA-Z0-9]+$/.test(processedFileExtension)) { + throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_DEIDENTIFY_FILE_REQUEST); + } + const outputFileName = `processed-${fileBaseName}.${processedFileExtension}`; const outputFilePath = path.join(outputDirectory, outputFileName); + const resolvedOutput = path.resolve(outputFilePath); + const resolvedDir = path.resolve(outputDirectory); + if (!resolvedOutput.startsWith(resolvedDir + path.sep) && resolvedOutput !== resolvedDir) { + throw new SkyflowError(SKYFLOW_ERROR_CODE.INVALID_DEIDENTIFY_FILE_REQUEST); + } if (processedFileExtension === FILE_EXTENSION.JSON) { const jsonData = Buffer.from(processedFile, ENCODING_TYPE.BASE64).toString(ENCODING_TYPE.UTF8); diff --git a/src/vault/types/index.ts b/src/vault/types/index.ts index 47df4531..7821f1cd 100644 --- a/src/vault/types/index.ts +++ b/src/vault/types/index.ts @@ -41,6 +41,8 @@ export interface ClientObj { export interface InsertResponseType { skyflowId: string; + /** @deprecated Renamed to skyflowId. Will be removed in v3. */ + skyflow_id?: string; [key: string]: unknown; } @@ -171,7 +173,7 @@ export interface DetectFileResponse { export interface SkyflowIdResponse { skyflowId: string; /** @deprecated Renamed to skyflowId. Will be removed in v3. */ - skyflow_id: string; + skyflow_id?: string; } export interface TokensResponse extends SkyflowIdResponse { From 244ba10e673f7211a13e612773fc73f6be908963 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Wed, 20 May 2026 14:23:45 +0530 Subject: [PATCH 33/34] SK-2812: Fixed test cases --- src/utils/validations/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/validations/index.ts b/src/utils/validations/index.ts index 76ba5f77..ce822871 100644 --- a/src/utils/validations/index.ts +++ b/src/utils/validations/index.ts @@ -84,7 +84,7 @@ function isValidCredentialsString(credentialsString: string) { keyId: parsed.keyId ?? parsed.keyID, tokenUri: parsed.tokenUri ?? parsed.tokenURI, }; - if (credentialsObj?.clientId == null || credentialsObj?.keyId == null || credentialsObj?.tokenUri == null) { + if (credentialsObj?.clientId == null || credentialsObj?.keyId == null) { return false; } return true; From 2a1dd055ae49abf346c00cbb34e135c634dd45a8 Mon Sep 17 00:00:00 2001 From: Aadarsh Date: Wed, 20 May 2026 15:37:58 +0530 Subject: [PATCH 34/34] SK-2812: updated readme --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9348e7d4..67485451 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Skyflow Node.js SDK -> **Node.js V2.1.x IS NOW AVAILABLE:** A new, improved version of the Skyflow SDK is ready with flexible authentication, multi-vault support, and richer error diagnostics. V1 is in maintenance mode (security patches only) and will reach End of Life on October 31, 2026. We recommend upgrading to v2 — see the **[Migration Guide](docs/migrate_to_v2.md)** for step-by-step instructions. +> **This is the current, recommended version of the Skyflow SDK.** V2.1.0 brings flexible auth, multi-vault support, builder patterns, native data types, and rich error diagnostics. +> +> Migrating from v1? See the **[Migration Guide](docs/migrate_to_v2.md)** for step-by-step instructions. V1 is in maintenance mode and will reach End of Life on October 31, 2026. Securely handle sensitive data at rest, in-transit, and in-use with the Skyflow SDK for Node.js, Deno, Bun, and Cloudflare Workers. @@ -230,6 +232,8 @@ const response: InsertResponse = await skyflowClient console.log('Insert response:', response); ``` +> **Note:** The response key is `skyflowId`. The legacy `skyflow_id` key is deprecated and will be removed in an upcoming release. + #### Insert example with `continueOnError` option Set the `continueOnError` flag to `true` to allow insert operations to proceed despite encountering partial errors. @@ -309,6 +313,8 @@ const response: GetResponse = await skyflowClient console.log("Get response:", response); ``` +> **Note:** The response key is `skyflowId`. The legacy `skyflow_id` key is deprecated and will be removed in an upcoming release. + #### Get by Skyflow IDs Retrieve specific records using Skyflow IDs. Use this method when you know the exact record IDs. @@ -415,6 +421,8 @@ const response: UpdateResponse = await skyflowClient console.log('Update response:', response); ``` +> **Note:** The response key is `skyflowId`. The legacy `skyflow_id` key is deprecated and will be removed in an upcoming release. + > [!TIP] > See the full example in the samples directory: [update-record.ts](samples/vault-api/update-record.ts)