From 6473a5b09840dc3d2c0a3a3bf6a626f506f13a60 Mon Sep 17 00:00:00 2001 From: 95gabor Date: Wed, 17 Sep 2025 17:54:56 +0200 Subject: [PATCH 01/13] refactor(trusted-timestamp): rewrite in typescript --- .eslintrc.json | 36 +- README.md | 22 +- package.json | 13 +- rollup.config.js | 1 + src/index.ts | 4 +- src/trustedTimestamp/TimestampRequest.js | 235 -- src/trustedTimestamp/TimestampRequest.ts | 231 ++ src/trustedTimestamp/TrustedTimestampCheck.js | 31 - src/trustedTimestamp/TrustedTimestampCheck.ts | 28 + ...pCommand.js => TrustedTimestampCommand.ts} | 69 +- src/trustedTimestamp/TrustedTimestampInfo.js | 153 -- src/trustedTimestamp/TrustedTimestampInfo.ts | 160 ++ .../TrustedTimestampRequest.js | 196 -- .../TrustedTimestampRequest.ts | 167 ++ ...pService.js => TrustedTimestampService.ts} | 115 +- .../error/create-timestamp-token.error.ts | 2 +- .../types/timestamp-config.type.ts | 6 + .../types/timestamp-log.type.ts | 13 + .../types/timestamp-provider.type.ts | 26 + .../types/timestamp-request.type.ts | 24 + .../types/timestamp-token.type.ts | 8 +- src/util/TempFileService.js | 32 - src/util/TempFileService.ts | 34 + src/util/child_process_promise.js | 44 - src/util/child_process_promise.ts | 61 + src/util/regexParser.js | 40 - src/util/regexParser.ts | 46 + test/tests/feature/timestamp-service.test.ts | 109 +- .../mocks/TrustedTimestampCommand.mock.js | 29 - .../mocks/TrustedTimestampCommand.mock.ts | 34 + test/{vitest.config.js => vitest.config.ts} | 1 - tsconfig.json | 2 +- yarn.lock | 2063 ++++++----------- 33 files changed, 1686 insertions(+), 2349 deletions(-) delete mode 100644 src/trustedTimestamp/TimestampRequest.js create mode 100644 src/trustedTimestamp/TimestampRequest.ts delete mode 100644 src/trustedTimestamp/TrustedTimestampCheck.js create mode 100644 src/trustedTimestamp/TrustedTimestampCheck.ts rename src/trustedTimestamp/{TrustedTimestampCommand.js => TrustedTimestampCommand.ts} (52%) delete mode 100644 src/trustedTimestamp/TrustedTimestampInfo.js create mode 100644 src/trustedTimestamp/TrustedTimestampInfo.ts delete mode 100644 src/trustedTimestamp/TrustedTimestampRequest.js create mode 100644 src/trustedTimestamp/TrustedTimestampRequest.ts rename src/trustedTimestamp/{TrustedTimestampService.js => TrustedTimestampService.ts} (67%) create mode 100644 src/trustedTimestamp/types/timestamp-config.type.ts create mode 100644 src/trustedTimestamp/types/timestamp-log.type.ts create mode 100644 src/trustedTimestamp/types/timestamp-provider.type.ts create mode 100644 src/trustedTimestamp/types/timestamp-request.type.ts delete mode 100644 src/util/TempFileService.js create mode 100644 src/util/TempFileService.ts delete mode 100644 src/util/child_process_promise.js create mode 100644 src/util/child_process_promise.ts delete mode 100644 src/util/regexParser.js create mode 100644 src/util/regexParser.ts delete mode 100644 test/tests/mocks/TrustedTimestampCommand.mock.js create mode 100644 test/tests/mocks/TrustedTimestampCommand.mock.ts rename test/{vitest.config.js => vitest.config.ts} (88%) diff --git a/.eslintrc.json b/.eslintrc.json index ccdfce1..c17f9fe 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,28 +1,10 @@ { - "root": true, - "extends": ["standard", "plugin:n/recommended", "plugin:@typescript-eslint/recommended", "prettier"], - "rules": { - "curly": ["error", "all"], - "brace-style": ["error", "1tbs", { "allowSingleLine": false }], - "guard-for-in": "error", - "no-console": "error", - "no-debugger": "error", - "radix": "error", - "n/no-deprecated-api": "warn", - "n/no-process-exit": "off", - "no-process-exit": "off", - "n/shebang": "off", - "no-empty-function": "error", - "no-shadow": "warn", - "n/no-unpublished-import": "off" - }, - "env": { - "commonjs": true, - "es6": true - }, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2020, - "sourceType": "module" - } - } + "root": true, + "extends": ["plugin:@typescript-eslint/recommended", "prettier"], + "rules": { + "@typescript-eslint/no-useless-constructor": "error", + "@typescript-eslint/no-empty-function": "error", + "@typescript-eslint/explicit-function-return-type": "error" + }, + "parser": "@typescript-eslint/parser" +} diff --git a/README.md b/README.md index 07b6d72..a2d3421 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,16 @@ -Timestamp -============= +# Timestamp Trustedtimestamp service implements the generate and verification of timestamps. -* [Install](#install) -* [Usage](#usage) - * [Params](#params) -* [Default config](#default-config) -* [Config provider options](#config-provider-options) - * [Required fields](#required-fields) - * [Optional fields](#optional-fields) -* [Config example](#config-example) -* [Public methods](#public-methods) - +- [Install](#install) +- [Usage](#usage) + - [Params](#params) +- [Default config](#default-config) +- [Config provider options](#config-provider-options) + - [Required fields](#required-fields) + - [Optional fields](#optional-fields) +- [Config example](#config-example) +- [Public methods](#public-methods) ## Install diff --git a/package.json b/package.json index def03b7..d3a5a32 100644 --- a/package.json +++ b/package.json @@ -24,11 +24,11 @@ "node": ">=16.20.1" }, "scripts": { - "vitest": "vitest run --config test/vitest.config.js", + "vitest": "vitest run --config test/vitest.config.ts", "build": "rollup -c", "vitest:unit": "yarn vitest unit/", "vitest:feature": "yarn vitest feature/", - "lint": "eslint . && echo 'npm run lint: OK'", + "lint": "eslint ./src ./test && echo 'npm run lint: OK'", "lint:fix": "eslint . --fix", "format": "prettier -w .", "test": "npm run lint --silent && echo 'npm test: OK'" @@ -36,27 +36,26 @@ "type": "module", "dependencies": { "@techteamer/cert-utils": "^1.1.3", - "node-fetch": "^2.7.0", + "@types/node-fetch": "^3", + "node-fetch": "^3", "proxy-agent": "^6.5.0", "tmp": "^0.2.1" }, "devDependencies": { "@rollup/plugin-typescript": "^12.1.4", "@types/node": "^20.14.6", + "@types/tmp": "^0.2.6", "@typescript-eslint/eslint-plugin": "^7.16.0", "@typescript-eslint/parser": "^7.13.1", "@vitest/coverage-v8": "^2.0.2", "eslint": "^8.19.0", "eslint-config-prettier": "^10.1.8", "eslint-config-standard": "^17.0.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-n": "^16.3.1", - "eslint-plugin-promise": "^6.0.0", "nock": "^13.5.4", "prettier": "^3.6.2", "rollup": "^4.18.0", "rollup-plugin-esbuild": "^6.1.1", - "typescript": "^5.5.3", + "typescript": "~5.5", "vitest": "^2.0.2" }, "resolutions": { diff --git a/rollup.config.js b/rollup.config.js index 2ab8770..df19542 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -5,6 +5,7 @@ const name = './build/timestamp_config' const bundle = config => ({ ...config, input: 'src/index.ts', + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type external: id => !/^[./]/.test(id) }) diff --git a/src/index.ts b/src/index.ts index e805f9c..9824006 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,3 @@ -export * from './trustedTimestamp/TrustedTimestampService.js' +export * from './trustedTimestamp/TrustedTimestampService' -export * from './trustedTimestamp/error/create-timestamp-token.error.js' +export * from './trustedTimestamp/error/create-timestamp-token.error' diff --git a/src/trustedTimestamp/TimestampRequest.js b/src/trustedTimestamp/TimestampRequest.js deleted file mode 100644 index a96a598..0000000 --- a/src/trustedTimestamp/TimestampRequest.js +++ /dev/null @@ -1,235 +0,0 @@ -import fetch from 'node-fetch' -import fs from 'node:fs' -import { ProxyAgent } from 'proxy-agent' - -/** - * TimestampRequest class implements timestamp request - * - * @class TimestampRequest - * */ -class TimestampRequest { - /** - * @constructor - * @param tempFileService - * @param cleanupTempFns - * @param {object} tmpOptions - */ - constructor (tempFileService, tmpOptions, cleanupTempFns) { - this.tempFileService = tempFileService - this.tmpOptions = tmpOptions - this.cleanupTempFns = cleanupTempFns - this.tsRequest = { - method: 'POST', - headers: { - 'Content-Type': 'application/timestamp-query' - } - } - } - - /** - * set request header - * @param {object} headers - * */ - setHeader (headers) { - this.tsRequest = { - ...this.tsRequest, - headers - } - } - - /** - * set request body - * @param {object} body - * */ - setBody (body) { - this.tsRequest.body = body - } - - /** - * set request proxy - * @param {string} proxyUrl - * */ - setProxy (proxyUrl) { - this.tsRequest.agent = new ProxyAgent(proxyUrl) - } - - /** - * set request encoding - * @param {string} encoding - * */ - setEncoding (encoding) { - this.tsRequest.encoding = encoding - } - - /** - * set request encoding - * @param {boolean} resolveWithFullResponse - * */ - setResolveWithFullResponse (resolveWithFullResponse) { - this.tsRequest.resolveWithFullResponse = resolveWithFullResponse - } - - /** - * return tsRequest - * @return {object} - * */ - get () { - return this.tsRequest - } - - /** - * authStrategy method that set no auth request - * @param requestType - * @param {object | string} url - * @param {object} [auth] - * @param {object} [body] - * @param {string} [proxy] - * @param {string} tsQuery - * @return {object} - * */ - async authStrategy (requestType, url, auth, body, proxy, tsQuery) { - switch (requestType) { - case 'basic': - return this._getTimestampRequestBasic(url, auth, tsQuery) - case 'oauth': - return await this._getTimestampRequestOauth(url, auth, body, proxy, tsQuery) - case 'noAuth': - return this._getTimestampRequestNoAuth(url, tsQuery) - default: - return this._getTimestampRequestNoAuth(url, tsQuery) - } - } - - /** - * _getTimestampRequestBasic method that set basic auth request - * @param {object | string} url - * @param {object} [auth] - * @param {string} tsQuery - * @return {object} - * @Private - * */ - _getTimestampRequestBasic (url, auth, tsQuery) { - this.setHeader({ - ...this.tsRequest.headers, - Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}` - }) - - this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily - this.setResolveWithFullResponse(true) - this.setBody(tsQuery) - - return { requestUrl: url, tsRequest: this.get() } - } - - /** - * _getTimestampRequestOauth method that set oauth request - * @param {object | string} url - * @param {object} [auth] - * @param {object} [body] - * @param {string} [proxy] - * @param {string} tsQuery - * @return {object} - * @Private - * */ - async _getTimestampRequestOauth (url, auth, body, proxy, tsQuery) { - const oauthResult = await this._getOauth(url.getTokenUrl, auth, body, proxy) - if (!oauthResult?.access_token) { - return { requestUrl: null, tsRequest: null, error: null } - } - - if (oauthResult?.error) { - return { requestUrl: null, tsRequest: null, error: oauthResult?.error } - } - - const accessToken = oauthResult?.access_token - - if (accessToken) { - this.setHeader({ - ...this.tsRequest.headers, - Authorization: `Bearer ${accessToken}` - }) - - const { - tempPath, - cleanupCallback - } = await this.tempFileService.createTempFile(this.tmpOptions, Buffer.from(tsQuery)) - this.cleanupTempFns.push(cleanupCallback) - - const stats = fs.statSync(tempPath) - const fileSizeInBytes = stats.size - this.setBody(fs.createReadStream(tempPath)) - this.setHeader({ - ...this.tsRequest.headers, - 'Content-length': fileSizeInBytes - }) - } - - return { requestUrl: url?.getTimestampUrl, tsRequest: this.get(), error: null } - } - - /** - * _getTimestampRequestNoAuth method that set no auth request - * @param {string} url - * @return {object} - * @Private - * */ - _getTimestampRequestNoAuth (url, tsQuery) { - this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily - this.setResolveWithFullResponse(true) - this.setBody(tsQuery) - - return { requestUrl: url, tsRequest: this.get() } - } - - /** - * _getOauth method that get oauth access_token - * - * @param {string} url - * @param {object} auth - * @param {object} body - * @param {string} [proxy] - * @return {Promise} - * @Private - **/ - async _getOauth (url, auth, body, proxy) { - const tsRequest = await this._getOauthRequestSettings(auth, body, proxy) - return await fetch(url, tsRequest).then((response) => { - return response.json() - }).catch((err) => { - return { - message: err.message, - trace: err - } - }) - } - - /** - * _getOauthRequestSettings method that set the request oath settings - * - * @param {object} auth - * @param {object} body - * @param {string} [proxy] - * @return {object} - * @Private - **/ - async _getOauthRequestSettings (auth, body, proxy) { - const tsRequest = { - method: 'POST' - } - - tsRequest.headers = { - 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}` - } - - tsRequest.body = new URLSearchParams(body) - - if (proxy && proxy?.url) { - tsRequest.agent = new ProxyAgent(proxy.url) - } - - return tsRequest - } -} - -export default TimestampRequest diff --git a/src/trustedTimestamp/TimestampRequest.ts b/src/trustedTimestamp/TimestampRequest.ts new file mode 100644 index 0000000..dbc3c5f --- /dev/null +++ b/src/trustedTimestamp/TimestampRequest.ts @@ -0,0 +1,231 @@ +import fetch, { BodyInit } from 'node-fetch' +import fs from 'node:fs' +import { ProxyAgent } from 'proxy-agent' +import type { FileOptions } from 'tmp' + +import type { + TimestampRequestAuthResult, + TimestampRequestAuthTypes, + TimestampRequestError, + TimestampRequestOptions +} from './types/timestamp-request.type' +import type { + TimestampProviderAuth, + TimestampProviderBody, + TimestampProviderOAuthUrl, + TimestampProviderProxyConfig, + TimestampProviderUrl +} from './types/timestamp-provider.type' +import type { TempFileService } from '../util/TempFileService' + +/** + * TimestampRequest class implements timestamp request + * */ +export class TimestampRequest { + private tsRequest: TimestampRequestOptions = { + method: 'POST', + headers: { + 'Content-Type': 'application/timestamp-query' + } + } + + constructor( + private readonly tempFileService: TempFileService, + private readonly tmpOptions: FileOptions, + private readonly cleanupTempFns: ((...args: unknown[]) => unknown)[] + ) {} + + /** + * set request header + * */ + setHeader(headers: Record): void { + this.tsRequest = { + ...this.tsRequest, + ...headers + } + } + + /** + * set request body + * */ + setBody(body: BodyInit): void { + this.tsRequest.body = body + } + + /** + * set request proxy + * */ + setProxy(proxyUrl: string): void { + this.tsRequest.agent = new ProxyAgent({ getProxyForUrl: (): string => proxyUrl }) + } + + /** + * set request encoding + * */ + setEncoding(encoding: string | null): void { + this.tsRequest.encoding = encoding + } + + /** + * set request encoding + * */ + setResolveWithFullResponse(resolveWithFullResponse: boolean): void { + this.tsRequest.resolveWithFullResponse = resolveWithFullResponse + } + + /** + * return tsRequest + * */ + get(): TimestampRequestOptions { + return this.tsRequest + } + + /** + * authStrategy method that set no auth request + * */ + async authStrategy( + requestType: TimestampRequestAuthTypes | undefined, + url: TimestampProviderUrl, + auth: TimestampProviderAuth | undefined, + body: TimestampProviderBody | undefined, + proxy: TimestampProviderProxyConfig | undefined, + tsQuery: string + ): Promise { + switch (requestType) { + case 'basic': + return this._getTimestampRequestBasic(url as string, auth!, tsQuery) + case 'oauth': + return await this._getTimestampRequestOauth(url as TimestampProviderOAuthUrl, auth!, body, proxy, tsQuery) + case 'noAuth': + return this._getTimestampRequestNoAuth(url as string, tsQuery) + default: + return this._getTimestampRequestNoAuth(url as string, tsQuery) + } + } + + /** + * _getTimestampRequestBasic method that set basic auth request + * */ + private _getTimestampRequestBasic( + url: string, + auth: TimestampProviderAuth, + tsQuery: string + ): TimestampRequestAuthResult { + this.setHeader({ + ...this.tsRequest.headers, + Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}` + }) + + this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily + this.setResolveWithFullResponse(true) + this.setBody(tsQuery) + + return { requestUrl: url, tsRequest: this.get() } + } + + /** + * _getTimestampRequestOauth method that set oauth request + * */ + private async _getTimestampRequestOauth( + url: TimestampProviderOAuthUrl, + auth: TimestampProviderAuth, + body: TimestampProviderBody | undefined, + proxy: TimestampProviderProxyConfig | undefined, + tsQuery: string + ): Promise { + const oauthResult = await this._getOauth<{ + access_token?: string + error?: TimestampRequestError + }>(url.getTokenUrl, auth, body, proxy) + if (!oauthResult?.access_token) { + return { requestUrl: null, tsRequest: null, error: null } + } + + if (oauthResult?.error) { + return { requestUrl: null, tsRequest: null, error: oauthResult?.error } + } + + const accessToken = oauthResult?.access_token + + if (accessToken) { + this.setHeader({ + ...this.tsRequest.headers, + Authorization: `Bearer ${accessToken}` + }) + + const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile( + this.tmpOptions, + Buffer.from(tsQuery) + ) + this.cleanupTempFns.push(cleanupCallback) + + const stats = fs.statSync(tempPath) + const fileSizeInBytes = stats.size + this.setBody(fs.createReadStream(tempPath)) + this.setHeader({ + ...this.tsRequest.headers, + 'Content-length': fileSizeInBytes + }) + } + + return { requestUrl: url?.getTimestampUrl, tsRequest: this.get(), error: null } + } + + /** + * _getTimestampRequestNoAuth method that set no auth request + * */ + private _getTimestampRequestNoAuth(url: string, tsQuery: string): TimestampRequestAuthResult { + this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily + this.setResolveWithFullResponse(true) + this.setBody(tsQuery) + + return { requestUrl: url, tsRequest: this.get() } + } + + /** + * _getOauth method that get oauth access_token + **/ + private async _getOauth( + url: string, + auth: TimestampProviderAuth, + body: TimestampProviderBody | undefined, + proxy: TimestampProviderProxyConfig | undefined + ): Promise { + const tsRequest = await this._getOauthRequestSettings(auth, body, proxy) + try { + const response = await fetch(url, tsRequest) + return (await response.json()) as ResponseType + } catch (error) { + return { + error: { + message: (error as Error).message, + trace: error as Error + } + } as ResponseType + } + } + + /** + * _getOauthRequestSettings method that set the request oath settings + **/ + private async _getOauthRequestSettings( + auth: TimestampProviderAuth, + body: TimestampProviderBody | undefined, + proxy: TimestampProviderProxyConfig | undefined + ): Promise> { + const tsRequest: TimestampRequestOptions = { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}` + }, + body: new URLSearchParams(body) + } + + if (proxy?.url) { + tsRequest.agent = new ProxyAgent({ getProxyForUrl: (): string => proxy.url }) + } + + return tsRequest + } +} diff --git a/src/trustedTimestamp/TrustedTimestampCheck.js b/src/trustedTimestamp/TrustedTimestampCheck.js deleted file mode 100644 index 081d237..0000000 --- a/src/trustedTimestamp/TrustedTimestampCheck.js +++ /dev/null @@ -1,31 +0,0 @@ -const supportedDigestForamts = [ - 'sha', 'sha1', 'mdc2', 'ripemd160', 'sha224', 'sha256', 'sha384', 'sha512', 'md2', 'md4', 'md5', 'dss1' -] - -/** - * @param format - * @return {boolean} - */ -function checkDigestFormat (format) { - return supportedDigestForamts.includes(format) -} - -/** - * @param digest - * @return {boolean} - */ -function checkDigest (digest) { - return /^([0-9A-F])+$/i.test(digest) -} - -/** - * @param {string} format - * @return {string} - */ -function normalizeDigestFormat (format) { - return format - .replace(/^-/, '') // -sha256 - .replace(/-/g, '') // sha-256 -} - -export { checkDigestFormat, checkDigest, normalizeDigestFormat } diff --git a/src/trustedTimestamp/TrustedTimestampCheck.ts b/src/trustedTimestamp/TrustedTimestampCheck.ts new file mode 100644 index 0000000..e29d1ff --- /dev/null +++ b/src/trustedTimestamp/TrustedTimestampCheck.ts @@ -0,0 +1,28 @@ +const supportedDigestForamts = [ + 'sha', + 'sha1', + 'mdc2', + 'ripemd160', + 'sha224', + 'sha256', + 'sha384', + 'sha512', + 'md2', + 'md4', + 'md5', + 'dss1' +] + +export function checkDigestFormat(format: string): boolean { + return supportedDigestForamts.includes(format) +} + +export function checkDigest(digest: string): boolean { + return /^([0-9A-F])+$/i.test(digest) +} + +export function normalizeDigestFormat(format: string): string { + return format + .replace(/^-/, '') // -sha256 + .replace(/-/g, '') // sha-256 +} diff --git a/src/trustedTimestamp/TrustedTimestampCommand.js b/src/trustedTimestamp/TrustedTimestampCommand.ts similarity index 52% rename from src/trustedTimestamp/TrustedTimestampCommand.js rename to src/trustedTimestamp/TrustedTimestampCommand.ts index 3993627..68026a4 100644 --- a/src/trustedTimestamp/TrustedTimestampCommand.js +++ b/src/trustedTimestamp/TrustedTimestampCommand.ts @@ -1,85 +1,60 @@ -import { exec } from '../util/child_process_promise.js' +import { exec } from '../util/child_process_promise' -/** - * @param digest - * @param digestFormat - * @return {Promise} - */ -async function getTsQuery (digest, digestFormat) { +export async function getTsQuery(digest: string, digestFormat: string): Promise { // create a time stamp request based on the hash of a data file const queryCommand = `openssl ts -query -digest ${digest} -no_nonce -${digestFormat} -cert` - return await exec(queryCommand, { encoding: 'buffer' }).catch((err) => { + return await exec(queryCommand, { encoding: 'buffer' }).catch(err => { throw new Error(`Failed to execute openssl ts -query command "${queryCommand}" ${err.message}`) }) } -/** - * @param digest - * @param tempPath - * @param isToken - * @param certsLocation - * @return {Promise} - */ -function getTsVerify (digest, tempPath, isToken, certsLocation) { +export function getTsVerify( + digest: string, + tempPath: string, + isToken: boolean, + certsLocation: string +): Promise { // verify the response with openssl const verifyCommand = isToken ? `openssl ts -verify -digest ${digest} -token_in -in ${tempPath} -CApath ${certsLocation}` : `openssl ts -verify -digest ${digest} -in ${tempPath} -CApath ${certsLocation}` - return exec(verifyCommand).catch((err) => { + return exec(verifyCommand).catch(err => { throw new Error(`Failed to verify tsr "${verifyCommand}" ${err.message}`) }) } -/** - * @param inputTempPath - * @param isToken - * @return {Promise} - */ -async function getTsReply (inputTempPath, isToken) { +export async function getTsReply(inputTempPath: string, isToken: boolean): Promise { // get token info const replyCommand = isToken ? `openssl ts -reply -token_in -in ${inputTempPath} -text` : `openssl ts -reply -in ${inputTempPath} -text` - return await exec(replyCommand).catch((err) => { + return await exec(replyCommand).catch(err => { throw new Error(`Error executing openssl ts -reply command "${replyCommand}" ${err.message}`) }) } -/** - * @param inputTempPath - * @param tmp - * @return {Promise} - */ -async function generateTsReply (inputTempPath, tmp) { - await exec(`openssl ts -reply -in "${inputTempPath}" -token_out -out "${tmp.tempPath}"`).catch((err) => { +export async function generateTsReply(inputTempPath: string, tempPath: string): Promise { + await exec(`openssl ts -reply -in "${inputTempPath}" -token_out -out "${tempPath}"`).catch(err => { throw new Error(`Error executing openssl ts -reply command "${inputTempPath}" ${err.message}`) }) } -/** - * @param tstPath - * @return {Promise} - */ -async function extractCertFromToken (tstPath) { - return await exec(`openssl pkcs7 -inform der -in "${tstPath}" -print_certs`).catch((err) => { +export async function extractCertFromToken(tstPath: string): Promise { + return await exec(`openssl pkcs7 -inform der -in "${tstPath}" -print_certs`).catch(err => { throw new Error(`Error executing openssl pkcs7 command ${err.message}`) }) } -/** - * @return {Promise} - */ -async function checkSslPath () { - return await exec('which openssl').catch((err) => { - throw new Error(`Unable to verify openssl installation ${err.message}`) - }).then((stdout) => { +export async function checkSslPath(): Promise { + try { + const stdout = await exec('which openssl') if (!stdout.toString()) { throw new Error('openssl is unavailable') } return stdout - }) + } catch (error) { + throw new Error(`Unable to verify openssl installation ${(error as Error).message}`) + } } - -export { getTsQuery, getTsVerify, getTsReply, generateTsReply, extractCertFromToken, checkSslPath } diff --git a/src/trustedTimestamp/TrustedTimestampInfo.js b/src/trustedTimestamp/TrustedTimestampInfo.js deleted file mode 100644 index a30255b..0000000 --- a/src/trustedTimestamp/TrustedTimestampInfo.js +++ /dev/null @@ -1,153 +0,0 @@ -import { parseRegex } from '../util/regexParser.js' -/** - * @class TimestampInfo - * @property {Number} version - * @property {String} policyOID - * @property {String} hashAlgorithm - * @property {String} hash - * @property {String} serialNumber - * @property {String} timeStamp - * @property {Date} timeStampDate - * @property {Number} accuracy - * @property {Boolean} ordering - * @property {String} nonce - * @property {String} issuer - * @property {Object} tsa - * @property {String} tsa.C - * @property {String} tsa.L - * @property {String} tsa.O - * @property {String} tsa.OU - * @property {String} tsa.CN - * @property {String|null} [error] - * @property {CertInfo|null} [certInfo] - * - * Status info: - * Status: Granted. - * Status description: unspecified - * Failure info: unspecified - * - * TST info: - * Version: 1 - * Policy OID: 1.3.6.1.4.1.21528.2.2.99 - * Hash Algorithm: sha256 - * Message data: - * 0000 - c5 3e 94 56 aa 61 ed 56-49 69 74 29 1e 01 d7 2a .>.V.a.VIit)...* - * 0010 - 64 cc 24 84 d2 a2 31 4d-33 b6 ca c8 98 23 03 b9 d.$...1M3....#.. - * Serial number: 0x0308441E - * Time stamp: Jan 30 13:45:20 2018 GMT - * Accuracy: 0x01 seconds, unspecified millis, unspecified micros - * Ordering: no - * Nonce: unspecified - * TSA: DirName:/C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=e-Szigno Test TSA2 - * Extensions: - * */ -class TimestampInfo { - /** - * @constructor - * @param {string} timestampInfoType (normal, short) - * @param {string} tsText - * @param {string} error - */ - constructor (timestampInfoType = 'normal', tsText, error = null) { - this.error = null - this.version = null - this.policyOID = null - this.hashAlgorithm = null - this.serialNumber = null - this.timeStamp = null - this.accuracy = null - this.ordering = null - this.nonce = null - this.tsa = null - - if (error) { - this.error = error - } else { - if (timestampInfoType === 'short') { - this.parseOpensslOutputShort(tsText) - } else { - this.hash = null - this.timeStampDate = null - this.issuer = null - this.certInfo = null - this.parseOpensslOutput(tsText) - } - } - } - - /** - * @param {CertInfo} certInfo - */ - setCertInfo (certInfo) { - this.certInfo = certInfo - } - - /** - * @param {string} tsText - */ - parseOpensslOutput (tsText) { - this.version = parseRegex(tsText, /Version:\s*([^\n\r]+)/, 1, parseInt) - this.policyOID = parseRegex(tsText, /Policy OID:\s*([^\n\r]+)/, 1) - this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\s*([^\n\r]+)/, 1) - this.hash = tsText.match(/\d{4} - .*?\s{2}/g).map(line => { - return line.replace(/\d{4} - /g, '').replace(/[\s*-]/g, '') - }).join('') - this.serialNumber = parseRegex(tsText, /Serial number:\s*([^\n\r]+)/, 1) - this.timeStamp = parseRegex(tsText, /Time stamp:\s*([^\n\r]+)/, 1) - this.timeStampDate = new Date(this.timeStamp) - this.accuracy = parseRegex(tsText, /Accuracy:\s*(.+) seconds, (.+) millis, (.+) micros/, ['s', 'm', 'u'], ({ s, m, u }) => { - s = Number(s === 'unspecified' ? 0 : s) - m = Number(m === 'unspecified' ? 0 : m) - u = Number(u === 'unspecified' ? 0 : u) - return s * 1000 + m + u / 1000 - }) - this.ordering = parseRegex(tsText, /Ordering:\s*([^\n\r]+)/, 1, ordering => ordering !== 'no') - this.nonce = parseRegex(tsText, /Nonce:\s*([^\n\r]+)/, 1, nonce => nonce === 'unspecified' ? null : nonce) - this.issuer = parseRegex(tsText, /TSA:\s*DirName:\s*([^\n\r]+)/, 1) - this.tsa = parseRegex(tsText, /TSA:\s*DirName:\s*([^\n\r]+)/, 1, (result) => { - const m = result.match(/\/\w{1,2}=[^/]+/g) || [] - - return m.reduce((obj, part) => { - const [, label, value] = part.match(/\/(\w{1,2})=([^/]+)/) || [] - if (!label || !value) { - return obj - } - obj[label] = value - return obj - }, { C: null, L: null, O: null, OU: null, CN: null }) - }) - } - - /** - * @param {string} tsText - */ - parseOpensslOutputShort (tsText) { - this.version = parseRegex(tsText, /Version:\s*([^\n\r]+)/, 1, parseInt) - this.policyOID = parseRegex(tsText, /Policy OID:\s*([^\n\r]+)/, 1) - this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\s*([^\n\r]+)/, 1) - this.serialNumber = parseRegex(tsText, /Serial number:\s*([^\n\r]+)/, 1) - this.timeStamp = parseRegex(tsText, /Time stamp:\s*([^\n\r]+)/, 1, dateString => new Date(dateString)) - this.accuracy = parseRegex(tsText, /Accuracy:\s*(.+) seconds, (.+) millis, (.+) micros/, ['s', 'm', 'u'], ({ s, m, u }) => { - s = Number(s === 'unspecified' ? 0 : s) - m = Number(m === 'unspecified' ? 0 : m) - u = Number(u === 'unspecified' ? 0 : u) - return s * 1000 + m + u / 1000 - }) - this.ordering = parseRegex(tsText, /Ordering:\s*([^\n\r]+)/, 1, ordering => ordering !== 'no') - this.nonce = parseRegex(tsText, /Nonce:\s*([^\n\r]+)/, 1, nonce => nonce === 'unspecified' ? null : nonce) - this.tsa = parseRegex(tsText, /TSA:\s*([^\n\r]+)/, 1, (v) => { - const m = v.match(/\/\w{1,2}=[^/]+/g) || [] - - return m.reduce((obj, part) => { - const [, label, value] = part.match(/\/(\w{1,2})=([^/]+)/) || [] - if (!label || !value) { - return obj - } - obj[label] = value - return obj - }, { C: null, L: null, O: null, OU: null, CN: null }) - }) - } -} - -export default TimestampInfo diff --git a/src/trustedTimestamp/TrustedTimestampInfo.ts b/src/trustedTimestamp/TrustedTimestampInfo.ts new file mode 100644 index 0000000..c09448c --- /dev/null +++ b/src/trustedTimestamp/TrustedTimestampInfo.ts @@ -0,0 +1,160 @@ +import { CertService } from '@techteamer/cert-utils' +import { parseRegex } from '../util/regexParser' + +interface TSA { + C: string | null + L: string | null + O: string | null + OU: string | null + CN: string | null +} + +/** + * + * Status info: + * Status: Granted. + * Status description: unspecified + * Failure info: unspecified + * + * TST info: + * Version: 1 + * Policy OID: 1.3.6.1.4.1.21528.2.2.99 + * Hash Algorithm: sha256 + * Message data: + * 0000 - c5 3e 94 56 aa 61 ed 56-49 69 74 29 1e 01 d7 2a .>.V.a.VIit)...* + * 0010 - 64 cc 24 84 d2 a2 31 4d-33 b6 ca c8 98 23 03 b9 d.$...1M3....#.. + * Serial number: 0x0308441E + * Time stamp: Jan 30 13:45:20 2018 GMT + * Accuracy: 0x01 seconds, unspecified millis, unspecified micros + * Ordering: no + * Nonce: unspecified + * TSA: DirName:/C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=e-Szigno Test TSA2 + * Extensions: + * */ +export class TimestampInfo { + error: string | null = null + version: number | null = null + policyOID: string | null = null + hashAlgorithm: string | null = null + hash: string | null = null + serialNumber: string | null = null + timeStamp: Date | null = null + timeStampDate: Date | null = null + accuracy: number | null = null + ordering: boolean | null = null + nonce: string | null = null + issuer: string | null = null + tsa: TSA | null = null + certInfo: CertService['CertInfo'] | null = null + + constructor(timestampInfoType: 'normal' | 'short' = 'normal', tsText: string, error: string | null = null) { + this.error = null + this.version = null + this.policyOID = null + this.hashAlgorithm = null + this.serialNumber = null + this.timeStamp = null + this.accuracy = null + this.ordering = null + this.nonce = null + this.tsa = null + + if (error) { + this.error = error + } else { + if (timestampInfoType === 'short') { + this.parseOpensslOutputShort(tsText) + } else { + this.hash = null + this.timeStampDate = null + this.issuer = null + this.certInfo = null + this.parseOpensslOutput(tsText) + } + } + } + + setCertInfo(certInfo: CertService['CertInfo'] | null): void { + this.certInfo = certInfo + } + + parseOpensslOutput(tsText: string): void { + this.version = parseRegex(tsText, /Version:\s*([^\n\r]+)/, 1, parseInt)! + this.policyOID = parseRegex(tsText, /Policy OID:\s*([^\n\r]+)/, 1)! + this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\s*([^\n\r]+)/, 1)! + this.hash = tsText + .match(/\d{4} - .*?\s{2}/g)! + .map(line => { + return line.replace(/\d{4} - /g, '').replace(/[\s*-]/g, '') + }) + .join('') + this.serialNumber = parseRegex(tsText, /Serial number:\s*([^\n\r]+)/, 1)! + this.timeStamp = parseRegex(tsText, /Time stamp:\s*([^\n\r]+)/, 1)! + this.timeStampDate = new Date(this.timeStamp) + this.accuracy = parseRegex( + tsText, + /Accuracy:\s*(.+) seconds, (.+) millis, (.+) micros/, + ['s', 'm', 'u'], + ({ s, m, u }) => { + const _s = Number(s === 'unspecified' ? 0 : s) + const _m = Number(m === 'unspecified' ? 0 : m) + const _u = Number(u === 'unspecified' ? 0 : u) + return _s * 1000 + _m + _u / 1000 + } + )! + this.ordering = parseRegex(tsText, /Ordering:\s*([^\n\r]+)/, 1, ordering => ordering !== 'no')! + this.nonce = parseRegex(tsText, /Nonce:\s*([^\n\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))! + this.issuer = parseRegex(tsText, /TSA:\s*DirName:\s*([^\n\r]+)/, 1)! + this.tsa = parseRegex(tsText, /TSA:\s*DirName:\s*([^\n\r]+)/, 1, (result): TSA => { + const m = result.match(/\/\w{1,2}=[^/]+/g) || [] + + return m.reduce( + (obj, part) => { + const [, label, value] = part.match(/\/(\w{1,2})=([^/]+)/) || [] + if (!label || !value) { + return obj + } + obj[label as keyof TSA] = value + return obj + }, + { C: null, L: null, O: null, OU: null, CN: null } as TSA + ) + })! + } + + parseOpensslOutputShort(tsText: string): void { + this.version = parseRegex(tsText, /Version:\s*([^\n\r]+)/, 1, parseInt)! + this.policyOID = parseRegex(tsText, /Policy OID:\s*([^\n\r]+)/, 1)! + this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\s*([^\n\r]+)/, 1)! + this.serialNumber = parseRegex(tsText, /Serial number:\s*([^\n\r]+)/, 1)! + this.timeStamp = parseRegex(tsText, /Time stamp:\s*([^\n\r]+)/, 1, dateString => new Date(dateString))! + this.accuracy = parseRegex( + tsText, + /Accuracy:\s*(.+) seconds, (.+) millis, (.+) micros/, + ['s', 'm', 'u'], + ({ s, m, u }) => { + const _s = Number(s === 'unspecified' ? 0 : s) + const _m = Number(m === 'unspecified' ? 0 : m) + const _u = Number(u === 'unspecified' ? 0 : u) + return _s * 1000 + _m + _u / 1000 + } + )! + this.ordering = parseRegex(tsText, /Ordering:\s*([^\n\r]+)/, 1, ordering => ordering !== 'no')! + this.nonce = parseRegex(tsText, /Nonce:\s*([^\n\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))! + this.tsa = parseRegex(tsText, /TSA:\s*([^\n\r]+)/, 1, v => { + const m = v.match(/\/\w{1,2}=[^/]+/g) || [] + + return m.reduce( + (obj, part) => { + const [, label, value] = part.match(/\/(\w{1,2})=([^/]+)/) || [] + if (!label || !value) { + return obj + } + obj[label as keyof TSA] = value + return obj + }, + { C: null, L: null, O: null, OU: null, CN: null } as TSA + ) + })! + } +} diff --git a/src/trustedTimestamp/TrustedTimestampRequest.js b/src/trustedTimestamp/TrustedTimestampRequest.js deleted file mode 100644 index 43c120a..0000000 --- a/src/trustedTimestamp/TrustedTimestampRequest.js +++ /dev/null @@ -1,196 +0,0 @@ -import fetch from 'node-fetch' -import TimestampRequest from './TimestampRequest.js' - -/** -* TrustedTimestampRequest service implements timestamp request and sorted providers -* -* @class TrustedTimestampRequest -* */ -class TrustedTimestampRequest { - /** - * @typedef {object} provider - * @property {string} name provider name - * @property {string | urlObject} url provider url - * @property {object} [auth] optional auth setting - * @property {number} [priority] optional provider priority - * - * @typedef {object} urlObject - * @property {string} getTokenUrl - * @property {string} getTimestampUrl - * - * @typedef {object} auth - * @property {string} user username - * @property {string} pass password - * - * @constructor - * @param {provider[]} providers - * @param tempFileService - * @param {object} tmpOptions - */ - constructor (providers, tempFileService, tmpOptions) { - this.tempFileService = tempFileService - this.tmpOptions = tmpOptions - this.cleanupTempFns = [] - this.providers = this._sortedProviders(providers) - } - - /** - * getTimestamp method that calls the service providers in sequence, requesting a timestamp - * - * @typedef {returnObject} result - * @property {Buffer} tsr - * @property {string} providerName - * @property {array} logHistory - * - * @param {string} tsQuery - * @return {returnObject} - **/ - async getTimestamp (tsQuery) { - let tsr = null - let providerName = '' - const logHistory = [] - - for (const provider of this.providers) { - if (!tsr) { - const { name, url, auth, body, proxy } = provider - - if (!name) { - throw new Error('Provider name is missing') - } - if (!url) { - throw new Error('Provider url is missing') - } - - const { timestampToken, log } = await this._getTimeStampToken(name, url, auth, body, proxy, tsQuery) - logHistory.push(log) - tsr = timestampToken - providerName = name - } - } - - return { tsr, providerName, logHistory } - } - - /** - * sortedProviders method that sorting the providers according to priority - * - * @return array - * @Private - **/ - _sortedProviders (providers) { - const priorityProviders = [] - const nonPriorityProviders = [] - - providers.forEach((provider) => { - if (provider?.priority) { - priorityProviders.push(provider) - } else { - nonPriorityProviders.push(provider) - } - }) - - const sortedProviders = priorityProviders.sort((a, b) => a.priority - b.priority) - - return sortedProviders.concat(nonPriorityProviders) - } - - /** - * @typedef {object} urlObject - * @property {string} getTokenUrl - * @property {string} getTimestampUrl - * - * @typedef {object} returnObject - * @property {Promise} timestampToken - * @property {logObject} log - * - * @typedef {object} logObject - * @property {infoObject} info - * @property {object} errorTrace - * - * @typedef {object} infoObject - * @property {string} name - * @property {string} info - * @property {string} date - * @property {urlObject} url - * @property {string} response - * @property {string} error - **/ - - /** - * sendTimestampRequest method that calls the provider - * - * @param {string} name - provider name - * @param {string| urlObject} url - * @param {string} [auth] - * @param {string} [proxy] - * @param {string} [body] - * @param {string} tsQuery - * @return {returnObject} - * @Private - **/ - async _getTimeStampToken (name, url, auth, body, proxy, tsQuery) { - const { requestUrl, tsRequest, error } = await this._getTimestampRequest(url, body, auth, proxy, tsQuery) - if (error) { - return { timestampToken: null, log: { info: { name, info: null, date: new Date(), url, response: null, error: error?.message }, errorTrace: error?.trace } } - } - return await fetch(requestUrl, tsRequest).then(async (response) => { - if (response.status !== 200) { - throw new Error(`TSA response unsatisfactory: ${response.status} ${response.statusText}`) - } - - return { timestampToken: Buffer.from(await response.arrayBuffer(), 'utf8'), log: { info: { name, date: new Date(), url, response: `${response.status}, ${response.statusText}`, error: null }, errorTrace: null } } - }).catch((err) => { - return { timestampToken: null, log: { info: { name, date: new Date(), url, reponse: null, error: err.message }, errorTrace: err } } - }).finally(() => { - for (const cleanUpFn of this.cleanupTempFns) { - if (typeof cleanUpFn === 'function') { - cleanUpFn() - } - } - }) - } - - /** - * @typedef {object} resultObject - * @property {string} requestUrl - * @property {string} tsRequest - * @property {string} error - * - **/ - - /** - * getTimestampRequestSettings method that set the request settings - * - * @param {object | string} url - * @param {string} [body] - * @param {string} [auth] - * @param {string} [proxy] - * @param {string} [body] - * @param {string} tsQuery - * @return {resultObject} - * @Private - **/ - async _getTimestampRequest (url, body, auth, proxy, tsQuery) { - // send the request to the TSA - const tsRequest = new TimestampRequest(this.tempFileService, this.tmpOptions, this.cleanupTempFns) - - if (proxy && proxy?.url) { - tsRequest.setProxy(proxy.url) - } - - let requestType - if (url?.getTokenUrl && tsQuery) { - requestType = 'oauth' - } - if (!url?.getTokenUrl && auth?.user && auth?.pass && tsQuery) { - requestType = 'basic' - } - if (!url?.getTokenUrl && !auth?.user) { - requestType = 'noAuth' - } - - return await tsRequest.authStrategy(requestType, url, auth, body, proxy, tsQuery) - } -} - -export default TrustedTimestampRequest diff --git a/src/trustedTimestamp/TrustedTimestampRequest.ts b/src/trustedTimestamp/TrustedTimestampRequest.ts new file mode 100644 index 0000000..681fe84 --- /dev/null +++ b/src/trustedTimestamp/TrustedTimestampRequest.ts @@ -0,0 +1,167 @@ +import fetch from 'node-fetch' +import { FileOptions as TempFileOptions } from 'tmp' + +import { TimestampRequest } from './TimestampRequest' +import { TempFileService } from '../util/TempFileService' +import type { TimestampRequestAuthResult, TimestampRequestAuthTypes } from './types/timestamp-request.type' +import type { + TimestampProvider, + TimestampProviderAuth, + TimestampProviderBody, + TimestampProviderOAuthUrl, + TimestampProviderProxyConfig, + TimestampProviderUrl +} from './types/timestamp-provider.type' +import type { TimestampLog } from './types/timestamp-log.type' + +/** + * TrustedTimestampRequest service implements timestamp request and sorted providers + * */ +export class TrustedTimestampRequest { + private readonly cleanupTempFns: (() => unknown)[] = [] + private readonly providers: TimestampProvider[] + + constructor( + providers: TimestampProvider[], + private readonly tempFileService: TempFileService, + private readonly tmpOptions: TempFileOptions + ) { + this.providers = this._sortedProviders(providers) + } + + /** + * getTimestamp method that calls the service providers in sequence, requesting a timestamp + **/ + async getTimestamp( + tsQuery: string + ): Promise<{ tsr: Buffer | null; providerName: string; logHistory: TimestampLog[] }> { + let tsr = null + let providerName = '' + const logHistory: TimestampLog[] = [] + + for (const provider of this.providers) { + if (!tsr) { + const { name, url, auth, body, proxy } = provider + + if (!name) { + throw new Error('Provider name is missing') + } + if (!url) { + throw new Error('Provider url is missing') + } + + const { timestampToken, log } = await this._getTimeStampToken(name, url, auth, body, proxy, tsQuery) + logHistory.push(log) + tsr = timestampToken + providerName = name + } + } + + return { tsr, providerName, logHistory } + } + + /** + * sortedProviders method that sorting the providers according to priority + **/ + private _sortedProviders(providers: TimestampProvider[]): TimestampProvider[] { + const priorityProviders: TimestampProvider[] = [] + const nonPriorityProviders: TimestampProvider[] = [] + + providers.forEach(provider => { + if (provider?.priority) { + priorityProviders.push(provider) + } else { + nonPriorityProviders.push(provider) + } + }) + + const sortedProviders = priorityProviders.toSorted((a, b) => a.priority! - b.priority!) + + return sortedProviders.concat(nonPriorityProviders) + } + + /** + * sendTimestampRequest method that calls the provider + **/ + private async _getTimeStampToken( + name: string, + url: TimestampProviderUrl, + auth: TimestampProviderAuth | undefined, + body: TimestampProviderBody | undefined, + proxy: TimestampProviderProxyConfig | undefined, + tsQuery: string + ): Promise<{ + timestampToken: null | Buffer + log: TimestampLog + }> { + const { requestUrl, tsRequest, error } = await this._getTimestampRequest(url, body, auth, proxy, tsQuery) + if (error) { + return { + timestampToken: null, + log: { + info: { name, info: null, date: new Date(), url, response: null, error: error?.message }, + errorTrace: error?.trace + } + } + } + try { + const response = await fetch(requestUrl!, tsRequest!) + if (response.status !== 200) { + throw new Error(`TSA response unsatisfactory: ${response.status} ${response.statusText}`) + } + + return { + timestampToken: Buffer.from((await response.arrayBuffer()) as unknown as string, 'utf8'), // TODO: fix type + log: { + info: { name, date: new Date(), url, response: `${response.status}, ${response.statusText}`, error: null }, + errorTrace: null + } + } + } catch (error) { + return { + timestampToken: null, + log: { + info: { name, date: new Date(), url, response: null, error: (error as Error).message }, + errorTrace: error as Error + } + } + } finally { + for (const cleanUpFn of this.cleanupTempFns) { + if (typeof cleanUpFn === 'function') { + cleanUpFn() + } + } + } + } + + /** + * getTimestampRequestSettings method that set the request settings + **/ + private async _getTimestampRequest( + url: TimestampProviderUrl, + body: TimestampProviderBody | undefined, + auth: TimestampProviderAuth | undefined, + proxy: TimestampProviderProxyConfig | undefined, + tsQuery: string + ): Promise { + // send the request to the TSA + const tsRequest = new TimestampRequest(this.tempFileService, this.tmpOptions, this.cleanupTempFns) + + if (proxy?.url) { + tsRequest.setProxy(proxy.url) + } + + let requestType: TimestampRequestAuthTypes | undefined + if ((url as TimestampProviderOAuthUrl)?.getTokenUrl && tsQuery) { + requestType = 'oauth' + } + if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && auth?.user && auth?.pass && tsQuery) { + requestType = 'basic' + } + if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && !auth?.user) { + requestType = 'noAuth' + } + + return await tsRequest.authStrategy(requestType, url, auth, body, proxy, tsQuery) + } +} diff --git a/src/trustedTimestamp/TrustedTimestampService.js b/src/trustedTimestamp/TrustedTimestampService.ts similarity index 67% rename from src/trustedTimestamp/TrustedTimestampService.js rename to src/trustedTimestamp/TrustedTimestampService.ts index f0b3f97..0760fac 100644 --- a/src/trustedTimestamp/TrustedTimestampService.js +++ b/src/trustedTimestamp/TrustedTimestampService.ts @@ -1,5 +1,8 @@ -import TimestampInfo from './TrustedTimestampInfo.js' -import TrustedTimestampRequest from './TrustedTimestampRequest.js' +import { CertService } from '@techteamer/cert-utils' +import { FileOptions as TempFileOptions } from 'tmp' + +import { TimestampInfo } from './TrustedTimestampInfo' +import { TrustedTimestampRequest } from './TrustedTimestampRequest' import { checkSslPath, extractCertFromToken, @@ -7,15 +10,13 @@ import { getTsQuery, getTsReply, getTsVerify -} from './TrustedTimestampCommand.js' -import { checkDigest, checkDigestFormat, normalizeDigestFormat } from './TrustedTimestampCheck.js' -import TempFileService from '../util/TempFileService.js' -import { CreateTimestampTokenError } from './error/create-timestamp-token.error.ts' -import { CertService } from '@techteamer/cert-utils' - -/** - * @typedef {import('./types/timestamp-token.type').CreatedTimestampToken} CreatedTimestampToken - */ +} from './TrustedTimestampCommand' +import { checkDigest, checkDigestFormat, normalizeDigestFormat } from './TrustedTimestampCheck' +import { TempFileService } from '../util/TempFileService' +import { CreateTimestampTokenError } from './error/create-timestamp-token.error' +import type { TimestampConfig } from './types/timestamp-config.type' +import type { TimestampProvider } from './types/timestamp-provider.type' +import type { CreatedTimestampToken, Timestamp } from './types/timestamp-token.type' /** * OpenSSL docs: https://www.openssl.org/docs/manmaster/man1/ts.html @@ -24,48 +25,27 @@ import { CertService } from '@techteamer/cert-utils' * * Trustedtimestamp service implements the generate, import and verification of timestamps * - * @class TrustedTimestampService * */ export class TrustedTimestampService { - /** - * @typedef {object} provider - * @property {string} name provider name - * @property {string | urlObject} url provider url - * @property {object} [auth] optional auth setting - * @property {number} [priority] optional provider priority - * - * @typedef {object} urlObject - * @property {string} getTokenUrl - * @property {string} getTimestampUrl - * - * @typedef {object} auth - * @property {string} user username - * @property {string} pass password - * - * @typedef {object} config - * @property {string} [certsLocation="/etc/ssl/certs/"] - * @property {provider[]} [providers=[{provider}, {provider}, ...]] - * @constructor - * @param {string} timestampInfoType (normal, short) - * @param {config} config - * @param {string} encoding - */ - constructor(timestampInfoType = 'normal', config, encoding = 'latin1') { - this.timestampInfoType = timestampInfoType - this.config = config - this.encoding = encoding + private readonly tmpOptions: TempFileOptions = { prefix: 'request-', postfix: '.tsr' } + private tempFileService!: TempFileService + private certService!: CertService + private providers!: TimestampProvider[] + private certsLocation!: string + private timestampRequest!: TrustedTimestampRequest + + constructor( + private readonly timestampInfoType: 'normal' | 'short' = 'normal', + private readonly config: TimestampConfig = {} as TimestampConfig, + private readonly encoding = 'latin1' + ) { this._init() } /** * init method that sets the config and instantiates the required services - * - * @return void - * @private * */ - _init() { - this.tmpOptions = { prefix: 'request-', postfix: '.tsr' } - + private _init(): void { if (this.config) { if (!this.config?.certsLocation) { throw new Error('trustedTimestamp config "certsLocation" missing!') @@ -85,13 +65,9 @@ export class TrustedTimestampService { /** * Utility method that resolves to a TimestampInfo object containing parsed info from the tsr - * - * @param tsr timestamp response - * @param [isToken=false] true if the input is a timestamp token (not a whole timestamp response) - * @return {Promise} * */ - async getTimestampInfo(tsr, isToken = false) { - const cleanupTempFns = [] + async getTimestampInfo(tsr: Buffer, isToken = false): Promise { + const cleanupTempFns: (() => unknown)[] = [] let inputTempPath = '' try { @@ -111,7 +87,7 @@ export class TrustedTimestampService { tstPath = inputTempPath } else { const tmp = await this.tempFileService.createTempFile(this.tmpOptions) - await generateTsReply(inputTempPath, tmp) + await generateTsReply(inputTempPath, tmp.tempPath) tstPath = tmp.tempPath cleanupTempFns.push(tmp.cleanupCallback) } @@ -125,12 +101,12 @@ export class TrustedTimestampService { timestampInfo.setCertInfo(certInfo) } } catch (err) { - throw new Error('Unable to get cert info from timestamp token', err) + throw new Error('Unable to get cert info from timestamp token', err as Error) } return timestampInfo } catch (err) { - return new TimestampInfo(this.timestampInfoType, null, err.message) + return new TimestampInfo(this.timestampInfoType, null!, (err as Error).message) } finally { for (const cleanUpFn of cleanupTempFns) { if (typeof cleanUpFn === 'function') { @@ -145,13 +121,8 @@ export class TrustedTimestampService { * It requests a token from the TSA and verifies the received response. * The returned timestamp token represents the token * and contains the tsr with the verification result. - * - * @param {String} digest - * @param {String} hashAlgorithm a valid option that openssl accepts (e.g: 'sha256', 'sha512') - * @param {Number} dataSize the size of the data the digest is generated from - * @return {CreatedTimestampToken} * */ - async createTimestampToken(digest, hashAlgorithm, dataSize) { + async createTimestampToken(digest: string, hashAlgorithm: string, dataSize: number): Promise { const digestFormat = normalizeDigestFormat(hashAlgorithm) try { @@ -172,7 +143,7 @@ export class TrustedTimestampService { } const timestampInfo = await this.getTimestampInfo(tsr, false) const certExpiry = timestampInfo.certInfo?.notAfter || null - const tt = { + const tt: Timestamp = { digest, hashAlgorithm, dataSize, @@ -190,19 +161,14 @@ export class TrustedTimestampService { throw error } - throw new CreateTimestampTokenError(`Failed to create trusted timestamp ${error.message}`) + throw new CreateTimestampTokenError(`Failed to create trusted timestamp ${(error as Error).message}`) } } /** * Verify if a timestamp token corresponds to a particular hash of data - * - * @param timestampToken - * @param {String} digest - * @param {Number} dataSize - * @return {Promise} * */ - async verifyToken(timestampToken, digest, dataSize) { + async verifyToken(timestampToken: Timestamp, digest: string, dataSize: number): Promise { if (timestampToken.dataSize !== dataSize) { throw new Error( `Timestamp token verification failed: The provided data size (${dataSize}) does not match the time stamped size (${timestampToken.dataSize}).` @@ -221,13 +187,8 @@ export class TrustedTimestampService { /** * Verify a hash digest against a timestamp response file - * - * @param {String} digest the hash of some data to verify against the response - * @param {Buffer} tsr a timestamp response - * @param {Boolean} [isToken=false] indicates that whether the input is a timestamp token or response - * @return {Promise} * */ - async verifyTsr(digest, tsr, isToken = false) { + async verifyTsr(digest: string, tsr: Buffer, isToken = false): Promise { let cleanupTempFile = null try { @@ -253,16 +214,14 @@ export class TrustedTimestampService { cleanupTempFile() } - throw new Error(`Failed to verify tsr ${err.message}`) + throw new Error(`Failed to verify tsr ${(err as Error).message}`) } } /** * testService method that check the ssl installation - * - * @return {Promise} * */ - async testService() { + async testService(): Promise { return await checkSslPath() } } diff --git a/src/trustedTimestamp/error/create-timestamp-token.error.ts b/src/trustedTimestamp/error/create-timestamp-token.error.ts index 52c50d6..13b54f4 100644 --- a/src/trustedTimestamp/error/create-timestamp-token.error.ts +++ b/src/trustedTimestamp/error/create-timestamp-token.error.ts @@ -1,4 +1,4 @@ -import { CreatedTimestampToken } from '../types/timestamp-token.type.js' +import { CreatedTimestampToken } from '../types/timestamp-token.type' export type CreateTimestampTokenErrorContext = Partial> diff --git a/src/trustedTimestamp/types/timestamp-config.type.ts b/src/trustedTimestamp/types/timestamp-config.type.ts new file mode 100644 index 0000000..7e595aa --- /dev/null +++ b/src/trustedTimestamp/types/timestamp-config.type.ts @@ -0,0 +1,6 @@ +import type { TimestampProvider } from './timestamp-provider.type' + +export interface TimestampConfig { + certsLocation: string + providers: TimestampProvider[] +} diff --git a/src/trustedTimestamp/types/timestamp-log.type.ts b/src/trustedTimestamp/types/timestamp-log.type.ts new file mode 100644 index 0000000..5ce999e --- /dev/null +++ b/src/trustedTimestamp/types/timestamp-log.type.ts @@ -0,0 +1,13 @@ +import { TimestampProviderUrl } from './timestamp-provider.type' + +export interface TimestampLog { + info: { + name: string + info?: null + date: Date + url: TimestampProviderUrl + response: string | null + error: string | null + } + errorTrace: Error | null +} diff --git a/src/trustedTimestamp/types/timestamp-provider.type.ts b/src/trustedTimestamp/types/timestamp-provider.type.ts new file mode 100644 index 0000000..dad496b --- /dev/null +++ b/src/trustedTimestamp/types/timestamp-provider.type.ts @@ -0,0 +1,26 @@ +export interface TimestampProviderProxyConfig { + url: string +} + +export interface TimestampProviderOAuthUrl { + getTokenUrl: string + getTimestampUrl: string +} + +export type TimestampProviderUrl = string | TimestampProviderOAuthUrl + +export interface TimestampProviderAuth { + user: string + pass: string +} + +export type TimestampProviderBody = Record + +export interface TimestampProvider { + name: string + url: TimestampProviderUrl + auth?: TimestampProviderAuth + priority?: number + body?: TimestampProviderBody + proxy?: TimestampProviderProxyConfig +} diff --git a/src/trustedTimestamp/types/timestamp-request.type.ts b/src/trustedTimestamp/types/timestamp-request.type.ts new file mode 100644 index 0000000..5aec3fa --- /dev/null +++ b/src/trustedTimestamp/types/timestamp-request.type.ts @@ -0,0 +1,24 @@ +import type { Agent } from 'http' +import type { BodyInit } from 'node-fetch' + +export type TimestampRequestAuthTypes = 'oauth' | 'basic' | 'noAuth' + +export interface TimestampRequestOptions { + method: string + headers: Record + encoding?: string | null + resolveWithFullResponse?: boolean + body?: BodyInit + agent?: AgentType +} + +export interface TimestampRequestError { + message: string + trace: Error | null +} + +export interface TimestampRequestAuthResult { + requestUrl: string | null + tsRequest: TimestampRequestOptions | null + error?: TimestampRequestError | null +} diff --git a/src/trustedTimestamp/types/timestamp-token.type.ts b/src/trustedTimestamp/types/timestamp-token.type.ts index 9e5da48..c27d246 100644 --- a/src/trustedTimestamp/types/timestamp-token.type.ts +++ b/src/trustedTimestamp/types/timestamp-token.type.ts @@ -1,15 +1,17 @@ +import { TimestampLog } from './timestamp-log.type' + export interface Timestamp { digest: string hashAlgorithm: string dataSize: number - tsr: unknown + tsr: Buffer isToken: boolean - certExpiry: string + certExpiry: Date | null verified: boolean | null } export interface CreatedTimestampToken { timestamp: Timestamp providerName: string - logHistory: string[] + logHistory: TimestampLog[] } diff --git a/src/util/TempFileService.js b/src/util/TempFileService.js deleted file mode 100644 index 127386b..0000000 --- a/src/util/TempFileService.js +++ /dev/null @@ -1,32 +0,0 @@ -import fs from 'node:fs/promises' -import util from 'node:util' -import tmp from 'tmp' - -tmp.setGracefulCleanup() - -const tmpFile = util.promisify((options, cb) => { - tmp.file(options, (err, ...results) => cb(err, results)) -}) - -class TempFileService { - /** - * Utility to create a temp file with content - * - * @param {Object} options - * @param {Buffer} content - * @return {Promise<{tempPath, fd, cleanupCallback}>} - * */ - async createTempFile (options = {}, content) { - try { - const [tempPath, fd, cleanupCallback] = await tmpFile(options) - if (content) { - await fs.writeFile(tempPath, content) - } - return { tempPath, fd, cleanupCallback } - } catch (err) { - throw new Error(`Failed to create temp file ${err}`) - } - } -} - -export default TempFileService diff --git a/src/util/TempFileService.ts b/src/util/TempFileService.ts new file mode 100644 index 0000000..1ab82a9 --- /dev/null +++ b/src/util/TempFileService.ts @@ -0,0 +1,34 @@ +import fs from 'node:fs/promises' +import util from 'node:util' +import tmp from 'tmp' + +tmp.setGracefulCleanup() + +const tmpFile = util.promisify( + ( + options: tmp.FileOptions, + cb: (error: Error | null, results: [string, number | undefined, () => void]) => unknown + ) => { + tmp.file(options, (err, ...results) => cb(err, results)) + } +) + +export class TempFileService { + /** + * Utility to create a temp file with content + * */ + async createTempFile( + options: tmp.FileOptions, + content?: Buffer + ): Promise<{ tempPath: string; fd: number | undefined; cleanupCallback: () => void }> { + try { + const [tempPath, fd, cleanupCallback] = await tmpFile(options) + if (content) { + await fs.writeFile(tempPath, content as unknown as string) + } + return { tempPath, fd, cleanupCallback } + } catch (err) { + throw new Error(`Failed to create temp file ${err}`) + } + } +} diff --git a/src/util/child_process_promise.js b/src/util/child_process_promise.js deleted file mode 100644 index eb3b0f4..0000000 --- a/src/util/child_process_promise.js +++ /dev/null @@ -1,44 +0,0 @@ -import * as childProcess from 'node:child_process' - -export function exec (command, options = {}, logger) { - return new Promise((resolve, reject) => { - const process = childProcess.exec(command, options, (err, stdout, stderr) => { - if (err) { - return reject(err || new Error(stderr.toString('utf8') || `Failed to execute command: ${command}`)) - } - - return resolve(stdout) - }) - - if (logger) { - process.stdout.on('data', (message) => { - message = message.trim() - if (message) { - logger.info(message) - } - }) - - process.stderr.on('data', (message) => { - message = message.trim() - if (message) { - logger.error(message) - } - }) - } - }) -} - -export function execFile (command, args, options = {}) { - return new Promise((resolve, reject) => { - childProcess.execFile(command, args, options, (err, stdout, stderr) => { - if (err) { - const error = new Error(err ? err.message : stderr.toString('utf8') || `Failed to execute file: ${command}`) - error.stdout = stdout - error.stderr = stderr - return reject(error) - } - - resolve({ stdout, stderr }) - }) - }) -} diff --git a/src/util/child_process_promise.ts b/src/util/child_process_promise.ts new file mode 100644 index 0000000..57dacec --- /dev/null +++ b/src/util/child_process_promise.ts @@ -0,0 +1,61 @@ +import * as childProcess from 'node:child_process' +import type { ExecOptions } from 'node:child_process' + +interface Logger { + info: (log: string, ...args: unknown[]) => unknown + error: (log: string, ...args: unknown[]) => unknown +} + +export function exec( + command: string, + options: { + encoding?: 'buffer' + } & ExecOptions = {}, + logger?: Logger +): Promise { + return new Promise((resolve, reject) => { + const process = childProcess.exec(command, options, (err, stdout, stderr) => { + if (err) { + return reject(err || new Error(stderr.toString() || `Failed to execute command: ${command}`)) + } + + return resolve(stdout as ReturnType) + }) + + if (logger) { + process.stdout!.on('data', message => { + message = message.trim() + if (message) { + logger.info(message) + } + }) + + process.stderr!.on('data', message => { + message = message.trim() + if (message) { + logger.error(message) + } + }) + } + }) +} + +export class ExecFileError extends Error { + public stdout?: string + public stderr?: string +} + +export function execFile(command: string, args: string[], options = {}): Promise<{ stdout: string; stderr: string }> { + return new Promise((resolve, reject) => { + childProcess.execFile(command, args, options, (err, stdout, stderr) => { + if (err) { + const error = new ExecFileError(err ? err.message : stderr.toString() || `Failed to execute file: ${command}`) + error.stdout = stdout + error.stderr = stderr + return reject(error) + } + + resolve({ stdout, stderr }) + }) + }) +} diff --git a/src/util/regexParser.js b/src/util/regexParser.js deleted file mode 100644 index c2f4776..0000000 --- a/src/util/regexParser.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @param text {string} - * @param regex {RegExp} - * @param groups {number | number[]} - * @param revive {(value: any) => any} - * @returns {any|null} - */ -function parseRegex (text, regex, groups, revive) { - const result = text.match(regex) - if (!result) { - return null - } - - revive = revive || (value => value) - - if (!groups) { - return revive(result) - } - - if (typeof groups === 'number') { - return revive(result[groups]) - } - - if (Array.isArray(groups)) { - const ret = {} - groups.forEach((name, i) => { - ret[name] = result[i + 1] - }) - return revive(ret) - } -} - -function createParser (regex, groups, revive) { - return (text) => { - return parseRegex(text, regex, groups, revive) - } -} - -export { createParser as create } -export { parseRegex } diff --git a/src/util/regexParser.ts b/src/util/regexParser.ts new file mode 100644 index 0000000..da95baa --- /dev/null +++ b/src/util/regexParser.ts @@ -0,0 +1,46 @@ +function parseRegex( + text: string, + regex: RegExp, + groups: Groups, + revive: ( + parameter: Groups extends number + ? string + : Groups extends (string | number)[] + ? Record + : RegExpMatchArray + ) => ReviveResult = value => value as unknown as ReviveResult +): ReviveResult | null | undefined { + const result = text.match(regex) + if (!result) { + return null + } + + if (!groups) { + return (revive as (parameter: RegExpMatchArray) => ReviveResult)(result) + } + + if (typeof groups === 'number') { + return (revive as (parameter: string) => ReviveResult)(result[groups]) + } + + if (Array.isArray(groups)) { + const ret: Record = {} + groups.forEach((name, i) => { + ret[name] = result[i + 1] + }) + return (revive as (parameter: Record) => ReviveResult)(ret) + } +} + +function createParser( + regex: RegExp, + groups: number | number[], + revive: (value: unknown) => ReviveResult +): (text: string) => ReviveResult | null | undefined { + return (text: string) => { + return parseRegex(text, regex, groups, revive) + } +} + +export { createParser as create } +export { parseRegex } diff --git a/test/tests/feature/timestamp-service.test.ts b/test/tests/feature/timestamp-service.test.ts index 31fbac6..05cad10 100644 --- a/test/tests/feature/timestamp-service.test.ts +++ b/test/tests/feature/timestamp-service.test.ts @@ -1,18 +1,19 @@ import { vi, expect, it, beforeEach, describe } from 'vitest' import nock from 'nock' -import '../mocks/TrustedTimestampCommand.mock.js' -import { TrustedTimestampService } from '../../../src/trustedTimestamp/TrustedTimestampService.js' -import { CreateTimestampTokenError } from '../../../src/trustedTimestamp/error/create-timestamp-token.error.ts' +import '../mocks/TrustedTimestampCommand.mock' +import { TrustedTimestampService } from '../../../src/trustedTimestamp/TrustedTimestampService' +import { CreateTimestampTokenError } from '../../../src/trustedTimestamp/error/create-timestamp-token.error' +import { TimestampConfig } from '../../../src/trustedTimestamp/types/timestamp-config.type' vi.mock('@techteamer/cert-utils', () => ({ CertService: vi.fn().mockImplementation(() => ({ - get CertType () { + get CertType(): { P12: 'P12'; PEM: 'PEM' } { return { P12: 'P12', PEM: 'PEM' } }, - parseCert: () => { /**/ } + parseCert: (): null => null })) })) @@ -81,24 +82,30 @@ describe('TrustedTimestampService.js (feature-test)', () => { }) it('fail test - config missing providers', () => { - expect(() => new TrustedTimestampService('normal', { - certsLocation: '/etc/ssl/certs/' - })).toThrow('trustedTimestamp config "providers" missing or empty!') + expect( + () => + new TrustedTimestampService('normal', { + certsLocation: '/etc/ssl/certs/' + } as TimestampConfig) + ).toThrow('trustedTimestamp config "providers" missing or empty!') }) it('fail test - config missing certsLocation', () => { - expect(() => new TrustedTimestampService('normal', { - providers: [ - { - name: 'bteszt', - url: 'https://bteszt.e-szigno.hu/tsa', - auth: { - user: 'username', - pass: 'password' - } - } - ] - })).toThrow('trustedTimestamp config "certsLocation" missing!') + expect( + () => + new TrustedTimestampService('normal', { + providers: [ + { + name: 'bteszt', + url: 'https://bteszt.e-szigno.hu/tsa', + auth: { + user: 'username', + pass: 'password' + } + } + ] + } as TimestampConfig) + ).toThrow('trustedTimestamp config "certsLocation" missing!') }) }) @@ -123,12 +130,14 @@ describe('TrustedTimestampService.js (feature-test)', () => { const hashAlgorithm = 'sha256' const dataSize = 210893 - const scope = nock('https://bteszt.e-szigno.hu') - .post('/tsa') - .reply(200, { }) + const scope = nock('https://bteszt.e-szigno.hu').post('/tsa').reply(200, {}) scope.persist(false) - const { timestamp, providerName } = await trustedTimestampServiceInstance.createTimestampToken(digest, hashAlgorithm, dataSize) + const { timestamp, providerName } = await trustedTimestampServiceInstance.createTimestampToken( + digest, + hashAlgorithm, + dataSize + ) expect(providerName).not.toBe(null) expect(timestamp).not.toBe(null) expect(timestamp.verified).toBe(true) @@ -170,7 +179,11 @@ describe('TrustedTimestampService.js (feature-test)', () => { .reply(200, { access_token: 'f1d44c9a9f3c6f12536f46e8f06cbe3001954e9e684ccabb99dd36ca296f7bd0' }) scope2.persist(false) - const { timestamp, providerName } = await trustedTimestampServiceInstance.createTimestampToken(digest, hashAlgorithm, dataSize) + const { timestamp, providerName } = await trustedTimestampServiceInstance.createTimestampToken( + digest, + hashAlgorithm, + dataSize + ) expect(providerName).not.toBe(null) expect(timestamp).not.toBe(null) expect(timestamp.verified).toBe(true) @@ -215,12 +228,14 @@ describe('TrustedTimestampService.js (feature-test)', () => { .reply(200, { access_token: 'f1d44c9a9f3c6d12536f46e8f06bbe3001954e9e684ccabb99dd36ca296f7bd0' }) scope.persist(false) - const scope2 = nock('http://localhost') - .post('/timestamp') - .reply(200, { }) + const scope2 = nock('http://localhost').post('/timestamp').reply(200, {}) scope2.persist(false) - const { timestamp, providerName } = await trustedTimestampServiceInstance.createTimestampToken(digest, hashAlgorithm, dataSize) + const { timestamp, providerName } = await trustedTimestampServiceInstance.createTimestampToken( + digest, + hashAlgorithm, + dataSize + ) expect(providerName).not.toBe(null) expect(timestamp).not.toBe(null) expect(timestamp.verified).toBe(true) @@ -283,19 +298,19 @@ describe('TrustedTimestampService.js (feature-test)', () => { ] }) - const tsr = Buffer.from(JSON.stringify({ - digest: 'f1d44c9a9f3c6f12536f46e8f06cbe3001954e9e684ccabb99dd36ca296f7bd0', - hashAlgorithm: 'sha256', - dataSize: 210893, - tsr: {}, - isToken: false, - certExpiry: null, - verified: null - })) - - const scope = nock('http://127.0.0.1') - .post('/?token=xxxxx') - .reply(200, { }) + const tsr = Buffer.from( + JSON.stringify({ + digest: 'f1d44c9a9f3c6f12536f46e8f06cbe3001954e9e684ccabb99dd36ca296f7bd0', + hashAlgorithm: 'sha256', + dataSize: 210893, + tsr: {}, + isToken: false, + certExpiry: null, + verified: null + }) + ) + + const scope = nock('http://127.0.0.1').post('/?token=xxxxx').reply(200, {}) scope.persist(false) const result = await trustedTimestampServiceInstance.getTimestampInfo(tsr, false) @@ -322,7 +337,7 @@ describe('TrustedTimestampService.js (feature-test)', () => { digest: '7c86796d0bba6cda5805fe327200528f65fbab8847d7c847f2fc29dfede24343', hashAlgorithm: 'sha256', dataSize: 458, - tsr: '', + tsr: Buffer.from(''), isToken: false, certExpiry: null, verified: null @@ -330,9 +345,7 @@ describe('TrustedTimestampService.js (feature-test)', () => { const digest = '7c86796d0bba6cda5805fe327200528f65fbab8847d7c847f2fc29dfede24343' const dataSize = 458 - const scope = nock('http://127.0.0.1') - .post('/?token=xxxxx') - .reply(200, { }) + const scope = nock('http://127.0.0.1').post('/?token=xxxxx').reply(200, {}) scope.persist(false) const result = await trustedTimestampServiceInstance.verifyToken(timestampToken, digest, dataSize) @@ -358,9 +371,7 @@ describe('TrustedTimestampService.js (feature-test)', () => { const tsr = Buffer.from('test') const digest = 'f1d44c9a9f3c6f12536f46e8f06cbe3001954e9e684ccabb99dd36ca296f7bd0' const isToken = false - const scope = nock('http://127.0.0.1') - .post('/?token=xxxxx') - .reply(200, { }) + const scope = nock('http://127.0.0.1').post('/?token=xxxxx').reply(200, {}) scope.persist(false) const result = await trustedTimestampServiceInstance.verifyTsr(digest, tsr, isToken) diff --git a/test/tests/mocks/TrustedTimestampCommand.mock.js b/test/tests/mocks/TrustedTimestampCommand.mock.js deleted file mode 100644 index e207464..0000000 --- a/test/tests/mocks/TrustedTimestampCommand.mock.js +++ /dev/null @@ -1,29 +0,0 @@ -import { vi } from 'vitest' - -const mockResult = 'TST info\n' + - 'Version: 1\n' + - 'Policy OID: 1.3.6.1.4.1.12345.1.1.11\n' + - 'Hash Algorithm: sha256\n' + - ' Message data:\n' + - ' 0000 - eb 0c 81 b5 01 05 7f 2a-23 1d 2e af e0 a2 c3 60`\n' + - ' 0010 - 12 08 67 f6 fd e6 ab 0f-50 cb 8b 90 84 0f f7 c4\n' + - 'Serial number: 0x01234XXX\n' + - 'Time stamp: May 29 07:19:13 2024 GMT\n' + - 'Accuracy: 0x01 seconds, unspecified millis, unspecified micros\n' + - 'Ordering: no\n' + - 'Nonce: unspecified\n' + - 'TSA: DirName:/C=HU/L=Budapest/O=XXXXX ./organizationIdentifier=VATHU-12345678/CN=Test xxxxx TSA xxxxx 01\n' - -vi.mock('../../../src/trustedTimestamp/TrustedTimestampCommand.js', () => ({ - getTsQuery: vi.fn().mockResolvedValue(Buffer.from(mockResult)), - getTsVerify: vi.fn().mockResolvedValue('Verification: ok'), - getTsReply: vi.fn().mockResolvedValue(mockResult), - generateTsReply: vi.fn().mockResolvedValue(mockResult), - extractCertFromToken: vi.fn().mockResolvedValue('-----BEGIN CERTIFICATE-----\n' + - 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX\n' + - 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX\n' + - 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX\n' + - 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX\n' + - '-----END CERTIFICATE-----\n'), - checkSslPath: vi.fn().mockResolvedValue('/usr/bin/openssl') -})) diff --git a/test/tests/mocks/TrustedTimestampCommand.mock.ts b/test/tests/mocks/TrustedTimestampCommand.mock.ts new file mode 100644 index 0000000..a474088 --- /dev/null +++ b/test/tests/mocks/TrustedTimestampCommand.mock.ts @@ -0,0 +1,34 @@ +import { vi } from 'vitest' + +const mockResult = + 'TST info\n' + + 'Version: 1\n' + + 'Policy OID: 1.3.6.1.4.1.12345.1.1.11\n' + + 'Hash Algorithm: sha256\n' + + ' Message data:\n' + + ' 0000 - eb 0c 81 b5 01 05 7f 2a-23 1d 2e af e0 a2 c3 60`\n' + + ' 0010 - 12 08 67 f6 fd e6 ab 0f-50 cb 8b 90 84 0f f7 c4\n' + + 'Serial number: 0x01234XXX\n' + + 'Time stamp: May 29 07:19:13 2024 GMT\n' + + 'Accuracy: 0x01 seconds, unspecified millis, unspecified micros\n' + + 'Ordering: no\n' + + 'Nonce: unspecified\n' + + 'TSA: DirName:/C=HU/L=Budapest/O=XXXXX ./organizationIdentifier=VATHU-12345678/CN=Test xxxxx TSA xxxxx 01\n' + +vi.mock('../../../src/trustedTimestamp/TrustedTimestampCommand.ts', () => ({ + getTsQuery: vi.fn().mockResolvedValue(Buffer.from(mockResult)), + getTsVerify: vi.fn().mockResolvedValue('Verification: ok'), + getTsReply: vi.fn().mockResolvedValue(mockResult), + generateTsReply: vi.fn().mockResolvedValue(mockResult), + extractCertFromToken: vi + .fn() + .mockResolvedValue( + '-----BEGIN CERTIFICATE-----\n' + + 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX\n' + + 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX\n' + + 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX\n' + + 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX\n' + + '-----END CERTIFICATE-----\n' + ), + checkSslPath: vi.fn().mockResolvedValue('/usr/bin/openssl') +})) diff --git a/test/vitest.config.js b/test/vitest.config.ts similarity index 88% rename from test/vitest.config.js rename to test/vitest.config.ts index 69639d9..f980dd1 100644 --- a/test/vitest.config.js +++ b/test/vitest.config.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line n/no-unpublished-import import { defineConfig } from 'vitest/config' export default defineConfig({ diff --git a/tsconfig.json b/tsconfig.json index 7e9295f..2a38813 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,7 @@ "lib": ["esnext"], "listEmittedFiles": false, "listFiles": false, - "moduleResolution": "node", + "moduleResolution": "bundler", "noFallthroughCasesInSwitch": true, "pretty": true, "resolveJsonModule": true, diff --git a/yarn.lock b/yarn.lock index 4db16cb..d7010e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,29 +10,30 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/helper-string-parser@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" - integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/parser@^7.24.4": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" - integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== - -"@babel/types@^7.24.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" - integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== - dependencies: - "@babel/helper-string-parser" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/parser@^7.25.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.4.tgz#da25d4643532890932cc03f7705fe19637e03fa8" + integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== + dependencies: + "@babel/types" "^7.28.4" + +"@babel/types@^7.25.4", "@babel/types@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" + integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" @@ -154,17 +155,17 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== -"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" + integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== dependencies: - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -181,17 +182,17 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -200,7 +201,7 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": +"@humanwhocodes/object-schema@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== @@ -223,12 +224,11 @@ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/sourcemap-codec" "^1.5.0" "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": @@ -236,20 +236,15 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -288,15 +283,6 @@ "@rollup/pluginutils" "^5.1.0" resolve "^1.22.1" -"@rollup/pluginutils@^5.0.5": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" - integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^2.0.2" - picomatch "^2.3.1" - "@rollup/pluginutils@^5.1.0": version "5.3.0" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz#57ba1b0cbda8e7a3c597a4853c807b156e21a7b4" @@ -306,85 +292,110 @@ estree-walker "^2.0.2" picomatch "^4.0.2" -"@rollup/rollup-android-arm-eabi@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz#f0da481244b7d9ea15296b35f7fe39cd81157396" - integrity sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA== - -"@rollup/rollup-android-arm64@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz#82ab3c575f4235fb647abea5e08eec6cf325964e" - integrity sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg== - -"@rollup/rollup-darwin-arm64@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz#6a530452e68a9152809ce58de1f89597632a085b" - integrity sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ== - -"@rollup/rollup-darwin-x64@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz#47727479f5ca292cf434d7e75af2725b724ecbc7" - integrity sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA== - -"@rollup/rollup-linux-arm-gnueabihf@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz#46193c498aa7902a8db89ac00128060320e84fef" - integrity sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g== - -"@rollup/rollup-linux-arm-musleabihf@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz#22d831fe239643c1d05c98906420325cee439d85" - integrity sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ== - -"@rollup/rollup-linux-arm64-gnu@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz#19abd33695ec9d588b4a858d122631433084e4a3" - integrity sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ== - -"@rollup/rollup-linux-arm64-musl@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz#d60af8c0b9be424424ff96a0ba19fce65d26f6ab" - integrity sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ== - -"@rollup/rollup-linux-powerpc64le-gnu@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz#b1194e5ed6d138fdde0842d126fccde74a90f457" - integrity sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ== - -"@rollup/rollup-linux-riscv64-gnu@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz#f5a635c017b9bff8b856b0221fbd5c0e3373b7ec" - integrity sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg== - -"@rollup/rollup-linux-s390x-gnu@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz#f1043d9f4026bf6995863cb3f8dd4732606e4baa" - integrity sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg== - -"@rollup/rollup-linux-x64-gnu@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz#1e781730be445119f06c9df5f185e193bc82c610" - integrity sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g== - -"@rollup/rollup-linux-x64-musl@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz#08f12e1965d6f27d6898ff932592121cca6abc4b" - integrity sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ== - -"@rollup/rollup-win32-arm64-msvc@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz#4a5dcbbe7af7d41cac92b09798e7c1831da1f599" - integrity sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g== - -"@rollup/rollup-win32-ia32-msvc@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz#075b0713de627843a73b4cf0e087c56b53e9d780" - integrity sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg== - -"@rollup/rollup-win32-x64-msvc@4.18.1": - version "4.18.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz#0cb240c147c0dfd0e3eaff4cc060a772d39e155c" - integrity sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw== +"@rollup/rollup-android-arm-eabi@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.2.tgz#52d66eba5198155f265f54aed94d2489c49269f6" + integrity sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A== + +"@rollup/rollup-android-arm64@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.2.tgz#137e8153fc9ce6757531ce300b8d2262299f758e" + integrity sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g== + +"@rollup/rollup-darwin-arm64@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.2.tgz#d4afd904386d37192cf5ef7345fdb0dd1bac0bc3" + integrity sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q== + +"@rollup/rollup-darwin-x64@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.2.tgz#6dbe83431fc7cbc09a2b6ed2b9fb7a62dd66ebc2" + integrity sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A== + +"@rollup/rollup-freebsd-arm64@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.2.tgz#d35afb9f66154b557b3387d12450920f8a954b96" + integrity sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow== + +"@rollup/rollup-freebsd-x64@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.2.tgz#849303ecdc171a420317ad9166a70af308348f34" + integrity sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog== + +"@rollup/rollup-linux-arm-gnueabihf@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.2.tgz#ab36199ca613376232794b2f3ba10e2b547a447c" + integrity sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w== + +"@rollup/rollup-linux-arm-musleabihf@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.2.tgz#f3704bc2eaecd176f558dc47af64197fcac36e8a" + integrity sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw== + +"@rollup/rollup-linux-arm64-gnu@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.2.tgz#dda0b06fd1daedd00b34395a2fb4aaaa2ed6c32b" + integrity sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg== + +"@rollup/rollup-linux-arm64-musl@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.2.tgz#a018de66209051dad0c58e689e080326c3dd15b0" + integrity sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ== + +"@rollup/rollup-linux-loong64-gnu@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.50.2.tgz#6e514f09988615e0c98fa5a34a88a30fec64d969" + integrity sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw== + +"@rollup/rollup-linux-ppc64-gnu@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.2.tgz#9b2efebc7b4a1951e684a895fdee0fef26319e0d" + integrity sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag== + +"@rollup/rollup-linux-riscv64-gnu@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.2.tgz#a7104270e93d75789d1ba857b2c68ddf61f24f68" + integrity sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ== + +"@rollup/rollup-linux-riscv64-musl@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.2.tgz#42d153f734a7b9fcacd764cc9bee6c207dca4db6" + integrity sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw== + +"@rollup/rollup-linux-s390x-gnu@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.2.tgz#826ad73099f6fd57c083dc5329151b25404bc67d" + integrity sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w== + +"@rollup/rollup-linux-x64-gnu@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.2.tgz#b9ec17bf0ca3f737d0895fca2115756674342142" + integrity sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA== + +"@rollup/rollup-linux-x64-musl@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.2.tgz#29fe0adb45a1d99042f373685efbac9cdd5354d9" + integrity sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw== + +"@rollup/rollup-openharmony-arm64@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.2.tgz#29648f11e202736b74413f823b71e339e3068d60" + integrity sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA== + +"@rollup/rollup-win32-arm64-msvc@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.2.tgz#91e7edec80542fd81ab1c2581a91403ac63458ae" + integrity sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA== + +"@rollup/rollup-win32-ia32-msvc@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.2.tgz#9b7cd9779f1147a3e8d3ddad432ae64dd222c4e9" + integrity sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA== + +"@rollup/rollup-win32-x64-msvc@4.50.2": + version "4.50.2" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.2.tgz#40ecd1357526fe328c7af704a283ee8533ca7ad6" + integrity sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA== "@techteamer/cert-utils@^1.1.3": version "1.1.3" @@ -413,79 +424,86 @@ resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== -"@types/estree@1.0.5", "@types/estree@^1.0.0": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/estree@1.0.8", "@types/estree@^1.0.0": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/node-fetch@^3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-3.0.3.tgz#9d969c9a748e841554a40ee435d26e53fa3ee899" + integrity sha512-HhggYPH5N+AQe/OmN6fmhKmRRt2XuNJow+R3pQwJxOOF9GuwM7O2mheyGeIrs5MOIeNjDEdgdoyHBOrFeJBR3g== + dependencies: + node-fetch "*" "@types/node@^20.14.6": - version "20.14.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" - integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== + version "20.19.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.17.tgz#41b52697373aef8a43b3b92f33b43f329b2d674b" + integrity sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ== dependencies: - undici-types "~5.26.4" + undici-types "~6.21.0" + +"@types/tmp@^0.2.6": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.6.tgz#d785ee90c52d7cc020e249c948c36f7b32d1e217" + integrity sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA== "@typescript-eslint/eslint-plugin@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz#b3563927341eca15124a18c6f94215f779f5c02a" - integrity sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw== + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" + integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "7.16.0" - "@typescript-eslint/type-utils" "7.16.0" - "@typescript-eslint/utils" "7.16.0" - "@typescript-eslint/visitor-keys" "7.16.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/type-utils" "7.18.0" + "@typescript-eslint/utils" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" "@typescript-eslint/parser@^7.13.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.16.0.tgz#53fae8112f8c912024aea7b499cf7374487af6d8" - integrity sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw== - dependencies: - "@typescript-eslint/scope-manager" "7.16.0" - "@typescript-eslint/types" "7.16.0" - "@typescript-eslint/typescript-estree" "7.16.0" - "@typescript-eslint/visitor-keys" "7.16.0" + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== + dependencies: + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz#eb0757af5720c9c53c8010d7a0355ae27e17b7e5" - integrity sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw== +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== dependencies: - "@typescript-eslint/types" "7.16.0" - "@typescript-eslint/visitor-keys" "7.16.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" -"@typescript-eslint/type-utils@7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz#ec52b1932b8fb44a15a3e20208e0bd49d0b6bd00" - integrity sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg== +"@typescript-eslint/type-utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" + integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== dependencies: - "@typescript-eslint/typescript-estree" "7.16.0" - "@typescript-eslint/utils" "7.16.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/utils" "7.18.0" debug "^4.3.4" ts-api-utils "^1.3.0" -"@typescript-eslint/types@7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.16.0.tgz#60a19d7e7a6b1caa2c06fac860829d162a036ed2" - integrity sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw== +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== -"@typescript-eslint/typescript-estree@7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz#98ac779d526fab2a781e5619c9250f3e33867c09" - integrity sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw== +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== dependencies: - "@typescript-eslint/types" "7.16.0" - "@typescript-eslint/visitor-keys" "7.16.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -493,97 +511,104 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.16.0.tgz#b38dc0ce1778e8182e227c98d91d3418449aa17f" - integrity sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA== +"@typescript-eslint/utils@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "7.16.0" - "@typescript-eslint/types" "7.16.0" - "@typescript-eslint/typescript-estree" "7.16.0" + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" -"@typescript-eslint/visitor-keys@7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz#a1d99fa7a3787962d6e0efd436575ef840e23b06" - integrity sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg== +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== dependencies: - "@typescript-eslint/types" "7.16.0" + "@typescript-eslint/types" "7.18.0" eslint-visitor-keys "^3.4.3" "@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== "@vitest/coverage-v8@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-2.0.2.tgz#dcaf34b4927e272e8babaa557a677e1e6a16196e" - integrity sha512-iA8eb4PMid3bMc++gfQSTvYE1QL//fC8pz+rKsTUDBFjdDiy/gH45hvpqyDu5K7FHhvgG0GNNCJzTMMSFKhoxg== + version "2.1.9" + resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz#060bebfe3705c1023bdc220e17fdea4bd9e2b24d" + integrity sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ== dependencies: "@ampproject/remapping" "^2.3.0" "@bcoe/v8-coverage" "^0.2.3" - debug "^4.3.5" + debug "^4.3.7" istanbul-lib-coverage "^3.2.2" istanbul-lib-report "^3.0.1" istanbul-lib-source-maps "^5.0.6" istanbul-reports "^3.1.7" - magic-string "^0.30.10" - magicast "^0.3.4" - std-env "^3.7.0" - strip-literal "^2.1.0" + magic-string "^0.30.12" + magicast "^0.3.5" + std-env "^3.8.0" test-exclude "^7.0.1" tinyrainbow "^1.2.0" -"@vitest/expect@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.0.2.tgz#2eff61dde5fb2574a0a7a32517419b5de7d78124" - integrity sha512-nKAvxBYqcDugYZ4nJvnm5OR8eDJdgWjk4XM9owQKUjzW70q0icGV2HVnQOyYsp906xJaBDUXw0+9EHw2T8e0mQ== +"@vitest/expect@2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.9.tgz#b566ea20d58ea6578d8dc37040d6c1a47ebe5ff8" + integrity sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw== dependencies: - "@vitest/spy" "2.0.2" - "@vitest/utils" "2.0.2" - chai "^5.1.1" + "@vitest/spy" "2.1.9" + "@vitest/utils" "2.1.9" + chai "^5.1.2" tinyrainbow "^1.2.0" -"@vitest/pretty-format@2.0.2", "@vitest/pretty-format@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.0.2.tgz#c2674fef447ad8469144fdc483e859f9b1664133" - integrity sha512-SBCyOXfGVvddRd9r2PwoVR0fonQjh9BMIcBMlSzbcNwFfGr6ZhOhvBzurjvi2F4ryut2HcqiFhNeDVGwru8tLg== +"@vitest/mocker@2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.9.tgz#36243b27351ca8f4d0bbc4ef91594ffd2dc25ef5" + integrity sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg== + dependencies: + "@vitest/spy" "2.1.9" + estree-walker "^3.0.3" + magic-string "^0.30.12" + +"@vitest/pretty-format@2.1.9", "@vitest/pretty-format@^2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.9.tgz#434ff2f7611689f9ce70cd7d567eceb883653fdf" + integrity sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ== dependencies: tinyrainbow "^1.2.0" -"@vitest/runner@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.0.2.tgz#5716c25f762308e4c87485668e4654cd4b832a73" - integrity sha512-OCh437Vi8Wdbif1e0OvQcbfM3sW4s2lpmOjAE7qfLrpzJX2M7J1IQlNvEcb/fu6kaIB9n9n35wS0G2Q3en5kHg== +"@vitest/runner@2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.9.tgz#cc18148d2d797fd1fd5908d1f1851d01459be2f6" + integrity sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g== dependencies: - "@vitest/utils" "2.0.2" + "@vitest/utils" "2.1.9" pathe "^1.1.2" -"@vitest/snapshot@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.0.2.tgz#91a8b847d82d92d06b9bf70b72bb9f21a4a416a1" - integrity sha512-Yc2ewhhZhx+0f9cSUdfzPRcsM6PhIb+S43wxE7OG0kTxqgqzo8tHkXFuFlndXeDMp09G3sY/X5OAo/RfYydf1g== +"@vitest/snapshot@2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.9.tgz#24260b93f798afb102e2dcbd7e61c6dfa118df91" + integrity sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ== dependencies: - "@vitest/pretty-format" "2.0.2" - magic-string "^0.30.10" + "@vitest/pretty-format" "2.1.9" + magic-string "^0.30.12" pathe "^1.1.2" -"@vitest/spy@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.0.2.tgz#505b70978ae5f9db7a923bf8d62e4bfa6d89725f" - integrity sha512-MgwJ4AZtCgqyp2d7WcQVE8aNG5vQ9zu9qMPYQHjsld/QVsrvg78beNrXdO4HYkP0lDahCO3P4F27aagIag+SGQ== +"@vitest/spy@2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.9.tgz#cb28538c5039d09818b8bfa8edb4043c94727c60" + integrity sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ== dependencies: - tinyspy "^3.0.0" + tinyspy "^3.0.2" -"@vitest/utils@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.0.2.tgz#a2e829b126b08987e93e1d105323c7f7b99e271d" - integrity sha512-pxCY1v7kmOCWYWjzc0zfjGTA3Wmn8PKnlPvSrsA643P1NHl1fOyXj2Q9SaNlrlFE+ivCsxM80Ov3AR82RmHCWQ== +"@vitest/utils@2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.9.tgz#4f2486de8a54acf7ecbf2c5c24ad7994a680a6c1" + integrity sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ== dependencies: - "@vitest/pretty-format" "2.0.2" - estree-walker "^3.0.3" - loupe "^3.1.1" + "@vitest/pretty-format" "2.1.9" + loupe "^3.1.2" tinyrainbow "^1.2.0" acorn-jsx@^5.3.2: @@ -592,14 +617,14 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.9.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== agent-base@^7.1.0, agent-base@^7.1.2: - version "7.1.3" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" - integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== + version "7.1.4" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== ajv@^6.12.4: version "6.12.6" @@ -624,86 +649,20 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: color-convert "^2.0.1" ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-includes@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - asn1.js-rfc2560@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/asn1.js-rfc2560/-/asn1.js-rfc2560-5.0.1.tgz#cff99b903e714756b29503ad49de01c72f131e60" @@ -741,9 +700,9 @@ ast-types@^0.13.4: tslib "^2.0.1" async@^3.2.4: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== available-typed-arrays@^1.0.7: version "1.0.7" @@ -763,22 +722,22 @@ basic-ftp@^5.0.2: integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== bn.js@^4.0.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + version "4.12.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.2.tgz#3d8fed6796c24e177737f7cc5172ee04ef39ec99" + integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw== brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + version "2.0.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" @@ -789,43 +748,46 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" -builtin-modules@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -builtins@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.1.0.tgz#6d85eeb360c4ebc166c3fdef922a15aa7316a5e8" - integrity sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg== - dependencies: - semver "^7.0.0" - cac@^6.7.14: version "6.7.14" resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: - es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" + +call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -chai@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.1.1.tgz#f035d9792a22b481ead1c65908d14bb62ec1c82c" - integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA== +chai@^5.1.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" + integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== dependencies: assertion-error "^2.0.1" check-error "^2.1.1" @@ -863,68 +825,32 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +cross-spawn@^7.0.2, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + data-uri-to-buffer@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -debug@4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.7, debug@^4.4.0: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - deep-eql@^5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" @@ -935,7 +861,7 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -define-data-property@^1.0.1, define-data-property@^1.1.4: +define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -944,15 +870,6 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" -define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - degenerator@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" @@ -969,13 +886,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -983,6 +893,15 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -998,107 +917,28 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== -es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-module-lexer@^1.3.1: - version "1.5.4" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" - integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== +es-module-lexer@^1.5.4, es-module-lexer@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - esbuild@^0.21.3: version "0.21.5" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" @@ -1144,13 +984,6 @@ escodegen@^2.1.0: optionalDependencies: source-map "~0.6.1" -eslint-compat-utils@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz#7fc92b776d185a70c4070d03fd26fde3d59652e4" - integrity sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q== - dependencies: - semver "^7.5.4" - eslint-config-prettier@^10.1.8: version "10.1.8" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" @@ -1161,76 +994,6 @@ eslint-config-standard@^17.0.0: resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== - dependencies: - debug "^3.2.7" - -eslint-plugin-es-x@^7.5.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz#a207aa08da37a7923f2a9599e6d3eb73f3f92b74" - integrity sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ== - dependencies: - "@eslint-community/eslint-utils" "^4.1.2" - "@eslint-community/regexpp" "^4.11.0" - eslint-compat-utils "^0.5.1" - -eslint-plugin-import@^2.26.0: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-n@^16.3.1: - version "16.6.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz#6a60a1a376870064c906742272074d5d0b412b0b" - integrity sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - builtins "^5.0.1" - eslint-plugin-es-x "^7.5.0" - get-tsconfig "^4.7.0" - globals "^13.24.0" - ignore "^5.2.4" - is-builtin-module "^3.2.1" - is-core-module "^2.12.1" - minimatch "^3.1.2" - resolve "^1.22.2" - semver "^7.5.3" - -eslint-plugin-promise@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.4.0.tgz#54926d53c79541efe9cea6ac1d823a58bbed1106" - integrity sha512-/KWWRaD3fGkVCZsdR0RU53PSthFmoHVhZl+y9+6DqeDLSikLdlUVpVEAmI6iCRR5QyOjBYBqHZV/bdv4DJ4Gtw== - eslint-scope@^7.2.2: version "7.2.2" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" @@ -1239,21 +1002,21 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.19.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -1338,20 +1101,10 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" +expect-type@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.2.tgz#c030a329fb61184126c8447585bc75a7ec6fbff3" + integrity sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" @@ -1359,15 +1112,15 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.4" + micromatch "^4.0.8" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -1380,12 +1133,20 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -1418,29 +1179,36 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== +for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: - is-callable "^1.1.3" + is-callable "^1.2.7" foreground-child@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" - integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: - cross-spawn "^7.0.0" + cross-spawn "^7.0.6" signal-exit "^4.0.1" +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + fs-extra@^11.1.1: - version "11.2.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + version "11.3.2" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.2.tgz#c838aeddc6f4a8c74dd15f85e11fe5511bfe02a4" + integrity sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -1461,62 +1229,41 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-func-name@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.2.4, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" es-errors "^1.3.0" + es-object-atoms "^1.1.1" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" -get-tsconfig@^4.7.0, get-tsconfig@^4.7.2: - version "4.7.5" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" - integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== +get-tsconfig@^4.10.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.1.tgz#d34c1c01f47d65a606c37aa7a177bc3e56ab4b2e" + integrity sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ== dependencies: resolve-pkg-maps "^1.0.0" get-uri@^6.0.1: - version "6.0.4" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.4.tgz#6daaee9e12f9759e19e55ba313956883ef50e0a7" - integrity sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ== + version "6.0.5" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.5.tgz#714892aa4a871db671abc5395e5e9447bc306a16" + integrity sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg== dependencies: basic-ftp "^5.0.2" data-uri-to-buffer "^6.0.2" @@ -1560,21 +1307,13 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^13.19.0, globals@^13.24.0: +globals@^13.19.0: version "13.24.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -1587,12 +1326,10 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" @@ -1604,41 +1341,31 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: +has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: +has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: +hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -1666,11 +1393,6 @@ https-proxy-agent@^7.0.6: agent-base "^7.1.2" debug "4" -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - iconv-lite@^0.6.0: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" @@ -1678,15 +1400,15 @@ iconv-lite@^0.6.0: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +ignore@^5.2.0, ignore@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -1709,73 +1431,24 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -ip-address@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" - integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== - dependencies: - jsbn "1.1.0" - sprintf-js "^1.1.3" +ip-address@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.0.1.tgz#a8180b783ce7788777d796286d61bce4276818ed" + integrity sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA== is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-builtin-module@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" - integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b" + integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== dependencies: - builtin-modules "^3.3.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.12.1, is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== - dependencies: - hasown "^2.0.2" - is-core-module@^2.16.0: version "2.16.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" @@ -1783,20 +1456,6 @@ is-core-module@^2.16.0: dependencies: hasown "^2.0.2" -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -1808,11 +1467,14 @@ is-fullwidth-code-point@^3.0.0: integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" @@ -1821,18 +1483,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -1843,58 +1493,22 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13, is-typed-array@^1.1.3: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: - which-typed-array "^1.1.14" + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== +is-typed-array@^1.1.3: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: - call-bind "^1.0.2" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + which-typed-array "^1.1.16" isexe@^2.0.0: version "2.0.0" @@ -1925,9 +1539,9 @@ istanbul-lib-source-maps@^5.0.6: istanbul-lib-coverage "^3.0.0" istanbul-reports@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93" + integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -1941,11 +1555,6 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -js-tokens@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.0.tgz#0f893996d6f3ed46df7f0a3b12a03f5fd84223c1" - integrity sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ== - js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -1953,11 +1562,6 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsbn@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" - integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -1978,17 +1582,10 @@ json-stringify-safe@^5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + version "6.2.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" + integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== dependencies: universalify "^2.0.0" optionalDependencies: @@ -2021,12 +1618,10 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -loupe@^3.1.0, loupe@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.1.1.tgz#71d038d59007d890e3247c5db97c1ec5a92edc54" - integrity sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw== - dependencies: - get-func-name "^2.0.1" +loupe@^3.1.0, loupe@^3.1.2: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" + integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== lru-cache@^10.2.0: version "10.4.3" @@ -2038,20 +1633,20 @@ lru-cache@^7.14.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -magic-string@^0.30.10: - version "0.30.10" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e" - integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== +magic-string@^0.30.12: + version "0.30.19" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.19.tgz#cebe9f104e565602e5d2098c5f2e79a77cc86da9" + integrity sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw== dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" + "@jridgewell/sourcemap-codec" "^1.5.5" -magicast@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/magicast/-/magicast-0.3.4.tgz#bbda1791d03190a24b00ff3dd18151e7fd381d19" - integrity sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q== +magicast@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/magicast/-/magicast-0.3.5.tgz#8301c3c7d66704a0771eb1bad74274f0ec036739" + integrity sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ== dependencies: - "@babel/parser" "^7.24.4" - "@babel/types" "^7.24.0" + "@babel/parser" "^7.25.4" + "@babel/types" "^7.25.4" source-map-js "^1.2.0" make-dir@^4.0.0: @@ -2061,29 +1656,24 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -micromatch@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -2103,30 +1693,20 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1, ms@^2.1.3: +ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== natural-compare@^1.4.0: version "1.4.0" @@ -2139,75 +1719,27 @@ netmask@^2.0.2: integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== nock@^13.5.4: - version "13.5.4" - resolved "https://registry.yarnpkg.com/nock/-/nock-13.5.4.tgz#8918f0addc70a63736170fef7106a9721e0dc479" - integrity sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw== + version "13.5.6" + resolved "https://registry.yarnpkg.com/nock/-/nock-13.5.6.tgz#5e693ec2300bbf603b61dae6df0225673e6c4997" + integrity sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ== dependencies: debug "^4.1.0" json-stringify-safe "^5.0.1" propagate "^2.0.0" -node-fetch@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.fromentries@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== -object.values@^1.1.7: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== +node-fetch@*, node-fetch@^3: + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" once@^1.3.0: version "1.4.0" @@ -2216,13 +1748,6 @@ once@^1.3.0: dependencies: wrappy "1" -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -2272,9 +1797,9 @@ pac-resolver@^7.0.1: netmask "^2.0.2" package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== parent-module@^1.0.0: version "1.0.1" @@ -2298,11 +1823,6 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -2326,39 +1846,44 @@ pathe@^1.1.2: resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== +pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + pathval@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" - integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== + version "2.0.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" + integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== -picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.2: +picomatch@^4.0.2, picomatch@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== -postcss@^8.4.39: - version "8.4.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.39.tgz#aa3c94998b61d3a9c259efa51db4b392e1bde0e3" - integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw== +postcss@^8.4.43: + version "8.5.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== dependencies: - nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" prelude-ls@^1.2.1: version "1.2.1" @@ -2404,16 +1929,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -2433,19 +1948,10 @@ resolve@^1.22.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.22.2, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rimraf@^3.0.2: version "3.0.2" @@ -2455,38 +1961,43 @@ rimraf@^3.0.2: glob "^7.1.3" rollup-plugin-esbuild@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-esbuild/-/rollup-plugin-esbuild-6.1.1.tgz#ec1dba647dbe1974f76192c75e907aa6eb636399" - integrity sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw== + version "6.2.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-esbuild/-/rollup-plugin-esbuild-6.2.1.tgz#c556195465bf452965686e0f21adfe306b90c219" + integrity sha512-jTNOMGoMRhs0JuueJrJqbW8tOwxumaWYq+V5i+PD+8ecSCVkuX27tGW7BXqDgoULQ55rO7IdNxPcnsWtshz3AA== dependencies: - "@rollup/pluginutils" "^5.0.5" - debug "^4.3.4" - es-module-lexer "^1.3.1" - get-tsconfig "^4.7.2" + debug "^4.4.0" + es-module-lexer "^1.6.0" + get-tsconfig "^4.10.0" + unplugin-utils "^0.2.4" -rollup@^4.13.0, rollup@^4.18.0: - version "4.18.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.1.tgz#18a606df5e76ca53b8a69f2d8eab256d69dda851" - integrity sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A== +rollup@^4.18.0, rollup@^4.20.0: + version "4.50.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.50.2.tgz#938d898394939f3386d1e367ee6410a796b8f268" + integrity sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w== dependencies: - "@types/estree" "1.0.5" + "@types/estree" "1.0.8" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.18.1" - "@rollup/rollup-android-arm64" "4.18.1" - "@rollup/rollup-darwin-arm64" "4.18.1" - "@rollup/rollup-darwin-x64" "4.18.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.18.1" - "@rollup/rollup-linux-arm-musleabihf" "4.18.1" - "@rollup/rollup-linux-arm64-gnu" "4.18.1" - "@rollup/rollup-linux-arm64-musl" "4.18.1" - "@rollup/rollup-linux-powerpc64le-gnu" "4.18.1" - "@rollup/rollup-linux-riscv64-gnu" "4.18.1" - "@rollup/rollup-linux-s390x-gnu" "4.18.1" - "@rollup/rollup-linux-x64-gnu" "4.18.1" - "@rollup/rollup-linux-x64-musl" "4.18.1" - "@rollup/rollup-win32-arm64-msvc" "4.18.1" - "@rollup/rollup-win32-ia32-msvc" "4.18.1" - "@rollup/rollup-win32-x64-msvc" "4.18.1" + "@rollup/rollup-android-arm-eabi" "4.50.2" + "@rollup/rollup-android-arm64" "4.50.2" + "@rollup/rollup-darwin-arm64" "4.50.2" + "@rollup/rollup-darwin-x64" "4.50.2" + "@rollup/rollup-freebsd-arm64" "4.50.2" + "@rollup/rollup-freebsd-x64" "4.50.2" + "@rollup/rollup-linux-arm-gnueabihf" "4.50.2" + "@rollup/rollup-linux-arm-musleabihf" "4.50.2" + "@rollup/rollup-linux-arm64-gnu" "4.50.2" + "@rollup/rollup-linux-arm64-musl" "4.50.2" + "@rollup/rollup-linux-loong64-gnu" "4.50.2" + "@rollup/rollup-linux-ppc64-gnu" "4.50.2" + "@rollup/rollup-linux-riscv64-gnu" "4.50.2" + "@rollup/rollup-linux-riscv64-musl" "4.50.2" + "@rollup/rollup-linux-s390x-gnu" "4.50.2" + "@rollup/rollup-linux-x64-gnu" "4.50.2" + "@rollup/rollup-linux-x64-musl" "4.50.2" + "@rollup/rollup-openharmony-arm64" "4.50.2" + "@rollup/rollup-win32-arm64-msvc" "4.50.2" + "@rollup/rollup-win32-ia32-msvc" "4.50.2" + "@rollup/rollup-win32-x64-msvc" "4.50.2" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -2496,41 +2007,26 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: - call-bind "^1.0.6" + call-bound "^1.0.2" es-errors "^1.3.0" - is-regex "^1.1.4" + is-regex "^1.2.1" "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.5.3, semver@^7.6.0: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== -semver@^7.0.0, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - -set-function-length@^1.2.1: +set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== @@ -2542,16 +2038,6 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -set-function-name@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2564,22 +2050,12 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - siginfo@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -signal-exit@^4.0.1, signal-exit@^4.1.0: +signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -2609,39 +2085,35 @@ socks-proxy-agent@^8.0.5: socks "^2.8.3" socks@^2.8.3: - version "2.8.4" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc" - integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ== + version "2.8.7" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea" + integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A== dependencies: - ip-address "^9.0.5" + ip-address "^10.0.1" smart-buffer "^4.2.0" -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-js@^1.2.0, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sprintf-js@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - stackback@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== -std-env@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" - integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== +std-env@^3.8.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" + integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== -"string-width-cjs@npm:string-width@^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -2650,15 +2122,6 @@ std-env@^3.7.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -2668,34 +2131,6 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1, strip-ansi@^7.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -2703,28 +2138,11 @@ string.prototype.trimstart@^1.0.8: dependencies: ansi-regex "^5.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strip-literal@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.0.tgz#6d82ade5e2e74f5c7e8739b6c84692bd65f0bd2a" - integrity sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw== - dependencies: - js-tokens "^9.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -2751,35 +2169,35 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -tinybench@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.8.0.tgz#30e19ae3a27508ee18273ffed9ac7018949acd7b" - integrity sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw== +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== -tinypool@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.0.0.tgz#a68965218e04f4ad9de037d2a1cd63cda9afb238" - integrity sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ== +tinyexec@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== + +tinypool@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" + integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== tinyrainbow@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== -tinyspy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.0.tgz#cb61644f2713cd84dee184863f4642e06ddf0585" - integrity sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA== +tinyspy@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" + integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== tmp@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" - integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + version "0.2.5" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" + integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== to-regex-range@^5.0.1: version "5.0.1" @@ -2788,25 +2206,10 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" + version "1.4.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== tslib@^2.0.1: version "2.8.1" @@ -2825,75 +2228,29 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typescript@^5.5.3: - version "5.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" - integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" +typescript@~5.5: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== universalify@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== +unplugin-utils@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/unplugin-utils/-/unplugin-utils-0.2.5.tgz#d2fe44566ffffd7f216579bbb01184f6702e379b" + integrity sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg== + dependencies: + pathe "^2.0.3" + picomatch "^4.0.3" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -2912,86 +2269,70 @@ util@^0.12.5: is-typed-array "^1.1.3" which-typed-array "^1.1.2" -vite-node@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.0.2.tgz#6e1958b2db655ddef8c95e6fb461bcd954b7fbbf" - integrity sha512-w4vkSz1Wo+NIQg8pjlEn0jQbcM/0D+xVaYjhw3cvarTanLLBh54oNiRbsT8PNK5GfuST0IlVXjsNRoNlqvY/fw== +vite-node@2.1.9: + version "2.1.9" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.9.tgz#549710f76a643f1c39ef34bdb5493a944e4f895f" + integrity sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA== dependencies: cac "^6.7.14" - debug "^4.3.5" + debug "^4.3.7" + es-module-lexer "^1.5.4" pathe "^1.1.2" - tinyrainbow "^1.2.0" vite "^5.0.0" vite@^5.0.0: - version "5.3.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.3.tgz#5265b1f0a825b3b6564c2d07524777c83e3c04c2" - integrity sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A== + version "5.4.20" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.20.tgz#3267a5e03f21212f44edfd72758138e8fcecd76a" + integrity sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g== dependencies: esbuild "^0.21.3" - postcss "^8.4.39" - rollup "^4.13.0" + postcss "^8.4.43" + rollup "^4.20.0" optionalDependencies: fsevents "~2.3.3" vitest@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.0.2.tgz#39a4bde8af124c848b4e9098ca339914ebe10ef9" - integrity sha512-WlpZ9neRIjNBIOQwBYfBSr0+of5ZCbxT2TVGKW4Lv0c8+srCFIiRdsP7U009t8mMn821HQ4XKgkx5dVWpyoyLw== - dependencies: - "@ampproject/remapping" "^2.3.0" - "@vitest/expect" "2.0.2" - "@vitest/pretty-format" "^2.0.2" - "@vitest/runner" "2.0.2" - "@vitest/snapshot" "2.0.2" - "@vitest/spy" "2.0.2" - "@vitest/utils" "2.0.2" - chai "^5.1.1" - debug "^4.3.5" - execa "^8.0.1" - magic-string "^0.30.10" + version "2.1.9" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.9.tgz#7d01ffd07a553a51c87170b5e80fea3da7fb41e7" + integrity sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q== + dependencies: + "@vitest/expect" "2.1.9" + "@vitest/mocker" "2.1.9" + "@vitest/pretty-format" "^2.1.9" + "@vitest/runner" "2.1.9" + "@vitest/snapshot" "2.1.9" + "@vitest/spy" "2.1.9" + "@vitest/utils" "2.1.9" + chai "^5.1.2" + debug "^4.3.7" + expect-type "^1.1.0" + magic-string "^0.30.12" pathe "^1.1.2" - std-env "^3.7.0" - tinybench "^2.8.0" - tinypool "^1.0.0" + std-env "^3.8.0" + tinybench "^2.9.0" + tinyexec "^0.3.1" + tinypool "^1.0.1" tinyrainbow "^1.2.0" vite "^5.0.0" - vite-node "2.0.2" - why-is-node-running "^2.2.2" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" + vite-node "2.1.9" + why-is-node-running "^2.3.0" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" +web-streams-polyfill@^3.0.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== +which-typed-array@^1.1.16, which-typed-array@^1.1.2: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== dependencies: available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" has-tostringtag "^1.0.2" which@^2.0.1: @@ -3001,7 +2342,7 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -why-is-node-running@^2.2.2: +why-is-node-running@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== From f1834c482aa9848902c2eb44fb1fcc04ab57f0ff Mon Sep 17 00:00:00 2001 From: 95gabor Date: Thu, 18 Sep 2025 10:05:24 +0200 Subject: [PATCH 02/13] feat(trusted-timestamp): unauthorized proxy config option --- src/trustedTimestamp/TimestampRequest.ts | 12 +++++++++--- src/trustedTimestamp/TrustedTimestampRequest.ts | 2 +- .../types/timestamp-provider.type.ts | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/trustedTimestamp/TimestampRequest.ts b/src/trustedTimestamp/TimestampRequest.ts index dbc3c5f..1c7cac2 100644 --- a/src/trustedTimestamp/TimestampRequest.ts +++ b/src/trustedTimestamp/TimestampRequest.ts @@ -55,8 +55,11 @@ export class TimestampRequest { /** * set request proxy * */ - setProxy(proxyUrl: string): void { - this.tsRequest.agent = new ProxyAgent({ getProxyForUrl: (): string => proxyUrl }) + setProxy(proxy: TimestampProviderProxyConfig): void { + this.tsRequest.agent = new ProxyAgent({ + getProxyForUrl: (): string => proxy.url, + rejectUnauthorized: !(proxy.allowUnauthorized ?? false) + }) } /** @@ -223,7 +226,10 @@ export class TimestampRequest { } if (proxy?.url) { - tsRequest.agent = new ProxyAgent({ getProxyForUrl: (): string => proxy.url }) + tsRequest.agent = new ProxyAgent({ + getProxyForUrl: (): string => proxy.url, + rejectUnauthorized: !(proxy.allowUnauthorized ?? false) + }) } return tsRequest diff --git a/src/trustedTimestamp/TrustedTimestampRequest.ts b/src/trustedTimestamp/TrustedTimestampRequest.ts index 681fe84..cb14cf1 100644 --- a/src/trustedTimestamp/TrustedTimestampRequest.ts +++ b/src/trustedTimestamp/TrustedTimestampRequest.ts @@ -148,7 +148,7 @@ export class TrustedTimestampRequest { const tsRequest = new TimestampRequest(this.tempFileService, this.tmpOptions, this.cleanupTempFns) if (proxy?.url) { - tsRequest.setProxy(proxy.url) + tsRequest.setProxy(proxy) } let requestType: TimestampRequestAuthTypes | undefined diff --git a/src/trustedTimestamp/types/timestamp-provider.type.ts b/src/trustedTimestamp/types/timestamp-provider.type.ts index dad496b..20195d3 100644 --- a/src/trustedTimestamp/types/timestamp-provider.type.ts +++ b/src/trustedTimestamp/types/timestamp-provider.type.ts @@ -1,5 +1,6 @@ export interface TimestampProviderProxyConfig { url: string + allowUnauthorized?: boolean } export interface TimestampProviderOAuthUrl { From 4fe3b513fc01025bada50b3a3a109af4aae16877 Mon Sep 17 00:00:00 2001 From: 95gabor Date: Thu, 18 Sep 2025 10:45:35 +0200 Subject: [PATCH 03/13] docs(proxy): add proxy documentation and docker example --- README.md | 19 ++++++++++--------- docs/proxy.md | 32 ++++++++++++++++++++++++++++++++ proxy/docker-compose.yaml | 16 ++++++++++++++++ 3 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 docs/proxy.md create mode 100644 proxy/docker-compose.yaml diff --git a/README.md b/README.md index a2d3421..372b523 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,16 @@ Trustedtimestamp service implements the generate and verification of timestamps. -- [Install](#install) -- [Usage](#usage) - - [Params](#params) -- [Default config](#default-config) -- [Config provider options](#config-provider-options) - - [Required fields](#required-fields) - - [Optional fields](#optional-fields) -- [Config example](#config-example) -- [Public methods](#public-methods) +- [Timestamp](#timestamp) + - [Install](#install) + - [Usage](#usage) + - [Params](#params) + - [Default config](#default-config) + - [Config provider options](#config-provider-options) + - [Required fields](#required-fields) + - [Optional fields](#optional-fields) + - [Config example](#config-example) + - [Public methods](#public-methods) ## Install diff --git a/docs/proxy.md b/docs/proxy.md new file mode 100644 index 0000000..581b903 --- /dev/null +++ b/docs/proxy.md @@ -0,0 +1,32 @@ +# Proxy configuration + +## Configure local proxy + +```shell +cd proxy +docker-compose up +``` + +## Application usage + +```json +{ + "trustedTimestamp": { + "certsLocation": "/etc/ssl/certs/", + "providers": [ + { + "name": "bteszt", + "url": "https://bteszt.e-szigno.hu/tsa", + "auth": { + "user": "", + "pass": "" + }, + "proxy": { + "url": "http://localhost:8080", + "allowUnauthorized": true + } + } + ] + } +} +``` diff --git a/proxy/docker-compose.yaml b/proxy/docker-compose.yaml new file mode 100644 index 0000000..2d50d49 --- /dev/null +++ b/proxy/docker-compose.yaml @@ -0,0 +1,16 @@ +services: + proxy: + image: mitmproxy/mitmproxy + command: + - 'mitmweb' + - '--no-web-open-browser' + - '--listen-port' + - '8080' + - '--web-host' + - '0.0.0.0' + # - '--set' + # - 'web_password=test' + tty: true + ports: + - 8080:8080 + - 127.0.0.1:8081:8081 From 567ec42cd5929154d471cab601067131d5c97bc4 Mon Sep 17 00:00:00 2001 From: 95gabor Date: Thu, 18 Sep 2025 10:54:37 +0200 Subject: [PATCH 04/13] fix(timestamp-request): set headers --- src/trustedTimestamp/TimestampRequest.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/trustedTimestamp/TimestampRequest.ts b/src/trustedTimestamp/TimestampRequest.ts index 1c7cac2..c1b6159 100644 --- a/src/trustedTimestamp/TimestampRequest.ts +++ b/src/trustedTimestamp/TimestampRequest.ts @@ -38,10 +38,10 @@ export class TimestampRequest { /** * set request header * */ - setHeader(headers: Record): void { + setHeader(headers: Record): void { this.tsRequest = { ...this.tsRequest, - ...headers + headers } } From 603dc680a7f5bb57e7cb0772cf6dc9dd0fb13007 Mon Sep 17 00:00:00 2001 From: 95gabor Date: Fri, 19 Sep 2025 11:05:31 +0200 Subject: [PATCH 05/13] fix!: npm engine node updated from v16 to v22.19 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d3a5a32..20ecb22 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "url": "https://github.com/TechTeamer/timestamp" }, "engines": { - "node": ">=16.20.1" + "node": ">=22.17.0" }, "scripts": { "vitest": "vitest run --config test/vitest.config.ts", From 3d0a39ea92adb7c85309ca60cd454105a1d4e0b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nagy=20Bal=C3=A1zs?= Date: Fri, 19 Sep 2025 12:09:49 +0200 Subject: [PATCH 06/13] chore: release --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 20ecb22..6caa39c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@techteamer/timestamp", - "version": "1.0.6", + "version": "1.0.7", "description": "This package contains a TimestampService, which can create and verity timestamps", "main": "src/index.ts", "author": "Techteamer", @@ -21,7 +21,7 @@ "url": "https://github.com/TechTeamer/timestamp" }, "engines": { - "node": ">=22.17.0" + "node": ">=22.0.0" }, "scripts": { "vitest": "vitest run --config test/vitest.config.ts", From 39c5db66fa9e5122202148ddbf61d8698af12978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nagy=20Bal=C3=A1zs?= Date: Fri, 19 Sep 2025 12:12:06 +0200 Subject: [PATCH 07/13] fix(TimestampRequest): content-length to string --- src/trustedTimestamp/TimestampRequest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trustedTimestamp/TimestampRequest.ts b/src/trustedTimestamp/TimestampRequest.ts index c1b6159..71a5797 100644 --- a/src/trustedTimestamp/TimestampRequest.ts +++ b/src/trustedTimestamp/TimestampRequest.ts @@ -167,7 +167,7 @@ export class TimestampRequest { this.setBody(fs.createReadStream(tempPath)) this.setHeader({ ...this.tsRequest.headers, - 'Content-length': fileSizeInBytes + 'Content-length': fileSizeInBytes.toString() }) } From d52d6acbeb4ddc2d2d2acca96d9207221b410cc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nagy=20Bal=C3=A1zs?= Date: Fri, 19 Sep 2025 12:13:06 +0200 Subject: [PATCH 08/13] chore: release with breaking change --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6caa39c..8e43605 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@techteamer/timestamp", - "version": "1.0.7", + "version": "2.0.0", "description": "This package contains a TimestampService, which can create and verity timestamps", "main": "src/index.ts", "author": "Techteamer", From 4166624b8da46e896034eebc7b31483cc6edc49c Mon Sep 17 00:00:00 2001 From: 95gabor Date: Fri, 19 Sep 2025 13:23:02 +0200 Subject: [PATCH 09/13] fix(node-fetch): using ESM bundle --- src/patch/node-fetch.ts | 6 ++++++ src/trustedTimestamp/TimestampRequest.ts | 3 ++- src/trustedTimestamp/TrustedTimestampRequest.ts | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 src/patch/node-fetch.ts diff --git a/src/patch/node-fetch.ts b/src/patch/node-fetch.ts new file mode 100644 index 0000000..1821826 --- /dev/null +++ b/src/patch/node-fetch.ts @@ -0,0 +1,6 @@ +import type { RequestInfo, RequestInit, Response } from 'node-fetch' + +export const fetch = async (url: URL | RequestInfo, init?: RequestInit): Promise => { + const { default: fetch } = await import('node-fetch') + return fetch(url, init) +} diff --git a/src/trustedTimestamp/TimestampRequest.ts b/src/trustedTimestamp/TimestampRequest.ts index 71a5797..6a7dd01 100644 --- a/src/trustedTimestamp/TimestampRequest.ts +++ b/src/trustedTimestamp/TimestampRequest.ts @@ -1,4 +1,5 @@ -import fetch, { BodyInit } from 'node-fetch' +import type { BodyInit } from 'node-fetch' +import { fetch } from '../patch/node-fetch' import fs from 'node:fs' import { ProxyAgent } from 'proxy-agent' import type { FileOptions } from 'tmp' diff --git a/src/trustedTimestamp/TrustedTimestampRequest.ts b/src/trustedTimestamp/TrustedTimestampRequest.ts index cb14cf1..77a3e32 100644 --- a/src/trustedTimestamp/TrustedTimestampRequest.ts +++ b/src/trustedTimestamp/TrustedTimestampRequest.ts @@ -1,5 +1,5 @@ -import fetch from 'node-fetch' import { FileOptions as TempFileOptions } from 'tmp' +import { fetch } from '../patch/node-fetch' import { TimestampRequest } from './TimestampRequest' import { TempFileService } from '../util/TempFileService' From 9cabb9ae7397d53187f8a6b53ae46acf8706d67d Mon Sep 17 00:00:00 2001 From: 95gabor Date: Fri, 19 Sep 2025 13:25:53 +0200 Subject: [PATCH 10/13] ci(yarn-vitest): bump node to v22 --- .github/workflows/yarn-vitest.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/yarn-vitest.yaml b/.github/workflows/yarn-vitest.yaml index 900da1d..31bcc11 100644 --- a/.github/workflows/yarn-vitest.yaml +++ b/.github/workflows/yarn-vitest.yaml @@ -10,7 +10,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '22' cache: 'yarn' - run: yarn install --frozen-lockfile - run: yarn test From d738d299005069b71f0cf313bb0a9a01dc0d41bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nagy=20Bal=C3=A1zs?= Date: Fri, 19 Sep 2025 14:55:23 +0200 Subject: [PATCH 11/13] chore: release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8e43605..fe859d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@techteamer/timestamp", - "version": "2.0.0", + "version": "2.0.1", "description": "This package contains a TimestampService, which can create and verity timestamps", "main": "src/index.ts", "author": "Techteamer", From 92f4615f5eb1d3498b5e80b15cd15e26230fdac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nagy=20Bal=C3=A1zs?= Date: Sun, 21 Sep 2025 18:54:32 +0200 Subject: [PATCH 12/13] chore: init --- .editorconfig | 11 + app/cjs/app/createTimestamp.test.js | 54 + app/cjs/package.json | 12 + app/forge/digest.js | 18 + app/forge/mock_response.tsr | Bin 0 -> 1451 bytes app/forge/package.json | 10 + app/forge/request.tsq | Bin 0 -> 59 bytes app/forge/test.txt | 1 + app/forge/tsa_mock.js | 85 + app/forge/tsa_openssl.cnf | 28 + app/forge/tsr-generator.js | 104 + mock_servers/__files/tsa_response.json | 4 + {proxy => mock_servers}/docker-compose.yaml | 11 +- mock_servers/mappings/signo.json | 13 + package-lock.json | 4312 +++++++++++++++++ package.json | 69 +- .../timestamp_service/.eslintignore | 0 .../timestamp_service/.eslintrc.json | 0 .../timestamp_service/.prettierrc.json | 0 .../timestamp_service/build/src/index.d.ts | 2 + .../build/src/patch/node-fetch.d.ts | 2 + .../trustedTimestamp/TimestampRequest.d.ts | 63 + .../TrustedTimestampCheck.d.ts | 3 + .../TrustedTimestampCommand.d.ts | 6 + .../TrustedTimestampInfo.d.ts | 51 + .../TrustedTimestampRequest.d.ts | 34 + .../TrustedTimestampService.d.ts | 50 + .../error/create-timestamp-token.error.d.ts | 9 + .../types/timestamp-config.type.d.ts | 5 + .../types/timestamp-log.type.d.ts | 12 + .../types/timestamp-provider.type.d.ts | 22 + .../types/timestamp-request.type.d.ts | 20 + .../types/timestamp-token.type.d.ts | 15 + .../build/src/util/TempFileService.d.ts | 11 + .../build/src/util/child_process_promise.d.ts | 17 + .../build/src/util/regexParser.d.ts | 4 + .../build/timestamp_config.cjs | 775 +++ .../build/timestamp_config.cjs.map | 1 + .../build/timestamp_config.mjs | 753 +++ .../build/timestamp_config.mjs.map | 1 + package/timestamp_service/package.json | 68 + .../timestamp_service/rollup.config.js | 0 .../timestamp_service/src}/index.ts | 0 .../src}/patch/node-fetch.ts | 0 .../src}/trustedTimestamp/TimestampRequest.ts | 0 .../trustedTimestamp/TrustedTimestampCheck.ts | 0 .../TrustedTimestampCommand.ts | 0 .../trustedTimestamp/TrustedTimestampInfo.ts | 0 .../TrustedTimestampRequest.ts | 0 .../TrustedTimestampService.ts | 0 .../error/create-timestamp-token.error.ts | 0 .../types/timestamp-config.type.ts | 0 .../types/timestamp-log.type.ts | 0 .../types/timestamp-provider.type.ts | 0 .../types/timestamp-request.type.ts | 0 .../types/timestamp-token.type.ts | 0 .../src}/util/TempFileService.ts | 0 .../src}/util/child_process_promise.ts | 0 .../src}/util/regexParser.ts | 0 .../test/coverage/jest/base.css | 224 + .../test/coverage/jest/block-navigation.js | 87 + .../test/coverage/jest/favicon.png | Bin 0 -> 445 bytes .../test/coverage/jest/index.html | 146 + .../test/coverage/jest/lcov.info | 1227 +++++ .../test/coverage/jest/prettify.css | 1 + .../test/coverage/jest/prettify.js | 2 + .../test/coverage/jest/sort-arrow-sprite.png | Bin 0 -> 138 bytes .../test/coverage/jest/sorter.js | 196 + .../jest/timestamp_service/index.html | 116 + .../jest/timestamp_service/index.js.html | 94 + .../trustedTimestamp/TimestampRequest.js.html | 775 +++ .../TrustedTimestampCheck.js.html | 178 + .../TrustedTimestampInfo.js.html | 544 +++ .../TrustedTimestampRequest.js.html | 673 +++ .../TrustedTimestampService.js.html | 880 ++++ .../src/trustedTimestamp/index.html | 176 + .../src/util/TempFileService.js.html | 181 + .../timestamp_service/src/util/index.html | 131 + .../src/util/regexParser.js.html | 184 + .../test/coverage/vitest/lcov.info | 1151 +++++ .../tests/feature/timestamp-service.test.ts | 0 .../mocks/TrustedTimestampCommand.mock.ts | 0 .../timestamp_service/test}/vitest.config.ts | 0 .../timestamp_service/tsconfig.json | 0 yarn.lock | 966 ++-- 85 files changed, 13965 insertions(+), 623 deletions(-) create mode 100644 .editorconfig create mode 100644 app/cjs/app/createTimestamp.test.js create mode 100644 app/cjs/package.json create mode 100644 app/forge/digest.js create mode 100644 app/forge/mock_response.tsr create mode 100644 app/forge/package.json create mode 100644 app/forge/request.tsq create mode 100644 app/forge/test.txt create mode 100644 app/forge/tsa_mock.js create mode 100644 app/forge/tsa_openssl.cnf create mode 100644 app/forge/tsr-generator.js create mode 100644 mock_servers/__files/tsa_response.json rename {proxy => mock_servers}/docker-compose.yaml (51%) create mode 100644 mock_servers/mappings/signo.json create mode 100644 package-lock.json rename .eslintignore => package/timestamp_service/.eslintignore (100%) rename .eslintrc.json => package/timestamp_service/.eslintrc.json (100%) rename .prettierrc.json => package/timestamp_service/.prettierrc.json (100%) create mode 100644 package/timestamp_service/build/src/index.d.ts create mode 100644 package/timestamp_service/build/src/patch/node-fetch.d.ts create mode 100644 package/timestamp_service/build/src/trustedTimestamp/TimestampRequest.d.ts create mode 100644 package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampCheck.d.ts create mode 100644 package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampCommand.d.ts create mode 100644 package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampInfo.d.ts create mode 100644 package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampRequest.d.ts create mode 100644 package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampService.d.ts create mode 100644 package/timestamp_service/build/src/trustedTimestamp/error/create-timestamp-token.error.d.ts create mode 100644 package/timestamp_service/build/src/trustedTimestamp/types/timestamp-config.type.d.ts create mode 100644 package/timestamp_service/build/src/trustedTimestamp/types/timestamp-log.type.d.ts create mode 100644 package/timestamp_service/build/src/trustedTimestamp/types/timestamp-provider.type.d.ts create mode 100644 package/timestamp_service/build/src/trustedTimestamp/types/timestamp-request.type.d.ts create mode 100644 package/timestamp_service/build/src/trustedTimestamp/types/timestamp-token.type.d.ts create mode 100644 package/timestamp_service/build/src/util/TempFileService.d.ts create mode 100644 package/timestamp_service/build/src/util/child_process_promise.d.ts create mode 100644 package/timestamp_service/build/src/util/regexParser.d.ts create mode 100644 package/timestamp_service/build/timestamp_config.cjs create mode 100644 package/timestamp_service/build/timestamp_config.cjs.map create mode 100644 package/timestamp_service/build/timestamp_config.mjs create mode 100644 package/timestamp_service/build/timestamp_config.mjs.map create mode 100644 package/timestamp_service/package.json rename rollup.config.js => package/timestamp_service/rollup.config.js (100%) rename {src => package/timestamp_service/src}/index.ts (100%) rename {src => package/timestamp_service/src}/patch/node-fetch.ts (100%) rename {src => package/timestamp_service/src}/trustedTimestamp/TimestampRequest.ts (100%) rename {src => package/timestamp_service/src}/trustedTimestamp/TrustedTimestampCheck.ts (100%) rename {src => package/timestamp_service/src}/trustedTimestamp/TrustedTimestampCommand.ts (100%) rename {src => package/timestamp_service/src}/trustedTimestamp/TrustedTimestampInfo.ts (100%) rename {src => package/timestamp_service/src}/trustedTimestamp/TrustedTimestampRequest.ts (100%) rename {src => package/timestamp_service/src}/trustedTimestamp/TrustedTimestampService.ts (100%) rename {src => package/timestamp_service/src}/trustedTimestamp/error/create-timestamp-token.error.ts (100%) rename {src => package/timestamp_service/src}/trustedTimestamp/types/timestamp-config.type.ts (100%) rename {src => package/timestamp_service/src}/trustedTimestamp/types/timestamp-log.type.ts (100%) rename {src => package/timestamp_service/src}/trustedTimestamp/types/timestamp-provider.type.ts (100%) rename {src => package/timestamp_service/src}/trustedTimestamp/types/timestamp-request.type.ts (100%) rename {src => package/timestamp_service/src}/trustedTimestamp/types/timestamp-token.type.ts (100%) rename {src => package/timestamp_service/src}/util/TempFileService.ts (100%) rename {src => package/timestamp_service/src}/util/child_process_promise.ts (100%) rename {src => package/timestamp_service/src}/util/regexParser.ts (100%) create mode 100644 package/timestamp_service/test/coverage/jest/base.css create mode 100644 package/timestamp_service/test/coverage/jest/block-navigation.js create mode 100644 package/timestamp_service/test/coverage/jest/favicon.png create mode 100644 package/timestamp_service/test/coverage/jest/index.html create mode 100644 package/timestamp_service/test/coverage/jest/lcov.info create mode 100644 package/timestamp_service/test/coverage/jest/prettify.css create mode 100644 package/timestamp_service/test/coverage/jest/prettify.js create mode 100644 package/timestamp_service/test/coverage/jest/sort-arrow-sprite.png create mode 100644 package/timestamp_service/test/coverage/jest/sorter.js create mode 100644 package/timestamp_service/test/coverage/jest/timestamp_service/index.html create mode 100644 package/timestamp_service/test/coverage/jest/timestamp_service/index.js.html create mode 100644 package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TimestampRequest.js.html create mode 100644 package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampCheck.js.html create mode 100644 package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampInfo.js.html create mode 100644 package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampRequest.js.html create mode 100644 package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampService.js.html create mode 100644 package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/index.html create mode 100644 package/timestamp_service/test/coverage/jest/timestamp_service/src/util/TempFileService.js.html create mode 100644 package/timestamp_service/test/coverage/jest/timestamp_service/src/util/index.html create mode 100644 package/timestamp_service/test/coverage/jest/timestamp_service/src/util/regexParser.js.html create mode 100644 package/timestamp_service/test/coverage/vitest/lcov.info rename {test => package/timestamp_service/test}/tests/feature/timestamp-service.test.ts (100%) rename {test => package/timestamp_service/test}/tests/mocks/TrustedTimestampCommand.mock.ts (100%) rename {test => package/timestamp_service/test}/vitest.config.ts (100%) rename tsconfig.json => package/timestamp_service/tsconfig.json (100%) diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..14ea680 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 240 diff --git a/app/cjs/app/createTimestamp.test.js b/app/cjs/app/createTimestamp.test.js new file mode 100644 index 0000000..fc524bc --- /dev/null +++ b/app/cjs/app/createTimestamp.test.js @@ -0,0 +1,54 @@ +const path = require('path') +const { TrustedTimestampService: TrustedTimestampServiceLib, CreateTimestampTokenError } = require('@techteamer/timestamp') + +const certPath = path.join(__dirname, '..', '..', 'cert'); + +const config = { + certsLocation: certPath, + providers: [ + { + name: 'bteszt', + url: 'http://wiremock:8080/tsa', + auth: { + user: 'username', + pass: 'password' + }, + proxy: { + url: 'http://localhost:8080' + } + } + ] +} + +async function createTimestampToken () { + const trustedTimestampServiceInstance = new TrustedTimestampServiceLib('normal', config) + const digest = 'ca447095370ccb6f66157119a7dd100ee889a7c6baf69a52b37d0c4040c19e68' + const hashAlgorithm = 'sha256' + const dataSize = 20 + + try { + const { timestamp, providerName } = await trustedTimestampServiceInstance.createTimestampToken( + digest, + hashAlgorithm, + dataSize + ) + console.info({ timestamp, providerName }) + } catch (err) { + if (err instanceof CreateTimestampTokenError) { + const { providerName, logHistory } = err.context + + console.error( + 'Failed to create trusted timestamp.', + `Provider: ${providerName},`, + `history: ${JSON.stringify(logHistory, null, 2)}` + ) + } + + console.error('Failed to create trusted timestamp', err) + throw new Error('Failed to create trusted timestamp') + } + + +} + +createTimestampToken() diff --git a/app/cjs/package.json b/app/cjs/package.json new file mode 100644 index 0000000..a18888a --- /dev/null +++ b/app/cjs/package.json @@ -0,0 +1,12 @@ +{ + "name": "cjs", + "version": "1.0.0", + "main": "test/index.js", + "license": "MIT", + "scripts": { + "start": "node app/createTimestamp.test.js" + }, + "dependencies": { + "@techteamer/timestamp": "file:../../package/timestamp_service" + } +} diff --git a/app/forge/digest.js b/app/forge/digest.js new file mode 100644 index 0000000..e3a684f --- /dev/null +++ b/app/forge/digest.js @@ -0,0 +1,18 @@ +const fs = require('fs'); +const crypto = require('crypto'); + +const filePath = 'test.txt'; // vagy bármilyen másik fájl + +const data = fs.readFileSync(filePath); + +// SHA256 digest +const hash = crypto.createHash('sha256'); +hash.update(data); +const digestHex = hash.digest('hex'); + +// Méret +const fileSize = data.length; + +console.log(`Fájl: ${filePath}`); +console.log(`Méret: ${fileSize} byte`); +console.log(`SHA256 digest: ${digestHex}`); diff --git a/app/forge/mock_response.tsr b/app/forge/mock_response.tsr new file mode 100644 index 0000000000000000000000000000000000000000..4cfbf2f78337c9897f6214dde7aaee86e833571a GIT binary patch literal 1451 zcmXqLVqI>)%*4oG(8M~AjZ>@5qwPB{BRkWACf0tSP&X4JqanWmFB@ktOkXIn z)n4nm*X@YHO3@DjXOy@=c0rxY$PILuh@p^y02^~C3o{R=OKEOyr9w!sqk)__FVt{D zBV%KuC?MAiY!`%!Lst`{60-3?e=|2R@&m((k&CH`k&)p(!^`T&A-~oyyt3(^o<<`9}x4l+YaeVml zqgd7(cf0R6%swkw8wnWg{Z^JnP;R5T@Y`2T)i=u zd+WO2YZk7~KJ1>;*zj!H2kAXQ^>WI>2F>=fIcuVo8+ zztQJY`m=W~FDI5fp7Heb;;nDCvpd{4?Za`lOl@t5{QJ6^>xb@I-q?Om{rWeX)2xfT zU;gL5q4R5MpqUhV_34_lfU9s@2m4sA9@R#tXq4g*<` zARmhui-^s~rHlvdGFNO*5ODAMkW_H|fVQiFB}iJC#mK;5p~Mm~?D5k?Oo9N$7$bwS zqmb9K^y6Fy){C7yE~d8a%qRKU%>D0@oR{<7X$;T2^1XaYpmg2hq`$TkXPT)xAHAVy z?G&OJ+4p|YnfM!_eR)%)(p1(y-q~6B`RDaVQw3DtKPsJnJ)WO&x>l3-zuRXHPCw7A z_fTP9hOLgvd9@ZVg+~WZoQ%+j{AN74LM6iI-n==T7BP$VtPA+jv8ZG9tH@u`?EzpuGtj{vn7DHnQnp`^Z6F2DZk)`9ylmXiyvHfP$YP+6 zkYh1aVo{KLyqGU?_i^Jb9FfhZKMSt9(sF)oAKPx0+@lGfQlDA18OR_sup08i^C+YM zK+Ae8O^giFYw~o39K%jMwsn%05@6L$;q1EbQ$2W9x66Ka|LYOafwfzw82fF$5YV7` z`$X6zzf1puJ=VW;c)jq>3%d=Mcic&AJUe~8pb5*5Rg2=jGCHlRuiK@|GwG znky#t{9CmeSC@W0a5W+$=tbFgne87<{$G3`GTZh4>ff0yIhiHGZSPO{Zu(j#l~@q? z#-B@IPx^$uDtVSOJzx0_&k43(Si4ri)IB?L)yj$jLFb2(edpAd{cd>N;_!6!BAp4_ zWQE>*3zg7)6tW|_wjWX7dw12Y52Hj=Ux67GXRp*F+BhP literal 0 HcmV?d00001 diff --git a/app/forge/package.json b/app/forge/package.json new file mode 100644 index 0000000..8885fc3 --- /dev/null +++ b/app/forge/package.json @@ -0,0 +1,10 @@ +{ + "name": "forge", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "devDependencies": { + "asn1.js": "^5.4.1", + "node-forge": "^1.3.1" + } +} diff --git a/app/forge/request.tsq b/app/forge/request.tsq new file mode 100644 index 0000000000000000000000000000000000000000..f5d6ca95ebbfe0b1a8745a3e46921f1b745df8b1 GIT binary patch literal 59 zcmV-B0L1?=IRXIzFflL<1_@w>NC9O71OfpC00bb)L~xZi49jn36>%A--4G7wiKoW8 R_L@?&eGEWA!JcRV0spQY6Bhsg literal 0 HcmV?d00001 diff --git a/app/forge/test.txt b/app/forge/test.txt new file mode 100644 index 0000000..4ed2ed9 --- /dev/null +++ b/app/forge/test.txt @@ -0,0 +1 @@ +Timestamp test file diff --git a/app/forge/tsa_mock.js b/app/forge/tsa_mock.js new file mode 100644 index 0000000..03a09d3 --- /dev/null +++ b/app/forge/tsa_mock.js @@ -0,0 +1,85 @@ +const forge = require('node-forge'); +const fs = require('fs'); + +// Kulcs + tanúsítvány generálása +function generateKeyAndCert() { + return new Promise((resolve, reject) => { + forge.pki.rsa.generateKeyPair({ bits: 2048, workers: 2 }, (err, keypair) => { + if (err) return reject(err); + + const cert = forge.pki.createCertificate(); + cert.publicKey = keypair.publicKey; + cert.serialNumber = (Math.floor(Math.random() * 1e9)).toString(); + const now = new Date(); + cert.validity.notBefore = new Date(now.getTime() - 24 * 60 * 60 * 1000); + cert.validity.notAfter = new Date(now.getTime() + 365 * 24 * 60 * 60 * 1000); + + const attrs = [{ name: 'commonName', value: 'Mock TSA' }]; + cert.setSubject(attrs); + cert.setIssuer(attrs); + + cert.setExtensions([ + { name: 'basicConstraints', cA: false, critical: true }, + { name: 'keyUsage', digitalSignature: true, nonRepudiation: true }, + { + name: 'extKeyUsage', + timeStamping: true, // <- fontos! + critical: true, + }, + { name: 'subjectKeyIdentifier' } + ]); + + cert.sign(keypair.privateKey, forge.md.sha256.create()); + + resolve({ keypair, cert }); + }); + }); +} + +// Mock TSR (egyszerű JSON base64 aláírással) +function createMockTSR(cert, privateKey, dataBytes) { + const md = forge.md.sha256.create(); + md.update(dataBytes.toString('binary')); + + const signature = privateKey.sign(md); + + const mockTSR = { + cert: forge.pki.certificateToPem(cert), + signature: forge.util.encode64(signature), + }; + + return Buffer.from(JSON.stringify(mockTSR)); +} + +async function main() { + if (process.argv.length < 3) { + console.log('Usage: node tsa_mock.js '); + process.exit(1); + } + + const inputFile = process.argv[2]; + const dataBytes = fs.readFileSync(inputFile); + + const { keypair, cert } = await generateKeyAndCert(); + + // Mentés PEM fájlokba + const certPem = forge.pki.certificateToPem(cert); + const keyPem = forge.pki.privateKeyToPem(keypair.privateKey); + + fs.writeFileSync('tsa.crt.pem', certPem); + fs.writeFileSync('tsa.key.pem', keyPem); + + console.log('\n=== Tanúsítvány (tsa.crt.pem) ===\n'); + console.log(certPem); + + console.log('\n=== Privát kulcs (tsa.key.pem) ===\n'); + console.log(keyPem); + + // Mock TSR létrehozása + const tsr = createMockTSR(cert, keypair.privateKey, dataBytes); + fs.writeFileSync('response.tsr', tsr); + + console.log('\n✅ Mock timestamp response elmentve: response.tsr'); +} + +main().catch(console.error); diff --git a/app/forge/tsa_openssl.cnf b/app/forge/tsa_openssl.cnf new file mode 100644 index 0000000..2f64bbd --- /dev/null +++ b/app/forge/tsa_openssl.cnf @@ -0,0 +1,28 @@ +[ req ] +default_bits = 2048 +prompt = no +default_md = sha256 +distinguished_name = dn +x509_extensions = ext + +[ dn ] +CN = Dummy TSA + +[ ext ] +basicConstraints = critical,CA:FALSE +keyUsage = digitalSignature, nonRepudiation +extendedKeyUsage = timeStamping +subjectKeyIdentifier = hash +authorityKeyIdentifier = keyid,issuer + +[ tsa ] +default_tsa = tsa_config1 + +[ tsa_config1 ] +serial = tsa/serial +signer_cert = tsa.crt.pem +certs = tsa.crt.pem +signer_key = tsa.key.pem +digest = sha256 +policy = 1.2.3.4.1 +clock_precision_digits = 2 diff --git a/app/forge/tsr-generator.js b/app/forge/tsr-generator.js new file mode 100644 index 0000000..28c8a35 --- /dev/null +++ b/app/forge/tsr-generator.js @@ -0,0 +1,104 @@ +const fs = require('fs'); +const forge = require('node-forge'); +const asn1 = forge.asn1; + +// --- ADATOK --- // + +const sha256OID = '2.16.840.1.101.3.4.2.1'; // SHA-256 OID +const digestHex = 'ca447095370ccb6f66157119a7dd100ee889a7c6baf69a52b37d0c4040c19e68'; // példa digest +const digestBytes = forge.util.hexToBytes(digestHex); + +// --- MESSAGE IMPRINT (ASN.1) --- // +const messageImprint = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // hashAlgorithm SEQUENCE + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // algorithm OID + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false, asn1.oidToDer(sha256OID).getBytes()), + // parameters NULL + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, ''), + ]), + // hashedMessage OCTET STRING + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, digestBytes), +]); + +// --- TSTInfo (ASN.1) --- // +const tstInfo = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + // version INTEGER (1) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false, String.fromCharCode(1)), + // policy OBJECT IDENTIFIER (példa OID) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false, asn1.oidToDer('1.2.3.4.1').getBytes()), + // messageImprint (az előző) + messageImprint, + // serialNumber INTEGER (1) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false, String.fromCharCode(1)), + // genTime GeneralizedTime (most) + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.GENERALIZEDTIME, false, toGeneralizedTime(new Date())), +]); + +// DER kódolás +const tstInfoDer = asn1.toDer(tstInfo).getBytes(); + +// --- SIGNED DATA (PKCS7) --- // + +const privateKeyPem = fs.readFileSync('./tsa.key.pem', 'utf8'); +const certPem = fs.readFileSync('./tsa.crt.pem', 'utf8'); + +const p7 = forge.pkcs7.createSignedData(); + +// A TSTInfo DER bufferét kell tartalomként adni, az ASN.1 Bufferből forge Buffer kell +p7.content = forge.util.createBuffer(tstInfoDer); + +p7.addCertificate(certPem); +p7.addSigner({ + key: forge.pki.privateKeyFromPem(privateKeyPem), + certificate: forge.pki.certificateFromPem(certPem), + digestAlgorithm: forge.pki.oids.sha256, + authenticatedAttributes: [ + { + type: forge.pki.oids.contentType, + // id-ct-TSTInfo OID, string formában + value: '1.2.840.113549.1.9.16.1.4', + }, + { + type: forge.pki.oids.messageDigest, + value: forge.md.sha256.create().update(tstInfoDer).digest().getBytes(), + }, + { + type: forge.pki.oids.signingTime, + value: new Date(), + }, + ], +}); +p7.sign(); + +// PKIStatusInfo ASN.1 objektum (status = 0) +const status = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false, String.fromCharCode(0)), // status = granted + // opcionális mezők: statusString, failInfo itt kihagyva +]); + +// TimeStampToken (PKCS7) ASN.1 objektum +const timeStampTokenAsn1 = p7.toAsn1(); + +// TimeStampResp ::= SEQUENCE { status PKIStatusInfo, timeStampToken TimeStampToken } +const tsResp = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [ + status, + timeStampTokenAsn1, +]); + +// DER kódolás és fájlba írás +const tsRespDerBytes = asn1.toDer(tsResp).getBytes(); +fs.writeFileSync('mock_response.tsr', Buffer.from(tsRespDerBytes, 'binary')); + +console.log('✅ mock_response.tsr elkészült!'); + +function toGeneralizedTime(date) { + function pad(n) { return n < 10 ? '0' + n : n; } + return date.getUTCFullYear().toString() + + pad(date.getUTCMonth() + 1) + + pad(date.getUTCDate()) + + pad(date.getUTCHours()) + + pad(date.getUTCMinutes()) + + pad(date.getUTCSeconds()) + + 'Z'; +} diff --git a/mock_servers/__files/tsa_response.json b/mock_servers/__files/tsa_response.json new file mode 100644 index 0000000..bf6165b --- /dev/null +++ b/mock_servers/__files/tsa_response.json @@ -0,0 +1,4 @@ +{ + "cert": "-----BEGIN CERTIFICATE-----\r\nMIIC+TCCAeGgAwIBAgIFBWVVllMwDQYJKoZIhvcNAQELBQAwEzERMA8GA1UEAxMI\r\nTW9jayBUU0EwHhcNMjUwOTE4MjEwNzA4WhcNMjYwOTE5MjEwNzA4WjATMREwDwYD\r\nVQQDEwhNb2NrIFRTQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4\r\nriB/ltXPG6FaJPCW9R07ssZV5qMxF8udEjlKXp78EEmj+Bk6/mANC+eYEoa5x0b7\r\nmU8SURkScbA3WbtY18zCpKV7Cvu+hExkgHmK5XxyRTRia3BmtbcHQjy5uGq0T7Py\r\nbN9u/vMmoh5xlzMXrcmKBGiKj65Tug2tR/ePijYTE+5dNJNcGgtxvbC+JLtsO3aX\r\nVMIwl+L79AVUYhKFMpMm8Mv1sHvCJd28/NgdGomQwHRkNFpPjn9O4qA/sOYGQqTN\r\nCqksKe+j55+mT4/vAtmcVob5Y73ExjRDVaVh/9Tj0DUflk+kJM0qgQLQnY6YmIiw\r\nwmALgrIGvIjo/9YVkdkCAwEAAaNUMFIwDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMC\r\nBsAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwHQYDVR0OBBYEFCB2SeEXuHnhrM4M\r\n91Pc/+W8IgmGMA0GCSqGSIb3DQEBCwUAA4IBAQAcNnl1SOw4+MBvKWBdwEYB0i3w\r\nfpQkM4Wk7LL1KAUO6+3L21uqqIf6iH+2DAAmfKuPye0n70Q07Jw1Zgk3oydDwZ9S\r\nrUckz88gN5TqKubf57q4D/9SPttUK2A1VVjMr+2xSWL+PmAV3uxocaD8FrK/Ex28\r\nqB6rXLmMdYscsHSmOH87aqKvacSveyx4kMGLZODeQOau0m9RJ27jRaivSP0GAM7E\r\noXSAnx5j8Y55OTIC15F9x6Nh8CKI9dPgzIazbLXizFlduaw+d9qbRYt0wbgy7m59\r\neX8Odp/EC+2oWvSiAX1tpUlcMiHyEgkc+vZJMFn7yyK26DgZEFoRfasHbKFE\r\n-----END CERTIFICATE-----\r\n", + "signature": "MfNW0C6rBBni1oMu4UqCKbxHffWVxTMjnJg+e8+4an60UIxG0BEePgICrAF4U/et6OyPxjmbtUslkvNdsGa9jntmio9ijNp1eRH92KWXbgNbS/srpNE+CyUuMUzWkMooBBbPNcFXl+KALU1gbDlt/SWxkVTAl1uFe6MFGj7OAUgNn3hXx/4UvOqwf7ILTEto6ynQUGhYDRmCTauRxxPWJgB4KwTY1ZO9kuUNR6JArP4PHrPEiqhkxmNCfJCsMsDxpkR1KbfRBsj2CqgkqVdYWZlqVZ7VtZIZlcQbkpKDkb7a08m2kZ8XWvIWme3nI/CAUL5VtFDFjIUYrJOcqCy5lQ==" +} diff --git a/proxy/docker-compose.yaml b/mock_servers/docker-compose.yaml similarity index 51% rename from proxy/docker-compose.yaml rename to mock_servers/docker-compose.yaml index 2d50d49..a19087d 100644 --- a/proxy/docker-compose.yaml +++ b/mock_servers/docker-compose.yaml @@ -8,9 +8,16 @@ services: - '8080' - '--web-host' - '0.0.0.0' - # - '--set' - # - 'web_password=test' tty: true ports: - 8080:8080 - 127.0.0.1:8081:8081 + wiremock: + image: wiremock/wiremock:3.6.0 + container_name: wiremock + ports: + - "8888:8080" + volumes: + - ./__files:/home/wiremock/__files + - ./mappings:/home/wiremock/mappings + command: ["--global-response-templating"] diff --git a/mock_servers/mappings/signo.json b/mock_servers/mappings/signo.json new file mode 100644 index 0000000..1f93c2a --- /dev/null +++ b/mock_servers/mappings/signo.json @@ -0,0 +1,13 @@ +{ + "request": { + "method": "POST", + "url": "/tsa" + }, + "response": { + "status": 200, + "bodyFileName": "tsa_response.json", + "headers": { + "Content-Type": "application/timestamp-reply" + } + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7cbdbf2 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4312 @@ +{ + "name": "timestamp-service", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "timestamp-service", + "version": "1.0.0", + "license": "MIT", + "workspaces": [ + "app/*", + "package/*" + ] + }, + "app/cjs": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@techteamer/timestamp": "file:../../package/timestamp_service" + } + }, + "app/forge": { + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "asn1.js": "^5.4.1", + "node-forge": "^1.3.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/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "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": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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/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": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "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.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.4.tgz", + "integrity": "sha512-s5Hx+EtN60LMlDBvl5f04bEiFZmAepk27Q+mr85L/00zPDn1jtzlTV6FWn81MaIwqfWzKxmOJrBWHU6vtQyedQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.51.0.tgz", + "integrity": "sha512-4YHhP+Rv3T3+H3TPbUvWOw5tuSwhrVhkHHZhk4hC9VXeAOKR26/IsUAT4FsB4mT+kfIdxxb1BezQDEg/voPO8A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.51.0.tgz", + "integrity": "sha512-P7U7U03+E5w7WgJtvSseNLOX1UhknVPmEaqgUENFWfNxNBa1OhExT6qYGmyF8gepcxWSaSfJsAV5UwhWrYefdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@techteamer/cert-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@techteamer/cert-utils/-/cert-utils-1.1.3.tgz", + "integrity": "sha512-dImubvTYUR5scCEq/noQnts39DPVR0UK8eqayoTU+PL+KrG3CKPLFPb8IQqbA2ljJdZ0ZQKYL9Nsfez+ErATNw==", + "license": "MIT", + "dependencies": { + "@techteamer/ocsp": "^1.0.1", + "fs-extra": "^11.1.1", + "iconv-lite": "^0.6.0", + "tmp": "^0.2.1", + "util": "^0.12.5" + }, + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/@techteamer/ocsp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@techteamer/ocsp/-/ocsp-1.0.1.tgz", + "integrity": "sha512-q4pW5wAC6Pc3JI8UePwE37CkLQ5gDGZMgjSX4MEEm4D4Di59auDQ8UNIDzC4gRnPNmmcwjpPxozq8p5pjiOmOw==", + "license": "MIT", + "dependencies": { + "asn1.js": "^5.4.1", + "asn1.js-rfc2560": "^5.0.1", + "asn1.js-rfc5280": "^3.0.0", + "async": "^3.2.4", + "simple-lru-cache": "^0.0.2" + } + }, + "node_modules/@techteamer/timestamp": { + "resolved": "package/timestamp_service", + "link": true + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.17.tgz", + "integrity": "sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-fetch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-3.0.3.tgz", + "integrity": "sha512-HhggYPH5N+AQe/OmN6fmhKmRRt2XuNJow+R3pQwJxOOF9GuwM7O2mheyGeIrs5MOIeNjDEdgdoyHBOrFeJBR3g==", + "license": "MIT", + "dependencies": { + "node-fetch": "*" + } + }, + "node_modules/@types/tmp": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", + "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.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/@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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitest/coverage-v8": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz", + "integrity": "sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.7", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.12", + "magicast": "^0.3.5", + "std-env": "^3.8.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "2.1.9", + "vitest": "2.1.9" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.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/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "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/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/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/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js-rfc2560": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/asn1.js-rfc2560/-/asn1.js-rfc2560-5.0.1.tgz", + "integrity": "sha512-1PrVg6kuBziDN3PGFmRk3QrjpKvP9h/Hv5yMrFZvC1kpzP6dQRzf5BpKstANqHBkaOUmTpakJWhicTATOA/SbA==", + "license": "MIT", + "dependencies": { + "asn1.js-rfc5280": "^3.0.0" + }, + "peerDependencies": { + "asn1.js": "^5.0.0" + } + }, + "node_modules/asn1.js-rfc5280": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/asn1.js-rfc5280/-/asn1.js-rfc5280-3.0.0.tgz", + "integrity": "sha512-Y2LZPOWeZ6qehv698ZgOGGCZXBQShObWnGthTrIFlIQjuV1gg2B8QOhWFRExq/MR1VnPpIIe7P9vX2vElxv+Pg==", + "license": "MIT", + "dependencies": { + "asn1.js": "^5.0.0" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "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/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/cjs": { + "resolved": "app/cjs", + "link": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "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, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "dev": true, + "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", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "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" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forge": { + "resolved": "app/forge", + "link": true + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "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", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "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" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/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/glob/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "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" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "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": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "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, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "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, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nock": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz", + "integrity": "sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">= 10.13" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "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", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "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/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "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/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.51.0.tgz", + "integrity": "sha512-7cR0XWrdp/UAj2HMY/Y4QQEUjidn3l2AY1wSeZoFjMbD8aOMPoV9wgTFYbrJpPzzvejDEini1h3CiUP8wLzxQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.51.0", + "@rollup/rollup-android-arm64": "4.51.0", + "@rollup/rollup-darwin-arm64": "4.51.0", + "@rollup/rollup-darwin-x64": "4.51.0", + "@rollup/rollup-freebsd-arm64": "4.51.0", + "@rollup/rollup-freebsd-x64": "4.51.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.51.0", + "@rollup/rollup-linux-arm-musleabihf": "4.51.0", + "@rollup/rollup-linux-arm64-gnu": "4.51.0", + "@rollup/rollup-linux-arm64-musl": "4.51.0", + "@rollup/rollup-linux-loong64-gnu": "4.51.0", + "@rollup/rollup-linux-ppc64-gnu": "4.51.0", + "@rollup/rollup-linux-riscv64-gnu": "4.51.0", + "@rollup/rollup-linux-riscv64-musl": "4.51.0", + "@rollup/rollup-linux-s390x-gnu": "4.51.0", + "@rollup/rollup-linux-x64-gnu": "4.51.0", + "@rollup/rollup-linux-x64-musl": "4.51.0", + "@rollup/rollup-openharmony-arm64": "4.51.0", + "@rollup/rollup-win32-arm64-msvc": "4.51.0", + "@rollup/rollup-win32-ia32-msvc": "4.51.0", + "@rollup/rollup-win32-x64-msvc": "4.51.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-esbuild": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-esbuild/-/rollup-plugin-esbuild-6.2.1.tgz", + "integrity": "sha512-jTNOMGoMRhs0JuueJrJqbW8tOwxumaWYq+V5i+PD+8ecSCVkuX27tGW7BXqDgoULQ55rO7IdNxPcnsWtshz3AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "get-tsconfig": "^4.10.0", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=14.18.0" + }, + "peerDependencies": { + "esbuild": ">=0.18.0", + "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "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", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-lru-cache": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz", + "integrity": "sha512-uEv/AFO0ADI7d99OHDmh1QfYzQk/izT1vCmu/riQfh7qjBVUUgRT87E5s5h7CxWCA/+YoZerykpEthzVrW3LIw==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "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": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/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/test-exclude/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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.5.tgz", + "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-utils/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "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" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/vite": { + "version": "5.4.20", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.20.tgz", + "integrity": "sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", + "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", + "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.9", + "@vitest/mocker": "2.1.9", + "@vitest/pretty-format": "^2.1.9", + "@vitest/runner": "2.1.9", + "@vitest/snapshot": "2.1.9", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.9", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.9", + "@vitest/ui": "2.1.9", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "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/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "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": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "package/timestamp_service": { + "name": "@techteamer/timestamp", + "version": "2.0.1", + "license": "MIT", + "workspaces": [ + "app/*", + "project/*" + ], + "dependencies": { + "@techteamer/cert-utils": "^1.1.3", + "@types/node-fetch": "^3", + "node-fetch": "^3", + "proxy-agent": "^6.5.0", + "tmp": "^0.2.1" + }, + "devDependencies": { + "@rollup/plugin-typescript": "^12.1.4", + "@types/node": "^20.14.6", + "@types/tmp": "^0.2.6", + "@typescript-eslint/eslint-plugin": "^7.16.0", + "@typescript-eslint/parser": "^7.13.1", + "@vitest/coverage-v8": "^2.0.2", + "eslint": "^8.19.0", + "eslint-config-prettier": "^10.1.8", + "eslint-config-standard": "^17.0.0", + "nock": "^13.5.4", + "prettier": "^3.6.2", + "rollup": "^4.18.0", + "rollup-plugin-esbuild": "^6.1.1", + "typescript": "~5.5", + "vitest": "^2.0.2" + }, + "engines": { + "node": ">=22.0.0" + } + } + } +} diff --git a/package.json b/package.json index fe859d0..aa8e6c7 100644 --- a/package.json +++ b/package.json @@ -1,64 +1,15 @@ { - "name": "@techteamer/timestamp", - "version": "2.0.1", - "description": "This package contains a TimestampService, which can create and verity timestamps", - "main": "src/index.ts", - "author": "Techteamer", + "name": "timestamp-service", + "version": "1.0.0", "license": "MIT", - "exports": { - ".": { - "import": "./build/timestamp_config.mjs", - "require": "./build/timestamp_config.cjs", - "types": "./build/src/index.d.ts", - "default": "./build/timestamp_config.mjs" - } - }, - "files": [ - "build" + "private": "true", + "workspaces": [ + "app/*", + "package/*" ], - "repository": { - "type": "git", - "url": "https://github.com/TechTeamer/timestamp" - }, - "engines": { - "node": ">=22.0.0" - }, "scripts": { - "vitest": "vitest run --config test/vitest.config.ts", - "build": "rollup -c", - "vitest:unit": "yarn vitest unit/", - "vitest:feature": "yarn vitest feature/", - "lint": "eslint ./src ./test && echo 'npm run lint: OK'", - "lint:fix": "eslint . --fix", - "format": "prettier -w .", - "test": "npm run lint --silent && echo 'npm test: OK'" - }, - "type": "module", - "dependencies": { - "@techteamer/cert-utils": "^1.1.3", - "@types/node-fetch": "^3", - "node-fetch": "^3", - "proxy-agent": "^6.5.0", - "tmp": "^0.2.1" - }, - "devDependencies": { - "@rollup/plugin-typescript": "^12.1.4", - "@types/node": "^20.14.6", - "@types/tmp": "^0.2.6", - "@typescript-eslint/eslint-plugin": "^7.16.0", - "@typescript-eslint/parser": "^7.13.1", - "@vitest/coverage-v8": "^2.0.2", - "eslint": "^8.19.0", - "eslint-config-prettier": "^10.1.8", - "eslint-config-standard": "^17.0.0", - "nock": "^13.5.4", - "prettier": "^3.6.2", - "rollup": "^4.18.0", - "rollup-plugin-esbuild": "^6.1.1", - "typescript": "~5.5", - "vitest": "^2.0.2" - }, - "resolutions": { - "strip-ansi": "6.0.1" + "test:cjs": "cd ./apps/test_cjs/test_app/ && yarn start", + "test:mjs": "cd ./apps/test_mjs/test_app/ && yarn start", + "test": "yarn test:cjs && yarn test:mjs" } -} +} \ No newline at end of file diff --git a/.eslintignore b/package/timestamp_service/.eslintignore similarity index 100% rename from .eslintignore rename to package/timestamp_service/.eslintignore diff --git a/.eslintrc.json b/package/timestamp_service/.eslintrc.json similarity index 100% rename from .eslintrc.json rename to package/timestamp_service/.eslintrc.json diff --git a/.prettierrc.json b/package/timestamp_service/.prettierrc.json similarity index 100% rename from .prettierrc.json rename to package/timestamp_service/.prettierrc.json diff --git a/package/timestamp_service/build/src/index.d.ts b/package/timestamp_service/build/src/index.d.ts new file mode 100644 index 0000000..2426918 --- /dev/null +++ b/package/timestamp_service/build/src/index.d.ts @@ -0,0 +1,2 @@ +export * from './trustedTimestamp/TrustedTimestampService'; +export * from './trustedTimestamp/error/create-timestamp-token.error'; diff --git a/package/timestamp_service/build/src/patch/node-fetch.d.ts b/package/timestamp_service/build/src/patch/node-fetch.d.ts new file mode 100644 index 0000000..1e1c25b --- /dev/null +++ b/package/timestamp_service/build/src/patch/node-fetch.d.ts @@ -0,0 +1,2 @@ +import type { RequestInfo, RequestInit, Response } from 'node-fetch'; +export declare const fetch: (url: URL | RequestInfo, init?: RequestInit) => Promise; diff --git a/package/timestamp_service/build/src/trustedTimestamp/TimestampRequest.d.ts b/package/timestamp_service/build/src/trustedTimestamp/TimestampRequest.d.ts new file mode 100644 index 0000000..6eeb454 --- /dev/null +++ b/package/timestamp_service/build/src/trustedTimestamp/TimestampRequest.d.ts @@ -0,0 +1,63 @@ +import type { BodyInit } from 'node-fetch'; +import type { FileOptions } from 'tmp'; +import type { TimestampRequestAuthResult, TimestampRequestAuthTypes, TimestampRequestOptions } from './types/timestamp-request.type'; +import type { TimestampProviderAuth, TimestampProviderBody, TimestampProviderProxyConfig, TimestampProviderUrl } from './types/timestamp-provider.type'; +import type { TempFileService } from '../util/TempFileService'; +/** + * TimestampRequest class implements timestamp request + * */ +export declare class TimestampRequest { + private readonly tempFileService; + private readonly tmpOptions; + private readonly cleanupTempFns; + private tsRequest; + constructor(tempFileService: TempFileService, tmpOptions: FileOptions, cleanupTempFns: ((...args: unknown[]) => unknown)[]); + /** + * set request header + * */ + setHeader(headers: Record): void; + /** + * set request body + * */ + setBody(body: BodyInit): void; + /** + * set request proxy + * */ + setProxy(proxy: TimestampProviderProxyConfig): void; + /** + * set request encoding + * */ + setEncoding(encoding: string | null): void; + /** + * set request encoding + * */ + setResolveWithFullResponse(resolveWithFullResponse: boolean): void; + /** + * return tsRequest + * */ + get(): TimestampRequestOptions; + /** + * authStrategy method that set no auth request + * */ + authStrategy(requestType: TimestampRequestAuthTypes | undefined, url: TimestampProviderUrl, auth: TimestampProviderAuth | undefined, body: TimestampProviderBody | undefined, proxy: TimestampProviderProxyConfig | undefined, tsQuery: string): Promise; + /** + * _getTimestampRequestBasic method that set basic auth request + * */ + private _getTimestampRequestBasic; + /** + * _getTimestampRequestOauth method that set oauth request + * */ + private _getTimestampRequestOauth; + /** + * _getTimestampRequestNoAuth method that set no auth request + * */ + private _getTimestampRequestNoAuth; + /** + * _getOauth method that get oauth access_token + **/ + private _getOauth; + /** + * _getOauthRequestSettings method that set the request oath settings + **/ + private _getOauthRequestSettings; +} diff --git a/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampCheck.d.ts b/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampCheck.d.ts new file mode 100644 index 0000000..9b180ae --- /dev/null +++ b/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampCheck.d.ts @@ -0,0 +1,3 @@ +export declare function checkDigestFormat(format: string): boolean; +export declare function checkDigest(digest: string): boolean; +export declare function normalizeDigestFormat(format: string): string; diff --git a/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampCommand.d.ts b/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampCommand.d.ts new file mode 100644 index 0000000..0425a17 --- /dev/null +++ b/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampCommand.d.ts @@ -0,0 +1,6 @@ +export declare function getTsQuery(digest: string, digestFormat: string): Promise; +export declare function getTsVerify(digest: string, tempPath: string, isToken: boolean, certsLocation: string): Promise; +export declare function getTsReply(inputTempPath: string, isToken: boolean): Promise; +export declare function generateTsReply(inputTempPath: string, tempPath: string): Promise; +export declare function extractCertFromToken(tstPath: string): Promise; +export declare function checkSslPath(): Promise; diff --git a/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampInfo.d.ts b/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampInfo.d.ts new file mode 100644 index 0000000..88f511d --- /dev/null +++ b/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampInfo.d.ts @@ -0,0 +1,51 @@ +import { CertService } from '@techteamer/cert-utils'; +interface TSA { + C: string | null; + L: string | null; + O: string | null; + OU: string | null; + CN: string | null; +} +/** + * + * Status info: + * Status: Granted. + * Status description: unspecified + * Failure info: unspecified + * + * TST info: + * Version: 1 + * Policy OID: 1.3.6.1.4.1.21528.2.2.99 + * Hash Algorithm: sha256 + * Message data: + * 0000 - c5 3e 94 56 aa 61 ed 56-49 69 74 29 1e 01 d7 2a .>.V.a.VIit)...* + * 0010 - 64 cc 24 84 d2 a2 31 4d-33 b6 ca c8 98 23 03 b9 d.$...1M3....#.. + * Serial number: 0x0308441E + * Time stamp: Jan 30 13:45:20 2018 GMT + * Accuracy: 0x01 seconds, unspecified millis, unspecified micros + * Ordering: no + * Nonce: unspecified + * TSA: DirName:/C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=e-Szigno Test TSA2 + * Extensions: + * */ +export declare class TimestampInfo { + error: string | null; + version: number | null; + policyOID: string | null; + hashAlgorithm: string | null; + hash: string | null; + serialNumber: string | null; + timeStamp: Date | null; + timeStampDate: Date | null; + accuracy: number | null; + ordering: boolean | null; + nonce: string | null; + issuer: string | null; + tsa: TSA | null; + certInfo: CertService['CertInfo'] | null; + constructor(timestampInfoType: ("normal" | "short") | undefined, tsText: string, error?: string | null); + setCertInfo(certInfo: CertService['CertInfo'] | null): void; + parseOpensslOutput(tsText: string): void; + parseOpensslOutputShort(tsText: string): void; +} +export {}; diff --git a/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampRequest.d.ts b/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampRequest.d.ts new file mode 100644 index 0000000..31d777a --- /dev/null +++ b/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampRequest.d.ts @@ -0,0 +1,34 @@ +import { FileOptions as TempFileOptions } from 'tmp'; +import { TempFileService } from '../util/TempFileService'; +import type { TimestampProvider } from './types/timestamp-provider.type'; +import type { TimestampLog } from './types/timestamp-log.type'; +/** + * TrustedTimestampRequest service implements timestamp request and sorted providers + * */ +export declare class TrustedTimestampRequest { + private readonly tempFileService; + private readonly tmpOptions; + private readonly cleanupTempFns; + private readonly providers; + constructor(providers: TimestampProvider[], tempFileService: TempFileService, tmpOptions: TempFileOptions); + /** + * getTimestamp method that calls the service providers in sequence, requesting a timestamp + **/ + getTimestamp(tsQuery: string): Promise<{ + tsr: Buffer | null; + providerName: string; + logHistory: TimestampLog[]; + }>; + /** + * sortedProviders method that sorting the providers according to priority + **/ + private _sortedProviders; + /** + * sendTimestampRequest method that calls the provider + **/ + private _getTimeStampToken; + /** + * getTimestampRequestSettings method that set the request settings + **/ + private _getTimestampRequest; +} diff --git a/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampService.d.ts b/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampService.d.ts new file mode 100644 index 0000000..5055d1d --- /dev/null +++ b/package/timestamp_service/build/src/trustedTimestamp/TrustedTimestampService.d.ts @@ -0,0 +1,50 @@ +import { TimestampInfo } from './TrustedTimestampInfo'; +import type { TimestampConfig } from './types/timestamp-config.type'; +import type { CreatedTimestampToken, Timestamp } from './types/timestamp-token.type'; +/** + * OpenSSL docs: https://www.openssl.org/docs/manmaster/man1/ts.html + * + * Certificate Installation with OpenSSL: http://gagravarr.org/writing/openssl-certs/others.shtml + * + * Trustedtimestamp service implements the generate, import and verification of timestamps + * + * */ +export declare class TrustedTimestampService { + private readonly timestampInfoType; + private readonly config; + private readonly encoding; + private readonly tmpOptions; + private tempFileService; + private certService; + private providers; + private certsLocation; + private timestampRequest; + constructor(timestampInfoType?: 'normal' | 'short', config?: TimestampConfig, encoding?: string); + /** + * init method that sets the config and instantiates the required services + * */ + private _init; + /** + * Utility method that resolves to a TimestampInfo object containing parsed info from the tsr + * */ + getTimestampInfo(tsr: Buffer, isToken?: boolean): Promise; + /** + * Returns a TimestampToken instance for a hash digest and a hash algorithm. + * It requests a token from the TSA and verifies the received response. + * The returned timestamp token represents the token + * and contains the tsr with the verification result. + * */ + createTimestampToken(digest: string, hashAlgorithm: string, dataSize: number): Promise; + /** + * Verify if a timestamp token corresponds to a particular hash of data + * */ + verifyToken(timestampToken: Timestamp, digest: string, dataSize: number): Promise; + /** + * Verify a hash digest against a timestamp response file + * */ + verifyTsr(digest: string, tsr: Buffer, isToken?: boolean): Promise; + /** + * testService method that check the ssl installation + * */ + testService(): Promise; +} diff --git a/package/timestamp_service/build/src/trustedTimestamp/error/create-timestamp-token.error.d.ts b/package/timestamp_service/build/src/trustedTimestamp/error/create-timestamp-token.error.d.ts new file mode 100644 index 0000000..c6defe3 --- /dev/null +++ b/package/timestamp_service/build/src/trustedTimestamp/error/create-timestamp-token.error.d.ts @@ -0,0 +1,9 @@ +import { CreatedTimestampToken } from '../types/timestamp-token.type'; +export type CreateTimestampTokenErrorContext = Partial>; +/** + * Custom error class that encapsulates context about token creation, including the provider used and the associated log history + */ +export declare class CreateTimestampTokenError extends Error { + readonly context: CreateTimestampTokenErrorContext; + constructor(message: string, context?: CreateTimestampTokenErrorContext, options?: ErrorOptions); +} diff --git a/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-config.type.d.ts b/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-config.type.d.ts new file mode 100644 index 0000000..6336315 --- /dev/null +++ b/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-config.type.d.ts @@ -0,0 +1,5 @@ +import type { TimestampProvider } from './timestamp-provider.type'; +export interface TimestampConfig { + certsLocation: string; + providers: TimestampProvider[]; +} diff --git a/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-log.type.d.ts b/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-log.type.d.ts new file mode 100644 index 0000000..842c214 --- /dev/null +++ b/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-log.type.d.ts @@ -0,0 +1,12 @@ +import { TimestampProviderUrl } from './timestamp-provider.type'; +export interface TimestampLog { + info: { + name: string; + info?: null; + date: Date; + url: TimestampProviderUrl; + response: string | null; + error: string | null; + }; + errorTrace: Error | null; +} diff --git a/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-provider.type.d.ts b/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-provider.type.d.ts new file mode 100644 index 0000000..8d67747 --- /dev/null +++ b/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-provider.type.d.ts @@ -0,0 +1,22 @@ +export interface TimestampProviderProxyConfig { + url: string; + allowUnauthorized?: boolean; +} +export interface TimestampProviderOAuthUrl { + getTokenUrl: string; + getTimestampUrl: string; +} +export type TimestampProviderUrl = string | TimestampProviderOAuthUrl; +export interface TimestampProviderAuth { + user: string; + pass: string; +} +export type TimestampProviderBody = Record; +export interface TimestampProvider { + name: string; + url: TimestampProviderUrl; + auth?: TimestampProviderAuth; + priority?: number; + body?: TimestampProviderBody; + proxy?: TimestampProviderProxyConfig; +} diff --git a/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-request.type.d.ts b/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-request.type.d.ts new file mode 100644 index 0000000..d0afed1 --- /dev/null +++ b/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-request.type.d.ts @@ -0,0 +1,20 @@ +import type { Agent } from 'http'; +import type { BodyInit } from 'node-fetch'; +export type TimestampRequestAuthTypes = 'oauth' | 'basic' | 'noAuth'; +export interface TimestampRequestOptions { + method: string; + headers: Record; + encoding?: string | null; + resolveWithFullResponse?: boolean; + body?: BodyInit; + agent?: AgentType; +} +export interface TimestampRequestError { + message: string; + trace: Error | null; +} +export interface TimestampRequestAuthResult { + requestUrl: string | null; + tsRequest: TimestampRequestOptions | null; + error?: TimestampRequestError | null; +} diff --git a/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-token.type.d.ts b/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-token.type.d.ts new file mode 100644 index 0000000..9572b03 --- /dev/null +++ b/package/timestamp_service/build/src/trustedTimestamp/types/timestamp-token.type.d.ts @@ -0,0 +1,15 @@ +import { TimestampLog } from './timestamp-log.type'; +export interface Timestamp { + digest: string; + hashAlgorithm: string; + dataSize: number; + tsr: Buffer; + isToken: boolean; + certExpiry: Date | null; + verified: boolean | null; +} +export interface CreatedTimestampToken { + timestamp: Timestamp; + providerName: string; + logHistory: TimestampLog[]; +} diff --git a/package/timestamp_service/build/src/util/TempFileService.d.ts b/package/timestamp_service/build/src/util/TempFileService.d.ts new file mode 100644 index 0000000..f1b0239 --- /dev/null +++ b/package/timestamp_service/build/src/util/TempFileService.d.ts @@ -0,0 +1,11 @@ +import tmp from 'tmp'; +export declare class TempFileService { + /** + * Utility to create a temp file with content + * */ + createTempFile(options: tmp.FileOptions, content?: Buffer): Promise<{ + tempPath: string; + fd: number | undefined; + cleanupCallback: () => void; + }>; +} diff --git a/package/timestamp_service/build/src/util/child_process_promise.d.ts b/package/timestamp_service/build/src/util/child_process_promise.d.ts new file mode 100644 index 0000000..1810bab --- /dev/null +++ b/package/timestamp_service/build/src/util/child_process_promise.d.ts @@ -0,0 +1,17 @@ +import type { ExecOptions } from 'node:child_process'; +interface Logger { + info: (log: string, ...args: unknown[]) => unknown; + error: (log: string, ...args: unknown[]) => unknown; +} +export declare function exec(command: string, options?: { + encoding?: 'buffer'; +} & ExecOptions, logger?: Logger): Promise; +export declare class ExecFileError extends Error { + stdout?: string; + stderr?: string; +} +export declare function execFile(command: string, args: string[], options?: {}): Promise<{ + stdout: string; + stderr: string; +}>; +export {}; diff --git a/package/timestamp_service/build/src/util/regexParser.d.ts b/package/timestamp_service/build/src/util/regexParser.d.ts new file mode 100644 index 0000000..cf5c234 --- /dev/null +++ b/package/timestamp_service/build/src/util/regexParser.d.ts @@ -0,0 +1,4 @@ +declare function parseRegex(text: string, regex: RegExp, groups: Groups, revive?: (parameter: Groups extends number ? string : Groups extends (string | number)[] ? Record : RegExpMatchArray) => ReviveResult): ReviveResult | null | undefined; +declare function createParser(regex: RegExp, groups: number | number[], revive: (value: unknown) => ReviveResult): (text: string) => ReviveResult | null | undefined; +export { createParser as create }; +export { parseRegex }; diff --git a/package/timestamp_service/build/timestamp_config.cjs b/package/timestamp_service/build/timestamp_config.cjs new file mode 100644 index 0000000..5a80b8b --- /dev/null +++ b/package/timestamp_service/build/timestamp_config.cjs @@ -0,0 +1,775 @@ +'use strict'; + +var certUtils = require('@techteamer/cert-utils'); +var fs = require('node:fs'); +var proxyAgent = require('proxy-agent'); +var childProcess = require('node:child_process'); +var fs$1 = require('node:fs/promises'); +var util = require('node:util'); +var tmp = require('tmp'); + +function _interopNamespaceDefault(e) { + var n = Object.create(null); + if (e) { + Object.keys(e).forEach(function (k) { + if (k !== 'default') { + var d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { return e[k]; } + }); + } + }); + } + n.default = e; + return Object.freeze(n); +} + +var childProcess__namespace = /*#__PURE__*/_interopNamespaceDefault(childProcess); + +function parseRegex(text, regex, groups, revive = value => value) { + const result = text.match(regex); + if (!result) { + return null; + } + if (!groups) { + return revive(result); + } + if (typeof groups === 'number') { + return revive(result[groups]); + } + if (Array.isArray(groups)) { + const ret = {}; + groups.forEach((name, i) => { + ret[name] = result[i + 1]; + }); + return revive(ret); + } +} + +/** + * + * Status info: + * Status: Granted. + * Status description: unspecified + * Failure info: unspecified + * + * TST info: + * Version: 1 + * Policy OID: 1.3.6.1.4.1.21528.2.2.99 + * Hash Algorithm: sha256 + * Message data: + * 0000 - c5 3e 94 56 aa 61 ed 56-49 69 74 29 1e 01 d7 2a .>.V.a.VIit)...* + * 0010 - 64 cc 24 84 d2 a2 31 4d-33 b6 ca c8 98 23 03 b9 d.$...1M3....#.. + * Serial number: 0x0308441E + * Time stamp: Jan 30 13:45:20 2018 GMT + * Accuracy: 0x01 seconds, unspecified millis, unspecified micros + * Ordering: no + * Nonce: unspecified + * TSA: DirName:/C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=e-Szigno Test TSA2 + * Extensions: + * */ +class TimestampInfo { + error = null; + version = null; + policyOID = null; + hashAlgorithm = null; + hash = null; + serialNumber = null; + timeStamp = null; + timeStampDate = null; + accuracy = null; + ordering = null; + nonce = null; + issuer = null; + tsa = null; + certInfo = null; + constructor(timestampInfoType = 'normal', tsText, error = null) { + this.error = null; + this.version = null; + this.policyOID = null; + this.hashAlgorithm = null; + this.serialNumber = null; + this.timeStamp = null; + this.accuracy = null; + this.ordering = null; + this.nonce = null; + this.tsa = null; + if (error) { + this.error = error; + } + else { + if (timestampInfoType === 'short') { + this.parseOpensslOutputShort(tsText); + } + else { + this.hash = null; + this.timeStampDate = null; + this.issuer = null; + this.certInfo = null; + this.parseOpensslOutput(tsText); + } + } + } + setCertInfo(certInfo) { + this.certInfo = certInfo; + } + parseOpensslOutput(tsText) { + this.version = parseRegex(tsText, /Version:\s*([^\n\r]+)/, 1, parseInt); + this.policyOID = parseRegex(tsText, /Policy OID:\s*([^\n\r]+)/, 1); + this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\s*([^\n\r]+)/, 1); + this.hash = tsText + .match(/\d{4} - .*?\s{2}/g) + .map(line => { + return line.replace(/\d{4} - /g, '').replace(/[\s*-]/g, ''); + }) + .join(''); + this.serialNumber = parseRegex(tsText, /Serial number:\s*([^\n\r]+)/, 1); + this.timeStamp = parseRegex(tsText, /Time stamp:\s*([^\n\r]+)/, 1); + this.timeStampDate = new Date(this.timeStamp); + this.accuracy = parseRegex(tsText, /Accuracy:\s*(.+) seconds, (.+) millis, (.+) micros/, ['s', 'm', 'u'], ({ s, m, u }) => { + const _s = Number(s === 'unspecified' ? 0 : s); + const _m = Number(m === 'unspecified' ? 0 : m); + const _u = Number(u === 'unspecified' ? 0 : u); + return _s * 1000 + _m + _u / 1000; + }); + this.ordering = parseRegex(tsText, /Ordering:\s*([^\n\r]+)/, 1, ordering => ordering !== 'no'); + this.nonce = parseRegex(tsText, /Nonce:\s*([^\n\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce)); + this.issuer = parseRegex(tsText, /TSA:\s*DirName:\s*([^\n\r]+)/, 1); + this.tsa = parseRegex(tsText, /TSA:\s*DirName:\s*([^\n\r]+)/, 1, (result) => { + const m = result.match(/\/\w{1,2}=[^/]+/g) || []; + return m.reduce((obj, part) => { + const [, label, value] = part.match(/\/(\w{1,2})=([^/]+)/) || []; + if (!label || !value) { + return obj; + } + obj[label] = value; + return obj; + }, { C: null, L: null, O: null, OU: null, CN: null }); + }); + } + parseOpensslOutputShort(tsText) { + this.version = parseRegex(tsText, /Version:\s*([^\n\r]+)/, 1, parseInt); + this.policyOID = parseRegex(tsText, /Policy OID:\s*([^\n\r]+)/, 1); + this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\s*([^\n\r]+)/, 1); + this.serialNumber = parseRegex(tsText, /Serial number:\s*([^\n\r]+)/, 1); + this.timeStamp = parseRegex(tsText, /Time stamp:\s*([^\n\r]+)/, 1, dateString => new Date(dateString)); + this.accuracy = parseRegex(tsText, /Accuracy:\s*(.+) seconds, (.+) millis, (.+) micros/, ['s', 'm', 'u'], ({ s, m, u }) => { + const _s = Number(s === 'unspecified' ? 0 : s); + const _m = Number(m === 'unspecified' ? 0 : m); + const _u = Number(u === 'unspecified' ? 0 : u); + return _s * 1000 + _m + _u / 1000; + }); + this.ordering = parseRegex(tsText, /Ordering:\s*([^\n\r]+)/, 1, ordering => ordering !== 'no'); + this.nonce = parseRegex(tsText, /Nonce:\s*([^\n\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce)); + this.tsa = parseRegex(tsText, /TSA:\s*([^\n\r]+)/, 1, v => { + const m = v.match(/\/\w{1,2}=[^/]+/g) || []; + return m.reduce((obj, part) => { + const [, label, value] = part.match(/\/(\w{1,2})=([^/]+)/) || []; + if (!label || !value) { + return obj; + } + obj[label] = value; + return obj; + }, { C: null, L: null, O: null, OU: null, CN: null }); + }); + } +} + +const fetch = async (url, init) => { + const { default: fetch } = await import('node-fetch'); + return fetch(url, init); +}; + +/** + * TimestampRequest class implements timestamp request + * */ +class TimestampRequest { + tempFileService; + tmpOptions; + cleanupTempFns; + tsRequest = { + method: 'POST', + headers: { + 'Content-Type': 'application/timestamp-query' + } + }; + constructor(tempFileService, tmpOptions, cleanupTempFns) { + this.tempFileService = tempFileService; + this.tmpOptions = tmpOptions; + this.cleanupTempFns = cleanupTempFns; + } + /** + * set request header + * */ + setHeader(headers) { + this.tsRequest = { + ...this.tsRequest, + headers + }; + } + /** + * set request body + * */ + setBody(body) { + this.tsRequest.body = body; + } + /** + * set request proxy + * */ + setProxy(proxy) { + this.tsRequest.agent = new proxyAgent.ProxyAgent({ + getProxyForUrl: () => proxy.url, + rejectUnauthorized: !(proxy.allowUnauthorized ?? false) + }); + } + /** + * set request encoding + * */ + setEncoding(encoding) { + this.tsRequest.encoding = encoding; + } + /** + * set request encoding + * */ + setResolveWithFullResponse(resolveWithFullResponse) { + this.tsRequest.resolveWithFullResponse = resolveWithFullResponse; + } + /** + * return tsRequest + * */ + get() { + return this.tsRequest; + } + /** + * authStrategy method that set no auth request + * */ + async authStrategy(requestType, url, auth, body, proxy, tsQuery) { + switch (requestType) { + case 'basic': + return this._getTimestampRequestBasic(url, auth, tsQuery); + case 'oauth': + return await this._getTimestampRequestOauth(url, auth, body, proxy, tsQuery); + case 'noAuth': + return this._getTimestampRequestNoAuth(url, tsQuery); + default: + return this._getTimestampRequestNoAuth(url, tsQuery); + } + } + /** + * _getTimestampRequestBasic method that set basic auth request + * */ + _getTimestampRequestBasic(url, auth, tsQuery) { + this.setHeader({ + ...this.tsRequest.headers, + Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}` + }); + this.setEncoding(null); // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily + this.setResolveWithFullResponse(true); + this.setBody(tsQuery); + return { requestUrl: url, tsRequest: this.get() }; + } + /** + * _getTimestampRequestOauth method that set oauth request + * */ + async _getTimestampRequestOauth(url, auth, body, proxy, tsQuery) { + const oauthResult = await this._getOauth(url.getTokenUrl, auth, body, proxy); + if (!oauthResult?.access_token) { + return { requestUrl: null, tsRequest: null, error: null }; + } + if (oauthResult?.error) { + return { requestUrl: null, tsRequest: null, error: oauthResult?.error }; + } + const accessToken = oauthResult?.access_token; + if (accessToken) { + this.setHeader({ + ...this.tsRequest.headers, + Authorization: `Bearer ${accessToken}` + }); + const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(this.tmpOptions, Buffer.from(tsQuery)); + this.cleanupTempFns.push(cleanupCallback); + const stats = fs.statSync(tempPath); + const fileSizeInBytes = stats.size; + this.setBody(fs.createReadStream(tempPath)); + this.setHeader({ + ...this.tsRequest.headers, + 'Content-length': fileSizeInBytes.toString() + }); + } + return { requestUrl: url?.getTimestampUrl, tsRequest: this.get(), error: null }; + } + /** + * _getTimestampRequestNoAuth method that set no auth request + * */ + _getTimestampRequestNoAuth(url, tsQuery) { + this.setEncoding(null); // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily + this.setResolveWithFullResponse(true); + this.setBody(tsQuery); + return { requestUrl: url, tsRequest: this.get() }; + } + /** + * _getOauth method that get oauth access_token + **/ + async _getOauth(url, auth, body, proxy) { + const tsRequest = await this._getOauthRequestSettings(auth, body, proxy); + try { + const response = await fetch(url, tsRequest); + return (await response.json()); + } + catch (error) { + return { + error: { + message: error.message, + trace: error + } + }; + } + } + /** + * _getOauthRequestSettings method that set the request oath settings + **/ + async _getOauthRequestSettings(auth, body, proxy) { + const tsRequest = { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}` + }, + body: new URLSearchParams(body) + }; + if (proxy?.url) { + tsRequest.agent = new proxyAgent.ProxyAgent({ + getProxyForUrl: () => proxy.url, + rejectUnauthorized: !(proxy.allowUnauthorized ?? false) + }); + } + return tsRequest; + } +} + +/** + * TrustedTimestampRequest service implements timestamp request and sorted providers + * */ +class TrustedTimestampRequest { + tempFileService; + tmpOptions; + cleanupTempFns = []; + providers; + constructor(providers, tempFileService, tmpOptions) { + this.tempFileService = tempFileService; + this.tmpOptions = tmpOptions; + this.providers = this._sortedProviders(providers); + } + /** + * getTimestamp method that calls the service providers in sequence, requesting a timestamp + **/ + async getTimestamp(tsQuery) { + let tsr = null; + let providerName = ''; + const logHistory = []; + for (const provider of this.providers) { + if (!tsr) { + const { name, url, auth, body, proxy } = provider; + if (!name) { + throw new Error('Provider name is missing'); + } + if (!url) { + throw new Error('Provider url is missing'); + } + const { timestampToken, log } = await this._getTimeStampToken(name, url, auth, body, proxy, tsQuery); + logHistory.push(log); + tsr = timestampToken; + providerName = name; + } + } + return { tsr, providerName, logHistory }; + } + /** + * sortedProviders method that sorting the providers according to priority + **/ + _sortedProviders(providers) { + const priorityProviders = []; + const nonPriorityProviders = []; + providers.forEach(provider => { + if (provider?.priority) { + priorityProviders.push(provider); + } + else { + nonPriorityProviders.push(provider); + } + }); + const sortedProviders = priorityProviders.toSorted((a, b) => a.priority - b.priority); + return sortedProviders.concat(nonPriorityProviders); + } + /** + * sendTimestampRequest method that calls the provider + **/ + async _getTimeStampToken(name, url, auth, body, proxy, tsQuery) { + const { requestUrl, tsRequest, error } = await this._getTimestampRequest(url, body, auth, proxy, tsQuery); + if (error) { + return { + timestampToken: null, + log: { + info: { name, info: null, date: new Date(), url, response: null, error: error?.message }, + errorTrace: error?.trace + } + }; + } + try { + const response = await fetch(requestUrl, tsRequest); + if (response.status !== 200) { + throw new Error(`TSA response unsatisfactory: ${response.status} ${response.statusText}`); + } + return { + timestampToken: Buffer.from((await response.arrayBuffer()), 'utf8'), // TODO: fix type + log: { + info: { name, date: new Date(), url, response: `${response.status}, ${response.statusText}`, error: null }, + errorTrace: null + } + }; + } + catch (error) { + return { + timestampToken: null, + log: { + info: { name, date: new Date(), url, response: null, error: error.message }, + errorTrace: error + } + }; + } + finally { + for (const cleanUpFn of this.cleanupTempFns) { + if (typeof cleanUpFn === 'function') { + cleanUpFn(); + } + } + } + } + /** + * getTimestampRequestSettings method that set the request settings + **/ + async _getTimestampRequest(url, body, auth, proxy, tsQuery) { + // send the request to the TSA + const tsRequest = new TimestampRequest(this.tempFileService, this.tmpOptions, this.cleanupTempFns); + if (proxy?.url) { + tsRequest.setProxy(proxy); + } + let requestType; + if (url?.getTokenUrl && tsQuery) { + requestType = 'oauth'; + } + if (!url?.getTokenUrl && auth?.user && auth?.pass && tsQuery) { + requestType = 'basic'; + } + if (!url?.getTokenUrl && !auth?.user) { + requestType = 'noAuth'; + } + return await tsRequest.authStrategy(requestType, url, auth, body, proxy, tsQuery); + } +} + +function exec(command, options = {}, logger) { + return new Promise((resolve, reject) => { + childProcess__namespace.exec(command, options, (err, stdout, stderr) => { + if (err) { + return reject(err || new Error(stderr.toString() || `Failed to execute command: ${command}`)); + } + return resolve(stdout); + }); + }); +} + +async function getTsQuery(digest, digestFormat) { + // create a time stamp request based on the hash of a data file + const queryCommand = `openssl ts -query -digest ${digest} -no_nonce -${digestFormat} -cert`; + return await exec(queryCommand, { encoding: 'buffer' }).catch(err => { + throw new Error(`Failed to execute openssl ts -query command "${queryCommand}" ${err.message}`); + }); +} +function getTsVerify(digest, tempPath, isToken, certsLocation) { + // verify the response with openssl + const verifyCommand = isToken + ? `openssl ts -verify -digest ${digest} -token_in -in ${tempPath} -CApath ${certsLocation}` + : `openssl ts -verify -digest ${digest} -in ${tempPath} -CApath ${certsLocation}`; + return exec(verifyCommand).catch(err => { + throw new Error(`Failed to verify tsr "${verifyCommand}" ${err.message}`); + }); +} +async function getTsReply(inputTempPath, isToken) { + // get token info + const replyCommand = isToken + ? `openssl ts -reply -token_in -in ${inputTempPath} -text` + : `openssl ts -reply -in ${inputTempPath} -text`; + return await exec(replyCommand).catch(err => { + throw new Error(`Error executing openssl ts -reply command "${replyCommand}" ${err.message}`); + }); +} +async function generateTsReply(inputTempPath, tempPath) { + await exec(`openssl ts -reply -in "${inputTempPath}" -token_out -out "${tempPath}"`).catch(err => { + throw new Error(`Error executing openssl ts -reply command "${inputTempPath}" ${err.message}`); + }); +} +async function extractCertFromToken(tstPath) { + return await exec(`openssl pkcs7 -inform der -in "${tstPath}" -print_certs`).catch(err => { + throw new Error(`Error executing openssl pkcs7 command ${err.message}`); + }); +} +async function checkSslPath() { + try { + const stdout = await exec('which openssl'); + if (!stdout.toString()) { + throw new Error('openssl is unavailable'); + } + return stdout; + } + catch (error) { + throw new Error(`Unable to verify openssl installation ${error.message}`); + } +} + +const supportedDigestForamts = [ + 'sha', + 'sha1', + 'mdc2', + 'ripemd160', + 'sha224', + 'sha256', + 'sha384', + 'sha512', + 'md2', + 'md4', + 'md5', + 'dss1' +]; +function checkDigestFormat(format) { + return supportedDigestForamts.includes(format); +} +function checkDigest(digest) { + return /^([0-9A-F])+$/i.test(digest); +} +function normalizeDigestFormat(format) { + return format + .replace(/^-/, '') // -sha256 + .replace(/-/g, ''); // sha-256 +} + +tmp.setGracefulCleanup(); +const tmpFile = util.promisify((options, cb) => { + tmp.file(options, (err, ...results) => cb(err, results)); +}); +class TempFileService { + /** + * Utility to create a temp file with content + * */ + async createTempFile(options, content) { + try { + const [tempPath, fd, cleanupCallback] = await tmpFile(options); + if (content) { + await fs$1.writeFile(tempPath, content); + } + return { tempPath, fd, cleanupCallback }; + } + catch (err) { + throw new Error(`Failed to create temp file ${err}`); + } + } +} + +/** + * Custom error class that encapsulates context about token creation, including the provider used and the associated log history + */ +class CreateTimestampTokenError extends Error { + context; + constructor(message, context = {}, options) { + super(message, options); + this.context = context; + } +} + +/** + * OpenSSL docs: https://www.openssl.org/docs/manmaster/man1/ts.html + * + * Certificate Installation with OpenSSL: http://gagravarr.org/writing/openssl-certs/others.shtml + * + * Trustedtimestamp service implements the generate, import and verification of timestamps + * + * */ +class TrustedTimestampService { + timestampInfoType; + config; + encoding; + tmpOptions = { prefix: 'request-', postfix: '.tsr' }; + tempFileService; + certService; + providers; + certsLocation; + timestampRequest; + constructor(timestampInfoType = 'normal', config = {}, encoding = 'latin1') { + this.timestampInfoType = timestampInfoType; + this.config = config; + this.encoding = encoding; + this._init(); + } + /** + * init method that sets the config and instantiates the required services + * */ + _init() { + if (this.config) { + if (!this.config?.certsLocation) { + throw new Error('trustedTimestamp config "certsLocation" missing!'); + } + if (!this.config?.providers?.length) { + throw new Error('trustedTimestamp config "providers" missing or empty!'); + } + this.tempFileService = new TempFileService(); + this.certService = new certUtils.CertService(this.encoding); + this.providers = this.config.providers; + this.certsLocation = this.config.certsLocation; + this.timestampRequest = new TrustedTimestampRequest(this.providers, this.tempFileService, this.tmpOptions); + } + } + /** + * Utility method that resolves to a TimestampInfo object containing parsed info from the tsr + * */ + async getTimestampInfo(tsr, isToken = false) { + const cleanupTempFns = []; + let inputTempPath = ''; + try { + const tsrtmp = await this.tempFileService.createTempFile(this.tmpOptions, tsr); + inputTempPath = tsrtmp.tempPath; + cleanupTempFns.push(tsrtmp.cleanupCallback); + const responseText = await getTsReply(inputTempPath, isToken); + const timestampInfo = new TimestampInfo(this.timestampInfoType, responseText); + // get cert info + try { + // get raw token if the input was a whole response (TimestampResponse->TimestampToken) + let tstPath; + if (isToken) { + tstPath = inputTempPath; + } + else { + const tmp = await this.tempFileService.createTempFile(this.tmpOptions); + await generateTsReply(inputTempPath, tmp.tempPath); + tstPath = tmp.tempPath; + cleanupTempFns.push(tmp.cleanupCallback); + } + // extract cert from token + const x509Cert = await extractCertFromToken(tstPath); + // parse cert + const certInfo = await this.certService.parseCert(Buffer.from(x509Cert), '', this.certService.CertType.PEM); + if (this.timestampInfoType === 'normal') { + timestampInfo.setCertInfo(certInfo); + } + } + catch (err) { + throw new Error('Unable to get cert info from timestamp token', err); + } + return timestampInfo; + } + catch (err) { + return new TimestampInfo(this.timestampInfoType, null, err.message); + } + finally { + for (const cleanUpFn of cleanupTempFns) { + if (typeof cleanUpFn === 'function') { + cleanUpFn(); + } + } + } + } + /** + * Returns a TimestampToken instance for a hash digest and a hash algorithm. + * It requests a token from the TSA and verifies the received response. + * The returned timestamp token represents the token + * and contains the tsr with the verification result. + * */ + async createTimestampToken(digest, hashAlgorithm, dataSize) { + const digestFormat = normalizeDigestFormat(hashAlgorithm); + try { + if (!checkDigestFormat(digestFormat)) { + throw new Error(`Unknown digest format: ${hashAlgorithm}`); + } + if (!checkDigest(digest)) { + throw new Error(`Invalid digest: ${digest}`); + } + const tsQuery = await getTsQuery(digest, digestFormat); + console.log('!!!!!!!!!!!!!!!'); + console.log(tsQuery); + const { tsr, providerName, logHistory } = await this.timestampRequest.getTimestamp(tsQuery); + if (!tsr) { + throw new CreateTimestampTokenError('Failed to create trusted timestamp, no provider was available', { + providerName, + logHistory + }); + } + const timestampInfo = await this.getTimestampInfo(tsr, false); + const certExpiry = timestampInfo.certInfo?.notAfter || null; + const tt = { + digest, + hashAlgorithm, + dataSize, + tsr, + isToken: false, + certExpiry, + verified: null // not yet + }; + tt.verified = await this.verifyToken(tt, digest, dataSize); + return { timestamp: tt, providerName, logHistory }; + } + catch (error) { + if (error instanceof CreateTimestampTokenError) { + throw error; + } + throw new CreateTimestampTokenError(`Failed to create trusted timestamp ${error.message}`); + } + } + /** + * Verify if a timestamp token corresponds to a particular hash of data + * */ + async verifyToken(timestampToken, digest, dataSize) { + if (timestampToken.dataSize !== dataSize) { + throw new Error(`Timestamp token verification failed: The provided data size (${dataSize}) does not match the time stamped size (${timestampToken.dataSize}).`); + } + if (timestampToken.digest !== digest) { + throw new Error(`Timestamp token verification failed: The provided digest (${digest}) does not match the time stamped digest (${timestampToken.digest}).`); + } + // verify token + return await this.verifyTsr(digest, timestampToken.tsr, timestampToken.isToken); + } + /** + * Verify a hash digest against a timestamp response file + * */ + async verifyTsr(digest, tsr, isToken = false) { + let cleanupTempFile = null; + try { + if (!checkDigest(digest)) { + throw new Error(`Invalid digest: ${digest}`); + } + // save the tsr on disk because openssl can only read it from file + const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(this.tmpOptions, tsr); + cleanupTempFile = cleanupCallback; + const stdout = await getTsVerify(digest, tempPath, isToken, this.certsLocation); + const verificationResult = /Verification: OK/i.test(stdout); + if (cleanupTempFile) { + cleanupTempFile(); + } + return verificationResult; + } + catch (err) { + if (typeof cleanupTempFile === 'function') { + cleanupTempFile(); + } + throw new Error(`Failed to verify tsr ${err.message}`); + } + } + /** + * testService method that check the ssl installation + * */ + async testService() { + return await checkSslPath(); + } +} + +exports.CreateTimestampTokenError = CreateTimestampTokenError; +exports.TrustedTimestampService = TrustedTimestampService; +//# sourceMappingURL=timestamp_config.cjs.map diff --git a/package/timestamp_service/build/timestamp_config.cjs.map b/package/timestamp_service/build/timestamp_config.cjs.map new file mode 100644 index 0000000..fd97a0b --- /dev/null +++ b/package/timestamp_service/build/timestamp_config.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"timestamp_config.cjs","sources":["../../src/util/regexParser.ts","../../src/trustedTimestamp/TrustedTimestampInfo.ts","../../src/patch/node-fetch.ts","../../src/trustedTimestamp/TimestampRequest.ts","../../src/trustedTimestamp/TrustedTimestampRequest.ts","../../src/util/child_process_promise.ts","../../src/trustedTimestamp/TrustedTimestampCommand.ts","../../src/trustedTimestamp/TrustedTimestampCheck.ts","../../src/util/TempFileService.ts","../../src/trustedTimestamp/error/create-timestamp-token.error.ts","../../src/trustedTimestamp/TrustedTimestampService.ts"],"sourcesContent":["function parseRegex(\n text: string,\n regex: RegExp,\n groups: Groups,\n revive: (\n parameter: Groups extends number\n ? string\n : Groups extends (string | number)[]\n ? Record\n : RegExpMatchArray\n ) => ReviveResult = value => value as unknown as ReviveResult\n): ReviveResult | null | undefined {\n const result = text.match(regex)\n if (!result) {\n return null\n }\n\n if (!groups) {\n return (revive as (parameter: RegExpMatchArray) => ReviveResult)(result)\n }\n\n if (typeof groups === 'number') {\n return (revive as (parameter: string) => ReviveResult)(result[groups])\n }\n\n if (Array.isArray(groups)) {\n const ret: Record = {}\n groups.forEach((name, i) => {\n ret[name] = result[i + 1]\n })\n return (revive as (parameter: Record) => ReviveResult)(ret)\n }\n}\n\nfunction createParser(\n regex: RegExp,\n groups: number | number[],\n revive: (value: unknown) => ReviveResult\n): (text: string) => ReviveResult | null | undefined {\n return (text: string) => {\n return parseRegex(text, regex, groups, revive)\n }\n}\n\nexport { createParser as create }\nexport { parseRegex }\n","import { CertService } from '@techteamer/cert-utils'\nimport { parseRegex } from '../util/regexParser'\n\ninterface TSA {\n C: string | null\n L: string | null\n O: string | null\n OU: string | null\n CN: string | null\n}\n\n/**\n *\n * Status info:\n * Status: Granted.\n * Status description: unspecified\n * Failure info: unspecified\n *\n * TST info:\n * Version: 1\n * Policy OID: 1.3.6.1.4.1.21528.2.2.99\n * Hash Algorithm: sha256\n * Message data:\n * 0000 - c5 3e 94 56 aa 61 ed 56-49 69 74 29 1e 01 d7 2a .>.V.a.VIit)...*\n * 0010 - 64 cc 24 84 d2 a2 31 4d-33 b6 ca c8 98 23 03 b9 d.$...1M3....#..\n * Serial number: 0x0308441E\n * Time stamp: Jan 30 13:45:20 2018 GMT\n * Accuracy: 0x01 seconds, unspecified millis, unspecified micros\n * Ordering: no\n * Nonce: unspecified\n * TSA: DirName:/C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=e-Szigno Test TSA2\n * Extensions:\n * */\nexport class TimestampInfo {\n error: string | null = null\n version: number | null = null\n policyOID: string | null = null\n hashAlgorithm: string | null = null\n hash: string | null = null\n serialNumber: string | null = null\n timeStamp: Date | null = null\n timeStampDate: Date | null = null\n accuracy: number | null = null\n ordering: boolean | null = null\n nonce: string | null = null\n issuer: string | null = null\n tsa: TSA | null = null\n certInfo: CertService['CertInfo'] | null = null\n\n constructor(timestampInfoType: 'normal' | 'short' = 'normal', tsText: string, error: string | null = null) {\n this.error = null\n this.version = null\n this.policyOID = null\n this.hashAlgorithm = null\n this.serialNumber = null\n this.timeStamp = null\n this.accuracy = null\n this.ordering = null\n this.nonce = null\n this.tsa = null\n\n if (error) {\n this.error = error\n } else {\n if (timestampInfoType === 'short') {\n this.parseOpensslOutputShort(tsText)\n } else {\n this.hash = null\n this.timeStampDate = null\n this.issuer = null\n this.certInfo = null\n this.parseOpensslOutput(tsText)\n }\n }\n }\n\n setCertInfo(certInfo: CertService['CertInfo'] | null): void {\n this.certInfo = certInfo\n }\n\n parseOpensslOutput(tsText: string): void {\n this.version = parseRegex(tsText, /Version:\\s*([^\\n\\r]+)/, 1, parseInt)!\n this.policyOID = parseRegex(tsText, /Policy OID:\\s*([^\\n\\r]+)/, 1)!\n this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\\s*([^\\n\\r]+)/, 1)!\n this.hash = tsText\n .match(/\\d{4} - .*?\\s{2}/g)!\n .map(line => {\n return line.replace(/\\d{4} - /g, '').replace(/[\\s*-]/g, '')\n })\n .join('')\n this.serialNumber = parseRegex(tsText, /Serial number:\\s*([^\\n\\r]+)/, 1)!\n this.timeStamp = parseRegex(tsText, /Time stamp:\\s*([^\\n\\r]+)/, 1)!\n this.timeStampDate = new Date(this.timeStamp)\n this.accuracy = parseRegex(\n tsText,\n /Accuracy:\\s*(.+) seconds, (.+) millis, (.+) micros/,\n ['s', 'm', 'u'],\n ({ s, m, u }) => {\n const _s = Number(s === 'unspecified' ? 0 : s)\n const _m = Number(m === 'unspecified' ? 0 : m)\n const _u = Number(u === 'unspecified' ? 0 : u)\n return _s * 1000 + _m + _u / 1000\n }\n )!\n this.ordering = parseRegex(tsText, /Ordering:\\s*([^\\n\\r]+)/, 1, ordering => ordering !== 'no')!\n this.nonce = parseRegex(tsText, /Nonce:\\s*([^\\n\\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))!\n this.issuer = parseRegex(tsText, /TSA:\\s*DirName:\\s*([^\\n\\r]+)/, 1)!\n this.tsa = parseRegex(tsText, /TSA:\\s*DirName:\\s*([^\\n\\r]+)/, 1, (result): TSA => {\n const m = result.match(/\\/\\w{1,2}=[^/]+/g) || []\n\n return m.reduce(\n (obj, part) => {\n const [, label, value] = part.match(/\\/(\\w{1,2})=([^/]+)/) || []\n if (!label || !value) {\n return obj\n }\n obj[label as keyof TSA] = value\n return obj\n },\n { C: null, L: null, O: null, OU: null, CN: null } as TSA\n )\n })!\n }\n\n parseOpensslOutputShort(tsText: string): void {\n this.version = parseRegex(tsText, /Version:\\s*([^\\n\\r]+)/, 1, parseInt)!\n this.policyOID = parseRegex(tsText, /Policy OID:\\s*([^\\n\\r]+)/, 1)!\n this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\\s*([^\\n\\r]+)/, 1)!\n this.serialNumber = parseRegex(tsText, /Serial number:\\s*([^\\n\\r]+)/, 1)!\n this.timeStamp = parseRegex(tsText, /Time stamp:\\s*([^\\n\\r]+)/, 1, dateString => new Date(dateString))!\n this.accuracy = parseRegex(\n tsText,\n /Accuracy:\\s*(.+) seconds, (.+) millis, (.+) micros/,\n ['s', 'm', 'u'],\n ({ s, m, u }) => {\n const _s = Number(s === 'unspecified' ? 0 : s)\n const _m = Number(m === 'unspecified' ? 0 : m)\n const _u = Number(u === 'unspecified' ? 0 : u)\n return _s * 1000 + _m + _u / 1000\n }\n )!\n this.ordering = parseRegex(tsText, /Ordering:\\s*([^\\n\\r]+)/, 1, ordering => ordering !== 'no')!\n this.nonce = parseRegex(tsText, /Nonce:\\s*([^\\n\\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))!\n this.tsa = parseRegex(tsText, /TSA:\\s*([^\\n\\r]+)/, 1, v => {\n const m = v.match(/\\/\\w{1,2}=[^/]+/g) || []\n\n return m.reduce(\n (obj, part) => {\n const [, label, value] = part.match(/\\/(\\w{1,2})=([^/]+)/) || []\n if (!label || !value) {\n return obj\n }\n obj[label as keyof TSA] = value\n return obj\n },\n { C: null, L: null, O: null, OU: null, CN: null } as TSA\n )\n })!\n }\n}\n","import type { RequestInfo, RequestInit, Response } from 'node-fetch'\n\nexport const fetch = async (url: URL | RequestInfo, init?: RequestInit): Promise => {\n const { default: fetch } = await import('node-fetch')\n return fetch(url, init)\n}\n","import type { BodyInit } from 'node-fetch'\nimport { fetch } from '../patch/node-fetch'\nimport fs from 'node:fs'\nimport { ProxyAgent } from 'proxy-agent'\nimport type { FileOptions } from 'tmp'\n\nimport type {\n TimestampRequestAuthResult,\n TimestampRequestAuthTypes,\n TimestampRequestError,\n TimestampRequestOptions\n} from './types/timestamp-request.type'\nimport type {\n TimestampProviderAuth,\n TimestampProviderBody,\n TimestampProviderOAuthUrl,\n TimestampProviderProxyConfig,\n TimestampProviderUrl\n} from './types/timestamp-provider.type'\nimport type { TempFileService } from '../util/TempFileService'\n\n/**\n * TimestampRequest class implements timestamp request\n * */\nexport class TimestampRequest {\n private tsRequest: TimestampRequestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/timestamp-query'\n }\n }\n\n constructor(\n private readonly tempFileService: TempFileService,\n private readonly tmpOptions: FileOptions,\n private readonly cleanupTempFns: ((...args: unknown[]) => unknown)[]\n ) {}\n\n /**\n * set request header\n * */\n setHeader(headers: Record): void {\n this.tsRequest = {\n ...this.tsRequest,\n headers\n }\n }\n\n /**\n * set request body\n * */\n setBody(body: BodyInit): void {\n this.tsRequest.body = body\n }\n\n /**\n * set request proxy\n * */\n setProxy(proxy: TimestampProviderProxyConfig): void {\n this.tsRequest.agent = new ProxyAgent({\n getProxyForUrl: (): string => proxy.url,\n rejectUnauthorized: !(proxy.allowUnauthorized ?? false)\n })\n }\n\n /**\n * set request encoding\n * */\n setEncoding(encoding: string | null): void {\n this.tsRequest.encoding = encoding\n }\n\n /**\n * set request encoding\n * */\n setResolveWithFullResponse(resolveWithFullResponse: boolean): void {\n this.tsRequest.resolveWithFullResponse = resolveWithFullResponse\n }\n\n /**\n * return tsRequest\n * */\n get(): TimestampRequestOptions {\n return this.tsRequest\n }\n\n /**\n * authStrategy method that set no auth request\n * */\n async authStrategy(\n requestType: TimestampRequestAuthTypes | undefined,\n url: TimestampProviderUrl,\n auth: TimestampProviderAuth | undefined,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n switch (requestType) {\n case 'basic':\n return this._getTimestampRequestBasic(url as string, auth!, tsQuery)\n case 'oauth':\n return await this._getTimestampRequestOauth(url as TimestampProviderOAuthUrl, auth!, body, proxy, tsQuery)\n case 'noAuth':\n return this._getTimestampRequestNoAuth(url as string, tsQuery)\n default:\n return this._getTimestampRequestNoAuth(url as string, tsQuery)\n }\n }\n\n /**\n * _getTimestampRequestBasic method that set basic auth request\n * */\n private _getTimestampRequestBasic(\n url: string,\n auth: TimestampProviderAuth,\n tsQuery: string\n ): TimestampRequestAuthResult {\n this.setHeader({\n ...this.tsRequest.headers,\n Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`\n })\n\n this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily\n this.setResolveWithFullResponse(true)\n this.setBody(tsQuery)\n\n return { requestUrl: url, tsRequest: this.get() }\n }\n\n /**\n * _getTimestampRequestOauth method that set oauth request\n * */\n private async _getTimestampRequestOauth(\n url: TimestampProviderOAuthUrl,\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n const oauthResult = await this._getOauth<{\n access_token?: string\n error?: TimestampRequestError\n }>(url.getTokenUrl, auth, body, proxy)\n if (!oauthResult?.access_token) {\n return { requestUrl: null, tsRequest: null, error: null }\n }\n\n if (oauthResult?.error) {\n return { requestUrl: null, tsRequest: null, error: oauthResult?.error }\n }\n\n const accessToken = oauthResult?.access_token\n\n if (accessToken) {\n this.setHeader({\n ...this.tsRequest.headers,\n Authorization: `Bearer ${accessToken}`\n })\n\n const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(\n this.tmpOptions,\n Buffer.from(tsQuery)\n )\n this.cleanupTempFns.push(cleanupCallback)\n\n const stats = fs.statSync(tempPath)\n const fileSizeInBytes = stats.size\n this.setBody(fs.createReadStream(tempPath))\n this.setHeader({\n ...this.tsRequest.headers,\n 'Content-length': fileSizeInBytes.toString()\n })\n }\n\n return { requestUrl: url?.getTimestampUrl, tsRequest: this.get(), error: null }\n }\n\n /**\n * _getTimestampRequestNoAuth method that set no auth request\n * */\n private _getTimestampRequestNoAuth(url: string, tsQuery: string): TimestampRequestAuthResult {\n this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily\n this.setResolveWithFullResponse(true)\n this.setBody(tsQuery)\n\n return { requestUrl: url, tsRequest: this.get() }\n }\n\n /**\n * _getOauth method that get oauth access_token\n **/\n private async _getOauth(\n url: string,\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined\n ): Promise {\n const tsRequest = await this._getOauthRequestSettings(auth, body, proxy)\n try {\n const response = await fetch(url, tsRequest)\n return (await response.json()) as ResponseType\n } catch (error) {\n return {\n error: {\n message: (error as Error).message,\n trace: error as Error\n }\n } as ResponseType\n }\n }\n\n /**\n * _getOauthRequestSettings method that set the request oath settings\n **/\n private async _getOauthRequestSettings(\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined\n ): Promise> {\n const tsRequest: TimestampRequestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`\n },\n body: new URLSearchParams(body)\n }\n\n if (proxy?.url) {\n tsRequest.agent = new ProxyAgent({\n getProxyForUrl: (): string => proxy.url,\n rejectUnauthorized: !(proxy.allowUnauthorized ?? false)\n })\n }\n\n return tsRequest\n }\n}\n","import { FileOptions as TempFileOptions } from 'tmp'\nimport { fetch } from '../patch/node-fetch'\n\nimport { TimestampRequest } from './TimestampRequest'\nimport { TempFileService } from '../util/TempFileService'\nimport type { TimestampRequestAuthResult, TimestampRequestAuthTypes } from './types/timestamp-request.type'\nimport type {\n TimestampProvider,\n TimestampProviderAuth,\n TimestampProviderBody,\n TimestampProviderOAuthUrl,\n TimestampProviderProxyConfig,\n TimestampProviderUrl\n} from './types/timestamp-provider.type'\nimport type { TimestampLog } from './types/timestamp-log.type'\n\n/**\n * TrustedTimestampRequest service implements timestamp request and sorted providers\n * */\nexport class TrustedTimestampRequest {\n private readonly cleanupTempFns: (() => unknown)[] = []\n private readonly providers: TimestampProvider[]\n\n constructor(\n providers: TimestampProvider[],\n private readonly tempFileService: TempFileService,\n private readonly tmpOptions: TempFileOptions\n ) {\n this.providers = this._sortedProviders(providers)\n }\n\n /**\n * getTimestamp method that calls the service providers in sequence, requesting a timestamp\n **/\n async getTimestamp(\n tsQuery: string\n ): Promise<{ tsr: Buffer | null; providerName: string; logHistory: TimestampLog[] }> {\n let tsr = null\n let providerName = ''\n const logHistory: TimestampLog[] = []\n\n for (const provider of this.providers) {\n if (!tsr) {\n const { name, url, auth, body, proxy } = provider\n\n if (!name) {\n throw new Error('Provider name is missing')\n }\n if (!url) {\n throw new Error('Provider url is missing')\n }\n\n const { timestampToken, log } = await this._getTimeStampToken(name, url, auth, body, proxy, tsQuery)\n logHistory.push(log)\n tsr = timestampToken\n providerName = name\n }\n }\n\n return { tsr, providerName, logHistory }\n }\n\n /**\n * sortedProviders method that sorting the providers according to priority\n **/\n private _sortedProviders(providers: TimestampProvider[]): TimestampProvider[] {\n const priorityProviders: TimestampProvider[] = []\n const nonPriorityProviders: TimestampProvider[] = []\n\n providers.forEach(provider => {\n if (provider?.priority) {\n priorityProviders.push(provider)\n } else {\n nonPriorityProviders.push(provider)\n }\n })\n\n const sortedProviders = priorityProviders.toSorted((a, b) => a.priority! - b.priority!)\n\n return sortedProviders.concat(nonPriorityProviders)\n }\n\n /**\n * sendTimestampRequest method that calls the provider\n **/\n private async _getTimeStampToken(\n name: string,\n url: TimestampProviderUrl,\n auth: TimestampProviderAuth | undefined,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise<{\n timestampToken: null | Buffer\n log: TimestampLog\n }> {\n const { requestUrl, tsRequest, error } = await this._getTimestampRequest(url, body, auth, proxy, tsQuery)\n if (error) {\n return {\n timestampToken: null,\n log: {\n info: { name, info: null, date: new Date(), url, response: null, error: error?.message },\n errorTrace: error?.trace\n }\n }\n }\n try {\n const response = await fetch(requestUrl!, tsRequest!)\n if (response.status !== 200) {\n throw new Error(`TSA response unsatisfactory: ${response.status} ${response.statusText}`)\n }\n\n return {\n timestampToken: Buffer.from((await response.arrayBuffer()) as unknown as string, 'utf8'), // TODO: fix type\n log: {\n info: { name, date: new Date(), url, response: `${response.status}, ${response.statusText}`, error: null },\n errorTrace: null\n }\n }\n } catch (error) {\n return {\n timestampToken: null,\n log: {\n info: { name, date: new Date(), url, response: null, error: (error as Error).message },\n errorTrace: error as Error\n }\n }\n } finally {\n for (const cleanUpFn of this.cleanupTempFns) {\n if (typeof cleanUpFn === 'function') {\n cleanUpFn()\n }\n }\n }\n }\n\n /**\n * getTimestampRequestSettings method that set the request settings\n **/\n private async _getTimestampRequest(\n url: TimestampProviderUrl,\n body: TimestampProviderBody | undefined,\n auth: TimestampProviderAuth | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n // send the request to the TSA\n const tsRequest = new TimestampRequest(this.tempFileService, this.tmpOptions, this.cleanupTempFns)\n\n if (proxy?.url) {\n tsRequest.setProxy(proxy)\n }\n\n let requestType: TimestampRequestAuthTypes | undefined\n if ((url as TimestampProviderOAuthUrl)?.getTokenUrl && tsQuery) {\n requestType = 'oauth'\n }\n if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && auth?.user && auth?.pass && tsQuery) {\n requestType = 'basic'\n }\n if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && !auth?.user) {\n requestType = 'noAuth'\n }\n\n return await tsRequest.authStrategy(requestType, url, auth, body, proxy, tsQuery)\n }\n}\n","import * as childProcess from 'node:child_process'\nimport type { ExecOptions } from 'node:child_process'\n\ninterface Logger {\n info: (log: string, ...args: unknown[]) => unknown\n error: (log: string, ...args: unknown[]) => unknown\n}\n\nexport function exec(\n command: string,\n options: {\n encoding?: 'buffer'\n } & ExecOptions = {},\n logger?: Logger\n): Promise {\n return new Promise((resolve, reject) => {\n const process = childProcess.exec(command, options, (err, stdout, stderr) => {\n if (err) {\n return reject(err || new Error(stderr.toString() || `Failed to execute command: ${command}`))\n }\n\n return resolve(stdout as ReturnType)\n })\n\n if (logger) {\n process.stdout!.on('data', message => {\n message = message.trim()\n if (message) {\n logger.info(message)\n }\n })\n\n process.stderr!.on('data', message => {\n message = message.trim()\n if (message) {\n logger.error(message)\n }\n })\n }\n })\n}\n\nexport class ExecFileError extends Error {\n public stdout?: string\n public stderr?: string\n}\n\nexport function execFile(command: string, args: string[], options = {}): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n childProcess.execFile(command, args, options, (err, stdout, stderr) => {\n if (err) {\n const error = new ExecFileError(err ? err.message : stderr.toString() || `Failed to execute file: ${command}`)\n error.stdout = stdout\n error.stderr = stderr\n return reject(error)\n }\n\n resolve({ stdout, stderr })\n })\n })\n}\n","import { exec } from '../util/child_process_promise'\n\nexport async function getTsQuery(digest: string, digestFormat: string): Promise {\n // create a time stamp request based on the hash of a data file\n const queryCommand = `openssl ts -query -digest ${digest} -no_nonce -${digestFormat} -cert`\n\n return await exec(queryCommand, { encoding: 'buffer' }).catch(err => {\n throw new Error(`Failed to execute openssl ts -query command \"${queryCommand}\" ${err.message}`)\n })\n}\n\nexport function getTsVerify(\n digest: string,\n tempPath: string,\n isToken: boolean,\n certsLocation: string\n): Promise {\n // verify the response with openssl\n const verifyCommand = isToken\n ? `openssl ts -verify -digest ${digest} -token_in -in ${tempPath} -CApath ${certsLocation}`\n : `openssl ts -verify -digest ${digest} -in ${tempPath} -CApath ${certsLocation}`\n\n return exec(verifyCommand).catch(err => {\n throw new Error(`Failed to verify tsr \"${verifyCommand}\" ${err.message}`)\n })\n}\n\nexport async function getTsReply(inputTempPath: string, isToken: boolean): Promise {\n // get token info\n const replyCommand = isToken\n ? `openssl ts -reply -token_in -in ${inputTempPath} -text`\n : `openssl ts -reply -in ${inputTempPath} -text`\n return await exec(replyCommand).catch(err => {\n throw new Error(`Error executing openssl ts -reply command \"${replyCommand}\" ${err.message}`)\n })\n}\n\nexport async function generateTsReply(inputTempPath: string, tempPath: string): Promise {\n await exec(`openssl ts -reply -in \"${inputTempPath}\" -token_out -out \"${tempPath}\"`).catch(err => {\n throw new Error(`Error executing openssl ts -reply command \"${inputTempPath}\" ${err.message}`)\n })\n}\n\nexport async function extractCertFromToken(tstPath: string): Promise {\n return await exec(`openssl pkcs7 -inform der -in \"${tstPath}\" -print_certs`).catch(err => {\n throw new Error(`Error executing openssl pkcs7 command ${err.message}`)\n })\n}\n\nexport async function checkSslPath(): Promise {\n try {\n const stdout = await exec('which openssl')\n if (!stdout.toString()) {\n throw new Error('openssl is unavailable')\n }\n return stdout\n } catch (error) {\n throw new Error(`Unable to verify openssl installation ${(error as Error).message}`)\n }\n}\n","const supportedDigestForamts = [\n 'sha',\n 'sha1',\n 'mdc2',\n 'ripemd160',\n 'sha224',\n 'sha256',\n 'sha384',\n 'sha512',\n 'md2',\n 'md4',\n 'md5',\n 'dss1'\n]\n\nexport function checkDigestFormat(format: string): boolean {\n return supportedDigestForamts.includes(format)\n}\n\nexport function checkDigest(digest: string): boolean {\n return /^([0-9A-F])+$/i.test(digest)\n}\n\nexport function normalizeDigestFormat(format: string): string {\n return format\n .replace(/^-/, '') // -sha256\n .replace(/-/g, '') // sha-256\n}\n","import fs from 'node:fs/promises'\nimport util from 'node:util'\nimport tmp from 'tmp'\n\ntmp.setGracefulCleanup()\n\nconst tmpFile = util.promisify(\n (\n options: tmp.FileOptions,\n cb: (error: Error | null, results: [string, number | undefined, () => void]) => unknown\n ) => {\n tmp.file(options, (err, ...results) => cb(err, results))\n }\n)\n\nexport class TempFileService {\n /**\n * Utility to create a temp file with content\n * */\n async createTempFile(\n options: tmp.FileOptions,\n content?: Buffer\n ): Promise<{ tempPath: string; fd: number | undefined; cleanupCallback: () => void }> {\n try {\n const [tempPath, fd, cleanupCallback] = await tmpFile(options)\n if (content) {\n await fs.writeFile(tempPath, content as unknown as string)\n }\n return { tempPath, fd, cleanupCallback }\n } catch (err) {\n throw new Error(`Failed to create temp file ${err}`)\n }\n }\n}\n","import { CreatedTimestampToken } from '../types/timestamp-token.type'\n\nexport type CreateTimestampTokenErrorContext = Partial>\n\n/**\n * Custom error class that encapsulates context about token creation, including the provider used and the associated log history\n */\nexport class CreateTimestampTokenError extends Error {\n constructor(\n message: string,\n readonly context: CreateTimestampTokenErrorContext = {},\n options?: ErrorOptions\n ) {\n super(message, options)\n }\n}\n","import { CertService } from '@techteamer/cert-utils'\nimport { FileOptions as TempFileOptions } from 'tmp'\n\nimport { TimestampInfo } from './TrustedTimestampInfo'\nimport { TrustedTimestampRequest } from './TrustedTimestampRequest'\nimport {\n checkSslPath,\n extractCertFromToken,\n generateTsReply,\n getTsQuery,\n getTsReply,\n getTsVerify\n} from './TrustedTimestampCommand'\nimport { checkDigest, checkDigestFormat, normalizeDigestFormat } from './TrustedTimestampCheck'\nimport { TempFileService } from '../util/TempFileService'\nimport { CreateTimestampTokenError } from './error/create-timestamp-token.error'\nimport type { TimestampConfig } from './types/timestamp-config.type'\nimport type { TimestampProvider } from './types/timestamp-provider.type'\nimport type { CreatedTimestampToken, Timestamp } from './types/timestamp-token.type'\n\n/**\n * OpenSSL docs: https://www.openssl.org/docs/manmaster/man1/ts.html\n *\n * Certificate Installation with OpenSSL: http://gagravarr.org/writing/openssl-certs/others.shtml\n *\n * Trustedtimestamp service implements the generate, import and verification of timestamps\n *\n * */\nexport class TrustedTimestampService {\n private readonly tmpOptions: TempFileOptions = { prefix: 'request-', postfix: '.tsr' }\n private tempFileService!: TempFileService\n private certService!: CertService\n private providers!: TimestampProvider[]\n private certsLocation!: string\n private timestampRequest!: TrustedTimestampRequest\n\n constructor(\n private readonly timestampInfoType: 'normal' | 'short' = 'normal',\n private readonly config: TimestampConfig = {} as TimestampConfig,\n private readonly encoding = 'latin1'\n ) {\n this._init()\n }\n\n /**\n * init method that sets the config and instantiates the required services\n * */\n private _init(): void {\n if (this.config) {\n if (!this.config?.certsLocation) {\n throw new Error('trustedTimestamp config \"certsLocation\" missing!')\n }\n\n if (!this.config?.providers?.length) {\n throw new Error('trustedTimestamp config \"providers\" missing or empty!')\n }\n\n this.tempFileService = new TempFileService()\n this.certService = new CertService(this.encoding)\n this.providers = this.config.providers\n this.certsLocation = this.config.certsLocation\n this.timestampRequest = new TrustedTimestampRequest(this.providers, this.tempFileService, this.tmpOptions)\n }\n }\n\n /**\n * Utility method that resolves to a TimestampInfo object containing parsed info from the tsr\n * */\n async getTimestampInfo(tsr: Buffer, isToken = false): Promise {\n const cleanupTempFns: (() => unknown)[] = []\n let inputTempPath = ''\n\n try {\n const tsrtmp = await this.tempFileService.createTempFile(this.tmpOptions, tsr)\n inputTempPath = tsrtmp.tempPath\n cleanupTempFns.push(tsrtmp.cleanupCallback)\n\n const responseText = await getTsReply(inputTempPath, isToken)\n const timestampInfo = new TimestampInfo(this.timestampInfoType, responseText)\n\n // get cert info\n\n try {\n // get raw token if the input was a whole response (TimestampResponse->TimestampToken)\n let tstPath\n if (isToken) {\n tstPath = inputTempPath\n } else {\n const tmp = await this.tempFileService.createTempFile(this.tmpOptions)\n await generateTsReply(inputTempPath, tmp.tempPath)\n tstPath = tmp.tempPath\n cleanupTempFns.push(tmp.cleanupCallback)\n }\n\n // extract cert from token\n const x509Cert = await extractCertFromToken(tstPath)\n // parse cert\n const certInfo = await this.certService.parseCert(Buffer.from(x509Cert), '', this.certService.CertType.PEM)\n\n if (this.timestampInfoType === 'normal') {\n timestampInfo.setCertInfo(certInfo)\n }\n } catch (err) {\n throw new Error('Unable to get cert info from timestamp token', err as Error)\n }\n\n return timestampInfo\n } catch (err) {\n return new TimestampInfo(this.timestampInfoType, null!, (err as Error).message)\n } finally {\n for (const cleanUpFn of cleanupTempFns) {\n if (typeof cleanUpFn === 'function') {\n cleanUpFn()\n }\n }\n }\n }\n\n /**\n * Returns a TimestampToken instance for a hash digest and a hash algorithm.\n * It requests a token from the TSA and verifies the received response.\n * The returned timestamp token represents the token\n * and contains the tsr with the verification result.\n * */\n async createTimestampToken(digest: string, hashAlgorithm: string, dataSize: number): Promise {\n const digestFormat = normalizeDigestFormat(hashAlgorithm)\n\n try {\n if (!checkDigestFormat(digestFormat)) {\n throw new Error(`Unknown digest format: ${hashAlgorithm}`)\n }\n if (!checkDigest(digest)) {\n throw new Error(`Invalid digest: ${digest}`)\n }\n\n const tsQuery = await getTsQuery(digest, digestFormat)\n console.log('!!!!!!!!!!!!!!!')\n console.log(tsQuery)\n const { tsr, providerName, logHistory } = await this.timestampRequest.getTimestamp(tsQuery)\n if (!tsr) {\n throw new CreateTimestampTokenError('Failed to create trusted timestamp, no provider was available', {\n providerName,\n logHistory\n })\n }\n const timestampInfo = await this.getTimestampInfo(tsr, false)\n const certExpiry = timestampInfo.certInfo?.notAfter || null\n const tt: Timestamp = {\n digest,\n hashAlgorithm,\n dataSize,\n tsr,\n isToken: false,\n certExpiry,\n verified: null // not yet\n }\n\n tt.verified = await this.verifyToken(tt, digest, dataSize)\n\n return { timestamp: tt, providerName, logHistory }\n } catch (error) {\n if (error instanceof CreateTimestampTokenError) {\n throw error\n }\n\n throw new CreateTimestampTokenError(`Failed to create trusted timestamp ${(error as Error).message}`)\n }\n }\n\n /**\n * Verify if a timestamp token corresponds to a particular hash of data\n * */\n async verifyToken(timestampToken: Timestamp, digest: string, dataSize: number): Promise {\n if (timestampToken.dataSize !== dataSize) {\n throw new Error(\n `Timestamp token verification failed: The provided data size (${dataSize}) does not match the time stamped size (${timestampToken.dataSize}).`\n )\n }\n\n if (timestampToken.digest !== digest) {\n throw new Error(\n `Timestamp token verification failed: The provided digest (${digest}) does not match the time stamped digest (${timestampToken.digest}).`\n )\n }\n\n // verify token\n return await this.verifyTsr(digest, timestampToken.tsr, timestampToken.isToken)\n }\n\n /**\n * Verify a hash digest against a timestamp response file\n * */\n async verifyTsr(digest: string, tsr: Buffer, isToken = false): Promise {\n let cleanupTempFile = null\n\n try {\n if (!checkDigest(digest)) {\n throw new Error(`Invalid digest: ${digest}`)\n }\n\n // save the tsr on disk because openssl can only read it from file\n const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(this.tmpOptions, tsr)\n cleanupTempFile = cleanupCallback\n\n const stdout = await getTsVerify(digest, tempPath, isToken, this.certsLocation)\n\n const verificationResult = /Verification: OK/i.test(stdout)\n\n if (cleanupTempFile) {\n cleanupTempFile()\n }\n\n return verificationResult\n } catch (err) {\n if (typeof cleanupTempFile === 'function') {\n cleanupTempFile()\n }\n\n throw new Error(`Failed to verify tsr ${(err as Error).message}`)\n }\n }\n\n /**\n * testService method that check the ssl installation\n * */\n async testService(): Promise {\n return await checkSslPath()\n }\n}\n"],"names":["ProxyAgent","childProcess","fs","CertService"],"mappings":"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"} \ No newline at end of file diff --git a/package/timestamp_service/build/timestamp_config.mjs b/package/timestamp_service/build/timestamp_config.mjs new file mode 100644 index 0000000..548ad8a --- /dev/null +++ b/package/timestamp_service/build/timestamp_config.mjs @@ -0,0 +1,753 @@ +import { CertService } from '@techteamer/cert-utils'; +import fs from 'node:fs'; +import { ProxyAgent } from 'proxy-agent'; +import * as childProcess from 'node:child_process'; +import fs$1 from 'node:fs/promises'; +import util from 'node:util'; +import tmp from 'tmp'; + +function parseRegex(text, regex, groups, revive = value => value) { + const result = text.match(regex); + if (!result) { + return null; + } + if (!groups) { + return revive(result); + } + if (typeof groups === 'number') { + return revive(result[groups]); + } + if (Array.isArray(groups)) { + const ret = {}; + groups.forEach((name, i) => { + ret[name] = result[i + 1]; + }); + return revive(ret); + } +} + +/** + * + * Status info: + * Status: Granted. + * Status description: unspecified + * Failure info: unspecified + * + * TST info: + * Version: 1 + * Policy OID: 1.3.6.1.4.1.21528.2.2.99 + * Hash Algorithm: sha256 + * Message data: + * 0000 - c5 3e 94 56 aa 61 ed 56-49 69 74 29 1e 01 d7 2a .>.V.a.VIit)...* + * 0010 - 64 cc 24 84 d2 a2 31 4d-33 b6 ca c8 98 23 03 b9 d.$...1M3....#.. + * Serial number: 0x0308441E + * Time stamp: Jan 30 13:45:20 2018 GMT + * Accuracy: 0x01 seconds, unspecified millis, unspecified micros + * Ordering: no + * Nonce: unspecified + * TSA: DirName:/C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=e-Szigno Test TSA2 + * Extensions: + * */ +class TimestampInfo { + error = null; + version = null; + policyOID = null; + hashAlgorithm = null; + hash = null; + serialNumber = null; + timeStamp = null; + timeStampDate = null; + accuracy = null; + ordering = null; + nonce = null; + issuer = null; + tsa = null; + certInfo = null; + constructor(timestampInfoType = 'normal', tsText, error = null) { + this.error = null; + this.version = null; + this.policyOID = null; + this.hashAlgorithm = null; + this.serialNumber = null; + this.timeStamp = null; + this.accuracy = null; + this.ordering = null; + this.nonce = null; + this.tsa = null; + if (error) { + this.error = error; + } + else { + if (timestampInfoType === 'short') { + this.parseOpensslOutputShort(tsText); + } + else { + this.hash = null; + this.timeStampDate = null; + this.issuer = null; + this.certInfo = null; + this.parseOpensslOutput(tsText); + } + } + } + setCertInfo(certInfo) { + this.certInfo = certInfo; + } + parseOpensslOutput(tsText) { + this.version = parseRegex(tsText, /Version:\s*([^\n\r]+)/, 1, parseInt); + this.policyOID = parseRegex(tsText, /Policy OID:\s*([^\n\r]+)/, 1); + this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\s*([^\n\r]+)/, 1); + this.hash = tsText + .match(/\d{4} - .*?\s{2}/g) + .map(line => { + return line.replace(/\d{4} - /g, '').replace(/[\s*-]/g, ''); + }) + .join(''); + this.serialNumber = parseRegex(tsText, /Serial number:\s*([^\n\r]+)/, 1); + this.timeStamp = parseRegex(tsText, /Time stamp:\s*([^\n\r]+)/, 1); + this.timeStampDate = new Date(this.timeStamp); + this.accuracy = parseRegex(tsText, /Accuracy:\s*(.+) seconds, (.+) millis, (.+) micros/, ['s', 'm', 'u'], ({ s, m, u }) => { + const _s = Number(s === 'unspecified' ? 0 : s); + const _m = Number(m === 'unspecified' ? 0 : m); + const _u = Number(u === 'unspecified' ? 0 : u); + return _s * 1000 + _m + _u / 1000; + }); + this.ordering = parseRegex(tsText, /Ordering:\s*([^\n\r]+)/, 1, ordering => ordering !== 'no'); + this.nonce = parseRegex(tsText, /Nonce:\s*([^\n\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce)); + this.issuer = parseRegex(tsText, /TSA:\s*DirName:\s*([^\n\r]+)/, 1); + this.tsa = parseRegex(tsText, /TSA:\s*DirName:\s*([^\n\r]+)/, 1, (result) => { + const m = result.match(/\/\w{1,2}=[^/]+/g) || []; + return m.reduce((obj, part) => { + const [, label, value] = part.match(/\/(\w{1,2})=([^/]+)/) || []; + if (!label || !value) { + return obj; + } + obj[label] = value; + return obj; + }, { C: null, L: null, O: null, OU: null, CN: null }); + }); + } + parseOpensslOutputShort(tsText) { + this.version = parseRegex(tsText, /Version:\s*([^\n\r]+)/, 1, parseInt); + this.policyOID = parseRegex(tsText, /Policy OID:\s*([^\n\r]+)/, 1); + this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\s*([^\n\r]+)/, 1); + this.serialNumber = parseRegex(tsText, /Serial number:\s*([^\n\r]+)/, 1); + this.timeStamp = parseRegex(tsText, /Time stamp:\s*([^\n\r]+)/, 1, dateString => new Date(dateString)); + this.accuracy = parseRegex(tsText, /Accuracy:\s*(.+) seconds, (.+) millis, (.+) micros/, ['s', 'm', 'u'], ({ s, m, u }) => { + const _s = Number(s === 'unspecified' ? 0 : s); + const _m = Number(m === 'unspecified' ? 0 : m); + const _u = Number(u === 'unspecified' ? 0 : u); + return _s * 1000 + _m + _u / 1000; + }); + this.ordering = parseRegex(tsText, /Ordering:\s*([^\n\r]+)/, 1, ordering => ordering !== 'no'); + this.nonce = parseRegex(tsText, /Nonce:\s*([^\n\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce)); + this.tsa = parseRegex(tsText, /TSA:\s*([^\n\r]+)/, 1, v => { + const m = v.match(/\/\w{1,2}=[^/]+/g) || []; + return m.reduce((obj, part) => { + const [, label, value] = part.match(/\/(\w{1,2})=([^/]+)/) || []; + if (!label || !value) { + return obj; + } + obj[label] = value; + return obj; + }, { C: null, L: null, O: null, OU: null, CN: null }); + }); + } +} + +const fetch = async (url, init) => { + const { default: fetch } = await import('node-fetch'); + return fetch(url, init); +}; + +/** + * TimestampRequest class implements timestamp request + * */ +class TimestampRequest { + tempFileService; + tmpOptions; + cleanupTempFns; + tsRequest = { + method: 'POST', + headers: { + 'Content-Type': 'application/timestamp-query' + } + }; + constructor(tempFileService, tmpOptions, cleanupTempFns) { + this.tempFileService = tempFileService; + this.tmpOptions = tmpOptions; + this.cleanupTempFns = cleanupTempFns; + } + /** + * set request header + * */ + setHeader(headers) { + this.tsRequest = { + ...this.tsRequest, + headers + }; + } + /** + * set request body + * */ + setBody(body) { + this.tsRequest.body = body; + } + /** + * set request proxy + * */ + setProxy(proxy) { + this.tsRequest.agent = new ProxyAgent({ + getProxyForUrl: () => proxy.url, + rejectUnauthorized: !(proxy.allowUnauthorized ?? false) + }); + } + /** + * set request encoding + * */ + setEncoding(encoding) { + this.tsRequest.encoding = encoding; + } + /** + * set request encoding + * */ + setResolveWithFullResponse(resolveWithFullResponse) { + this.tsRequest.resolveWithFullResponse = resolveWithFullResponse; + } + /** + * return tsRequest + * */ + get() { + return this.tsRequest; + } + /** + * authStrategy method that set no auth request + * */ + async authStrategy(requestType, url, auth, body, proxy, tsQuery) { + switch (requestType) { + case 'basic': + return this._getTimestampRequestBasic(url, auth, tsQuery); + case 'oauth': + return await this._getTimestampRequestOauth(url, auth, body, proxy, tsQuery); + case 'noAuth': + return this._getTimestampRequestNoAuth(url, tsQuery); + default: + return this._getTimestampRequestNoAuth(url, tsQuery); + } + } + /** + * _getTimestampRequestBasic method that set basic auth request + * */ + _getTimestampRequestBasic(url, auth, tsQuery) { + this.setHeader({ + ...this.tsRequest.headers, + Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}` + }); + this.setEncoding(null); // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily + this.setResolveWithFullResponse(true); + this.setBody(tsQuery); + return { requestUrl: url, tsRequest: this.get() }; + } + /** + * _getTimestampRequestOauth method that set oauth request + * */ + async _getTimestampRequestOauth(url, auth, body, proxy, tsQuery) { + const oauthResult = await this._getOauth(url.getTokenUrl, auth, body, proxy); + if (!oauthResult?.access_token) { + return { requestUrl: null, tsRequest: null, error: null }; + } + if (oauthResult?.error) { + return { requestUrl: null, tsRequest: null, error: oauthResult?.error }; + } + const accessToken = oauthResult?.access_token; + if (accessToken) { + this.setHeader({ + ...this.tsRequest.headers, + Authorization: `Bearer ${accessToken}` + }); + const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(this.tmpOptions, Buffer.from(tsQuery)); + this.cleanupTempFns.push(cleanupCallback); + const stats = fs.statSync(tempPath); + const fileSizeInBytes = stats.size; + this.setBody(fs.createReadStream(tempPath)); + this.setHeader({ + ...this.tsRequest.headers, + 'Content-length': fileSizeInBytes.toString() + }); + } + return { requestUrl: url?.getTimestampUrl, tsRequest: this.get(), error: null }; + } + /** + * _getTimestampRequestNoAuth method that set no auth request + * */ + _getTimestampRequestNoAuth(url, tsQuery) { + this.setEncoding(null); // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily + this.setResolveWithFullResponse(true); + this.setBody(tsQuery); + return { requestUrl: url, tsRequest: this.get() }; + } + /** + * _getOauth method that get oauth access_token + **/ + async _getOauth(url, auth, body, proxy) { + const tsRequest = await this._getOauthRequestSettings(auth, body, proxy); + try { + const response = await fetch(url, tsRequest); + return (await response.json()); + } + catch (error) { + return { + error: { + message: error.message, + trace: error + } + }; + } + } + /** + * _getOauthRequestSettings method that set the request oath settings + **/ + async _getOauthRequestSettings(auth, body, proxy) { + const tsRequest = { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}` + }, + body: new URLSearchParams(body) + }; + if (proxy?.url) { + tsRequest.agent = new ProxyAgent({ + getProxyForUrl: () => proxy.url, + rejectUnauthorized: !(proxy.allowUnauthorized ?? false) + }); + } + return tsRequest; + } +} + +/** + * TrustedTimestampRequest service implements timestamp request and sorted providers + * */ +class TrustedTimestampRequest { + tempFileService; + tmpOptions; + cleanupTempFns = []; + providers; + constructor(providers, tempFileService, tmpOptions) { + this.tempFileService = tempFileService; + this.tmpOptions = tmpOptions; + this.providers = this._sortedProviders(providers); + } + /** + * getTimestamp method that calls the service providers in sequence, requesting a timestamp + **/ + async getTimestamp(tsQuery) { + let tsr = null; + let providerName = ''; + const logHistory = []; + for (const provider of this.providers) { + if (!tsr) { + const { name, url, auth, body, proxy } = provider; + if (!name) { + throw new Error('Provider name is missing'); + } + if (!url) { + throw new Error('Provider url is missing'); + } + const { timestampToken, log } = await this._getTimeStampToken(name, url, auth, body, proxy, tsQuery); + logHistory.push(log); + tsr = timestampToken; + providerName = name; + } + } + return { tsr, providerName, logHistory }; + } + /** + * sortedProviders method that sorting the providers according to priority + **/ + _sortedProviders(providers) { + const priorityProviders = []; + const nonPriorityProviders = []; + providers.forEach(provider => { + if (provider?.priority) { + priorityProviders.push(provider); + } + else { + nonPriorityProviders.push(provider); + } + }); + const sortedProviders = priorityProviders.toSorted((a, b) => a.priority - b.priority); + return sortedProviders.concat(nonPriorityProviders); + } + /** + * sendTimestampRequest method that calls the provider + **/ + async _getTimeStampToken(name, url, auth, body, proxy, tsQuery) { + const { requestUrl, tsRequest, error } = await this._getTimestampRequest(url, body, auth, proxy, tsQuery); + if (error) { + return { + timestampToken: null, + log: { + info: { name, info: null, date: new Date(), url, response: null, error: error?.message }, + errorTrace: error?.trace + } + }; + } + try { + const response = await fetch(requestUrl, tsRequest); + if (response.status !== 200) { + throw new Error(`TSA response unsatisfactory: ${response.status} ${response.statusText}`); + } + return { + timestampToken: Buffer.from((await response.arrayBuffer()), 'utf8'), // TODO: fix type + log: { + info: { name, date: new Date(), url, response: `${response.status}, ${response.statusText}`, error: null }, + errorTrace: null + } + }; + } + catch (error) { + return { + timestampToken: null, + log: { + info: { name, date: new Date(), url, response: null, error: error.message }, + errorTrace: error + } + }; + } + finally { + for (const cleanUpFn of this.cleanupTempFns) { + if (typeof cleanUpFn === 'function') { + cleanUpFn(); + } + } + } + } + /** + * getTimestampRequestSettings method that set the request settings + **/ + async _getTimestampRequest(url, body, auth, proxy, tsQuery) { + // send the request to the TSA + const tsRequest = new TimestampRequest(this.tempFileService, this.tmpOptions, this.cleanupTempFns); + if (proxy?.url) { + tsRequest.setProxy(proxy); + } + let requestType; + if (url?.getTokenUrl && tsQuery) { + requestType = 'oauth'; + } + if (!url?.getTokenUrl && auth?.user && auth?.pass && tsQuery) { + requestType = 'basic'; + } + if (!url?.getTokenUrl && !auth?.user) { + requestType = 'noAuth'; + } + return await tsRequest.authStrategy(requestType, url, auth, body, proxy, tsQuery); + } +} + +function exec(command, options = {}, logger) { + return new Promise((resolve, reject) => { + childProcess.exec(command, options, (err, stdout, stderr) => { + if (err) { + return reject(err || new Error(stderr.toString() || `Failed to execute command: ${command}`)); + } + return resolve(stdout); + }); + }); +} + +async function getTsQuery(digest, digestFormat) { + // create a time stamp request based on the hash of a data file + const queryCommand = `openssl ts -query -digest ${digest} -no_nonce -${digestFormat} -cert`; + return await exec(queryCommand, { encoding: 'buffer' }).catch(err => { + throw new Error(`Failed to execute openssl ts -query command "${queryCommand}" ${err.message}`); + }); +} +function getTsVerify(digest, tempPath, isToken, certsLocation) { + // verify the response with openssl + const verifyCommand = isToken + ? `openssl ts -verify -digest ${digest} -token_in -in ${tempPath} -CApath ${certsLocation}` + : `openssl ts -verify -digest ${digest} -in ${tempPath} -CApath ${certsLocation}`; + return exec(verifyCommand).catch(err => { + throw new Error(`Failed to verify tsr "${verifyCommand}" ${err.message}`); + }); +} +async function getTsReply(inputTempPath, isToken) { + // get token info + const replyCommand = isToken + ? `openssl ts -reply -token_in -in ${inputTempPath} -text` + : `openssl ts -reply -in ${inputTempPath} -text`; + return await exec(replyCommand).catch(err => { + throw new Error(`Error executing openssl ts -reply command "${replyCommand}" ${err.message}`); + }); +} +async function generateTsReply(inputTempPath, tempPath) { + await exec(`openssl ts -reply -in "${inputTempPath}" -token_out -out "${tempPath}"`).catch(err => { + throw new Error(`Error executing openssl ts -reply command "${inputTempPath}" ${err.message}`); + }); +} +async function extractCertFromToken(tstPath) { + return await exec(`openssl pkcs7 -inform der -in "${tstPath}" -print_certs`).catch(err => { + throw new Error(`Error executing openssl pkcs7 command ${err.message}`); + }); +} +async function checkSslPath() { + try { + const stdout = await exec('which openssl'); + if (!stdout.toString()) { + throw new Error('openssl is unavailable'); + } + return stdout; + } + catch (error) { + throw new Error(`Unable to verify openssl installation ${error.message}`); + } +} + +const supportedDigestForamts = [ + 'sha', + 'sha1', + 'mdc2', + 'ripemd160', + 'sha224', + 'sha256', + 'sha384', + 'sha512', + 'md2', + 'md4', + 'md5', + 'dss1' +]; +function checkDigestFormat(format) { + return supportedDigestForamts.includes(format); +} +function checkDigest(digest) { + return /^([0-9A-F])+$/i.test(digest); +} +function normalizeDigestFormat(format) { + return format + .replace(/^-/, '') // -sha256 + .replace(/-/g, ''); // sha-256 +} + +tmp.setGracefulCleanup(); +const tmpFile = util.promisify((options, cb) => { + tmp.file(options, (err, ...results) => cb(err, results)); +}); +class TempFileService { + /** + * Utility to create a temp file with content + * */ + async createTempFile(options, content) { + try { + const [tempPath, fd, cleanupCallback] = await tmpFile(options); + if (content) { + await fs$1.writeFile(tempPath, content); + } + return { tempPath, fd, cleanupCallback }; + } + catch (err) { + throw new Error(`Failed to create temp file ${err}`); + } + } +} + +/** + * Custom error class that encapsulates context about token creation, including the provider used and the associated log history + */ +class CreateTimestampTokenError extends Error { + context; + constructor(message, context = {}, options) { + super(message, options); + this.context = context; + } +} + +/** + * OpenSSL docs: https://www.openssl.org/docs/manmaster/man1/ts.html + * + * Certificate Installation with OpenSSL: http://gagravarr.org/writing/openssl-certs/others.shtml + * + * Trustedtimestamp service implements the generate, import and verification of timestamps + * + * */ +class TrustedTimestampService { + timestampInfoType; + config; + encoding; + tmpOptions = { prefix: 'request-', postfix: '.tsr' }; + tempFileService; + certService; + providers; + certsLocation; + timestampRequest; + constructor(timestampInfoType = 'normal', config = {}, encoding = 'latin1') { + this.timestampInfoType = timestampInfoType; + this.config = config; + this.encoding = encoding; + this._init(); + } + /** + * init method that sets the config and instantiates the required services + * */ + _init() { + if (this.config) { + if (!this.config?.certsLocation) { + throw new Error('trustedTimestamp config "certsLocation" missing!'); + } + if (!this.config?.providers?.length) { + throw new Error('trustedTimestamp config "providers" missing or empty!'); + } + this.tempFileService = new TempFileService(); + this.certService = new CertService(this.encoding); + this.providers = this.config.providers; + this.certsLocation = this.config.certsLocation; + this.timestampRequest = new TrustedTimestampRequest(this.providers, this.tempFileService, this.tmpOptions); + } + } + /** + * Utility method that resolves to a TimestampInfo object containing parsed info from the tsr + * */ + async getTimestampInfo(tsr, isToken = false) { + const cleanupTempFns = []; + let inputTempPath = ''; + try { + const tsrtmp = await this.tempFileService.createTempFile(this.tmpOptions, tsr); + inputTempPath = tsrtmp.tempPath; + cleanupTempFns.push(tsrtmp.cleanupCallback); + const responseText = await getTsReply(inputTempPath, isToken); + const timestampInfo = new TimestampInfo(this.timestampInfoType, responseText); + // get cert info + try { + // get raw token if the input was a whole response (TimestampResponse->TimestampToken) + let tstPath; + if (isToken) { + tstPath = inputTempPath; + } + else { + const tmp = await this.tempFileService.createTempFile(this.tmpOptions); + await generateTsReply(inputTempPath, tmp.tempPath); + tstPath = tmp.tempPath; + cleanupTempFns.push(tmp.cleanupCallback); + } + // extract cert from token + const x509Cert = await extractCertFromToken(tstPath); + // parse cert + const certInfo = await this.certService.parseCert(Buffer.from(x509Cert), '', this.certService.CertType.PEM); + if (this.timestampInfoType === 'normal') { + timestampInfo.setCertInfo(certInfo); + } + } + catch (err) { + throw new Error('Unable to get cert info from timestamp token', err); + } + return timestampInfo; + } + catch (err) { + return new TimestampInfo(this.timestampInfoType, null, err.message); + } + finally { + for (const cleanUpFn of cleanupTempFns) { + if (typeof cleanUpFn === 'function') { + cleanUpFn(); + } + } + } + } + /** + * Returns a TimestampToken instance for a hash digest and a hash algorithm. + * It requests a token from the TSA and verifies the received response. + * The returned timestamp token represents the token + * and contains the tsr with the verification result. + * */ + async createTimestampToken(digest, hashAlgorithm, dataSize) { + const digestFormat = normalizeDigestFormat(hashAlgorithm); + try { + if (!checkDigestFormat(digestFormat)) { + throw new Error(`Unknown digest format: ${hashAlgorithm}`); + } + if (!checkDigest(digest)) { + throw new Error(`Invalid digest: ${digest}`); + } + const tsQuery = await getTsQuery(digest, digestFormat); + console.log('!!!!!!!!!!!!!!!'); + console.log(tsQuery); + const { tsr, providerName, logHistory } = await this.timestampRequest.getTimestamp(tsQuery); + if (!tsr) { + throw new CreateTimestampTokenError('Failed to create trusted timestamp, no provider was available', { + providerName, + logHistory + }); + } + const timestampInfo = await this.getTimestampInfo(tsr, false); + const certExpiry = timestampInfo.certInfo?.notAfter || null; + const tt = { + digest, + hashAlgorithm, + dataSize, + tsr, + isToken: false, + certExpiry, + verified: null // not yet + }; + tt.verified = await this.verifyToken(tt, digest, dataSize); + return { timestamp: tt, providerName, logHistory }; + } + catch (error) { + if (error instanceof CreateTimestampTokenError) { + throw error; + } + throw new CreateTimestampTokenError(`Failed to create trusted timestamp ${error.message}`); + } + } + /** + * Verify if a timestamp token corresponds to a particular hash of data + * */ + async verifyToken(timestampToken, digest, dataSize) { + if (timestampToken.dataSize !== dataSize) { + throw new Error(`Timestamp token verification failed: The provided data size (${dataSize}) does not match the time stamped size (${timestampToken.dataSize}).`); + } + if (timestampToken.digest !== digest) { + throw new Error(`Timestamp token verification failed: The provided digest (${digest}) does not match the time stamped digest (${timestampToken.digest}).`); + } + // verify token + return await this.verifyTsr(digest, timestampToken.tsr, timestampToken.isToken); + } + /** + * Verify a hash digest against a timestamp response file + * */ + async verifyTsr(digest, tsr, isToken = false) { + let cleanupTempFile = null; + try { + if (!checkDigest(digest)) { + throw new Error(`Invalid digest: ${digest}`); + } + // save the tsr on disk because openssl can only read it from file + const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(this.tmpOptions, tsr); + cleanupTempFile = cleanupCallback; + const stdout = await getTsVerify(digest, tempPath, isToken, this.certsLocation); + const verificationResult = /Verification: OK/i.test(stdout); + if (cleanupTempFile) { + cleanupTempFile(); + } + return verificationResult; + } + catch (err) { + if (typeof cleanupTempFile === 'function') { + cleanupTempFile(); + } + throw new Error(`Failed to verify tsr ${err.message}`); + } + } + /** + * testService method that check the ssl installation + * */ + async testService() { + return await checkSslPath(); + } +} + +export { CreateTimestampTokenError, TrustedTimestampService }; +//# sourceMappingURL=timestamp_config.mjs.map diff --git a/package/timestamp_service/build/timestamp_config.mjs.map b/package/timestamp_service/build/timestamp_config.mjs.map new file mode 100644 index 0000000..7f980ac --- /dev/null +++ b/package/timestamp_service/build/timestamp_config.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"timestamp_config.mjs","sources":["../../src/util/regexParser.ts","../../src/trustedTimestamp/TrustedTimestampInfo.ts","../../src/patch/node-fetch.ts","../../src/trustedTimestamp/TimestampRequest.ts","../../src/trustedTimestamp/TrustedTimestampRequest.ts","../../src/util/child_process_promise.ts","../../src/trustedTimestamp/TrustedTimestampCommand.ts","../../src/trustedTimestamp/TrustedTimestampCheck.ts","../../src/util/TempFileService.ts","../../src/trustedTimestamp/error/create-timestamp-token.error.ts","../../src/trustedTimestamp/TrustedTimestampService.ts"],"sourcesContent":["function parseRegex(\n text: string,\n regex: RegExp,\n groups: Groups,\n revive: (\n parameter: Groups extends number\n ? string\n : Groups extends (string | number)[]\n ? Record\n : RegExpMatchArray\n ) => ReviveResult = value => value as unknown as ReviveResult\n): ReviveResult | null | undefined {\n const result = text.match(regex)\n if (!result) {\n return null\n }\n\n if (!groups) {\n return (revive as (parameter: RegExpMatchArray) => ReviveResult)(result)\n }\n\n if (typeof groups === 'number') {\n return (revive as (parameter: string) => ReviveResult)(result[groups])\n }\n\n if (Array.isArray(groups)) {\n const ret: Record = {}\n groups.forEach((name, i) => {\n ret[name] = result[i + 1]\n })\n return (revive as (parameter: Record) => ReviveResult)(ret)\n }\n}\n\nfunction createParser(\n regex: RegExp,\n groups: number | number[],\n revive: (value: unknown) => ReviveResult\n): (text: string) => ReviveResult | null | undefined {\n return (text: string) => {\n return parseRegex(text, regex, groups, revive)\n }\n}\n\nexport { createParser as create }\nexport { parseRegex }\n","import { CertService } from '@techteamer/cert-utils'\nimport { parseRegex } from '../util/regexParser'\n\ninterface TSA {\n C: string | null\n L: string | null\n O: string | null\n OU: string | null\n CN: string | null\n}\n\n/**\n *\n * Status info:\n * Status: Granted.\n * Status description: unspecified\n * Failure info: unspecified\n *\n * TST info:\n * Version: 1\n * Policy OID: 1.3.6.1.4.1.21528.2.2.99\n * Hash Algorithm: sha256\n * Message data:\n * 0000 - c5 3e 94 56 aa 61 ed 56-49 69 74 29 1e 01 d7 2a .>.V.a.VIit)...*\n * 0010 - 64 cc 24 84 d2 a2 31 4d-33 b6 ca c8 98 23 03 b9 d.$...1M3....#..\n * Serial number: 0x0308441E\n * Time stamp: Jan 30 13:45:20 2018 GMT\n * Accuracy: 0x01 seconds, unspecified millis, unspecified micros\n * Ordering: no\n * Nonce: unspecified\n * TSA: DirName:/C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=e-Szigno Test TSA2\n * Extensions:\n * */\nexport class TimestampInfo {\n error: string | null = null\n version: number | null = null\n policyOID: string | null = null\n hashAlgorithm: string | null = null\n hash: string | null = null\n serialNumber: string | null = null\n timeStamp: Date | null = null\n timeStampDate: Date | null = null\n accuracy: number | null = null\n ordering: boolean | null = null\n nonce: string | null = null\n issuer: string | null = null\n tsa: TSA | null = null\n certInfo: CertService['CertInfo'] | null = null\n\n constructor(timestampInfoType: 'normal' | 'short' = 'normal', tsText: string, error: string | null = null) {\n this.error = null\n this.version = null\n this.policyOID = null\n this.hashAlgorithm = null\n this.serialNumber = null\n this.timeStamp = null\n this.accuracy = null\n this.ordering = null\n this.nonce = null\n this.tsa = null\n\n if (error) {\n this.error = error\n } else {\n if (timestampInfoType === 'short') {\n this.parseOpensslOutputShort(tsText)\n } else {\n this.hash = null\n this.timeStampDate = null\n this.issuer = null\n this.certInfo = null\n this.parseOpensslOutput(tsText)\n }\n }\n }\n\n setCertInfo(certInfo: CertService['CertInfo'] | null): void {\n this.certInfo = certInfo\n }\n\n parseOpensslOutput(tsText: string): void {\n this.version = parseRegex(tsText, /Version:\\s*([^\\n\\r]+)/, 1, parseInt)!\n this.policyOID = parseRegex(tsText, /Policy OID:\\s*([^\\n\\r]+)/, 1)!\n this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\\s*([^\\n\\r]+)/, 1)!\n this.hash = tsText\n .match(/\\d{4} - .*?\\s{2}/g)!\n .map(line => {\n return line.replace(/\\d{4} - /g, '').replace(/[\\s*-]/g, '')\n })\n .join('')\n this.serialNumber = parseRegex(tsText, /Serial number:\\s*([^\\n\\r]+)/, 1)!\n this.timeStamp = parseRegex(tsText, /Time stamp:\\s*([^\\n\\r]+)/, 1)!\n this.timeStampDate = new Date(this.timeStamp)\n this.accuracy = parseRegex(\n tsText,\n /Accuracy:\\s*(.+) seconds, (.+) millis, (.+) micros/,\n ['s', 'm', 'u'],\n ({ s, m, u }) => {\n const _s = Number(s === 'unspecified' ? 0 : s)\n const _m = Number(m === 'unspecified' ? 0 : m)\n const _u = Number(u === 'unspecified' ? 0 : u)\n return _s * 1000 + _m + _u / 1000\n }\n )!\n this.ordering = parseRegex(tsText, /Ordering:\\s*([^\\n\\r]+)/, 1, ordering => ordering !== 'no')!\n this.nonce = parseRegex(tsText, /Nonce:\\s*([^\\n\\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))!\n this.issuer = parseRegex(tsText, /TSA:\\s*DirName:\\s*([^\\n\\r]+)/, 1)!\n this.tsa = parseRegex(tsText, /TSA:\\s*DirName:\\s*([^\\n\\r]+)/, 1, (result): TSA => {\n const m = result.match(/\\/\\w{1,2}=[^/]+/g) || []\n\n return m.reduce(\n (obj, part) => {\n const [, label, value] = part.match(/\\/(\\w{1,2})=([^/]+)/) || []\n if (!label || !value) {\n return obj\n }\n obj[label as keyof TSA] = value\n return obj\n },\n { C: null, L: null, O: null, OU: null, CN: null } as TSA\n )\n })!\n }\n\n parseOpensslOutputShort(tsText: string): void {\n this.version = parseRegex(tsText, /Version:\\s*([^\\n\\r]+)/, 1, parseInt)!\n this.policyOID = parseRegex(tsText, /Policy OID:\\s*([^\\n\\r]+)/, 1)!\n this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\\s*([^\\n\\r]+)/, 1)!\n this.serialNumber = parseRegex(tsText, /Serial number:\\s*([^\\n\\r]+)/, 1)!\n this.timeStamp = parseRegex(tsText, /Time stamp:\\s*([^\\n\\r]+)/, 1, dateString => new Date(dateString))!\n this.accuracy = parseRegex(\n tsText,\n /Accuracy:\\s*(.+) seconds, (.+) millis, (.+) micros/,\n ['s', 'm', 'u'],\n ({ s, m, u }) => {\n const _s = Number(s === 'unspecified' ? 0 : s)\n const _m = Number(m === 'unspecified' ? 0 : m)\n const _u = Number(u === 'unspecified' ? 0 : u)\n return _s * 1000 + _m + _u / 1000\n }\n )!\n this.ordering = parseRegex(tsText, /Ordering:\\s*([^\\n\\r]+)/, 1, ordering => ordering !== 'no')!\n this.nonce = parseRegex(tsText, /Nonce:\\s*([^\\n\\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))!\n this.tsa = parseRegex(tsText, /TSA:\\s*([^\\n\\r]+)/, 1, v => {\n const m = v.match(/\\/\\w{1,2}=[^/]+/g) || []\n\n return m.reduce(\n (obj, part) => {\n const [, label, value] = part.match(/\\/(\\w{1,2})=([^/]+)/) || []\n if (!label || !value) {\n return obj\n }\n obj[label as keyof TSA] = value\n return obj\n },\n { C: null, L: null, O: null, OU: null, CN: null } as TSA\n )\n })!\n }\n}\n","import type { RequestInfo, RequestInit, Response } from 'node-fetch'\n\nexport const fetch = async (url: URL | RequestInfo, init?: RequestInit): Promise => {\n const { default: fetch } = await import('node-fetch')\n return fetch(url, init)\n}\n","import type { BodyInit } from 'node-fetch'\nimport { fetch } from '../patch/node-fetch'\nimport fs from 'node:fs'\nimport { ProxyAgent } from 'proxy-agent'\nimport type { FileOptions } from 'tmp'\n\nimport type {\n TimestampRequestAuthResult,\n TimestampRequestAuthTypes,\n TimestampRequestError,\n TimestampRequestOptions\n} from './types/timestamp-request.type'\nimport type {\n TimestampProviderAuth,\n TimestampProviderBody,\n TimestampProviderOAuthUrl,\n TimestampProviderProxyConfig,\n TimestampProviderUrl\n} from './types/timestamp-provider.type'\nimport type { TempFileService } from '../util/TempFileService'\n\n/**\n * TimestampRequest class implements timestamp request\n * */\nexport class TimestampRequest {\n private tsRequest: TimestampRequestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/timestamp-query'\n }\n }\n\n constructor(\n private readonly tempFileService: TempFileService,\n private readonly tmpOptions: FileOptions,\n private readonly cleanupTempFns: ((...args: unknown[]) => unknown)[]\n ) {}\n\n /**\n * set request header\n * */\n setHeader(headers: Record): void {\n this.tsRequest = {\n ...this.tsRequest,\n headers\n }\n }\n\n /**\n * set request body\n * */\n setBody(body: BodyInit): void {\n this.tsRequest.body = body\n }\n\n /**\n * set request proxy\n * */\n setProxy(proxy: TimestampProviderProxyConfig): void {\n this.tsRequest.agent = new ProxyAgent({\n getProxyForUrl: (): string => proxy.url,\n rejectUnauthorized: !(proxy.allowUnauthorized ?? false)\n })\n }\n\n /**\n * set request encoding\n * */\n setEncoding(encoding: string | null): void {\n this.tsRequest.encoding = encoding\n }\n\n /**\n * set request encoding\n * */\n setResolveWithFullResponse(resolveWithFullResponse: boolean): void {\n this.tsRequest.resolveWithFullResponse = resolveWithFullResponse\n }\n\n /**\n * return tsRequest\n * */\n get(): TimestampRequestOptions {\n return this.tsRequest\n }\n\n /**\n * authStrategy method that set no auth request\n * */\n async authStrategy(\n requestType: TimestampRequestAuthTypes | undefined,\n url: TimestampProviderUrl,\n auth: TimestampProviderAuth | undefined,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n switch (requestType) {\n case 'basic':\n return this._getTimestampRequestBasic(url as string, auth!, tsQuery)\n case 'oauth':\n return await this._getTimestampRequestOauth(url as TimestampProviderOAuthUrl, auth!, body, proxy, tsQuery)\n case 'noAuth':\n return this._getTimestampRequestNoAuth(url as string, tsQuery)\n default:\n return this._getTimestampRequestNoAuth(url as string, tsQuery)\n }\n }\n\n /**\n * _getTimestampRequestBasic method that set basic auth request\n * */\n private _getTimestampRequestBasic(\n url: string,\n auth: TimestampProviderAuth,\n tsQuery: string\n ): TimestampRequestAuthResult {\n this.setHeader({\n ...this.tsRequest.headers,\n Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`\n })\n\n this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily\n this.setResolveWithFullResponse(true)\n this.setBody(tsQuery)\n\n return { requestUrl: url, tsRequest: this.get() }\n }\n\n /**\n * _getTimestampRequestOauth method that set oauth request\n * */\n private async _getTimestampRequestOauth(\n url: TimestampProviderOAuthUrl,\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n const oauthResult = await this._getOauth<{\n access_token?: string\n error?: TimestampRequestError\n }>(url.getTokenUrl, auth, body, proxy)\n if (!oauthResult?.access_token) {\n return { requestUrl: null, tsRequest: null, error: null }\n }\n\n if (oauthResult?.error) {\n return { requestUrl: null, tsRequest: null, error: oauthResult?.error }\n }\n\n const accessToken = oauthResult?.access_token\n\n if (accessToken) {\n this.setHeader({\n ...this.tsRequest.headers,\n Authorization: `Bearer ${accessToken}`\n })\n\n const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(\n this.tmpOptions,\n Buffer.from(tsQuery)\n )\n this.cleanupTempFns.push(cleanupCallback)\n\n const stats = fs.statSync(tempPath)\n const fileSizeInBytes = stats.size\n this.setBody(fs.createReadStream(tempPath))\n this.setHeader({\n ...this.tsRequest.headers,\n 'Content-length': fileSizeInBytes.toString()\n })\n }\n\n return { requestUrl: url?.getTimestampUrl, tsRequest: this.get(), error: null }\n }\n\n /**\n * _getTimestampRequestNoAuth method that set no auth request\n * */\n private _getTimestampRequestNoAuth(url: string, tsQuery: string): TimestampRequestAuthResult {\n this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily\n this.setResolveWithFullResponse(true)\n this.setBody(tsQuery)\n\n return { requestUrl: url, tsRequest: this.get() }\n }\n\n /**\n * _getOauth method that get oauth access_token\n **/\n private async _getOauth(\n url: string,\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined\n ): Promise {\n const tsRequest = await this._getOauthRequestSettings(auth, body, proxy)\n try {\n const response = await fetch(url, tsRequest)\n return (await response.json()) as ResponseType\n } catch (error) {\n return {\n error: {\n message: (error as Error).message,\n trace: error as Error\n }\n } as ResponseType\n }\n }\n\n /**\n * _getOauthRequestSettings method that set the request oath settings\n **/\n private async _getOauthRequestSettings(\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined\n ): Promise> {\n const tsRequest: TimestampRequestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`\n },\n body: new URLSearchParams(body)\n }\n\n if (proxy?.url) {\n tsRequest.agent = new ProxyAgent({\n getProxyForUrl: (): string => proxy.url,\n rejectUnauthorized: !(proxy.allowUnauthorized ?? false)\n })\n }\n\n return tsRequest\n }\n}\n","import { FileOptions as TempFileOptions } from 'tmp'\nimport { fetch } from '../patch/node-fetch'\n\nimport { TimestampRequest } from './TimestampRequest'\nimport { TempFileService } from '../util/TempFileService'\nimport type { TimestampRequestAuthResult, TimestampRequestAuthTypes } from './types/timestamp-request.type'\nimport type {\n TimestampProvider,\n TimestampProviderAuth,\n TimestampProviderBody,\n TimestampProviderOAuthUrl,\n TimestampProviderProxyConfig,\n TimestampProviderUrl\n} from './types/timestamp-provider.type'\nimport type { TimestampLog } from './types/timestamp-log.type'\n\n/**\n * TrustedTimestampRequest service implements timestamp request and sorted providers\n * */\nexport class TrustedTimestampRequest {\n private readonly cleanupTempFns: (() => unknown)[] = []\n private readonly providers: TimestampProvider[]\n\n constructor(\n providers: TimestampProvider[],\n private readonly tempFileService: TempFileService,\n private readonly tmpOptions: TempFileOptions\n ) {\n this.providers = this._sortedProviders(providers)\n }\n\n /**\n * getTimestamp method that calls the service providers in sequence, requesting a timestamp\n **/\n async getTimestamp(\n tsQuery: string\n ): Promise<{ tsr: Buffer | null; providerName: string; logHistory: TimestampLog[] }> {\n let tsr = null\n let providerName = ''\n const logHistory: TimestampLog[] = []\n\n for (const provider of this.providers) {\n if (!tsr) {\n const { name, url, auth, body, proxy } = provider\n\n if (!name) {\n throw new Error('Provider name is missing')\n }\n if (!url) {\n throw new Error('Provider url is missing')\n }\n\n const { timestampToken, log } = await this._getTimeStampToken(name, url, auth, body, proxy, tsQuery)\n logHistory.push(log)\n tsr = timestampToken\n providerName = name\n }\n }\n\n return { tsr, providerName, logHistory }\n }\n\n /**\n * sortedProviders method that sorting the providers according to priority\n **/\n private _sortedProviders(providers: TimestampProvider[]): TimestampProvider[] {\n const priorityProviders: TimestampProvider[] = []\n const nonPriorityProviders: TimestampProvider[] = []\n\n providers.forEach(provider => {\n if (provider?.priority) {\n priorityProviders.push(provider)\n } else {\n nonPriorityProviders.push(provider)\n }\n })\n\n const sortedProviders = priorityProviders.toSorted((a, b) => a.priority! - b.priority!)\n\n return sortedProviders.concat(nonPriorityProviders)\n }\n\n /**\n * sendTimestampRequest method that calls the provider\n **/\n private async _getTimeStampToken(\n name: string,\n url: TimestampProviderUrl,\n auth: TimestampProviderAuth | undefined,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise<{\n timestampToken: null | Buffer\n log: TimestampLog\n }> {\n const { requestUrl, tsRequest, error } = await this._getTimestampRequest(url, body, auth, proxy, tsQuery)\n if (error) {\n return {\n timestampToken: null,\n log: {\n info: { name, info: null, date: new Date(), url, response: null, error: error?.message },\n errorTrace: error?.trace\n }\n }\n }\n try {\n const response = await fetch(requestUrl!, tsRequest!)\n if (response.status !== 200) {\n throw new Error(`TSA response unsatisfactory: ${response.status} ${response.statusText}`)\n }\n\n return {\n timestampToken: Buffer.from((await response.arrayBuffer()) as unknown as string, 'utf8'), // TODO: fix type\n log: {\n info: { name, date: new Date(), url, response: `${response.status}, ${response.statusText}`, error: null },\n errorTrace: null\n }\n }\n } catch (error) {\n return {\n timestampToken: null,\n log: {\n info: { name, date: new Date(), url, response: null, error: (error as Error).message },\n errorTrace: error as Error\n }\n }\n } finally {\n for (const cleanUpFn of this.cleanupTempFns) {\n if (typeof cleanUpFn === 'function') {\n cleanUpFn()\n }\n }\n }\n }\n\n /**\n * getTimestampRequestSettings method that set the request settings\n **/\n private async _getTimestampRequest(\n url: TimestampProviderUrl,\n body: TimestampProviderBody | undefined,\n auth: TimestampProviderAuth | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n // send the request to the TSA\n const tsRequest = new TimestampRequest(this.tempFileService, this.tmpOptions, this.cleanupTempFns)\n\n if (proxy?.url) {\n tsRequest.setProxy(proxy)\n }\n\n let requestType: TimestampRequestAuthTypes | undefined\n if ((url as TimestampProviderOAuthUrl)?.getTokenUrl && tsQuery) {\n requestType = 'oauth'\n }\n if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && auth?.user && auth?.pass && tsQuery) {\n requestType = 'basic'\n }\n if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && !auth?.user) {\n requestType = 'noAuth'\n }\n\n return await tsRequest.authStrategy(requestType, url, auth, body, proxy, tsQuery)\n }\n}\n","import * as childProcess from 'node:child_process'\nimport type { ExecOptions } from 'node:child_process'\n\ninterface Logger {\n info: (log: string, ...args: unknown[]) => unknown\n error: (log: string, ...args: unknown[]) => unknown\n}\n\nexport function exec(\n command: string,\n options: {\n encoding?: 'buffer'\n } & ExecOptions = {},\n logger?: Logger\n): Promise {\n return new Promise((resolve, reject) => {\n const process = childProcess.exec(command, options, (err, stdout, stderr) => {\n if (err) {\n return reject(err || new Error(stderr.toString() || `Failed to execute command: ${command}`))\n }\n\n return resolve(stdout as ReturnType)\n })\n\n if (logger) {\n process.stdout!.on('data', message => {\n message = message.trim()\n if (message) {\n logger.info(message)\n }\n })\n\n process.stderr!.on('data', message => {\n message = message.trim()\n if (message) {\n logger.error(message)\n }\n })\n }\n })\n}\n\nexport class ExecFileError extends Error {\n public stdout?: string\n public stderr?: string\n}\n\nexport function execFile(command: string, args: string[], options = {}): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n childProcess.execFile(command, args, options, (err, stdout, stderr) => {\n if (err) {\n const error = new ExecFileError(err ? err.message : stderr.toString() || `Failed to execute file: ${command}`)\n error.stdout = stdout\n error.stderr = stderr\n return reject(error)\n }\n\n resolve({ stdout, stderr })\n })\n })\n}\n","import { exec } from '../util/child_process_promise'\n\nexport async function getTsQuery(digest: string, digestFormat: string): Promise {\n // create a time stamp request based on the hash of a data file\n const queryCommand = `openssl ts -query -digest ${digest} -no_nonce -${digestFormat} -cert`\n\n return await exec(queryCommand, { encoding: 'buffer' }).catch(err => {\n throw new Error(`Failed to execute openssl ts -query command \"${queryCommand}\" ${err.message}`)\n })\n}\n\nexport function getTsVerify(\n digest: string,\n tempPath: string,\n isToken: boolean,\n certsLocation: string\n): Promise {\n // verify the response with openssl\n const verifyCommand = isToken\n ? `openssl ts -verify -digest ${digest} -token_in -in ${tempPath} -CApath ${certsLocation}`\n : `openssl ts -verify -digest ${digest} -in ${tempPath} -CApath ${certsLocation}`\n\n return exec(verifyCommand).catch(err => {\n throw new Error(`Failed to verify tsr \"${verifyCommand}\" ${err.message}`)\n })\n}\n\nexport async function getTsReply(inputTempPath: string, isToken: boolean): Promise {\n // get token info\n const replyCommand = isToken\n ? `openssl ts -reply -token_in -in ${inputTempPath} -text`\n : `openssl ts -reply -in ${inputTempPath} -text`\n return await exec(replyCommand).catch(err => {\n throw new Error(`Error executing openssl ts -reply command \"${replyCommand}\" ${err.message}`)\n })\n}\n\nexport async function generateTsReply(inputTempPath: string, tempPath: string): Promise {\n await exec(`openssl ts -reply -in \"${inputTempPath}\" -token_out -out \"${tempPath}\"`).catch(err => {\n throw new Error(`Error executing openssl ts -reply command \"${inputTempPath}\" ${err.message}`)\n })\n}\n\nexport async function extractCertFromToken(tstPath: string): Promise {\n return await exec(`openssl pkcs7 -inform der -in \"${tstPath}\" -print_certs`).catch(err => {\n throw new Error(`Error executing openssl pkcs7 command ${err.message}`)\n })\n}\n\nexport async function checkSslPath(): Promise {\n try {\n const stdout = await exec('which openssl')\n if (!stdout.toString()) {\n throw new Error('openssl is unavailable')\n }\n return stdout\n } catch (error) {\n throw new Error(`Unable to verify openssl installation ${(error as Error).message}`)\n }\n}\n","const supportedDigestForamts = [\n 'sha',\n 'sha1',\n 'mdc2',\n 'ripemd160',\n 'sha224',\n 'sha256',\n 'sha384',\n 'sha512',\n 'md2',\n 'md4',\n 'md5',\n 'dss1'\n]\n\nexport function checkDigestFormat(format: string): boolean {\n return supportedDigestForamts.includes(format)\n}\n\nexport function checkDigest(digest: string): boolean {\n return /^([0-9A-F])+$/i.test(digest)\n}\n\nexport function normalizeDigestFormat(format: string): string {\n return format\n .replace(/^-/, '') // -sha256\n .replace(/-/g, '') // sha-256\n}\n","import fs from 'node:fs/promises'\nimport util from 'node:util'\nimport tmp from 'tmp'\n\ntmp.setGracefulCleanup()\n\nconst tmpFile = util.promisify(\n (\n options: tmp.FileOptions,\n cb: (error: Error | null, results: [string, number | undefined, () => void]) => unknown\n ) => {\n tmp.file(options, (err, ...results) => cb(err, results))\n }\n)\n\nexport class TempFileService {\n /**\n * Utility to create a temp file with content\n * */\n async createTempFile(\n options: tmp.FileOptions,\n content?: Buffer\n ): Promise<{ tempPath: string; fd: number | undefined; cleanupCallback: () => void }> {\n try {\n const [tempPath, fd, cleanupCallback] = await tmpFile(options)\n if (content) {\n await fs.writeFile(tempPath, content as unknown as string)\n }\n return { tempPath, fd, cleanupCallback }\n } catch (err) {\n throw new Error(`Failed to create temp file ${err}`)\n }\n }\n}\n","import { CreatedTimestampToken } from '../types/timestamp-token.type'\n\nexport type CreateTimestampTokenErrorContext = Partial>\n\n/**\n * Custom error class that encapsulates context about token creation, including the provider used and the associated log history\n */\nexport class CreateTimestampTokenError extends Error {\n constructor(\n message: string,\n readonly context: CreateTimestampTokenErrorContext = {},\n options?: ErrorOptions\n ) {\n super(message, options)\n }\n}\n","import { CertService } from '@techteamer/cert-utils'\nimport { FileOptions as TempFileOptions } from 'tmp'\n\nimport { TimestampInfo } from './TrustedTimestampInfo'\nimport { TrustedTimestampRequest } from './TrustedTimestampRequest'\nimport {\n checkSslPath,\n extractCertFromToken,\n generateTsReply,\n getTsQuery,\n getTsReply,\n getTsVerify\n} from './TrustedTimestampCommand'\nimport { checkDigest, checkDigestFormat, normalizeDigestFormat } from './TrustedTimestampCheck'\nimport { TempFileService } from '../util/TempFileService'\nimport { CreateTimestampTokenError } from './error/create-timestamp-token.error'\nimport type { TimestampConfig } from './types/timestamp-config.type'\nimport type { TimestampProvider } from './types/timestamp-provider.type'\nimport type { CreatedTimestampToken, Timestamp } from './types/timestamp-token.type'\n\n/**\n * OpenSSL docs: https://www.openssl.org/docs/manmaster/man1/ts.html\n *\n * Certificate Installation with OpenSSL: http://gagravarr.org/writing/openssl-certs/others.shtml\n *\n * Trustedtimestamp service implements the generate, import and verification of timestamps\n *\n * */\nexport class TrustedTimestampService {\n private readonly tmpOptions: TempFileOptions = { prefix: 'request-', postfix: '.tsr' }\n private tempFileService!: TempFileService\n private certService!: CertService\n private providers!: TimestampProvider[]\n private certsLocation!: string\n private timestampRequest!: TrustedTimestampRequest\n\n constructor(\n private readonly timestampInfoType: 'normal' | 'short' = 'normal',\n private readonly config: TimestampConfig = {} as TimestampConfig,\n private readonly encoding = 'latin1'\n ) {\n this._init()\n }\n\n /**\n * init method that sets the config and instantiates the required services\n * */\n private _init(): void {\n if (this.config) {\n if (!this.config?.certsLocation) {\n throw new Error('trustedTimestamp config \"certsLocation\" missing!')\n }\n\n if (!this.config?.providers?.length) {\n throw new Error('trustedTimestamp config \"providers\" missing or empty!')\n }\n\n this.tempFileService = new TempFileService()\n this.certService = new CertService(this.encoding)\n this.providers = this.config.providers\n this.certsLocation = this.config.certsLocation\n this.timestampRequest = new TrustedTimestampRequest(this.providers, this.tempFileService, this.tmpOptions)\n }\n }\n\n /**\n * Utility method that resolves to a TimestampInfo object containing parsed info from the tsr\n * */\n async getTimestampInfo(tsr: Buffer, isToken = false): Promise {\n const cleanupTempFns: (() => unknown)[] = []\n let inputTempPath = ''\n\n try {\n const tsrtmp = await this.tempFileService.createTempFile(this.tmpOptions, tsr)\n inputTempPath = tsrtmp.tempPath\n cleanupTempFns.push(tsrtmp.cleanupCallback)\n\n const responseText = await getTsReply(inputTempPath, isToken)\n const timestampInfo = new TimestampInfo(this.timestampInfoType, responseText)\n\n // get cert info\n\n try {\n // get raw token if the input was a whole response (TimestampResponse->TimestampToken)\n let tstPath\n if (isToken) {\n tstPath = inputTempPath\n } else {\n const tmp = await this.tempFileService.createTempFile(this.tmpOptions)\n await generateTsReply(inputTempPath, tmp.tempPath)\n tstPath = tmp.tempPath\n cleanupTempFns.push(tmp.cleanupCallback)\n }\n\n // extract cert from token\n const x509Cert = await extractCertFromToken(tstPath)\n // parse cert\n const certInfo = await this.certService.parseCert(Buffer.from(x509Cert), '', this.certService.CertType.PEM)\n\n if (this.timestampInfoType === 'normal') {\n timestampInfo.setCertInfo(certInfo)\n }\n } catch (err) {\n throw new Error('Unable to get cert info from timestamp token', err as Error)\n }\n\n return timestampInfo\n } catch (err) {\n return new TimestampInfo(this.timestampInfoType, null!, (err as Error).message)\n } finally {\n for (const cleanUpFn of cleanupTempFns) {\n if (typeof cleanUpFn === 'function') {\n cleanUpFn()\n }\n }\n }\n }\n\n /**\n * Returns a TimestampToken instance for a hash digest and a hash algorithm.\n * It requests a token from the TSA and verifies the received response.\n * The returned timestamp token represents the token\n * and contains the tsr with the verification result.\n * */\n async createTimestampToken(digest: string, hashAlgorithm: string, dataSize: number): Promise {\n const digestFormat = normalizeDigestFormat(hashAlgorithm)\n\n try {\n if (!checkDigestFormat(digestFormat)) {\n throw new Error(`Unknown digest format: ${hashAlgorithm}`)\n }\n if (!checkDigest(digest)) {\n throw new Error(`Invalid digest: ${digest}`)\n }\n\n const tsQuery = await getTsQuery(digest, digestFormat)\n console.log('!!!!!!!!!!!!!!!')\n console.log(tsQuery)\n const { tsr, providerName, logHistory } = await this.timestampRequest.getTimestamp(tsQuery)\n if (!tsr) {\n throw new CreateTimestampTokenError('Failed to create trusted timestamp, no provider was available', {\n providerName,\n logHistory\n })\n }\n const timestampInfo = await this.getTimestampInfo(tsr, false)\n const certExpiry = timestampInfo.certInfo?.notAfter || null\n const tt: Timestamp = {\n digest,\n hashAlgorithm,\n dataSize,\n tsr,\n isToken: false,\n certExpiry,\n verified: null // not yet\n }\n\n tt.verified = await this.verifyToken(tt, digest, dataSize)\n\n return { timestamp: tt, providerName, logHistory }\n } catch (error) {\n if (error instanceof CreateTimestampTokenError) {\n throw error\n }\n\n throw new CreateTimestampTokenError(`Failed to create trusted timestamp ${(error as Error).message}`)\n }\n }\n\n /**\n * Verify if a timestamp token corresponds to a particular hash of data\n * */\n async verifyToken(timestampToken: Timestamp, digest: string, dataSize: number): Promise {\n if (timestampToken.dataSize !== dataSize) {\n throw new Error(\n `Timestamp token verification failed: The provided data size (${dataSize}) does not match the time stamped size (${timestampToken.dataSize}).`\n )\n }\n\n if (timestampToken.digest !== digest) {\n throw new Error(\n `Timestamp token verification failed: The provided digest (${digest}) does not match the time stamped digest (${timestampToken.digest}).`\n )\n }\n\n // verify token\n return await this.verifyTsr(digest, timestampToken.tsr, timestampToken.isToken)\n }\n\n /**\n * Verify a hash digest against a timestamp response file\n * */\n async verifyTsr(digest: string, tsr: Buffer, isToken = false): Promise {\n let cleanupTempFile = null\n\n try {\n if (!checkDigest(digest)) {\n throw new Error(`Invalid digest: ${digest}`)\n }\n\n // save the tsr on disk because openssl can only read it from file\n const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(this.tmpOptions, tsr)\n cleanupTempFile = cleanupCallback\n\n const stdout = await getTsVerify(digest, tempPath, isToken, this.certsLocation)\n\n const verificationResult = /Verification: OK/i.test(stdout)\n\n if (cleanupTempFile) {\n cleanupTempFile()\n }\n\n return verificationResult\n } catch (err) {\n if (typeof cleanupTempFile === 'function') {\n cleanupTempFile()\n }\n\n throw new Error(`Failed to verify tsr ${(err as Error).message}`)\n }\n }\n\n /**\n * testService method that check the ssl installation\n * */\n async testService(): Promise {\n return await checkSslPath()\n }\n}\n"],"names":["fs"],"mappings":"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"} \ No newline at end of file diff --git a/package/timestamp_service/package.json b/package/timestamp_service/package.json new file mode 100644 index 0000000..d5ea358 --- /dev/null +++ b/package/timestamp_service/package.json @@ -0,0 +1,68 @@ +{ + "name": "@techteamer/timestamp", + "version": "2.0.1", + "description": "This package contains a TimestampService, which can create and verity timestamps", + "main": "src/index.ts", + "author": "Techteamer", + "license": "MIT", + "exports": { + ".": { + "import": "./build/timestamp_config.mjs", + "require": "./build/timestamp_config.cjs", + "types": "./build/src/index.d.ts", + "default": "./build/timestamp_config.mjs" + } + }, + "files": [ + "build" + ], + "repository": { + "type": "git", + "url": "https://github.com/TechTeamer/timestamp" + }, + "engines": { + "node": ">=22.0.0" + }, + "scripts": { + "vitest": "vitest run --config test/vitest.config.ts", + "build": "rollup -c", + "vitest:unit": "yarn vitest unit/", + "vitest:feature": "yarn vitest feature/", + "lint": "eslint ./src ./test && echo 'npm run lint: OK'", + "lint:fix": "eslint . --fix", + "format": "prettier -w .", + "test": "npm run lint --silent && echo 'npm test: OK'" + }, + "type": "module", + "dependencies": { + "@techteamer/cert-utils": "^1.1.3", + "@types/node-fetch": "^3", + "node-fetch": "^3", + "proxy-agent": "^6.5.0", + "tmp": "^0.2.1" + }, + "devDependencies": { + "@rollup/plugin-typescript": "^12.1.4", + "@types/node": "^20.14.6", + "@types/tmp": "^0.2.6", + "@typescript-eslint/eslint-plugin": "^7.16.0", + "@typescript-eslint/parser": "^7.13.1", + "@vitest/coverage-v8": "^2.0.2", + "eslint": "^8.19.0", + "eslint-config-prettier": "^10.1.8", + "eslint-config-standard": "^17.0.0", + "nock": "^13.5.4", + "prettier": "^3.6.2", + "rollup": "^4.18.0", + "rollup-plugin-esbuild": "^6.1.1", + "typescript": "~5.5", + "vitest": "^2.0.2" + }, + "resolutions": { + "strip-ansi": "6.0.1" + }, + "workspaces": [ + "app/*", + "project/*" + ] +} diff --git a/rollup.config.js b/package/timestamp_service/rollup.config.js similarity index 100% rename from rollup.config.js rename to package/timestamp_service/rollup.config.js diff --git a/src/index.ts b/package/timestamp_service/src/index.ts similarity index 100% rename from src/index.ts rename to package/timestamp_service/src/index.ts diff --git a/src/patch/node-fetch.ts b/package/timestamp_service/src/patch/node-fetch.ts similarity index 100% rename from src/patch/node-fetch.ts rename to package/timestamp_service/src/patch/node-fetch.ts diff --git a/src/trustedTimestamp/TimestampRequest.ts b/package/timestamp_service/src/trustedTimestamp/TimestampRequest.ts similarity index 100% rename from src/trustedTimestamp/TimestampRequest.ts rename to package/timestamp_service/src/trustedTimestamp/TimestampRequest.ts diff --git a/src/trustedTimestamp/TrustedTimestampCheck.ts b/package/timestamp_service/src/trustedTimestamp/TrustedTimestampCheck.ts similarity index 100% rename from src/trustedTimestamp/TrustedTimestampCheck.ts rename to package/timestamp_service/src/trustedTimestamp/TrustedTimestampCheck.ts diff --git a/src/trustedTimestamp/TrustedTimestampCommand.ts b/package/timestamp_service/src/trustedTimestamp/TrustedTimestampCommand.ts similarity index 100% rename from src/trustedTimestamp/TrustedTimestampCommand.ts rename to package/timestamp_service/src/trustedTimestamp/TrustedTimestampCommand.ts diff --git a/src/trustedTimestamp/TrustedTimestampInfo.ts b/package/timestamp_service/src/trustedTimestamp/TrustedTimestampInfo.ts similarity index 100% rename from src/trustedTimestamp/TrustedTimestampInfo.ts rename to package/timestamp_service/src/trustedTimestamp/TrustedTimestampInfo.ts diff --git a/src/trustedTimestamp/TrustedTimestampRequest.ts b/package/timestamp_service/src/trustedTimestamp/TrustedTimestampRequest.ts similarity index 100% rename from src/trustedTimestamp/TrustedTimestampRequest.ts rename to package/timestamp_service/src/trustedTimestamp/TrustedTimestampRequest.ts diff --git a/src/trustedTimestamp/TrustedTimestampService.ts b/package/timestamp_service/src/trustedTimestamp/TrustedTimestampService.ts similarity index 100% rename from src/trustedTimestamp/TrustedTimestampService.ts rename to package/timestamp_service/src/trustedTimestamp/TrustedTimestampService.ts diff --git a/src/trustedTimestamp/error/create-timestamp-token.error.ts b/package/timestamp_service/src/trustedTimestamp/error/create-timestamp-token.error.ts similarity index 100% rename from src/trustedTimestamp/error/create-timestamp-token.error.ts rename to package/timestamp_service/src/trustedTimestamp/error/create-timestamp-token.error.ts diff --git a/src/trustedTimestamp/types/timestamp-config.type.ts b/package/timestamp_service/src/trustedTimestamp/types/timestamp-config.type.ts similarity index 100% rename from src/trustedTimestamp/types/timestamp-config.type.ts rename to package/timestamp_service/src/trustedTimestamp/types/timestamp-config.type.ts diff --git a/src/trustedTimestamp/types/timestamp-log.type.ts b/package/timestamp_service/src/trustedTimestamp/types/timestamp-log.type.ts similarity index 100% rename from src/trustedTimestamp/types/timestamp-log.type.ts rename to package/timestamp_service/src/trustedTimestamp/types/timestamp-log.type.ts diff --git a/src/trustedTimestamp/types/timestamp-provider.type.ts b/package/timestamp_service/src/trustedTimestamp/types/timestamp-provider.type.ts similarity index 100% rename from src/trustedTimestamp/types/timestamp-provider.type.ts rename to package/timestamp_service/src/trustedTimestamp/types/timestamp-provider.type.ts diff --git a/src/trustedTimestamp/types/timestamp-request.type.ts b/package/timestamp_service/src/trustedTimestamp/types/timestamp-request.type.ts similarity index 100% rename from src/trustedTimestamp/types/timestamp-request.type.ts rename to package/timestamp_service/src/trustedTimestamp/types/timestamp-request.type.ts diff --git a/src/trustedTimestamp/types/timestamp-token.type.ts b/package/timestamp_service/src/trustedTimestamp/types/timestamp-token.type.ts similarity index 100% rename from src/trustedTimestamp/types/timestamp-token.type.ts rename to package/timestamp_service/src/trustedTimestamp/types/timestamp-token.type.ts diff --git a/src/util/TempFileService.ts b/package/timestamp_service/src/util/TempFileService.ts similarity index 100% rename from src/util/TempFileService.ts rename to package/timestamp_service/src/util/TempFileService.ts diff --git a/src/util/child_process_promise.ts b/package/timestamp_service/src/util/child_process_promise.ts similarity index 100% rename from src/util/child_process_promise.ts rename to package/timestamp_service/src/util/child_process_promise.ts diff --git a/src/util/regexParser.ts b/package/timestamp_service/src/util/regexParser.ts similarity index 100% rename from src/util/regexParser.ts rename to package/timestamp_service/src/util/regexParser.ts diff --git a/package/timestamp_service/test/coverage/jest/base.css b/package/timestamp_service/test/coverage/jest/base.css new file mode 100644 index 0000000..f418035 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/package/timestamp_service/test/coverage/jest/block-navigation.js b/package/timestamp_service/test/coverage/jest/block-navigation.js new file mode 100644 index 0000000..cc12130 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/package/timestamp_service/test/coverage/jest/favicon.png b/package/timestamp_service/test/coverage/jest/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 90.13% + Statements + 850/943 +
+ + +
+ 69.67% + Branches + 85/122 +
+ + +
+ 91.11% + Functions + 41/45 +
+ + +
+ 90.13% + Lines + 850/943 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
timestamp_service +
+
100%3/3100%2/2100%1/1100%3/3
timestamp_service/src/trustedTimestamp +
+
90.62%793/87566.99%69/10392.1%35/3890.62%793/875
timestamp_service/src/util +
+
83.07%54/6582.35%14/1783.33%5/683.07%54/65
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/package/timestamp_service/test/coverage/jest/lcov.info b/package/timestamp_service/test/coverage/jest/lcov.info new file mode 100644 index 0000000..6b4fbb7 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/lcov.info @@ -0,0 +1,1227 @@ +TN: +SF:index.js +FN:1,Object. +FNF:1 +FNH:1 +FNDA:6,Object. +DA:1,6 +DA:2,6 +DA:3,6 +LF:3 +LH:3 +BRDA:1,0,0,6 +BRDA:1,1,0,6 +BRF:2 +BRH:2 +end_of_record +TN: +SF:src/trustedTimestamp/TimestampRequest.js +FN:1,Object. +FN:16,TimestampRequest +FN:32,setHeader +FN:43,setBody +FN:51,setProxy +FN:59,setEncoding +FN:67,setResolveWithFullResponse +FN:75,get +FN:89,authStrategy +FN:110,_getTimestampRequestBasic +FN:133,_getTimestampRequestOauth +FN:175,_getTimestampRequestNoAuth +FN:189,_getOauth +FN:210,_getOauthRequestSettings +FNF:14 +FNH:12 +FNDA:6,Object. +FNDA:4,TimestampRequest +FNDA:6,setHeader +FNDA:4,setBody +FNDA:0,setProxy +FNDA:2,setEncoding +FNDA:2,setResolveWithFullResponse +FNDA:4,get +FNDA:4,authStrategy +FNDA:2,_getTimestampRequestBasic +FNDA:2,_getTimestampRequestOauth +FNDA:0,_getTimestampRequestNoAuth +FNDA:2,_getOauth +FNDA:2,_getOauthRequestSettings +DA:1,6 +DA:2,6 +DA:3,6 +DA:4,6 +DA:5,6 +DA:6,6 +DA:7,6 +DA:8,6 +DA:9,6 +DA:10,6 +DA:11,6 +DA:12,6 +DA:13,6 +DA:14,6 +DA:15,6 +DA:16,6 +DA:17,4 +DA:18,4 +DA:19,4 +DA:20,4 +DA:21,4 +DA:22,4 +DA:23,4 +DA:24,4 +DA:25,4 +DA:26,4 +DA:27,6 +DA:28,6 +DA:29,6 +DA:30,6 +DA:31,6 +DA:32,6 +DA:33,6 +DA:34,6 +DA:35,6 +DA:36,6 +DA:37,6 +DA:38,6 +DA:39,6 +DA:40,6 +DA:41,6 +DA:42,6 +DA:43,6 +DA:44,4 +DA:45,4 +DA:46,6 +DA:47,6 +DA:48,6 +DA:49,6 +DA:50,6 +DA:51,6 +DA:52,0 +DA:53,0 +DA:54,6 +DA:55,6 +DA:56,6 +DA:57,6 +DA:58,6 +DA:59,6 +DA:60,2 +DA:61,2 +DA:62,6 +DA:63,6 +DA:64,6 +DA:65,6 +DA:66,6 +DA:67,6 +DA:68,2 +DA:69,2 +DA:70,6 +DA:71,6 +DA:72,6 +DA:73,6 +DA:74,6 +DA:75,6 +DA:76,4 +DA:77,4 +DA:78,6 +DA:79,6 +DA:80,6 +DA:81,6 +DA:82,6 +DA:83,6 +DA:84,6 +DA:85,6 +DA:86,6 +DA:87,6 +DA:88,6 +DA:89,6 +DA:90,4 +DA:91,4 +DA:92,2 +DA:93,4 +DA:94,2 +DA:95,4 +DA:96,0 +DA:97,4 +DA:98,0 +DA:99,4 +DA:100,4 +DA:101,6 +DA:102,6 +DA:103,6 +DA:104,6 +DA:105,6 +DA:106,6 +DA:107,6 +DA:108,6 +DA:109,6 +DA:110,6 +DA:111,2 +DA:112,2 +DA:113,2 +DA:114,2 +DA:115,2 +DA:116,2 +DA:117,2 +DA:118,2 +DA:119,2 +DA:120,2 +DA:121,2 +DA:122,6 +DA:123,6 +DA:124,6 +DA:125,6 +DA:126,6 +DA:127,6 +DA:128,6 +DA:129,6 +DA:130,6 +DA:131,6 +DA:132,6 +DA:133,6 +DA:134,2 +DA:135,2 +DA:136,0 +DA:137,0 +DA:138,2 +DA:139,2 +DA:140,0 +DA:141,0 +DA:142,2 +DA:143,2 +DA:144,2 +DA:145,2 +DA:146,2 +DA:147,2 +DA:148,2 +DA:149,2 +DA:150,2 +DA:151,2 +DA:152,2 +DA:153,2 +DA:154,2 +DA:155,2 +DA:156,2 +DA:157,2 +DA:158,2 +DA:159,2 +DA:160,2 +DA:161,2 +DA:162,2 +DA:163,2 +DA:164,2 +DA:165,2 +DA:166,2 +DA:167,2 +DA:168,6 +DA:169,6 +DA:170,6 +DA:171,6 +DA:172,6 +DA:173,6 +DA:174,6 +DA:175,6 +DA:176,0 +DA:177,0 +DA:178,6 +DA:179,6 +DA:180,6 +DA:181,6 +DA:182,6 +DA:183,6 +DA:184,6 +DA:185,6 +DA:186,6 +DA:187,6 +DA:188,6 +DA:189,6 +DA:190,2 +DA:191,2 +DA:192,2 +DA:193,2 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,2 +DA:199,2 +DA:200,6 +DA:201,6 +DA:202,6 +DA:203,6 +DA:204,6 +DA:205,6 +DA:206,6 +DA:207,6 +DA:208,6 +DA:209,6 +DA:210,6 +DA:211,2 +DA:212,2 +DA:213,2 +DA:214,2 +DA:215,2 +DA:216,2 +DA:217,2 +DA:218,2 +DA:219,2 +DA:220,2 +DA:221,2 +DA:222,2 +DA:223,0 +DA:224,0 +DA:225,2 +DA:226,2 +DA:227,2 +DA:228,6 +DA:229,6 +DA:230,6 +LF:230 +LH:214 +BRDA:1,0,0,6 +BRDA:1,1,0,6 +BRDA:16,2,0,4 +BRDA:32,3,0,6 +BRDA:43,4,0,4 +BRDA:59,5,0,2 +BRDA:67,6,0,2 +BRDA:75,7,0,4 +BRDA:89,8,0,4 +BRDA:91,9,0,2 +BRDA:93,10,0,2 +BRDA:95,11,0,0 +BRDA:97,12,0,0 +BRDA:110,13,0,2 +BRDA:133,14,0,2 +BRDA:135,15,0,0 +BRDA:139,16,0,0 +BRDA:189,17,0,2 +BRDA:191,18,0,2 +BRDA:210,19,0,2 +BRDA:222,20,0,0 +BRDA:222,21,0,0 +BRF:22 +BRH:16 +end_of_record +TN: +SF:src/trustedTimestamp/TrustedTimestampCheck.js +FN:1,Object. +FN:9,checkDigestFormat +FN:17,checkDigest +FN:25,normalizeDigestFormat +FNF:4 +FNH:4 +FNDA:6,Object. +FNDA:3,checkDigestFormat +FNDA:8,checkDigest +FNDA:3,normalizeDigestFormat +DA:1,6 +DA:2,6 +DA:3,6 +DA:4,6 +DA:5,6 +DA:6,6 +DA:7,6 +DA:8,6 +DA:9,3 +DA:10,3 +DA:11,3 +DA:12,6 +DA:13,6 +DA:14,6 +DA:15,6 +DA:16,6 +DA:17,8 +DA:18,8 +DA:19,8 +DA:20,6 +DA:21,6 +DA:22,6 +DA:23,6 +DA:24,6 +DA:25,3 +DA:26,3 +DA:27,3 +DA:28,3 +DA:29,3 +DA:30,6 +DA:31,6 +LF:31 +LH:31 +BRDA:1,0,0,6 +BRDA:1,1,0,6 +BRDA:9,2,0,3 +BRDA:17,3,0,8 +BRDA:25,4,0,3 +BRF:5 +BRH:5 +end_of_record +TN: +SF:src/trustedTimestamp/TrustedTimestampInfo.js +FN:1,Object. +FN:51,TimestampInfo +FN:81,setCertInfo +FN:88,parseOpensslOutput +FN:110,m.reduce.C +FN:124,parseOpensslOutputShort +FNF:6 +FNH:5 +FNDA:6,Object. +FNDA:4,TimestampInfo +FNDA:4,setCertInfo +FNDA:4,parseOpensslOutput +FNDA:16,m.reduce.C +FNDA:0,parseOpensslOutputShort +DA:1,6 +DA:2,6 +DA:3,6 +DA:4,6 +DA:5,6 +DA:6,6 +DA:7,6 +DA:8,6 +DA:9,6 +DA:10,6 +DA:11,6 +DA:12,6 +DA:13,6 +DA:14,6 +DA:15,6 +DA:16,6 +DA:17,6 +DA:18,6 +DA:19,6 +DA:20,6 +DA:21,6 +DA:22,6 +DA:23,6 +DA:24,6 +DA:25,6 +DA:26,6 +DA:27,6 +DA:28,6 +DA:29,6 +DA:30,6 +DA:31,6 +DA:32,6 +DA:33,6 +DA:34,6 +DA:35,6 +DA:36,6 +DA:37,6 +DA:38,6 +DA:39,6 +DA:40,6 +DA:41,6 +DA:42,6 +DA:43,6 +DA:44,6 +DA:45,6 +DA:46,6 +DA:47,6 +DA:48,6 +DA:49,6 +DA:50,6 +DA:51,6 +DA:52,4 +DA:53,4 +DA:54,4 +DA:55,4 +DA:56,4 +DA:57,4 +DA:58,4 +DA:59,4 +DA:60,4 +DA:61,4 +DA:62,4 +DA:63,4 +DA:64,0 +DA:65,4 +DA:66,4 +DA:67,0 +DA:68,4 +DA:69,4 +DA:70,4 +DA:71,4 +DA:72,4 +DA:73,4 +DA:74,4 +DA:75,4 +DA:76,4 +DA:77,6 +DA:78,6 +DA:79,6 +DA:80,6 +DA:81,6 +DA:82,4 +DA:83,4 +DA:84,6 +DA:85,6 +DA:86,6 +DA:87,6 +DA:88,6 +DA:89,4 +DA:90,4 +DA:91,4 +DA:92,4 +DA:93,4 +DA:94,4 +DA:95,4 +DA:96,4 +DA:97,4 +DA:98,4 +DA:99,4 +DA:100,4 +DA:101,4 +DA:102,4 +DA:103,4 +DA:104,4 +DA:105,4 +DA:106,4 +DA:107,4 +DA:108,4 +DA:109,4 +DA:110,4 +DA:111,16 +DA:112,16 +DA:113,0 +DA:114,0 +DA:115,16 +DA:116,16 +DA:117,4 +DA:118,4 +DA:119,4 +DA:120,6 +DA:121,6 +DA:122,6 +DA:123,6 +DA:124,6 +DA:125,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,6 +DA:152,6 +DA:153,6 +LF:153 +LH:123 +BRDA:1,0,0,6 +BRDA:1,1,0,6 +BRDA:51,2,0,4 +BRDA:63,3,0,0 +BRDA:66,4,0,0 +BRDA:81,5,0,4 +BRDA:88,6,0,4 +BRDA:92,7,0,4 +BRDA:98,8,0,4 +BRDA:99,9,0,0 +BRDA:100,10,0,0 +BRDA:101,11,0,0 +BRDA:104,12,0,4 +BRDA:105,13,0,4 +BRDA:105,14,0,0 +BRDA:107,15,0,4 +BRDA:108,16,0,0 +BRDA:110,17,0,16 +BRDA:111,18,0,0 +BRDA:112,19,0,0 +BRF:20 +BRH:11 +end_of_record +TN: +SF:src/trustedTimestamp/TrustedTimestampRequest.js +FN:1,Object. +FN:30,TrustedTimestampRequest +FN:48,getTimestamp +FN:80,_sortedProviders +FN:131,_getTimeStampToken +FN:173,_getTimestampRequest +FNF:6 +FNH:6 +FNDA:6,Object. +FNDA:9,TrustedTimestampRequest +FNDA:3,getTimestamp +FNDA:9,_sortedProviders +FNDA:4,_getTimeStampToken +FNDA:4,_getTimestampRequest +DA:1,6 +DA:2,6 +DA:3,6 +DA:4,6 +DA:5,6 +DA:6,6 +DA:7,6 +DA:8,6 +DA:9,6 +DA:10,6 +DA:11,6 +DA:12,6 +DA:13,6 +DA:14,6 +DA:15,6 +DA:16,6 +DA:17,6 +DA:18,6 +DA:19,6 +DA:20,6 +DA:21,6 +DA:22,6 +DA:23,6 +DA:24,6 +DA:25,6 +DA:26,6 +DA:27,6 +DA:28,6 +DA:29,6 +DA:30,6 +DA:31,9 +DA:32,9 +DA:33,9 +DA:34,9 +DA:35,9 +DA:36,6 +DA:37,6 +DA:38,6 +DA:39,6 +DA:40,6 +DA:41,6 +DA:42,6 +DA:43,6 +DA:44,6 +DA:45,6 +DA:46,6 +DA:47,6 +DA:48,6 +DA:49,3 +DA:50,3 +DA:51,3 +DA:52,3 +DA:53,3 +DA:54,4 +DA:55,4 +DA:56,4 +DA:57,4 +DA:58,0 +DA:59,0 +DA:60,4 +DA:61,0 +DA:62,0 +DA:63,4 +DA:64,4 +DA:65,4 +DA:66,4 +DA:67,4 +DA:68,4 +DA:69,4 +DA:70,3 +DA:71,3 +DA:72,3 +DA:73,6 +DA:74,6 +DA:75,6 +DA:76,6 +DA:77,6 +DA:78,6 +DA:79,6 +DA:80,6 +DA:81,9 +DA:82,9 +DA:83,9 +DA:84,9 +DA:85,16 +DA:86,5 +DA:87,16 +DA:88,11 +DA:89,11 +DA:90,9 +DA:91,9 +DA:92,9 +DA:93,9 +DA:94,9 +DA:95,9 +DA:96,6 +DA:97,6 +DA:98,6 +DA:99,6 +DA:100,6 +DA:101,6 +DA:102,6 +DA:103,6 +DA:104,6 +DA:105,6 +DA:106,6 +DA:107,6 +DA:108,6 +DA:109,6 +DA:110,6 +DA:111,6 +DA:112,6 +DA:113,6 +DA:114,6 +DA:115,6 +DA:116,6 +DA:117,6 +DA:118,6 +DA:119,6 +DA:120,6 +DA:121,6 +DA:122,6 +DA:123,6 +DA:124,6 +DA:125,6 +DA:126,6 +DA:127,6 +DA:128,6 +DA:129,6 +DA:130,6 +DA:131,6 +DA:132,4 +DA:133,4 +DA:134,0 +DA:135,0 +DA:136,4 +DA:137,3 +DA:138,0 +DA:139,0 +DA:140,3 +DA:141,3 +DA:142,4 +DA:143,1 +DA:144,4 +DA:145,4 +DA:146,2 +DA:147,2 +DA:148,2 +DA:149,2 +DA:150,4 +DA:151,4 +DA:152,6 +DA:153,6 +DA:154,6 +DA:155,6 +DA:156,6 +DA:157,6 +DA:158,6 +DA:159,6 +DA:160,6 +DA:161,6 +DA:162,6 +DA:163,6 +DA:164,6 +DA:165,6 +DA:166,6 +DA:167,6 +DA:168,6 +DA:169,6 +DA:170,6 +DA:171,6 +DA:172,6 +DA:173,6 +DA:174,4 +DA:175,4 +DA:176,4 +DA:177,4 +DA:178,0 +DA:179,0 +DA:180,4 +DA:181,4 +DA:182,4 +DA:183,2 +DA:184,2 +DA:185,4 +DA:186,2 +DA:187,2 +DA:188,4 +DA:189,0 +DA:190,0 +DA:191,4 +DA:192,4 +DA:193,4 +DA:194,6 +DA:195,6 +DA:196,6 +LF:196 +LH:184 +BRDA:1,0,0,6 +BRDA:1,1,0,6 +BRDA:30,2,0,9 +BRDA:48,3,0,3 +BRDA:53,4,0,4 +BRDA:57,5,0,0 +BRDA:60,6,0,0 +BRDA:80,7,0,9 +BRDA:84,8,0,16 +BRDA:85,9,0,5 +BRDA:87,10,0,11 +BRDA:131,11,0,4 +BRDA:133,12,0,0 +BRDA:136,13,0,3 +BRDA:137,14,0,0 +BRDA:142,15,0,1 +BRDA:144,16,0,4 +BRDA:145,17,0,2 +BRDA:173,18,0,4 +BRDA:177,19,0,0 +BRDA:177,20,0,0 +BRDA:182,21,0,2 +BRDA:182,22,0,2 +BRDA:185,23,0,2 +BRDA:185,24,0,2 +BRDA:185,25,0,2 +BRDA:185,26,0,2 +BRDA:188,27,0,2 +BRDA:188,28,0,0 +BRF:29 +BRH:22 +end_of_record +TN: +SF:src/trustedTimestamp/TrustedTimestampService.js +FN:1,Object. +FN:41,TrustedTimestampService +FN:54,_init +FN:81,getTimestampInfo +FN:160,createTimestampToken +FN:204,verifyToken +FN:225,verifyTsr +FN:260,testService +FNF:8 +FNH:8 +FNDA:6,Object. +FNDA:11,TrustedTimestampService +FNDA:11,_init +FNDA:4,getTimestampInfo +FNDA:3,createTimestampToken +FNDA:4,verifyToken +FNDA:5,verifyTsr +FNDA:1,testService +DA:1,6 +DA:2,6 +DA:3,6 +DA:4,6 +DA:5,6 +DA:6,6 +DA:7,6 +DA:8,6 +DA:9,6 +DA:10,6 +DA:11,6 +DA:12,6 +DA:13,6 +DA:14,6 +DA:15,6 +DA:16,6 +DA:17,6 +DA:18,6 +DA:19,6 +DA:20,6 +DA:21,6 +DA:22,6 +DA:23,6 +DA:24,6 +DA:25,6 +DA:26,6 +DA:27,6 +DA:28,6 +DA:29,6 +DA:30,6 +DA:31,6 +DA:32,6 +DA:33,6 +DA:34,6 +DA:35,6 +DA:36,6 +DA:37,6 +DA:38,6 +DA:39,6 +DA:40,6 +DA:41,6 +DA:42,11 +DA:43,11 +DA:44,11 +DA:45,11 +DA:46,11 +DA:47,6 +DA:48,6 +DA:49,6 +DA:50,6 +DA:51,6 +DA:52,6 +DA:53,6 +DA:54,6 +DA:55,11 +DA:56,11 +DA:57,11 +DA:58,11 +DA:59,1 +DA:60,1 +DA:61,10 +DA:62,11 +DA:63,1 +DA:64,1 +DA:65,9 +DA:66,9 +DA:67,9 +DA:68,9 +DA:69,9 +DA:70,9 +DA:71,9 +DA:72,11 +DA:73,6 +DA:74,6 +DA:75,6 +DA:76,6 +DA:77,6 +DA:78,6 +DA:79,6 +DA:80,6 +DA:81,6 +DA:82,4 +DA:83,4 +DA:84,4 +DA:85,4 +DA:86,4 +DA:87,4 +DA:88,4 +DA:89,4 +DA:90,4 +DA:91,4 +DA:92,4 +DA:93,4 +DA:94,4 +DA:95,4 +DA:96,4 +DA:97,4 +DA:98,4 +DA:99,0 +DA:100,4 +DA:101,4 +DA:102,4 +DA:103,4 +DA:104,4 +DA:105,4 +DA:106,4 +DA:107,4 +DA:108,4 +DA:109,4 +DA:110,4 +DA:111,4 +DA:112,4 +DA:113,4 +DA:114,4 +DA:115,4 +DA:116,0 +DA:117,0 +DA:118,4 +DA:119,4 +DA:120,4 +DA:121,0 +DA:122,4 +DA:123,4 +DA:124,8 +DA:125,8 +DA:126,8 +DA:127,8 +DA:128,4 +DA:129,4 +DA:130,6 +DA:131,6 +DA:132,6 +DA:133,6 +DA:134,6 +DA:135,6 +DA:136,6 +DA:137,6 +DA:138,6 +DA:139,6 +DA:140,6 +DA:141,6 +DA:142,6 +DA:143,6 +DA:144,6 +DA:145,6 +DA:146,6 +DA:147,6 +DA:148,6 +DA:149,6 +DA:150,6 +DA:151,6 +DA:152,6 +DA:153,6 +DA:154,6 +DA:155,6 +DA:156,6 +DA:157,6 +DA:158,6 +DA:159,6 +DA:160,6 +DA:161,3 +DA:162,3 +DA:163,3 +DA:164,3 +DA:165,0 +DA:166,0 +DA:167,3 +DA:168,0 +DA:169,0 +DA:170,3 +DA:171,3 +DA:172,3 +DA:173,3 +DA:174,0 +DA:175,0 +DA:176,3 +DA:177,3 +DA:178,3 +DA:179,3 +DA:180,3 +DA:181,3 +DA:182,3 +DA:183,3 +DA:184,3 +DA:185,3 +DA:186,3 +DA:187,3 +DA:188,3 +DA:189,3 +DA:190,3 +DA:191,3 +DA:192,0 +DA:193,0 +DA:194,3 +DA:195,6 +DA:196,6 +DA:197,6 +DA:198,6 +DA:199,6 +DA:200,6 +DA:201,6 +DA:202,6 +DA:203,6 +DA:204,6 +DA:205,4 +DA:206,0 +DA:207,0 +DA:208,4 +DA:209,4 +DA:210,0 +DA:211,0 +DA:212,4 +DA:213,4 +DA:214,4 +DA:215,4 +DA:216,6 +DA:217,6 +DA:218,6 +DA:219,6 +DA:220,6 +DA:221,6 +DA:222,6 +DA:223,6 +DA:224,6 +DA:225,6 +DA:226,5 +DA:227,5 +DA:228,5 +DA:229,5 +DA:230,0 +DA:231,0 +DA:232,5 +DA:233,5 +DA:234,5 +DA:235,5 +DA:236,5 +DA:237,5 +DA:238,5 +DA:239,5 +DA:240,5 +DA:241,5 +DA:242,5 +DA:243,5 +DA:244,5 +DA:245,5 +DA:246,5 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:253,5 +DA:254,6 +DA:255,6 +DA:256,6 +DA:257,6 +DA:258,6 +DA:259,6 +DA:260,6 +DA:261,1 +DA:262,1 +DA:263,6 +DA:264,6 +DA:265,6 +LF:265 +LH:241 +BRDA:1,0,0,6 +BRDA:1,1,0,6 +BRDA:41,2,0,11 +BRDA:54,3,0,11 +BRDA:58,4,0,1 +BRDA:61,5,0,10 +BRDA:62,6,0,9 +BRDA:62,7,0,1 +BRDA:65,8,0,9 +BRDA:81,9,0,4 +BRDA:98,10,0,0 +BRDA:115,11,0,0 +BRDA:120,12,0,0 +BRDA:123,13,0,8 +BRDA:160,14,0,3 +BRDA:164,15,0,0 +BRDA:167,16,0,0 +BRDA:173,17,0,0 +BRDA:177,18,0,0 +BRDA:191,19,0,0 +BRDA:204,20,0,4 +BRDA:205,21,0,0 +BRDA:209,22,0,0 +BRDA:225,23,0,5 +BRDA:229,24,0,0 +BRDA:246,25,0,0 +BRDA:260,26,0,1 +BRF:27 +BRH:15 +end_of_record +TN: +SF:src/util/TempFileService.js +FN:1,Object. +FN:19,createTempFile +FNF:2 +FNH:2 +FNDA:6,Object. +FNDA:15,createTempFile +DA:1,6 +DA:2,6 +DA:3,6 +DA:4,6 +DA:5,6 +DA:6,6 +DA:7,6 +DA:8,15 +DA:9,6 +DA:10,6 +DA:11,6 +DA:12,6 +DA:13,6 +DA:14,6 +DA:15,6 +DA:16,6 +DA:17,6 +DA:18,6 +DA:19,6 +DA:20,15 +DA:21,15 +DA:22,15 +DA:23,10 +DA:24,10 +DA:25,15 +DA:26,15 +DA:27,0 +DA:28,0 +DA:29,15 +DA:30,6 +DA:31,6 +DA:32,6 +LF:32 +LH:30 +BRDA:1,0,0,6 +BRDA:1,1,0,6 +BRDA:7,2,0,15 +BRDA:8,3,0,15 +BRDA:19,4,0,15 +BRDA:22,5,0,10 +BRDA:26,6,0,0 +BRF:7 +BRH:6 +end_of_record +TN: +SF:src/util/regexParser.js +FN:1,Object. +FN:1,parseRegex +FN:7,revive +FN:26,createParser +FNF:4 +FNH:3 +FNDA:6,Object. +FNDA:40,parseRegex +FNDA:20,revive +FNDA:0,createParser +DA:1,40 +DA:2,40 +DA:3,40 +DA:4,0 +DA:5,0 +DA:6,40 +DA:7,40 +DA:8,40 +DA:9,40 +DA:10,0 +DA:11,0 +DA:12,40 +DA:13,40 +DA:14,36 +DA:15,36 +DA:16,4 +DA:17,4 +DA:18,4 +DA:19,4 +DA:20,12 +DA:21,4 +DA:22,4 +DA:23,4 +DA:24,40 +DA:25,6 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,6 +DA:32,6 +DA:33,6 +LF:33 +LH:24 +BRDA:1,0,0,6 +BRDA:1,1,0,6 +BRDA:1,2,0,40 +BRDA:3,3,0,0 +BRDA:7,4,0,20 +BRDA:9,5,0,0 +BRDA:13,6,0,36 +BRDA:16,7,0,4 +BRDA:7,8,0,20 +BRDA:19,9,0,12 +BRF:10 +BRH:8 +end_of_record diff --git a/package/timestamp_service/test/coverage/jest/prettify.css b/package/timestamp_service/test/coverage/jest/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/package/timestamp_service/test/coverage/jest/prettify.js b/package/timestamp_service/test/coverage/jest/prettify.js new file mode 100644 index 0000000..b322523 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/package/timestamp_service/test/coverage/jest/sort-arrow-sprite.png b/package/timestamp_service/test/coverage/jest/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/package/timestamp_service/test/coverage/jest/sorter.js b/package/timestamp_service/test/coverage/jest/sorter.js new file mode 100644 index 0000000..2bb296a --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/package/timestamp_service/test/coverage/jest/timestamp_service/index.html b/package/timestamp_service/test/coverage/jest/timestamp_service/index.html new file mode 100644 index 0000000..06770b6 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/timestamp_service/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for timestamp_service + + + + + + + + + +
+
+

All files timestamp_service

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
index.js +
+
100%3/3100%2/2100%1/1100%3/3
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/package/timestamp_service/test/coverage/jest/timestamp_service/index.js.html b/package/timestamp_service/test/coverage/jest/timestamp_service/index.js.html new file mode 100644 index 0000000..df75723 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/timestamp_service/index.js.html @@ -0,0 +1,94 @@ + + + + + + Code coverage report for timestamp_service/index.js + + + + + + + + + +
+
+

All files / timestamp_service index.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +46x +6x +6x + 
module.exports = {
+  TrustedTimestampService: require('./src/trustedTimestamp/TrustedTimestampService')
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TimestampRequest.js.html b/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TimestampRequest.js.html new file mode 100644 index 0000000..b8b05c7 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TimestampRequest.js.html @@ -0,0 +1,775 @@ + + + + + + Code coverage report for timestamp_service/src/trustedTimestamp/TimestampRequest.js + + + + + + + + + +
+
+

All files / timestamp_service/src/trustedTimestamp TimestampRequest.js

+
+ +
+ 93.04% + Statements + 214/230 +
+ + +
+ 72.72% + Branches + 16/22 +
+ + +
+ 85.71% + Functions + 12/14 +
+ + +
+ 93.04% + Lines + 214/230 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +2316x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +4x +4x +6x +6x +6x +6x +6x +6x +  +  +6x +6x +6x +6x +6x +6x +2x +2x +6x +6x +6x +6x +6x +6x +2x +2x +6x +6x +6x +6x +6x +6x +4x +4x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +4x +4x +2x +4x +2x +4x +  +4x +  +4x +4x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +2x +2x +  +  +2x +2x +  +  +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +6x +6x +6x +6x +6x +6x +6x +6x +  +  +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +2x +2x +2x +2x +  +  +  +  +2x +2x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +  +2x +2x +2x +6x +6x +6x + 
const fetch = require('node-fetch')
+const fs = require('fs')
+ 
+/**
+ * TimestampRequest class implements timestamp request
+ *
+ * @class TimestampRequest
+ * */
+class TimestampRequest {
+  /**
+   * @constructor
+   * @param tempFileService
+   * @param cleanupTempFns
+   * @param {object} tmpOptions
+   */
+  constructor (tempFileService, tmpOptions, cleanupTempFns) {
+    this.tempFileService = tempFileService
+    this.tmpOptions = tmpOptions
+    this.cleanupTempFns = cleanupTempFns
+    this.tsRequest = {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/timestamp-query'
+      }
+    }
+  }
+ 
+  /**
+   * set request header
+   * @param {object} headers
+   * */
+  setHeader (headers) {
+    this.tsRequest = {
+      ...this.tsRequest,
+      headers
+    }
+  }
+ 
+  /**
+   * set request body
+   * @param {object} body
+   * */
+  setBody (body) {
+    this.tsRequest.body = body
+  }
+ 
+  /**
+   * set request proxy
+   * @param {string} proxyUrl
+   * */
+  setProxy (proxyUrl) {
+    this.tsRequest.proxy = proxyUrl
+  }
+ 
+  /**
+   * set request encoding
+   * @param {string} encoding
+   * */
+  setEncoding (encoding) {
+    this.tsRequest.encoding = encoding
+  }
+ 
+  /**
+   * set request encoding
+   * @param {boolean} resolveWithFullResponse
+   * */
+  setResolveWithFullResponse (resolveWithFullResponse) {
+    this.tsRequest.resolveWithFullResponse = resolveWithFullResponse
+  }
+ 
+  /**
+   * return tsRequest
+   * @return {object}
+   * */
+  get () {
+    return this.tsRequest
+  }
+ 
+  /**
+   * authStrategy method that set no auth request
+   * @param requestType
+   * @param {object | string} url
+   * @param {object} [auth]
+   * @param {object} [body]
+   * @param {string} [proxy]
+   * @param {string} tsQuery
+   * @return {object}
+   * */
+  async authStrategy (requestType, url, auth, body, proxy, tsQuery) {
+    switch (requestType) {
+      case 'basic':
+        return this._getTimestampRequestBasic(url, auth, tsQuery)
+      case 'oauth':
+        return await this._getTimestampRequestOauth(url, auth, body, proxy, tsQuery)
+      case 'noAuth':
+        return this._getTimestampRequestNoAuth(url)
+      default:
+        return this._getTimestampRequestNoAuth(url)
+    }
+  }
+ 
+  /**
+   * _getTimestampRequestBasic method that set basic auth request
+   * @param {object | string} url
+   * @param {object} [auth]
+   * @param {string} tsQuery
+   * @return {object}
+   * @Private
+   * */
+  _getTimestampRequestBasic (url, auth, tsQuery) {
+    this.setHeader({
+      ...this.tsRequest.headers,
+      Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`
+    })
+ 
+    this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily
+    this.setResolveWithFullResponse(true)
+    this.setBody(tsQuery)
+ 
+    return { requestUrl: url, tsRequest: this.get() }
+  }
+ 
+  /**
+   * _getTimestampRequestOauth method that set oauth request
+   * @param {object | string} url
+   * @param {object} [auth]
+   * @param {object} [body]
+   * @param {string} [proxy]
+   * @param {string} tsQuery
+   * @return {object}
+   * @Private
+   * */
+  async _getTimestampRequestOauth (url, auth, body, proxy, tsQuery) {
+    const oauthResult = await this._getOauth(url.getTokenUrl, auth, body, proxy)
+    if (!oauthResult?.access_token) {
+      return { requestUrl: null, tsRequest: null, error: null }
+    }
+ 
+    if (oauthResult?.error) {
+      return { requestUrl: null, tsRequest: null, error: oauthResult?.error }
+    }
+ 
+    const accessToken = oauthResult?.access_token
+ 
+    if (accessToken) {
+      this.setHeader({
+        ...this.tsRequest.headers,
+        Authorization: `Bearer ${accessToken}`
+      })
+ 
+      const {
+        tempPath,
+        cleanupCallback
+      } = await this.tempFileService.createTempFile(this.tmpOptions, Buffer.from(tsQuery))
+      this.cleanupTempFns.push(cleanupCallback)
+ 
+      const stats = fs.statSync(tempPath)
+      const fileSizeInBytes = stats.size
+      this.setBody(fs.createReadStream(tempPath))
+      this.setHeader({
+        ...this.tsRequest.headers,
+        'Content-length': fileSizeInBytes
+      })
+    }
+ 
+    return { requestUrl: url?.getTimestampUrl, tsRequest: this.get(), error: null }
+  }
+ 
+  /**
+   * _getTimestampRequestNoAuth method that set no auth request
+   * @param {string} url
+   * @return {object}
+   * @Private
+   * */
+  _getTimestampRequestNoAuth (url) {
+    return { requestUrl: url, tsRequest: this.get() }
+  }
+ 
+  /**
+   * _getOauth method that get oauth access_token
+   *
+   * @param {string} url
+   * @param {object} auth
+   * @param {object} body
+   * @param {string} [proxy]
+   * @return {Promise<object>}
+   * @Private
+   **/
+  async _getOauth (url, auth, body, proxy) {
+    const tsRequest = await this._getOauthRequestSettings(auth, body, proxy)
+    return await fetch(url, tsRequest).then((response) => {
+      return response.json()
+    }).catch((err) => {
+      return {
+        message: err.message,
+        trace: err
+      }
+    })
+  }
+ 
+  /**
+   * _getOauthRequestSettings method that set the request oath settings
+   *
+   * @param {object} auth
+   * @param {object} body
+   * @param {string} [proxy]
+   * @return {object}
+   * @Private
+   **/
+  async _getOauthRequestSettings (auth, body, proxy) {
+    const tsRequest = {
+      method: 'POST'
+    }
+ 
+    tsRequest.headers = {
+      'Content-Type': 'application/x-www-form-urlencoded',
+      Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`
+    }
+ 
+    tsRequest.body = new URLSearchParams(body)
+ 
+    if (proxy && proxy?.url) {
+      tsRequest.proxy = proxy.url
+    }
+ 
+    return tsRequest
+  }
+}
+ 
+module.exports = TimestampRequest
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampCheck.js.html b/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampCheck.js.html new file mode 100644 index 0000000..df7d300 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampCheck.js.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for timestamp_service/src/trustedTimestamp/TrustedTimestampCheck.js + + + + + + + + + +
+
+

All files / timestamp_service/src/trustedTimestamp TrustedTimestampCheck.js

+
+ +
+ 100% + Statements + 31/31 +
+ + +
+ 100% + Branches + 5/5 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 100% + Lines + 31/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +326x +6x +6x +6x +6x +6x +6x +6x +3x +3x +3x +6x +6x +6x +6x +6x +8x +8x +8x +6x +6x +6x +6x +6x +3x +3x +3x +3x +3x +6x +6x + 
const supportedDigestForamts = [
+  'sha', 'sha1', 'mdc2', 'ripemd160', 'sha224', 'sha256', 'sha384', 'sha512', 'md2', 'md4', 'md5', 'dss1'
+]
+ 
+/**
+ * @param format
+ * @return {boolean}
+ */
+function checkDigestFormat (format) {
+  return supportedDigestForamts.includes(format)
+}
+ 
+/**
+ * @param digest
+ * @return {boolean}
+ */
+function checkDigest (digest) {
+  return /^([0-9A-F])+$/i.test(digest)
+}
+ 
+/**
+ * @param {string} format
+ * @return {string}
+ */
+function normalizeDigestFormat (format) {
+  return format
+    .replace(/^-/, '') // -sha256
+    .replace(/-/g, '') // sha-256
+}
+ 
+module.exports = { checkDigestFormat, checkDigest, normalizeDigestFormat }
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampInfo.js.html b/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampInfo.js.html new file mode 100644 index 0000000..87e139e --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampInfo.js.html @@ -0,0 +1,544 @@ + + + + + + Code coverage report for timestamp_service/src/trustedTimestamp/TrustedTimestampInfo.js + + + + + + + + + +
+
+

All files / timestamp_service/src/trustedTimestamp TrustedTimestampInfo.js

+
+ +
+ 80.39% + Statements + 123/153 +
+ + +
+ 55% + Branches + 11/20 +
+ + +
+ 83.33% + Functions + 5/6 +
+ + +
+ 80.39% + Lines + 123/153 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +1546x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +  +4x +4x +  +4x +4x +4x +4x +4x +4x +4x +4x +4x +6x +6x +6x +6x +6x +4x +4x +6x +6x +6x +6x +6x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +16x +16x +  +  +16x +16x +4x +4x +4x +6x +6x +6x +6x +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +6x +6x + 
const parseRegex = require('../util/regexParser').parse
+/**
+ * @class TimestampInfo
+ * @property {Number} version
+ * @property {String} policyOID
+ * @property {String} hashAlgorithm
+ * @property {String} hash
+ * @property {String} serialNumber
+ * @property {String} timeStamp
+ * @property {Date} timeStampDate
+ * @property {Number} accuracy
+ * @property {Boolean} ordering
+ * @property {String} nonce
+ * @property {String} issuer
+ * @property {Object} tsa
+ * @property {String} tsa.C
+ * @property {String} tsa.L
+ * @property {String} tsa.O
+ * @property {String} tsa.OU
+ * @property {String} tsa.CN
+ * @property {String|null} [error]
+ * @property {CertInfo|null} [certInfo]
+ *
+ * Status info:
+ * Status: Granted.
+ * Status description: unspecified
+ * Failure info: unspecified
+ *
+ * TST info:
+ * Version: 1
+ * Policy OID: 1.3.6.1.4.1.21528.2.2.99
+ * Hash Algorithm: sha256
+ * Message data:
+ * 0000 - c5 3e 94 56 aa 61 ed 56-49 69 74 29 1e 01 d7 2a   .>.V.a.VIit)...*
+ * 0010 - 64 cc 24 84 d2 a2 31 4d-33 b6 ca c8 98 23 03 b9   d.$...1M3....#..
+ * Serial number: 0x0308441E
+ * Time stamp: Jan 30 13:45:20 2018 GMT
+ * Accuracy: 0x01 seconds, unspecified millis, unspecified micros
+ * Ordering: no
+ * Nonce: unspecified
+ * TSA: DirName:/C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=e-Szigno Test TSA2
+ * Extensions:
+ * */
+class TimestampInfo {
+  /**
+  * @constructor
+  * @param {string} timestampInfoType (normal, short)
+  * @param {string} tsText
+  * @param {string} error
+  */
+  constructor (timestampInfoType = 'normal', tsText, error = null) {
+    this.error = null
+    this.version = null
+    this.policyOID = null
+    this.hashAlgorithm = null
+    this.serialNumber = null
+    this.timeStamp = null
+    this.accuracy = null
+    this.ordering = null
+    this.nonce = null
+    this.tsa = null
+ 
+    if (error) {
+      this.error = error
+    } else {
+      if (timestampInfoType === 'short') {
+        this.parseOpensslOutputShort(tsText)
+      } else {
+        this.hash = null
+        this.timeStampDate = null
+        this.issuer = null
+        this.certInfo = null
+        this.parseOpensslOutput(tsText)
+      }
+    }
+  }
+ 
+  /**
+   * @param {CertInfo} certInfo
+   */
+  setCertInfo (certInfo) {
+    this.certInfo = certInfo
+  }
+ 
+  /**
+   * @param {string} tsText
+   */
+  parseOpensslOutput (tsText) {
+    this.version = parseRegex(tsText, /Version:\s*([^\n\r]+)/, 1, parseInt)
+    this.policyOID = parseRegex(tsText, /Policy OID:\s*([^\n\r]+)/, 1)
+    this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\s*([^\n\r]+)/, 1)
+    this.hash = tsText.match(/\d{4} - .*?\s{2}/g).map(line => {
+      return line.replace(/\d{4} - /g, '').replace(/[\s*-]/g, '')
+    }).join('')
+    this.serialNumber = parseRegex(tsText, /Serial number:\s*([^\n\r]+)/, 1)
+    this.timeStamp = parseRegex(tsText, /Time stamp:\s*([^\n\r]+)/, 1)
+    this.timeStampDate = new Date(this.timeStamp)
+    this.accuracy = parseRegex(tsText, /Accuracy:\s*(.+) seconds, (.+) millis, (.+) micros/, ['s', 'm', 'u'], ({ s, m, u }) => {
+      s = Number(s === 'unspecified' ? 0 : s)
+      m = Number(m === 'unspecified' ? 0 : m)
+      u = Number(u === 'unspecified' ? 0 : u)
+      return s * 1000 + m + u / 1000
+    })
+    this.ordering = parseRegex(tsText, /Ordering:\s*([^\n\r]+)/, 1, ordering => ordering !== 'no')
+    this.nonce = parseRegex(tsText, /Nonce:\s*([^\n\r]+)/, 1, nonce => nonce === 'unspecified' ? null : nonce)
+    this.issuer = parseRegex(tsText, /TSA:\s*DirName:\s*([^\n\r]+)/, 1)
+    this.tsa = parseRegex(tsText, /TSA:\s*DirName:\s*([^\n\r]+)/, 1, (result) => {
+      const m = result.match(/\/\w{1,2}=[^/]+/g) || []
+ 
+      return m.reduce((obj, part) => {
+        const [, label, value] = part.match(/\/(\w{1,2})=([^/]+)/) || []
+        if (!label || !value) {
+          return obj
+        }
+        obj[label] = value
+        return obj
+      }, { C: null, L: null, O: null, OU: null, CN: null })
+    })
+  }
+ 
+  /**
+   * @param {string} tsText
+   */
+  parseOpensslOutputShort (tsText) {
+    this.version = parseRegex(tsText, /Version:\s*([^\n\r]+)/, 1, parseInt)
+    this.policyOID = parseRegex(tsText, /Policy OID:\s*([^\n\r]+)/, 1)
+    this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\s*([^\n\r]+)/, 1)
+    this.serialNumber = parseRegex(tsText, /Serial number:\s*([^\n\r]+)/, 1)
+    this.timeStamp = parseRegex(tsText, /Time stamp:\s*([^\n\r]+)/, 1, dateString => new Date(dateString))
+    this.accuracy = parseRegex(tsText, /Accuracy:\s*(.+) seconds, (.+) millis, (.+) micros/, ['s', 'm', 'u'], ({ s, m, u }) => {
+      s = Number(s === 'unspecified' ? 0 : s)
+      m = Number(m === 'unspecified' ? 0 : m)
+      u = Number(u === 'unspecified' ? 0 : u)
+      return s * 1000 + m + u / 1000
+    })
+    this.ordering = parseRegex(tsText, /Ordering:\s*([^\n\r]+)/, 1, ordering => ordering !== 'no')
+    this.nonce = parseRegex(tsText, /Nonce:\s*([^\n\r]+)/, 1, nonce => nonce === 'unspecified' ? null : nonce)
+    this.tsa = parseRegex(tsText, /TSA:\s*([^\n\r]+)/, 1, (v) => {
+      const m = v.match(/\/\w{1,2}=[^/]+/g) || []
+
+      return m.reduce((obj, part) => {
+        const [, label, value] = part.match(/\/(\w{1,2})=([^/]+)/) || []
+        if (!label || !value) {
+          return obj
+        }
+        obj[label] = value
+        return obj
+      }, { C: null, L: null, O: null, OU: null, CN: null })
+    })
+  }
+}
+ 
+module.exports = TimestampInfo
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampRequest.js.html b/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampRequest.js.html new file mode 100644 index 0000000..499e0e1 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampRequest.js.html @@ -0,0 +1,673 @@ + + + + + + Code coverage report for timestamp_service/src/trustedTimestamp/TrustedTimestampRequest.js + + + + + + + + + +
+
+

All files / timestamp_service/src/trustedTimestamp TrustedTimestampRequest.js

+
+ +
+ 93.87% + Statements + 184/196 +
+ + +
+ 75.86% + Branches + 22/29 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 93.87% + Lines + 184/196 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +1976x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +9x +9x +9x +9x +9x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +3x +3x +3x +3x +3x +4x +4x +4x +4x +  +  +4x +  +  +4x +4x +4x +4x +4x +4x +4x +3x +3x +3x +6x +6x +6x +6x +6x +6x +6x +6x +9x +9x +9x +9x +16x +5x +16x +11x +11x +9x +9x +9x +9x +9x +9x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +4x +4x +  +  +4x +3x +  +  +3x +3x +4x +1x +4x +4x +2x +2x +2x +2x +4x +4x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +4x +4x +4x +4x +  +  +4x +4x +4x +2x +2x +4x +2x +2x +4x +  +  +4x +4x +4x +6x +6x +6x + 
const fetch = require('node-fetch')
+const TimestampRequest = require('./TimestampRequest')
+ 
+/**
+* TrustedTimestampRequest service implements timestamp request and sorted providers
+*
+* @class TrustedTimestampRequest
+* */
+class TrustedTimestampRequest {
+  /**
+   * @typedef {object}  provider
+   * @property {string} name provider name
+   * @property {string | urlObject} url provider url
+   * @property {object} [auth] optional auth setting
+   * @property {number} [priority] optional provider priority
+   *
+   * @typedef {object}  urlObject
+   * @property {string} getTokenUrl
+   * @property {string} getTimestampUrl
+   *
+   * @typedef {object}  auth
+   * @property {string} user username
+   * @property {string} pass password
+   *
+   * @constructor
+   * @param {provider[]} providers
+   * @param tempFileService
+   * @param {object} tmpOptions
+   */
+  constructor (providers, tempFileService, tmpOptions) {
+    this.tempFileService = tempFileService
+    this.tmpOptions = tmpOptions
+    this.cleanupTempFns = []
+    this.providers = this._sortedProviders(providers)
+  }
+ 
+  /**
+   * getTimestamp method that calls the service providers in sequence, requesting a timestamp
+   *
+   * @typedef {returnObject}  result
+   * @property {Buffer} tsr
+   * @property {string} providerName
+   * @property {array} logHistory
+   *
+   * @param {string} tsQuery
+   * @return {returnObject}
+   **/
+  async getTimestamp (tsQuery) {
+    let tsr = null
+    let providerName = ''
+    const logHistory = []
+ 
+    for (const provider of this.providers) {
+      if (!tsr) {
+        const { name, url, auth, body, proxy } = provider
+ 
+        if (!name) {
+          throw new Error('Provider name is missing')
+        }
+        if (!url) {
+          throw new Error('Provider url is missing')
+        }
+ 
+        const { timestampToken, log } = await this._getTimeStampToken(name, url, auth, body, proxy, tsQuery)
+        logHistory.push(log)
+        tsr = timestampToken
+        providerName = name
+      }
+    }
+ 
+    return { tsr, providerName, logHistory }
+  }
+ 
+  /**
+   * sortedProviders method that sorting the providers according to priority
+   *
+   * @return array
+   * @Private
+   **/
+  _sortedProviders (providers) {
+    const priorityProviders = []
+    const nonPriorityProviders = []
+ 
+    providers.forEach((provider) => {
+      if (provider?.priority) {
+        priorityProviders.push(provider)
+      } else {
+        nonPriorityProviders.push(provider)
+      }
+    })
+ 
+    const sortedProviders = priorityProviders.sort((a, b) => a.priority - b.priority)
+ 
+    return sortedProviders.concat(nonPriorityProviders)
+  }
+ 
+  /**
+   * @typedef {object}  urlObject
+   * @property {string} getTokenUrl
+   * @property {string} getTimestampUrl
+   *
+   * @typedef {object}  returnObject
+   * @property {Promise<Buffer>} timestampToken
+   * @property {logObject} log
+   *
+   * @typedef {object}  logObject
+   * @property {infoObject} info
+   * @property {object} errorTrace
+   *
+   * @typedef {object}  infoObject
+   * @property {string} name
+   * @property {string} info
+   * @property {string} date
+   * @property {urlObject} url
+   * @property {string} response
+   * @property {string} error
+   **/
+ 
+  /**
+   * sendTimestampRequest method that calls the provider
+   *
+   * @param {string} name - provider name
+   * @param {string| urlObject} url
+   * @param {string} [auth]
+   * @param {string} [proxy]
+   * @param {string} [body]
+   * @param {string} tsQuery
+   * @return {returnObject}
+   * @Private
+   **/
+  async _getTimeStampToken (name, url, auth, body, proxy, tsQuery) {
+    const { requestUrl, tsRequest, error } = await this._getTimestampRequest(url, body, auth, proxy, tsQuery)
+    if (error) {
+      return { timestampToken: null, log: { info: { name, info: null, date: new Date(), url, response: null, error: error?.message }, errorTrace: error?.trace } }
+    }
+    return await fetch(requestUrl, tsRequest).then(async (response) => {
+      if (response.status !== 200) {
+        throw new Error(`TSA response unsatisfactory: ${response.status} ${response.statusText}`)
+      }
+ 
+      return { timestampToken: Buffer.from(await response.arrayBuffer(), 'utf8'), log: { info: { name, date: new Date(), url, response: `${response.status}, ${response.statusText}`, error: null }, errorTrace: null } }
+    }).catch((err) => {
+      return { timestampToken: null, log: { info: { name, date: new Date(), url, reponse: null, error: err.message }, errorTrace: err } }
+    }).finally(() => {
+      for (const cleanUpFn of this.cleanupTempFns) {
+        if (typeof cleanUpFn === 'function') {
+          cleanUpFn()
+        }
+      }
+    })
+  }
+ 
+  /**
+   * @typedef {object}  resultObject
+   * @property {string} requestUrl
+   * @property {string} tsRequest
+   * @property {string} error
+   *
+   **/
+ 
+  /**
+   * getTimestampRequestSettings method that set the request settings
+   *
+   * @param {object | string} url
+   * @param {string} [body]
+   * @param {string} [auth]
+   * @param {string} [proxy]
+   * @param {string} [body]
+   * @param {string} tsQuery
+   * @return {resultObject}
+   * @Private
+   **/
+  async _getTimestampRequest (url, body, auth, proxy, tsQuery) {
+    // send the request to the TSA
+    const tsRequest = new TimestampRequest(this.tempFileService, this.tmpOptions, this.cleanupTempFns)
+ 
+    if (proxy && proxy?.url) {
+      tsRequest.setProxy(proxy.url)
+    }
+ 
+    let requestType
+    if (url?.getTokenUrl && tsQuery) {
+      requestType = 'oauth'
+    }
+    if (!url?.getTokenUrl && auth?.user && auth?.pass && tsQuery) {
+      requestType = 'basic'
+    }
+    if (!url?.getTokenUrl && !auth?.user) {
+      requestType = 'noAuth'
+    }
+ 
+    return await tsRequest.authStrategy(requestType, url, auth, body, proxy, tsQuery)
+  }
+}
+ 
+module.exports = TrustedTimestampRequest
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampService.js.html b/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampService.js.html new file mode 100644 index 0000000..8fa6079 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/TrustedTimestampService.js.html @@ -0,0 +1,880 @@ + + + + + + Code coverage report for timestamp_service/src/trustedTimestamp/TrustedTimestampService.js + + + + + + + + + +
+
+

All files / timestamp_service/src/trustedTimestamp TrustedTimestampService.js

+
+ +
+ 90.94% + Statements + 241/265 +
+ + +
+ 55.55% + Branches + 15/27 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 90.94% + Lines + 241/265 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +2666x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +11x +11x +11x +11x +11x +6x +6x +6x +6x +6x +6x +6x +6x +11x +11x +11x +11x +1x +1x +10x +11x +1x +1x +9x +9x +9x +9x +9x +9x +9x +11x +6x +6x +6x +6x +6x +6x +6x +6x +6x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +  +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +4x +  +  +4x +4x +4x +  +4x +4x +8x +8x +8x +8x +4x +4x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +3x +3x +3x +3x +  +  +3x +  +  +3x +3x +3x +3x +  +  +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +3x +  +  +3x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +4x +  +  +4x +4x +  +  +4x +4x +4x +4x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +5x +5x +5x +5x +  +  +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +5x +  +  +  +  +  +  +5x +6x +6x +6x +6x +6x +6x +6x +1x +1x +6x +6x +6x + 
const TimestampInfo = require('./TrustedTimestampInfo')
+const TrustedTimestampRequest = require('./TrustedTimestampRequest')
+const { getTsQuery, getTsVerify, getTsReply, generateTsReply, extractCertFromToken, checkSslPath } = require('./TrustedTimestampCommand')
+const { normalizeDigestFormat, checkDigestFormat, checkDigest } = require('./TrustedTimestampCheck')
+const TempFileService = require('../util/TempFileService')
+const { CertService } = require('@techteamer/cert-utils')
+ 
+/**
+ * OpenSSL docs: https://www.openssl.org/docs/manmaster/man1/ts.html
+ *
+ * Certificate Installation with OpenSSL: http://gagravarr.org/writing/openssl-certs/others.shtml
+ *
+ * Trustedtimestamp service implements the generate, import and verification of timestamps
+ *
+ * @class TrustedTimestampService
+ * */
+class TrustedTimestampService {
+  /**
+   * @typedef {object}  provider
+   * @property {string} name provider name
+   * @property {string | urlObject} url provider url
+   * @property {object} [auth] optional auth setting
+   * @property {number} [priority] optional provider priority
+   *
+   * @typedef {object}  urlObject
+   * @property {string} getTokenUrl
+   * @property {string} getTimestampUrl
+   *
+   * @typedef {object}  auth
+   * @property {string} user username
+   * @property {string} pass password
+   *
+   * @typedef {object}       config
+   * @property {string}      [certsLocation="/etc/ssl/certs/"]
+   * @property {provider[]}  [providers=[{provider}, {provider}, ...]]
+   * @constructor
+   * @param {string} timestampInfoType (normal, short)
+   * @param {config} config
+   * @param {string} encoding
+   */
+  constructor (timestampInfoType = 'normal', config, encoding = 'latin1') {
+    this.timestampInfoType = timestampInfoType
+    this.config = config
+    this.encoding = encoding
+    this._init()
+  }
+ 
+  /**
+   * init method that sets the config and instantiates the required services
+   *
+   * @return void
+   * @private
+   * */
+  _init () {
+    this.tmpOptions = { prefix: 'request-', postfix: '.tsr' }
+ 
+    if (this.config) {
+      if (!this.config?.certsLocation) {
+        throw new Error('trustedTimestamp config "certsLocation" missing!')
+      }
+ 
+      if (!this.config?.providers?.length) {
+        throw new Error('trustedTimestamp config "providers" missing or empty!')
+      }
+ 
+      this.tempFileService = new TempFileService()
+      this.certService = new CertService(this.encoding)
+      this.providers = this.config.providers
+      this.certsLocation = this.config.certsLocation
+      this.timestampRequest = new TrustedTimestampRequest(this.providers, this.tempFileService, this.tmpOptions)
+    }
+  }
+ 
+  /**
+   * Utility method that resolves to a TimestampInfo object containing parsed info from the tsr
+   *
+   * @param tsr timestamp response
+   * @param [isToken=false] true if the input is a timestamp token (not a whole timestamp response)
+   * @return {Promise<TimestampInfo>}
+   * */
+  async getTimestampInfo (tsr, isToken = false) {
+    const cleanupTempFns = []
+    let inputTempPath = ''
+ 
+    try {
+      const tsrtmp = await this.tempFileService.createTempFile(this.tmpOptions, tsr)
+      inputTempPath = tsrtmp.tempPath
+      cleanupTempFns.push(tsrtmp.cleanupCallback)
+ 
+      const responseText = await getTsReply(inputTempPath, isToken)
+      const timestampInfo = new TimestampInfo(this.timestampInfoType, responseText)
+ 
+      // get cert info
+ 
+      try {
+        // get raw token if the input was a whole response (TimestampResponse->TimestampToken)
+        let tstPath
+        if (isToken) {
+          tstPath = inputTempPath
+        } else {
+          const tmp = await this.tempFileService.createTempFile(this.tmpOptions)
+          await generateTsReply(inputTempPath, tmp)
+          tstPath = tmp.tempPath
+          cleanupTempFns.push(tmp.cleanupCallback)
+        }
+ 
+        // extract cert from token
+        const x509Cert = await extractCertFromToken(tstPath)
+        // parse cert
+        const certInfo = await this.certService.parseCert(Buffer.from(x509Cert), '', this.certService.CertType.PEM)
+ 
+        if (this.timestampInfoType === 'normal') {
+          timestampInfo.setCertInfo(certInfo)
+        }
+      } catch (err) {
+        throw new Error('Unable to get cert info from timestamp token', err)
+      }
+ 
+      return timestampInfo
+    } catch (err) {
+      return new TimestampInfo(this.timestampInfoType, null, err.message)
+    } finally {
+      for (const cleanUpFn of cleanupTempFns) {
+        if (typeof cleanUpFn === 'function') {
+          cleanUpFn()
+        }
+      }
+    }
+  }
+ 
+  /**
+   * Returns a TimestampToken instance for a hash digest and a hash algorithm.
+   * It requests a token from the TSA and verifies the received response.
+   * The returned timestamp token represents the token
+   * and contains the tsr with the verification result.
+   *
+   * @typedef {object}  result
+   * @property {object} timestamp
+   * @property {string} providerName
+   *
+   * @typedef {object}  timestamp
+   * @property {string} digest
+   * @property {string} hashAlgorithm
+   * @property {number} dataSize
+   * @property {object} tsr
+   * @property {boolean} isToken
+   * @property {string} certExpiry
+   * @property {boolean | null} verified
+   *
+   * @typedef {returnObject}  result
+   * @property {Promise<result>} timestamp
+   * @property {string} providerName
+   * @property {array} logHistory
+   *
+   * @param {String} digest
+   * @param {String} hashAlgorithm a valid option that openssl accepts (e.g: 'sha256', 'sha512')
+   * @param {Number} dataSize the size of the data the digest is generated from
+   * @return {returnObject}
+   * */
+  async createTimestampToken (digest, hashAlgorithm, dataSize) {
+    const digestFormat = normalizeDigestFormat(hashAlgorithm)
+ 
+    try {
+      if (!checkDigestFormat(digestFormat)) {
+        throw new Error(`Unknown digest format: ${hashAlgorithm}`)
+      }
+      if (!checkDigest(digest)) {
+        throw new Error(`Invalid digest: ${digest}`)
+      }
+ 
+      const tsQuery = await getTsQuery(digest, digestFormat)
+      const { tsr, providerName, logHistory } = await this.timestampRequest.getTimestamp(tsQuery)
+      if (!tsr) {
+        throw new Error('Failed to create trusted timestamp, no provider was available')
+      }
+      const timestampInfo = await this.getTimestampInfo(tsr, false)
+      const certExpiry = timestampInfo.certInfo?.notAfter || null
+      const tt = {
+        digest,
+        hashAlgorithm,
+        dataSize,
+        tsr,
+        isToken: false,
+        certExpiry,
+        verified: null // not yet
+      }
+ 
+      tt.verified = await this.verifyToken(tt, digest, dataSize)
+ 
+      return { timestamp: tt, providerName, logHistory }
+    } catch (err) {
+      throw new Error(`Failed to create trusted timestamp ${err.message}`)
+    }
+  }
+ 
+  /**
+   * Verify if a timestamp token corresponds to a particular hash of data
+   *
+   * @param timestampToken
+   * @param {String} digest
+   * @param {Number} dataSize
+   * @return {Promise<boolean>}
+   * */
+  async verifyToken (timestampToken, digest, dataSize) {
+    if (timestampToken.dataSize !== dataSize) {
+      throw new Error(`Timestamp token verification failed: The provided data size (${dataSize}) does not match the time stamped size (${timestampToken.dataSize}).`)
+    }
+ 
+    if (timestampToken.digest !== digest) {
+      throw new Error(`Timestamp token verification failed: The provided digest (${digest}) does not match the time stamped digest (${timestampToken.digest}).`)
+    }
+ 
+    // verify token
+    return await this.verifyTsr(digest, timestampToken.tsr, timestampToken.isToken)
+  }
+ 
+  /**
+   * Verify a hash digest against a timestamp response file
+   *
+   * @param {String} digest the hash of some data to verify against the response
+   * @param {Buffer} tsr a timestamp response
+   * @param {Boolean} [isToken=false] indicates that whether the input is a timestamp token or response
+   * @return {Promise<boolean>}
+   * */
+  async verifyTsr (digest, tsr, isToken = false) {
+    let cleanupTempFile = null
+ 
+    try {
+      if (!checkDigest(digest)) {
+        throw new Error(`Invalid digest: ${digest}`)
+      }
+ 
+      // save the tsr on disk because openssl can only read it from file
+      const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(this.tmpOptions, tsr)
+      cleanupTempFile = cleanupCallback
+ 
+      const stdout = await getTsVerify(digest, tempPath, isToken, this.certsLocation)
+ 
+      const verificationResult = /Verification: OK/i.test(stdout)
+ 
+      if (cleanupTempFile) {
+        cleanupTempFile()
+      }
+ 
+      return verificationResult
+    } catch (err) {
+      if (typeof cleanupTempFile === 'function') {
+        cleanupTempFile()
+      }
+
+      throw new Error(`Failed to verify tsr ${err.message}`)
+    }
+  }
+ 
+  /**
+   * testService method that check the ssl installation
+   *
+   * @return {Promise<string>}
+   * */
+  async testService () {
+    return await checkSslPath()
+  }
+}
+ 
+module.exports = TrustedTimestampService
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/index.html b/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/index.html new file mode 100644 index 0000000..3dbfe19 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/timestamp_service/src/trustedTimestamp/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for timestamp_service/src/trustedTimestamp + + + + + + + + + +
+
+

All files timestamp_service/src/trustedTimestamp

+
+ +
+ 90.62% + Statements + 793/875 +
+ + +
+ 66.99% + Branches + 69/103 +
+ + +
+ 92.1% + Functions + 35/38 +
+ + +
+ 90.62% + Lines + 793/875 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
TimestampRequest.js +
+
93.04%214/23072.72%16/2285.71%12/1493.04%214/230
TrustedTimestampCheck.js +
+
100%31/31100%5/5100%4/4100%31/31
TrustedTimestampInfo.js +
+
80.39%123/15355%11/2083.33%5/680.39%123/153
TrustedTimestampRequest.js +
+
93.87%184/19675.86%22/29100%6/693.87%184/196
TrustedTimestampService.js +
+
90.94%241/26555.55%15/27100%8/890.94%241/265
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/package/timestamp_service/test/coverage/jest/timestamp_service/src/util/TempFileService.js.html b/package/timestamp_service/test/coverage/jest/timestamp_service/src/util/TempFileService.js.html new file mode 100644 index 0000000..69c21b0 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/timestamp_service/src/util/TempFileService.js.html @@ -0,0 +1,181 @@ + + + + + + Code coverage report for timestamp_service/src/util/TempFileService.js + + + + + + + + + +
+
+

All files / timestamp_service/src/util TempFileService.js

+
+ +
+ 93.75% + Statements + 30/32 +
+ + +
+ 85.71% + Branches + 6/7 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 93.75% + Lines + 30/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +336x +6x +6x +6x +6x +6x +6x +15x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +6x +15x +15x +15x +10x +10x +15x +15x +  +  +15x +6x +6x +6x + 
const fs = require('fs-extra')
+const util = require('util')
+ 
+const tmp = require('tmp')
+tmp.setGracefulCleanup()
+ 
+const tmpFile = util.promisify((options, cb) => {
+  tmp.file(options, (err, ...results) => cb(err, results))
+})
+ 
+class TempFileService {
+  /**
+   * Utility to create a temp file with content
+   *
+   * @param {Object} options
+   * @param {Buffer} content
+   * @return {Promise<{tempPath, fd, cleanupCallback}>}
+   * */
+  async createTempFile (options = {}, content) {
+    try {
+      const [tempPath, fd, cleanupCallback] = await tmpFile(options)
+      if (content) {
+        await fs.writeFile(tempPath, content)
+      }
+      return { tempPath, fd, cleanupCallback }
+    } catch (err) {
+      throw new Error(`Failed to create temp file ${err}`)
+    }
+  }
+}
+ 
+module.exports = TempFileService
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/package/timestamp_service/test/coverage/jest/timestamp_service/src/util/index.html b/package/timestamp_service/test/coverage/jest/timestamp_service/src/util/index.html new file mode 100644 index 0000000..5cf1f78 --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/timestamp_service/src/util/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for timestamp_service/src/util + + + + + + + + + +
+
+

All files timestamp_service/src/util

+
+ +
+ 83.07% + Statements + 54/65 +
+ + +
+ 82.35% + Branches + 14/17 +
+ + +
+ 83.33% + Functions + 5/6 +
+ + +
+ 83.07% + Lines + 54/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
TempFileService.js +
+
93.75%30/3285.71%6/7100%2/293.75%30/32
regexParser.js +
+
72.72%24/3380%8/1075%3/472.72%24/33
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/package/timestamp_service/test/coverage/jest/timestamp_service/src/util/regexParser.js.html b/package/timestamp_service/test/coverage/jest/timestamp_service/src/util/regexParser.js.html new file mode 100644 index 0000000..79453ed --- /dev/null +++ b/package/timestamp_service/test/coverage/jest/timestamp_service/src/util/regexParser.js.html @@ -0,0 +1,184 @@ + + + + + + Code coverage report for timestamp_service/src/util/regexParser.js + + + + + + + + + +
+
+

All files / timestamp_service/src/util regexParser.js

+
+ +
+ 72.72% + Statements + 24/33 +
+ + +
+ 80% + Branches + 8/10 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 72.72% + Lines + 24/33 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +3440x +40x +40x +  +  +40x +40x +40x +40x +  +  +40x +40x +36x +36x +4x +4x +4x +4x +12x +4x +4x +4x +40x +6x +  +  +  +  +  +6x +6x +6x + 
function parseRegex (text, regex, groups, revive) {
+  const result = text.match(regex)
+  if (!result) {
+    return null
+  }
+ 
+  revive = revive || (value => value)
+ 
+  if (!groups) {
+    return revive(result)
+  }
+ 
+  if (typeof groups === 'number') {
+    return revive(result[groups])
+  }
+ 
+  if (Array.isArray(groups)) {
+    const ret = {}
+    groups.forEach((name, i) => {
+      ret[name] = result[i + 1]
+    })
+    return revive(ret)
+  }
+}
+ 
+function createParser (regex, groups, revive) {
+  return (text) => {
+    return parseRegex(text, regex, groups, revive)
+  }
+}
+ 
+module.exports.create = createParser
+module.exports.parse = parseRegex
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/package/timestamp_service/test/coverage/vitest/lcov.info b/package/timestamp_service/test/coverage/vitest/lcov.info new file mode 100644 index 0000000..68564dd --- /dev/null +++ b/package/timestamp_service/test/coverage/vitest/lcov.info @@ -0,0 +1,1151 @@ +TN: +SF:rollup.config.js +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:2,0 +DA:3,0 +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +LF:28 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/index.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:3,0 +LF:2 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/patch/node-fetch.ts +FN:3,fetch +FNF:1 +FNH:1 +FNDA:7,fetch +DA:3,1 +DA:4,7 +DA:5,7 +DA:6,7 +LF:4 +LH:4 +BRDA:3,0,0,7 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/trustedTimestamp/TimestampRequest.ts +FN:25, +FN:33,TimestampRequest +FN:42,setHeader +FN:52,setBody +FN:59,setProxy +FN:69,setEncoding +FN:76,setResolveWithFullResponse +FN:83,get +FN:90,authStrategy +FN:113,_getTimestampRequestBasic +FN:133,_getTimestampRequestOauth +FN:181,_getTimestampRequestNoAuth +FN:192,_getOauth +FN:215,_getOauthRequestSettings +FN:231,getProxyForUrl +FNF:15 +FNH:12 +FNDA:5, +FNDA:5,TimestampRequest +FNDA:7,setHeader +FNDA:5,setBody +FNDA:0,setProxy +FNDA:3,setEncoding +FNDA:3,setResolveWithFullResponse +FNDA:5,get +FNDA:5,authStrategy +FNDA:3,_getTimestampRequestBasic +FNDA:2,_getTimestampRequestOauth +FNDA:0,_getTimestampRequestNoAuth +FNDA:2,_getOauth +FNDA:2,_getOauthRequestSettings +FNDA:0,getProxyForUrl +DA:1,1 +DA:25,1 +DA:26,5 +DA:27,5 +DA:28,5 +DA:29,5 +DA:30,5 +DA:31,5 +DA:33,5 +DA:34,5 +DA:35,5 +DA:36,5 +DA:37,5 +DA:42,5 +DA:43,7 +DA:44,7 +DA:45,7 +DA:46,7 +DA:47,7 +DA:52,5 +DA:53,5 +DA:54,5 +DA:59,5 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:69,5 +DA:70,3 +DA:71,3 +DA:76,5 +DA:77,3 +DA:78,3 +DA:83,5 +DA:84,5 +DA:85,5 +DA:90,5 +DA:91,5 +DA:92,5 +DA:93,5 +DA:94,5 +DA:95,5 +DA:96,5 +DA:97,5 +DA:98,5 +DA:99,5 +DA:100,3 +DA:101,5 +DA:102,2 +DA:103,5 +DA:104,0 +DA:105,5 +DA:106,0 +DA:107,5 +DA:108,5 +DA:113,5 +DA:114,3 +DA:115,3 +DA:116,3 +DA:117,3 +DA:118,3 +DA:119,3 +DA:120,3 +DA:121,3 +DA:123,3 +DA:124,3 +DA:125,3 +DA:127,3 +DA:128,3 +DA:133,5 +DA:134,2 +DA:135,2 +DA:136,2 +DA:137,2 +DA:138,2 +DA:139,2 +DA:140,2 +DA:143,2 +DA:144,2 +DA:145,0 +DA:146,0 +DA:148,2 +DA:149,0 +DA:150,0 +DA:152,2 +DA:154,2 +DA:155,2 +DA:156,2 +DA:157,2 +DA:158,2 +DA:160,2 +DA:161,2 +DA:162,2 +DA:163,2 +DA:164,2 +DA:166,2 +DA:167,2 +DA:168,2 +DA:169,2 +DA:170,2 +DA:171,2 +DA:172,2 +DA:173,2 +DA:175,2 +DA:176,2 +DA:181,5 +DA:182,0 +DA:183,0 +DA:184,0 +DA:186,0 +DA:187,0 +DA:192,5 +DA:193,2 +DA:194,2 +DA:195,2 +DA:196,2 +DA:197,2 +DA:198,2 +DA:199,2 +DA:200,2 +DA:201,2 +DA:202,2 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,2 +DA:215,5 +DA:216,2 +DA:217,2 +DA:218,2 +DA:219,2 +DA:220,2 +DA:221,2 +DA:222,2 +DA:223,2 +DA:224,2 +DA:225,2 +DA:226,2 +DA:227,2 +DA:229,2 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:236,2 +DA:237,2 +DA:238,5 +LF:153 +LH:125 +BRDA:25,0,0,5 +BRDA:33,1,0,5 +BRDA:42,2,0,7 +BRDA:52,3,0,5 +BRDA:69,4,0,3 +BRDA:76,5,0,3 +BRDA:83,6,0,5 +BRDA:90,7,0,5 +BRDA:99,8,0,3 +BRDA:101,9,0,2 +BRDA:103,10,0,0 +BRDA:105,11,0,0 +BRDA:113,12,0,3 +BRDA:133,13,0,2 +BRDA:144,14,0,0 +BRDA:148,15,0,0 +BRDA:192,16,0,2 +BRDA:202,17,0,0 +BRDA:215,18,0,2 +BRDA:229,19,0,0 +BRDA:229,20,0,0 +BRF:21 +BRH:14 +end_of_record +TN: +SF:src/trustedTimestamp/TrustedTimestampCheck.ts +FN:16,checkDigestFormat +FN:20,checkDigest +FN:24,normalizeDigestFormat +FNF:3 +FNH:3 +FNDA:4,checkDigestFormat +FNDA:9,checkDigest +FNDA:4,normalizeDigestFormat +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:16,1 +DA:17,4 +DA:18,4 +DA:20,1 +DA:21,9 +DA:22,9 +DA:24,1 +DA:25,4 +DA:26,4 +DA:27,4 +DA:28,4 +LF:25 +LH:25 +BRDA:16,0,0,4 +BRDA:20,1,0,9 +BRDA:24,2,0,4 +BRF:3 +BRH:3 +end_of_record +TN: +SF:src/trustedTimestamp/TrustedTimestampCommand.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:3,0 +DA:5,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:10,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:28,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +LF:49 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/trustedTimestamp/TrustedTimestampInfo.ts +FN:34, +FN:50,TimestampInfo +FN:77,setCertInfo +FN:81,parseOpensslOutput +FN:112,m.reduce.C +FN:125,parseOpensslOutputShort +FNF:6 +FNH:5 +FNDA:4, +FNDA:4,TimestampInfo +FNDA:4,setCertInfo +FNDA:4,parseOpensslOutput +FNDA:16,m.reduce.C +FNDA:0,parseOpensslOutputShort +DA:1,1 +DA:34,1 +DA:35,4 +DA:36,4 +DA:37,4 +DA:38,4 +DA:39,4 +DA:40,4 +DA:41,4 +DA:42,4 +DA:43,4 +DA:44,4 +DA:45,4 +DA:46,4 +DA:47,4 +DA:48,4 +DA:50,4 +DA:51,4 +DA:52,4 +DA:53,4 +DA:54,4 +DA:55,4 +DA:56,4 +DA:57,4 +DA:58,4 +DA:59,4 +DA:60,4 +DA:62,4 +DA:63,0 +DA:64,4 +DA:65,4 +DA:66,0 +DA:67,4 +DA:68,4 +DA:69,4 +DA:70,4 +DA:71,4 +DA:72,4 +DA:73,4 +DA:74,4 +DA:75,4 +DA:77,4 +DA:78,4 +DA:79,4 +DA:81,4 +DA:82,4 +DA:83,4 +DA:84,4 +DA:85,4 +DA:86,4 +DA:87,4 +DA:88,4 +DA:89,4 +DA:90,4 +DA:91,4 +DA:92,4 +DA:93,4 +DA:94,4 +DA:95,4 +DA:96,4 +DA:97,4 +DA:98,4 +DA:99,4 +DA:100,4 +DA:101,4 +DA:102,4 +DA:103,4 +DA:104,4 +DA:105,4 +DA:106,4 +DA:107,4 +DA:108,4 +DA:109,4 +DA:111,4 +DA:112,4 +DA:113,16 +DA:114,16 +DA:115,0 +DA:116,0 +DA:117,16 +DA:118,16 +DA:119,16 +DA:120,4 +DA:121,4 +DA:122,4 +DA:123,4 +DA:125,4 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,4 +LF:121 +LH:84 +BRDA:34,0,0,4 +BRDA:50,1,0,4 +BRDA:62,2,0,0 +BRDA:65,3,0,0 +BRDA:77,4,0,4 +BRDA:81,5,0,4 +BRDA:87,6,0,4 +BRDA:98,7,0,4 +BRDA:99,8,0,0 +BRDA:100,9,0,0 +BRDA:101,10,0,0 +BRDA:105,11,0,4 +BRDA:106,12,0,4 +BRDA:106,13,0,0 +BRDA:108,14,0,4 +BRDA:109,15,0,0 +BRDA:112,16,0,16 +BRDA:113,17,0,0 +BRDA:114,18,0,0 +BRF:19 +BRH:10 +end_of_record +TN: +SF:src/trustedTimestamp/TrustedTimestampRequest.ts +FN:20, +FN:24,TrustedTimestampRequest +FN:35,getTimestamp +FN:66,_sortedProviders +FN:86,_getTimeStampToken +FN:140,_getTimestampRequest +FNF:6 +FNH:6 +FNDA:10, +FNDA:10,TrustedTimestampRequest +FNDA:4,getTimestamp +FNDA:10,_sortedProviders +FNDA:5,_getTimeStampToken +FNDA:5,_getTimestampRequest +DA:1,1 +DA:20,1 +DA:21,10 +DA:22,10 +DA:24,10 +DA:25,10 +DA:26,10 +DA:27,10 +DA:28,10 +DA:29,10 +DA:30,10 +DA:35,10 +DA:36,4 +DA:37,4 +DA:38,4 +DA:39,4 +DA:40,4 +DA:42,4 +DA:43,5 +DA:44,5 +DA:46,5 +DA:47,0 +DA:48,0 +DA:49,5 +DA:50,0 +DA:51,0 +DA:53,5 +DA:54,5 +DA:55,5 +DA:56,5 +DA:57,5 +DA:58,5 +DA:60,4 +DA:61,4 +DA:66,10 +DA:67,10 +DA:68,10 +DA:70,10 +DA:71,17 +DA:72,5 +DA:73,17 +DA:74,12 +DA:75,12 +DA:76,10 +DA:78,10 +DA:80,10 +DA:81,10 +DA:86,10 +DA:87,5 +DA:88,5 +DA:89,5 +DA:90,5 +DA:91,5 +DA:92,5 +DA:96,5 +DA:97,5 +DA:98,5 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,5 +DA:108,5 +DA:109,5 +DA:110,0 +DA:111,0 +DA:113,3 +DA:114,3 +DA:115,3 +DA:116,3 +DA:117,3 +DA:118,3 +DA:119,3 +DA:120,5 +DA:121,2 +DA:122,2 +DA:123,2 +DA:124,2 +DA:125,2 +DA:126,2 +DA:127,2 +DA:128,5 +DA:129,5 +DA:130,2 +DA:131,2 +DA:132,2 +DA:133,2 +DA:134,5 +DA:135,5 +DA:140,10 +DA:141,5 +DA:142,5 +DA:143,5 +DA:144,5 +DA:145,5 +DA:146,5 +DA:148,5 +DA:150,5 +DA:151,0 +DA:152,0 +DA:154,5 +DA:155,5 +DA:156,2 +DA:157,2 +DA:158,5 +DA:159,3 +DA:160,3 +DA:161,5 +DA:162,0 +DA:163,0 +DA:165,5 +DA:166,5 +DA:167,10 +LF:117 +LH:99 +BRDA:20,0,0,10 +BRDA:24,1,0,10 +BRDA:35,2,0,4 +BRDA:42,3,0,5 +BRDA:46,4,0,0 +BRDA:49,5,0,0 +BRDA:66,6,0,10 +BRDA:70,7,0,17 +BRDA:71,8,0,5 +BRDA:73,9,0,12 +BRDA:86,10,0,5 +BRDA:98,11,0,0 +BRDA:108,12,0,3 +BRDA:109,13,0,0 +BRDA:111,14,0,3 +BRDA:120,15,0,2 +BRDA:128,16,0,0 +BRDA:129,17,0,2 +BRDA:140,18,0,5 +BRDA:150,19,0,0 +BRDA:150,20,0,0 +BRDA:155,21,0,2 +BRDA:155,22,0,2 +BRDA:158,23,0,3 +BRDA:158,24,0,3 +BRDA:158,25,0,3 +BRDA:158,26,0,3 +BRDA:161,27,0,3 +BRDA:161,28,0,0 +BRF:29 +BRH:21 +end_of_record +TN: +SF:src/trustedTimestamp/TrustedTimestampService.ts +FN:29, +FN:37,TrustedTimestampService +FN:48,_init +FN:69,getTimestampInfo +FN:125,createTimestampToken +FN:171,verifyToken +FN:191,verifyTsr +FN:224,testService +FNF:8 +FNH:8 +FNDA:12, +FNDA:12,TrustedTimestampService +FNDA:12,_init +FNDA:4,getTimestampInfo +FNDA:4,createTimestampToken +FNDA:4,verifyToken +FNDA:5,verifyTsr +FNDA:1,testService +DA:1,1 +DA:29,1 +DA:30,12 +DA:31,12 +DA:32,12 +DA:33,12 +DA:34,12 +DA:35,12 +DA:37,12 +DA:38,12 +DA:39,12 +DA:40,12 +DA:41,12 +DA:42,12 +DA:43,12 +DA:48,12 +DA:49,12 +DA:50,12 +DA:51,1 +DA:52,1 +DA:54,12 +DA:55,1 +DA:56,1 +DA:58,10 +DA:59,10 +DA:60,10 +DA:61,10 +DA:62,10 +DA:63,10 +DA:64,12 +DA:69,12 +DA:70,4 +DA:71,4 +DA:73,4 +DA:74,4 +DA:75,4 +DA:76,4 +DA:78,4 +DA:79,4 +DA:83,4 +DA:85,4 +DA:86,4 +DA:87,0 +DA:88,4 +DA:89,4 +DA:90,4 +DA:91,4 +DA:92,4 +DA:93,4 +DA:96,4 +DA:98,4 +DA:100,4 +DA:101,4 +DA:102,4 +DA:103,4 +DA:104,0 +DA:105,0 +DA:107,4 +DA:108,4 +DA:109,0 +DA:110,4 +DA:111,4 +DA:112,8 +DA:113,8 +DA:114,8 +DA:115,8 +DA:116,4 +DA:117,4 +DA:125,12 +DA:126,4 +DA:128,4 +DA:129,4 +DA:130,0 +DA:131,0 +DA:132,4 +DA:133,0 +DA:134,0 +DA:136,4 +DA:137,4 +DA:138,4 +DA:139,1 +DA:140,1 +DA:141,1 +DA:142,1 +DA:143,1 +DA:144,3 +DA:145,4 +DA:146,4 +DA:147,4 +DA:148,4 +DA:149,4 +DA:150,4 +DA:151,4 +DA:152,4 +DA:153,4 +DA:154,4 +DA:156,4 +DA:158,3 +DA:159,4 +DA:160,1 +DA:161,1 +DA:162,1 +DA:164,0 +DA:165,0 +DA:166,4 +DA:171,12 +DA:172,4 +DA:173,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:178,4 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:185,4 +DA:186,4 +DA:191,12 +DA:192,5 +DA:194,5 +DA:195,5 +DA:196,0 +DA:197,0 +DA:200,5 +DA:201,5 +DA:203,5 +DA:205,5 +DA:207,5 +DA:208,5 +DA:209,5 +DA:211,5 +DA:212,5 +DA:213,0 +DA:214,0 +DA:215,0 +DA:217,0 +DA:218,0 +DA:219,5 +DA:224,12 +DA:225,1 +DA:226,1 +DA:227,12 +LF:143 +LH:118 +BRDA:29,0,0,12 +BRDA:37,1,0,12 +BRDA:48,2,0,12 +BRDA:50,3,0,1 +BRDA:52,4,0,11 +BRDA:54,5,0,10 +BRDA:54,6,0,1 +BRDA:56,7,0,10 +BRDA:69,8,0,4 +BRDA:86,9,0,0 +BRDA:103,10,0,0 +BRDA:108,11,0,0 +BRDA:111,12,0,8 +BRDA:125,13,0,4 +BRDA:129,14,0,0 +BRDA:132,15,0,0 +BRDA:138,16,0,1 +BRDA:143,17,0,3 +BRDA:145,18,0,0 +BRDA:145,19,0,3 +BRDA:156,20,0,3 +BRDA:159,21,0,1 +BRDA:162,22,0,0 +BRDA:171,23,0,4 +BRDA:172,24,0,0 +BRDA:178,25,0,0 +BRDA:191,26,0,5 +BRDA:195,27,0,0 +BRDA:212,28,0,0 +BRDA:224,29,0,1 +BRF:30 +BRH:19 +end_of_record +TN: +SF:src/trustedTimestamp/error/create-timestamp-token.error.ts +FN:9,CreateTimestampTokenError +FNF:1 +FNH:1 +FNDA:1,CreateTimestampTokenError +DA:8,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:15,1 +DA:16,1 +LF:9 +LH:9 +BRDA:9,0,0,1 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/trustedTimestamp/types/timestamp-config.type.ts +FN:1,(empty-report) +FNF:1 +FNH:1 +FNDA:1,(empty-report) +LF:0 +LH:0 +BRDA:1,0,0,1 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/trustedTimestamp/types/timestamp-log.type.ts +FN:1,(empty-report) +FNF:1 +FNH:1 +FNDA:1,(empty-report) +LF:0 +LH:0 +BRDA:1,0,0,1 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/trustedTimestamp/types/timestamp-provider.type.ts +FN:1,(empty-report) +FNF:1 +FNH:1 +FNDA:1,(empty-report) +LF:0 +LH:0 +BRDA:1,0,0,1 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/trustedTimestamp/types/timestamp-request.type.ts +FN:1,(empty-report) +FNF:1 +FNH:1 +FNDA:1,(empty-report) +LF:0 +LH:0 +BRDA:1,0,0,1 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/trustedTimestamp/types/timestamp-token.type.ts +FN:1,(empty-report) +FNF:1 +FNH:1 +FNDA:1,(empty-report) +LF:0 +LH:0 +BRDA:1,0,0,1 +BRF:1 +BRH:1 +end_of_record +TN: +SF:src/util/TempFileService.ts +FN:20,createTempFile +FNF:1 +FNH:1 +FNDA:15,createTempFile +DA:1,1 +DA:5,1 +DA:7,1 +DA:8,1 +DA:9,15 +DA:10,15 +DA:11,15 +DA:12,15 +DA:13,15 +DA:14,1 +DA:16,1 +DA:20,1 +DA:21,15 +DA:22,15 +DA:23,15 +DA:24,15 +DA:25,15 +DA:26,15 +DA:27,11 +DA:28,11 +DA:29,15 +DA:30,15 +DA:31,0 +DA:32,0 +DA:33,15 +DA:34,1 +LF:26 +LH:24 +BRDA:8,0,0,15 +BRDA:12,1,0,15 +BRDA:20,2,0,15 +BRDA:26,3,0,11 +BRDA:30,4,0,0 +BRF:5 +BRH:4 +end_of_record +TN: +SF:src/util/child_process_promise.ts +FN:1,(empty-report) +FNF:1 +FNH:0 +FNDA:0,(empty-report) +DA:1,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:22,0 +DA:23,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +LF:47 +LH:0 +BRDA:1,0,0,0 +BRF:1 +BRH:0 +end_of_record +TN: +SF:src/util/regexParser.ts +FN:1,parseRegex +FN:11,revive +FN:35,createParser +FNF:3 +FNH:2 +FNDA:40,parseRegex +FNDA:20,revive +FNDA:0,createParser +DA:1,40 +DA:2,40 +DA:3,40 +DA:4,40 +DA:5,40 +DA:11,40 +DA:12,40 +DA:13,40 +DA:14,40 +DA:15,0 +DA:16,0 +DA:18,40 +DA:19,0 +DA:20,0 +DA:22,40 +DA:23,36 +DA:24,36 +DA:26,4 +DA:27,4 +DA:28,4 +DA:29,12 +DA:30,4 +DA:31,4 +DA:32,4 +DA:33,40 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +LF:34 +LH:21 +BRDA:1,0,0,40 +BRDA:14,1,0,0 +BRDA:18,2,0,0 +BRDA:22,3,0,36 +BRDA:24,4,0,4 +BRDA:11,5,0,20 +BRDA:28,6,0,12 +BRF:7 +BRH:5 +end_of_record diff --git a/test/tests/feature/timestamp-service.test.ts b/package/timestamp_service/test/tests/feature/timestamp-service.test.ts similarity index 100% rename from test/tests/feature/timestamp-service.test.ts rename to package/timestamp_service/test/tests/feature/timestamp-service.test.ts diff --git a/test/tests/mocks/TrustedTimestampCommand.mock.ts b/package/timestamp_service/test/tests/mocks/TrustedTimestampCommand.mock.ts similarity index 100% rename from test/tests/mocks/TrustedTimestampCommand.mock.ts rename to package/timestamp_service/test/tests/mocks/TrustedTimestampCommand.mock.ts diff --git a/test/vitest.config.ts b/package/timestamp_service/test/vitest.config.ts similarity index 100% rename from test/vitest.config.ts rename to package/timestamp_service/test/vitest.config.ts diff --git a/tsconfig.json b/package/timestamp_service/tsconfig.json similarity index 100% rename from tsconfig.json rename to package/timestamp_service/tsconfig.json diff --git a/yarn.lock b/yarn.lock index d7010e7..d2ffaf6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@ampproject/remapping@^2.3.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -12,24 +12,24 @@ "@babel/helper-string-parser@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== "@babel/helper-validator-identifier@^7.27.1": version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== "@babel/parser@^7.25.4": version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.4.tgz#da25d4643532890932cc03f7705fe19637e03fa8" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz" integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== dependencies: "@babel/types" "^7.28.4" "@babel/types@^7.25.4", "@babel/types@^7.28.4": version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz" integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== dependencies: "@babel/helper-string-parser" "^7.27.1" @@ -37,139 +37,29 @@ "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - "@esbuild/linux-x64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.9.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz" integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== dependencies: eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/eslintrc@^2.1.4": version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" @@ -184,12 +74,12 @@ "@eslint/js@8.57.1": version "8.57.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz" integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== "@humanwhocodes/config-array@^0.13.0": version "0.13.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz" integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: "@humanwhocodes/object-schema" "^2.0.3" @@ -198,17 +88,17 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^2.0.3": version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@isaacs/cliui@^8.0.2": version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" @@ -220,12 +110,12 @@ "@istanbuljs/schema@^0.1.2": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -233,17 +123,17 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24": version "0.3.31" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz" integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -251,20 +141,20 @@ "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -272,12 +162,12 @@ "@pkgjs/parseargs@^0.11.0": version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@rollup/plugin-typescript@^12.1.4": version "12.1.4" - resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-12.1.4.tgz#9a58433e8b13906198953d79faf3b16f67ee0424" + resolved "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.4.tgz" integrity sha512-s5Hx+EtN60LMlDBvl5f04bEiFZmAepk27Q+mr85L/00zPDn1jtzlTV6FWn81MaIwqfWzKxmOJrBWHU6vtQyedQ== dependencies: "@rollup/pluginutils" "^5.1.0" @@ -285,121 +175,26 @@ "@rollup/pluginutils@^5.1.0": version "5.3.0" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz#57ba1b0cbda8e7a3c597a4853c807b156e21a7b4" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz" integrity sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q== dependencies: "@types/estree" "^1.0.0" estree-walker "^2.0.2" picomatch "^4.0.2" -"@rollup/rollup-android-arm-eabi@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.2.tgz#52d66eba5198155f265f54aed94d2489c49269f6" - integrity sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A== - -"@rollup/rollup-android-arm64@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.2.tgz#137e8153fc9ce6757531ce300b8d2262299f758e" - integrity sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g== - -"@rollup/rollup-darwin-arm64@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.2.tgz#d4afd904386d37192cf5ef7345fdb0dd1bac0bc3" - integrity sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q== - -"@rollup/rollup-darwin-x64@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.2.tgz#6dbe83431fc7cbc09a2b6ed2b9fb7a62dd66ebc2" - integrity sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A== - -"@rollup/rollup-freebsd-arm64@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.2.tgz#d35afb9f66154b557b3387d12450920f8a954b96" - integrity sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow== - -"@rollup/rollup-freebsd-x64@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.2.tgz#849303ecdc171a420317ad9166a70af308348f34" - integrity sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog== - -"@rollup/rollup-linux-arm-gnueabihf@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.2.tgz#ab36199ca613376232794b2f3ba10e2b547a447c" - integrity sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w== - -"@rollup/rollup-linux-arm-musleabihf@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.2.tgz#f3704bc2eaecd176f558dc47af64197fcac36e8a" - integrity sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw== - -"@rollup/rollup-linux-arm64-gnu@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.2.tgz#dda0b06fd1daedd00b34395a2fb4aaaa2ed6c32b" - integrity sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg== - -"@rollup/rollup-linux-arm64-musl@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.2.tgz#a018de66209051dad0c58e689e080326c3dd15b0" - integrity sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ== - -"@rollup/rollup-linux-loong64-gnu@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.50.2.tgz#6e514f09988615e0c98fa5a34a88a30fec64d969" - integrity sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw== - -"@rollup/rollup-linux-ppc64-gnu@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.2.tgz#9b2efebc7b4a1951e684a895fdee0fef26319e0d" - integrity sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag== - -"@rollup/rollup-linux-riscv64-gnu@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.2.tgz#a7104270e93d75789d1ba857b2c68ddf61f24f68" - integrity sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ== - -"@rollup/rollup-linux-riscv64-musl@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.2.tgz#42d153f734a7b9fcacd764cc9bee6c207dca4db6" - integrity sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw== - -"@rollup/rollup-linux-s390x-gnu@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.2.tgz#826ad73099f6fd57c083dc5329151b25404bc67d" - integrity sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w== - -"@rollup/rollup-linux-x64-gnu@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.2.tgz#b9ec17bf0ca3f737d0895fca2115756674342142" - integrity sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA== - -"@rollup/rollup-linux-x64-musl@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.2.tgz#29fe0adb45a1d99042f373685efbac9cdd5354d9" - integrity sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw== - -"@rollup/rollup-openharmony-arm64@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.2.tgz#29648f11e202736b74413f823b71e339e3068d60" - integrity sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA== - -"@rollup/rollup-win32-arm64-msvc@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.2.tgz#91e7edec80542fd81ab1c2581a91403ac63458ae" - integrity sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA== - -"@rollup/rollup-win32-ia32-msvc@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.2.tgz#9b7cd9779f1147a3e8d3ddad432ae64dd222c4e9" - integrity sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA== - -"@rollup/rollup-win32-x64-msvc@4.50.2": - version "4.50.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.2.tgz#40ecd1357526fe328c7af704a283ee8533ca7ad6" - integrity sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA== +"@rollup/rollup-linux-x64-gnu@4.51.0": + version "4.51.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.51.0.tgz" + integrity sha512-4YHhP+Rv3T3+H3TPbUvWOw5tuSwhrVhkHHZhk4hC9VXeAOKR26/IsUAT4FsB4mT+kfIdxxb1BezQDEg/voPO8A== + +"@rollup/rollup-linux-x64-musl@4.51.0": + version "4.51.0" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.51.0.tgz" + integrity sha512-P7U7U03+E5w7WgJtvSseNLOX1UhknVPmEaqgUENFWfNxNBa1OhExT6qYGmyF8gepcxWSaSfJsAV5UwhWrYefdQ== "@techteamer/cert-utils@^1.1.3": version "1.1.3" - resolved "https://registry.yarnpkg.com/@techteamer/cert-utils/-/cert-utils-1.1.3.tgz#06e4ebd48be53fb450ad23d09dab00fc8d3986a0" + resolved "https://registry.npmjs.org/@techteamer/cert-utils/-/cert-utils-1.1.3.tgz" integrity sha512-dImubvTYUR5scCEq/noQnts39DPVR0UK8eqayoTU+PL+KrG3CKPLFPb8IQqbA2ljJdZ0ZQKYL9Nsfez+ErATNw== dependencies: "@techteamer/ocsp" "^1.0.1" @@ -410,7 +205,7 @@ "@techteamer/ocsp@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@techteamer/ocsp/-/ocsp-1.0.1.tgz#420f80c64ff0f74a70b65c88e4031c03a9da6ded" + resolved "https://registry.npmjs.org/@techteamer/ocsp/-/ocsp-1.0.1.tgz" integrity sha512-q4pW5wAC6Pc3JI8UePwE37CkLQ5gDGZMgjSX4MEEm4D4Di59auDQ8UNIDzC4gRnPNmmcwjpPxozq8p5pjiOmOw== dependencies: asn1.js "^5.4.1" @@ -419,38 +214,57 @@ async "^3.2.4" simple-lru-cache "^0.0.2" +"@techteamer/timestamp@file:../../package/timestamp_service": + version "2.0.1" + dependencies: + "@techteamer/cert-utils" "^1.1.3" + "@types/node-fetch" "^3" + node-fetch "^3" + proxy-agent "^6.5.0" + tmp "^0.2.1" + +"@techteamer/timestamp@file:/workspace/timestamp_service/package/timestamp_service": + version "2.0.1" + resolved "file:package/timestamp_service" + dependencies: + "@techteamer/cert-utils" "^1.1.3" + "@types/node-fetch" "^3" + node-fetch "^3" + proxy-agent "^6.5.0" + tmp "^0.2.1" + "@tootallnate/quickjs-emscripten@^0.23.0": version "0.23.0" - resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + resolved "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz" integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== -"@types/estree@1.0.8", "@types/estree@^1.0.0": +"@types/estree@^1.0.0", "@types/estree@1.0.8": version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/node-fetch@^3": version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-3.0.3.tgz#9d969c9a748e841554a40ee435d26e53fa3ee899" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-3.0.3.tgz" integrity sha512-HhggYPH5N+AQe/OmN6fmhKmRRt2XuNJow+R3pQwJxOOF9GuwM7O2mheyGeIrs5MOIeNjDEdgdoyHBOrFeJBR3g== dependencies: node-fetch "*" -"@types/node@^20.14.6": +"@types/node@^18.0.0 || >=20.0.0", "@types/node@^20.14.6": version "20.19.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.17.tgz#41b52697373aef8a43b3b92f33b43f329b2d674b" + resolved "https://registry.npmjs.org/@types/node/-/node-20.19.17.tgz" integrity sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ== dependencies: undici-types "~6.21.0" "@types/tmp@^0.2.6": version "0.2.6" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.6.tgz#d785ee90c52d7cc020e249c948c36f7b32d1e217" + resolved "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz" integrity sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA== "@typescript-eslint/eslint-plugin@^7.16.0": version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz" integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw== dependencies: "@eslint-community/regexpp" "^4.10.0" @@ -463,9 +277,9 @@ natural-compare "^1.4.0" ts-api-utils "^1.3.0" -"@typescript-eslint/parser@^7.13.1": +"@typescript-eslint/parser@^7.0.0", "@typescript-eslint/parser@^7.13.1": version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz" integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== dependencies: "@typescript-eslint/scope-manager" "7.18.0" @@ -476,7 +290,7 @@ "@typescript-eslint/scope-manager@7.18.0": version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz" integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== dependencies: "@typescript-eslint/types" "7.18.0" @@ -484,7 +298,7 @@ "@typescript-eslint/type-utils@7.18.0": version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz" integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA== dependencies: "@typescript-eslint/typescript-estree" "7.18.0" @@ -494,12 +308,12 @@ "@typescript-eslint/types@7.18.0": version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz" integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== "@typescript-eslint/typescript-estree@7.18.0": version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz" integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== dependencies: "@typescript-eslint/types" "7.18.0" @@ -513,7 +327,7 @@ "@typescript-eslint/utils@7.18.0": version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz" integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== dependencies: "@eslint-community/eslint-utils" "^4.4.0" @@ -523,7 +337,7 @@ "@typescript-eslint/visitor-keys@7.18.0": version "7.18.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz" integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== dependencies: "@typescript-eslint/types" "7.18.0" @@ -531,12 +345,12 @@ "@ungap/structured-clone@^1.2.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== "@vitest/coverage-v8@^2.0.2": version "2.1.9" - resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz#060bebfe3705c1023bdc220e17fdea4bd9e2b24d" + resolved "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz" integrity sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ== dependencies: "@ampproject/remapping" "^2.3.0" @@ -554,7 +368,7 @@ "@vitest/expect@2.1.9": version "2.1.9" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-2.1.9.tgz#b566ea20d58ea6578d8dc37040d6c1a47ebe5ff8" + resolved "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz" integrity sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw== dependencies: "@vitest/spy" "2.1.9" @@ -564,23 +378,23 @@ "@vitest/mocker@2.1.9": version "2.1.9" - resolved "https://registry.yarnpkg.com/@vitest/mocker/-/mocker-2.1.9.tgz#36243b27351ca8f4d0bbc4ef91594ffd2dc25ef5" + resolved "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz" integrity sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg== dependencies: "@vitest/spy" "2.1.9" estree-walker "^3.0.3" magic-string "^0.30.12" -"@vitest/pretty-format@2.1.9", "@vitest/pretty-format@^2.1.9": +"@vitest/pretty-format@^2.1.9", "@vitest/pretty-format@2.1.9": version "2.1.9" - resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-2.1.9.tgz#434ff2f7611689f9ce70cd7d567eceb883653fdf" + resolved "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz" integrity sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ== dependencies: tinyrainbow "^1.2.0" "@vitest/runner@2.1.9": version "2.1.9" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-2.1.9.tgz#cc18148d2d797fd1fd5908d1f1851d01459be2f6" + resolved "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz" integrity sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g== dependencies: "@vitest/utils" "2.1.9" @@ -588,7 +402,7 @@ "@vitest/snapshot@2.1.9": version "2.1.9" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-2.1.9.tgz#24260b93f798afb102e2dcbd7e61c6dfa118df91" + resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz" integrity sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ== dependencies: "@vitest/pretty-format" "2.1.9" @@ -597,14 +411,14 @@ "@vitest/spy@2.1.9": version "2.1.9" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-2.1.9.tgz#cb28538c5039d09818b8bfa8edb4043c94727c60" + resolved "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz" integrity sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ== dependencies: tinyspy "^3.0.2" "@vitest/utils@2.1.9": version "2.1.9" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-2.1.9.tgz#4f2486de8a54acf7ecbf2c5c24ad7994a680a6c1" + resolved "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz" integrity sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ== dependencies: "@vitest/pretty-format" "2.1.9" @@ -613,22 +427,22 @@ acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0: version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== agent-base@^7.1.0, agent-base@^7.1.2: version "7.1.4" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -638,48 +452,53 @@ ajv@^6.12.4: ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.2.2" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^6.1.0: version "6.2.3" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== asn1.js-rfc2560@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/asn1.js-rfc2560/-/asn1.js-rfc2560-5.0.1.tgz#cff99b903e714756b29503ad49de01c72f131e60" + resolved "https://registry.npmjs.org/asn1.js-rfc2560/-/asn1.js-rfc2560-5.0.1.tgz" integrity sha512-1PrVg6kuBziDN3PGFmRk3QrjpKvP9h/Hv5yMrFZvC1kpzP6dQRzf5BpKstANqHBkaOUmTpakJWhicTATOA/SbA== dependencies: asn1.js-rfc5280 "^3.0.0" asn1.js-rfc5280@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/asn1.js-rfc5280/-/asn1.js-rfc5280-3.0.0.tgz#94e60498d5d4984b842d1a825485837574ccc902" + resolved "https://registry.npmjs.org/asn1.js-rfc5280/-/asn1.js-rfc5280-3.0.0.tgz" integrity sha512-Y2LZPOWeZ6qehv698ZgOGGCZXBQShObWnGthTrIFlIQjuV1gg2B8QOhWFRExq/MR1VnPpIIe7P9vX2vElxv+Pg== dependencies: asn1.js "^5.0.0" asn1.js@^5.0.0, asn1.js@^5.4.1: version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz" integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== dependencies: bn.js "^4.0.0" @@ -689,46 +508,46 @@ asn1.js@^5.0.0, asn1.js@^5.4.1: assertion-error@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz" integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== ast-types@^0.13.4: version "0.13.4" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz" integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== dependencies: tslib "^2.0.1" async@^3.2.4: version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== basic-ftp@^5.0.2: version "5.0.5" - resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" + resolved "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz" integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== bn.js@^4.0.0: version "4.12.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.2.tgz#3d8fed6796c24e177737f7cc5172ee04ef39ec99" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz" integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw== brace-expansion@^1.1.7: version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: balanced-match "^1.0.0" @@ -736,26 +555,26 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" braces@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" cac@^6.7.14: version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" @@ -763,7 +582,7 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply- call-bind@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== dependencies: call-bind-apply-helpers "^1.0.0" @@ -773,7 +592,7 @@ call-bind@^1.0.8: call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== dependencies: call-bind-apply-helpers "^1.0.2" @@ -781,12 +600,12 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== chai@^5.1.2: version "5.3.3" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" + resolved "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz" integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== dependencies: assertion-error "^2.0.1" @@ -797,7 +616,7 @@ chai@^5.1.2: chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -805,29 +624,35 @@ chalk@^4.0.0: check-error@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" + resolved "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz" integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== +"cjs@file:/workspace/timestamp_service/app/cjs": + version "1.0.0" + resolved "file:app/cjs" + dependencies: + "@techteamer/timestamp" "file:../../package/timestamp_service" + color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== cross-spawn@^7.0.2, cross-spawn@^7.0.6: version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -836,34 +661,34 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.6: data-uri-to-buffer@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz" integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== data-uri-to-buffer@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz" integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.7, debug@^4.4.0: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.7, debug@^4.4.0, debug@4: version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" deep-eql@^5.0.1: version "5.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz" integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -872,7 +697,7 @@ define-data-property@^1.1.4: degenerator@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + resolved "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz" integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== dependencies: ast-types "^0.13.4" @@ -881,21 +706,21 @@ degenerator@^5.0.0: dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" @@ -904,44 +729,44 @@ dunder-proto@^1.0.1: eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-module-lexer@^1.5.4, es-module-lexer@^1.6.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz" integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" -esbuild@^0.21.3: +esbuild@^0.21.3, esbuild@>=0.18.0: version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: "@esbuild/aix-ppc64" "0.21.5" @@ -970,12 +795,12 @@ esbuild@^0.21.3: escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" @@ -986,17 +811,17 @@ escodegen@^2.1.0: eslint-config-prettier@^10.1.8: version "10.1.8" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz" integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== eslint-config-standard@^17.0.0: version "17.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" + resolved "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz" integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" @@ -1004,12 +829,12 @@ eslint-scope@^7.2.2: eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.19.0: +"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.0.1, eslint@^8.19.0, eslint@^8.56.0, eslint@>=7.0.0: version "8.57.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -1053,7 +878,7 @@ eslint@^8.19.0: espree@^9.6.0, espree@^9.6.1: version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" @@ -1062,58 +887,58 @@ espree@^9.6.0, espree@^9.6.1: esprima@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.2: version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== estree-walker@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== dependencies: "@types/estree" "^1.0.0" esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== expect-type@^1.1.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.2.tgz#c030a329fb61184126c8447585bc75a7ec6fbff3" + resolved "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz" integrity sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.9: version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -1124,24 +949,24 @@ fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.19.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" - resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + resolved "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz" integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== dependencies: node-domexception "^1.0.0" @@ -1149,21 +974,21 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -1171,7 +996,7 @@ find-up@^5.0.0: flat-cache@^3.0.4: version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" @@ -1180,34 +1005,38 @@ flat-cache@^3.0.4: flatted@^3.2.9: version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== for-each@^0.3.5: version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: is-callable "^1.2.7" foreground-child@^3.1.0: version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz" integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: cross-spawn "^7.0.6" signal-exit "^4.0.1" +"forge@file:/workspace/timestamp_service/app/forge": + version "1.0.0" + resolved "file:app/forge" + formdata-polyfill@^4.0.10: version "4.0.10" - resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + resolved "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz" integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== dependencies: fetch-blob "^3.1.2" fs-extra@^11.1.1: version "11.3.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.2.tgz#c838aeddc6f4a8c74dd15f85e11fe5511bfe02a4" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz" integrity sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A== dependencies: graceful-fs "^4.2.0" @@ -1216,22 +1045,17 @@ fs-extra@^11.1.1: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== get-intrinsic@^1.2.4, get-intrinsic@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: call-bind-apply-helpers "^1.0.2" @@ -1247,7 +1071,7 @@ get-intrinsic@^1.2.4, get-intrinsic@^1.3.0: get-proto@^1.0.0, get-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" @@ -1255,14 +1079,14 @@ get-proto@^1.0.0, get-proto@^1.0.1: get-tsconfig@^4.10.0: version "4.10.1" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.1.tgz#d34c1c01f47d65a606c37aa7a177bc3e56ab4b2e" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz" integrity sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ== dependencies: resolve-pkg-maps "^1.0.0" get-uri@^6.0.1: version "6.0.5" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.5.tgz#714892aa4a871db671abc5395e5e9447bc306a16" + resolved "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz" integrity sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg== dependencies: basic-ftp "^5.0.2" @@ -1271,21 +1095,21 @@ get-uri@^6.0.1: glob-parent@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob@^10.4.1: version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" @@ -1297,7 +1121,7 @@ glob@^10.4.1: glob@^7.1.3: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -1309,14 +1133,14 @@ glob@^7.1.3: globals@^13.19.0: version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -1328,58 +1152,58 @@ globby@^11.1.0: gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: version "7.0.2" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: agent-base "^7.1.0" @@ -1387,7 +1211,7 @@ http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: https-proxy-agent@^7.0.6: version "7.0.6" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: agent-base "^7.1.2" @@ -1395,19 +1219,19 @@ https-proxy-agent@^7.0.6: iconv-lite@^0.6.0: version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" ignore@^5.2.0, ignore@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" @@ -1415,30 +1239,30 @@ import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3: +inherits@^2.0.1, inherits@^2.0.3, inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ip-address@^10.0.1: version "10.0.1" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.0.1.tgz#a8180b783ce7788777d796286d61bce4276818ed" + resolved "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz" integrity sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA== is-arguments@^1.0.4: version "1.2.0" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz" integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== dependencies: call-bound "^1.0.2" @@ -1446,29 +1270,29 @@ is-arguments@^1.0.4: is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.16.0: version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: hasown "^2.0.2" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-function@^1.0.7: version "1.1.0" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz" integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== dependencies: call-bound "^1.0.3" @@ -1478,24 +1302,24 @@ is-generator-function@^1.0.7: is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-regex@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: call-bound "^1.0.2" @@ -1505,24 +1329,24 @@ is-regex@^1.2.1: is-typed-array@^1.1.3: version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: which-typed-array "^1.1.16" isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.2: version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -1531,7 +1355,7 @@ istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: istanbul-lib-source-maps@^5.0.6: version "5.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz#acaef948df7747c8eb5fbf1265cb980f6353a441" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz" integrity sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A== dependencies: "@jridgewell/trace-mapping" "^0.3.23" @@ -1540,7 +1364,7 @@ istanbul-lib-source-maps@^5.0.6: istanbul-reports@^3.1.7: version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz" integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA== dependencies: html-escaper "^2.0.0" @@ -1548,7 +1372,7 @@ istanbul-reports@^3.1.7: jackspeak@^3.1.2: version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" @@ -1557,34 +1381,34 @@ jackspeak@^3.1.2: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== jsonfile@^6.0.1: version "6.2.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz" integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== dependencies: universalify "^2.0.0" @@ -1593,14 +1417,14 @@ jsonfile@^6.0.1: keyv@^4.5.3: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -1608,41 +1432,41 @@ levn@^0.4.1: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== loupe@^3.1.0, loupe@^3.1.2: version "3.2.1" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" + resolved "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz" integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== lru-cache@^10.2.0: version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^7.14.1: version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== magic-string@^0.30.12: version "0.30.19" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.19.tgz#cebe9f104e565602e5d2098c5f2e79a77cc86da9" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz" integrity sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw== dependencies: "@jridgewell/sourcemap-codec" "^1.5.5" magicast@^0.3.5: version "0.3.5" - resolved "https://registry.yarnpkg.com/magicast/-/magicast-0.3.5.tgz#8301c3c7d66704a0771eb1bad74274f0ec036739" + resolved "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz" integrity sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ== dependencies: "@babel/parser" "^7.25.4" @@ -1651,24 +1475,24 @@ magicast@^0.3.5: make-dir@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: semver "^7.5.3" math-intrinsics@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" @@ -1676,51 +1500,51 @@ micromatch@^4.0.8: minimalistic-assert@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.4: version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== nanoid@^3.3.11: version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== netmask@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" + resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== nock@^13.5.4: version "13.5.6" - resolved "https://registry.yarnpkg.com/nock/-/nock-13.5.6.tgz#5e693ec2300bbf603b61dae6df0225673e6c4997" + resolved "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz" integrity sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ== dependencies: debug "^4.1.0" @@ -1729,28 +1553,33 @@ nock@^13.5.4: node-domexception@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== node-fetch@*, node-fetch@^3: version "3.3.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz" integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== dependencies: data-uri-to-buffer "^4.0.0" fetch-blob "^3.1.4" formdata-polyfill "^4.0.10" +node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" optionator@^0.9.3: version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -1762,21 +1591,21 @@ optionator@^0.9.3: p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" pac-proxy-agent@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df" + resolved "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz" integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== dependencies: "@tootallnate/quickjs-emscripten" "^0.23.0" @@ -1790,7 +1619,7 @@ pac-proxy-agent@^7.1.0: pac-resolver@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + resolved "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz" integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== dependencies: degenerator "^5.0.0" @@ -1798,39 +1627,39 @@ pac-resolver@^7.0.1: package-json-from-dist@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.11.1: version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" @@ -1838,47 +1667,47 @@ path-scurry@^1.11.1: path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathe@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz" integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== pathe@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + resolved "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz" integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== pathval@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" + resolved "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz" integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== picomatch@^4.0.2, picomatch@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== possible-typed-array-names@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== postcss@^8.4.43: version "8.5.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== dependencies: nanoid "^3.3.11" @@ -1887,22 +1716,22 @@ postcss@^8.4.43: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier@^3.6.2: version "3.6.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz" integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== propagate@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz#40cdedab18085c792334e64f0ac17256d38f9a45" + resolved "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz" integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag== proxy-agent@^6.5.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + resolved "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz" integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== dependencies: agent-base "^7.1.2" @@ -1916,32 +1745,32 @@ proxy-agent@^6.5.0: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-pkg-maps@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve@^1.22.1: version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: is-core-module "^2.16.0" @@ -1950,19 +1779,19 @@ resolve@^1.22.1: reusify@^1.0.4: version "1.1.0" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" rollup-plugin-esbuild@^6.1.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-esbuild/-/rollup-plugin-esbuild-6.2.1.tgz#c556195465bf452965686e0f21adfe306b90c219" + resolved "https://registry.npmjs.org/rollup-plugin-esbuild/-/rollup-plugin-esbuild-6.2.1.tgz" integrity sha512-jTNOMGoMRhs0JuueJrJqbW8tOwxumaWYq+V5i+PD+8ecSCVkuX27tGW7BXqDgoULQ55rO7IdNxPcnsWtshz3AA== dependencies: debug "^4.4.0" @@ -1970,65 +1799,65 @@ rollup-plugin-esbuild@^6.1.1: get-tsconfig "^4.10.0" unplugin-utils "^0.2.4" -rollup@^4.18.0, rollup@^4.20.0: - version "4.50.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.50.2.tgz#938d898394939f3386d1e367ee6410a796b8f268" - integrity sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w== +"rollup@^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0", rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.14.0||^3.0.0||^4.0.0, rollup@^4.18.0, rollup@^4.20.0: + version "4.51.0" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.51.0.tgz" + integrity sha512-7cR0XWrdp/UAj2HMY/Y4QQEUjidn3l2AY1wSeZoFjMbD8aOMPoV9wgTFYbrJpPzzvejDEini1h3CiUP8wLzxQA== dependencies: "@types/estree" "1.0.8" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.50.2" - "@rollup/rollup-android-arm64" "4.50.2" - "@rollup/rollup-darwin-arm64" "4.50.2" - "@rollup/rollup-darwin-x64" "4.50.2" - "@rollup/rollup-freebsd-arm64" "4.50.2" - "@rollup/rollup-freebsd-x64" "4.50.2" - "@rollup/rollup-linux-arm-gnueabihf" "4.50.2" - "@rollup/rollup-linux-arm-musleabihf" "4.50.2" - "@rollup/rollup-linux-arm64-gnu" "4.50.2" - "@rollup/rollup-linux-arm64-musl" "4.50.2" - "@rollup/rollup-linux-loong64-gnu" "4.50.2" - "@rollup/rollup-linux-ppc64-gnu" "4.50.2" - "@rollup/rollup-linux-riscv64-gnu" "4.50.2" - "@rollup/rollup-linux-riscv64-musl" "4.50.2" - "@rollup/rollup-linux-s390x-gnu" "4.50.2" - "@rollup/rollup-linux-x64-gnu" "4.50.2" - "@rollup/rollup-linux-x64-musl" "4.50.2" - "@rollup/rollup-openharmony-arm64" "4.50.2" - "@rollup/rollup-win32-arm64-msvc" "4.50.2" - "@rollup/rollup-win32-ia32-msvc" "4.50.2" - "@rollup/rollup-win32-x64-msvc" "4.50.2" + "@rollup/rollup-android-arm-eabi" "4.51.0" + "@rollup/rollup-android-arm64" "4.51.0" + "@rollup/rollup-darwin-arm64" "4.51.0" + "@rollup/rollup-darwin-x64" "4.51.0" + "@rollup/rollup-freebsd-arm64" "4.51.0" + "@rollup/rollup-freebsd-x64" "4.51.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.51.0" + "@rollup/rollup-linux-arm-musleabihf" "4.51.0" + "@rollup/rollup-linux-arm64-gnu" "4.51.0" + "@rollup/rollup-linux-arm64-musl" "4.51.0" + "@rollup/rollup-linux-loong64-gnu" "4.51.0" + "@rollup/rollup-linux-ppc64-gnu" "4.51.0" + "@rollup/rollup-linux-riscv64-gnu" "4.51.0" + "@rollup/rollup-linux-riscv64-musl" "4.51.0" + "@rollup/rollup-linux-s390x-gnu" "4.51.0" + "@rollup/rollup-linux-x64-gnu" "4.51.0" + "@rollup/rollup-linux-x64-musl" "4.51.0" + "@rollup/rollup-openharmony-arm64" "4.51.0" + "@rollup/rollup-win32-arm64-msvc" "4.51.0" + "@rollup/rollup-win32-ia32-msvc" "4.51.0" + "@rollup/rollup-win32-x64-msvc" "4.51.0" fsevents "~2.3.2" run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" safe-regex-test@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: call-bound "^1.0.2" es-errors "^1.3.0" is-regex "^1.2.1" -"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: +safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== semver@^7.5.3, semver@^7.6.0: version "7.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== set-function-length@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -2040,44 +1869,44 @@ set-function-length@^1.2.2: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== siginfo@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== signal-exit@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== simple-lru-cache@^0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz#d59cc3a193c1a5d0320f84ee732f6e4713e511dd" + resolved "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz" integrity sha512-uEv/AFO0ADI7d99OHDmh1QfYzQk/izT1vCmu/riQfh7qjBVUUgRT87E5s5h7CxWCA/+YoZerykpEthzVrW3LIw== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== smart-buffer@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== socks-proxy-agent@^8.0.5: version "8.0.5" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz" integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== dependencies: agent-base "^7.1.2" @@ -2086,7 +1915,7 @@ socks-proxy-agent@^8.0.5: socks@^2.8.3: version "2.8.7" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.7.tgz#e2fb1d9a603add75050a2067db8c381a0b5669ea" + resolved "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz" integrity sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A== dependencies: ip-address "^10.0.1" @@ -2094,70 +1923,83 @@ socks@^2.8.3: source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== stackback@0.0.2: version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== std-env@^3.8.0: version "3.9.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz" integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: - name string-width-cjs +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1, string-width@^5.1.2: +string-width@^4.1.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" emoji-regex "^9.2.2" strip-ansi "^7.0.1" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1, strip-ansi@^7.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.2" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz" + integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== + dependencies: + ansi-regex "^6.0.1" + strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== test-exclude@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-7.0.1.tgz#20b3ba4906ac20994e275bbcafd68d510264c2a2" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz" integrity sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -2166,86 +2008,86 @@ test-exclude@^7.0.1: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== tinybench@^2.9.0: version "2.9.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" + resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz" integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== tinyexec@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-0.3.2.tgz#941794e657a85e496577995c6eef66f53f42b3d2" + resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz" integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== tinypool@^1.0.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" + resolved "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz" integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== tinyrainbow@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-1.2.0.tgz#5c57d2fc0fb3d1afd78465c33ca885d04f02abb5" + resolved "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz" integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== tinyspy@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-3.0.2.tgz#86dd3cf3d737b15adcf17d7887c84a75201df20a" + resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz" integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== tmp@^0.2.1: version "0.2.5" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz" integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" ts-api-utils@^1.3.0: version "1.4.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz" integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== -tslib@^2.0.1: +tslib@*, tslib@^2.0.1: version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -typescript@~5.5: +typescript@>=3.7.0, typescript@>=4.2.0, typescript@~5.5: version "5.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== undici-types@~6.21.0: version "6.21.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz" integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== universalify@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unplugin-utils@^0.2.4: version "0.2.5" - resolved "https://registry.yarnpkg.com/unplugin-utils/-/unplugin-utils-0.2.5.tgz#d2fe44566ffffd7f216579bbb01184f6702e379b" + resolved "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.5.tgz" integrity sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg== dependencies: pathe "^2.0.3" @@ -2253,14 +2095,14 @@ unplugin-utils@^0.2.4: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" util@^0.12.5: version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: inherits "^2.0.3" @@ -2271,7 +2113,7 @@ util@^0.12.5: vite-node@2.1.9: version "2.1.9" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-2.1.9.tgz#549710f76a643f1c39ef34bdb5493a944e4f895f" + resolved "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz" integrity sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA== dependencies: cac "^6.7.14" @@ -2282,7 +2124,7 @@ vite-node@2.1.9: vite@^5.0.0: version "5.4.20" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.20.tgz#3267a5e03f21212f44edfd72758138e8fcecd76a" + resolved "https://registry.npmjs.org/vite/-/vite-5.4.20.tgz" integrity sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g== dependencies: esbuild "^0.21.3" @@ -2291,9 +2133,9 @@ vite@^5.0.0: optionalDependencies: fsevents "~2.3.3" -vitest@^2.0.2: +vitest@^2.0.2, vitest@2.1.9: version "2.1.9" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.1.9.tgz#7d01ffd07a553a51c87170b5e80fea3da7fb41e7" + resolved "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz" integrity sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q== dependencies: "@vitest/expect" "2.1.9" @@ -2319,12 +2161,12 @@ vitest@^2.0.2: web-streams-polyfill@^3.0.3: version "3.3.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz" integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== which-typed-array@^1.1.16, which-typed-array@^1.1.2: version "1.1.19" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz" integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== dependencies: available-typed-arrays "^1.0.7" @@ -2337,14 +2179,14 @@ which-typed-array@^1.1.16, which-typed-array@^1.1.2: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" why-is-node-running@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz#a3f69a97107f494b3cdc3bdddd883a7d65cebf04" + resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz" integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== dependencies: siginfo "^2.0.0" @@ -2352,12 +2194,12 @@ why-is-node-running@^2.3.0: word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -2366,7 +2208,7 @@ word-wrap@^1.2.5: wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -2375,10 +2217,10 @@ wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From ae49424841c265b8bcfb334a372f9a7b32a653bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nagy=20Bal=C3=A1zs?= Date: Mon, 22 Sep 2025 10:12:52 +0200 Subject: [PATCH 13/13] chore: clean and add mjs test --- package/timestamp_service/build/timestamp_config.cjs | 2 -- package/timestamp_service/build/timestamp_config.cjs.map | 2 +- package/timestamp_service/build/timestamp_config.mjs | 2 -- package/timestamp_service/build/timestamp_config.mjs.map | 2 +- package/timestamp_service/package.json | 9 +++------ 5 files changed, 5 insertions(+), 12 deletions(-) diff --git a/package/timestamp_service/build/timestamp_config.cjs b/package/timestamp_service/build/timestamp_config.cjs index 5a80b8b..e092f38 100644 --- a/package/timestamp_service/build/timestamp_config.cjs +++ b/package/timestamp_service/build/timestamp_config.cjs @@ -693,8 +693,6 @@ class TrustedTimestampService { throw new Error(`Invalid digest: ${digest}`); } const tsQuery = await getTsQuery(digest, digestFormat); - console.log('!!!!!!!!!!!!!!!'); - console.log(tsQuery); const { tsr, providerName, logHistory } = await this.timestampRequest.getTimestamp(tsQuery); if (!tsr) { throw new CreateTimestampTokenError('Failed to create trusted timestamp, no provider was available', { diff --git a/package/timestamp_service/build/timestamp_config.cjs.map b/package/timestamp_service/build/timestamp_config.cjs.map index fd97a0b..fb4baa9 100644 --- a/package/timestamp_service/build/timestamp_config.cjs.map +++ b/package/timestamp_service/build/timestamp_config.cjs.map @@ -1 +1 @@ -{"version":3,"file":"timestamp_config.cjs","sources":["../../src/util/regexParser.ts","../../src/trustedTimestamp/TrustedTimestampInfo.ts","../../src/patch/node-fetch.ts","../../src/trustedTimestamp/TimestampRequest.ts","../../src/trustedTimestamp/TrustedTimestampRequest.ts","../../src/util/child_process_promise.ts","../../src/trustedTimestamp/TrustedTimestampCommand.ts","../../src/trustedTimestamp/TrustedTimestampCheck.ts","../../src/util/TempFileService.ts","../../src/trustedTimestamp/error/create-timestamp-token.error.ts","../../src/trustedTimestamp/TrustedTimestampService.ts"],"sourcesContent":["function parseRegex(\n text: string,\n regex: RegExp,\n groups: Groups,\n revive: (\n parameter: Groups extends number\n ? string\n : Groups extends (string | number)[]\n ? Record\n : RegExpMatchArray\n ) => ReviveResult = value => value as unknown as ReviveResult\n): ReviveResult | null | undefined {\n const result = text.match(regex)\n if (!result) {\n return null\n }\n\n if (!groups) {\n return (revive as (parameter: RegExpMatchArray) => ReviveResult)(result)\n }\n\n if (typeof groups === 'number') {\n return (revive as (parameter: string) => ReviveResult)(result[groups])\n }\n\n if (Array.isArray(groups)) {\n const ret: Record = {}\n groups.forEach((name, i) => {\n ret[name] = result[i + 1]\n })\n return (revive as (parameter: Record) => ReviveResult)(ret)\n }\n}\n\nfunction createParser(\n regex: RegExp,\n groups: number | number[],\n revive: (value: unknown) => ReviveResult\n): (text: string) => ReviveResult | null | undefined {\n return (text: string) => {\n return parseRegex(text, regex, groups, revive)\n }\n}\n\nexport { createParser as create }\nexport { parseRegex }\n","import { CertService } from '@techteamer/cert-utils'\nimport { parseRegex } from '../util/regexParser'\n\ninterface TSA {\n C: string | null\n L: string | null\n O: string | null\n OU: string | null\n CN: string | null\n}\n\n/**\n *\n * Status info:\n * Status: Granted.\n * Status description: unspecified\n * Failure info: unspecified\n *\n * TST info:\n * Version: 1\n * Policy OID: 1.3.6.1.4.1.21528.2.2.99\n * Hash Algorithm: sha256\n * Message data:\n * 0000 - c5 3e 94 56 aa 61 ed 56-49 69 74 29 1e 01 d7 2a .>.V.a.VIit)...*\n * 0010 - 64 cc 24 84 d2 a2 31 4d-33 b6 ca c8 98 23 03 b9 d.$...1M3....#..\n * Serial number: 0x0308441E\n * Time stamp: Jan 30 13:45:20 2018 GMT\n * Accuracy: 0x01 seconds, unspecified millis, unspecified micros\n * Ordering: no\n * Nonce: unspecified\n * TSA: DirName:/C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=e-Szigno Test TSA2\n * Extensions:\n * */\nexport class TimestampInfo {\n error: string | null = null\n version: number | null = null\n policyOID: string | null = null\n hashAlgorithm: string | null = null\n hash: string | null = null\n serialNumber: string | null = null\n timeStamp: Date | null = null\n timeStampDate: Date | null = null\n accuracy: number | null = null\n ordering: boolean | null = null\n nonce: string | null = null\n issuer: string | null = null\n tsa: TSA | null = null\n certInfo: CertService['CertInfo'] | null = null\n\n constructor(timestampInfoType: 'normal' | 'short' = 'normal', tsText: string, error: string | null = null) {\n this.error = null\n this.version = null\n this.policyOID = null\n this.hashAlgorithm = null\n this.serialNumber = null\n this.timeStamp = null\n this.accuracy = null\n this.ordering = null\n this.nonce = null\n this.tsa = null\n\n if (error) {\n this.error = error\n } else {\n if (timestampInfoType === 'short') {\n this.parseOpensslOutputShort(tsText)\n } else {\n this.hash = null\n this.timeStampDate = null\n this.issuer = null\n this.certInfo = null\n this.parseOpensslOutput(tsText)\n }\n }\n }\n\n setCertInfo(certInfo: CertService['CertInfo'] | null): void {\n this.certInfo = certInfo\n }\n\n parseOpensslOutput(tsText: string): void {\n this.version = parseRegex(tsText, /Version:\\s*([^\\n\\r]+)/, 1, parseInt)!\n this.policyOID = parseRegex(tsText, /Policy OID:\\s*([^\\n\\r]+)/, 1)!\n this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\\s*([^\\n\\r]+)/, 1)!\n this.hash = tsText\n .match(/\\d{4} - .*?\\s{2}/g)!\n .map(line => {\n return line.replace(/\\d{4} - /g, '').replace(/[\\s*-]/g, '')\n })\n .join('')\n this.serialNumber = parseRegex(tsText, /Serial number:\\s*([^\\n\\r]+)/, 1)!\n this.timeStamp = parseRegex(tsText, /Time stamp:\\s*([^\\n\\r]+)/, 1)!\n this.timeStampDate = new Date(this.timeStamp)\n this.accuracy = parseRegex(\n tsText,\n /Accuracy:\\s*(.+) seconds, (.+) millis, (.+) micros/,\n ['s', 'm', 'u'],\n ({ s, m, u }) => {\n const _s = Number(s === 'unspecified' ? 0 : s)\n const _m = Number(m === 'unspecified' ? 0 : m)\n const _u = Number(u === 'unspecified' ? 0 : u)\n return _s * 1000 + _m + _u / 1000\n }\n )!\n this.ordering = parseRegex(tsText, /Ordering:\\s*([^\\n\\r]+)/, 1, ordering => ordering !== 'no')!\n this.nonce = parseRegex(tsText, /Nonce:\\s*([^\\n\\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))!\n this.issuer = parseRegex(tsText, /TSA:\\s*DirName:\\s*([^\\n\\r]+)/, 1)!\n this.tsa = parseRegex(tsText, /TSA:\\s*DirName:\\s*([^\\n\\r]+)/, 1, (result): TSA => {\n const m = result.match(/\\/\\w{1,2}=[^/]+/g) || []\n\n return m.reduce(\n (obj, part) => {\n const [, label, value] = part.match(/\\/(\\w{1,2})=([^/]+)/) || []\n if (!label || !value) {\n return obj\n }\n obj[label as keyof TSA] = value\n return obj\n },\n { C: null, L: null, O: null, OU: null, CN: null } as TSA\n )\n })!\n }\n\n parseOpensslOutputShort(tsText: string): void {\n this.version = parseRegex(tsText, /Version:\\s*([^\\n\\r]+)/, 1, parseInt)!\n this.policyOID = parseRegex(tsText, /Policy OID:\\s*([^\\n\\r]+)/, 1)!\n this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\\s*([^\\n\\r]+)/, 1)!\n this.serialNumber = parseRegex(tsText, /Serial number:\\s*([^\\n\\r]+)/, 1)!\n this.timeStamp = parseRegex(tsText, /Time stamp:\\s*([^\\n\\r]+)/, 1, dateString => new Date(dateString))!\n this.accuracy = parseRegex(\n tsText,\n /Accuracy:\\s*(.+) seconds, (.+) millis, (.+) micros/,\n ['s', 'm', 'u'],\n ({ s, m, u }) => {\n const _s = Number(s === 'unspecified' ? 0 : s)\n const _m = Number(m === 'unspecified' ? 0 : m)\n const _u = Number(u === 'unspecified' ? 0 : u)\n return _s * 1000 + _m + _u / 1000\n }\n )!\n this.ordering = parseRegex(tsText, /Ordering:\\s*([^\\n\\r]+)/, 1, ordering => ordering !== 'no')!\n this.nonce = parseRegex(tsText, /Nonce:\\s*([^\\n\\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))!\n this.tsa = parseRegex(tsText, /TSA:\\s*([^\\n\\r]+)/, 1, v => {\n const m = v.match(/\\/\\w{1,2}=[^/]+/g) || []\n\n return m.reduce(\n (obj, part) => {\n const [, label, value] = part.match(/\\/(\\w{1,2})=([^/]+)/) || []\n if (!label || !value) {\n return obj\n }\n obj[label as keyof TSA] = value\n return obj\n },\n { C: null, L: null, O: null, OU: null, CN: null } as TSA\n )\n })!\n }\n}\n","import type { RequestInfo, RequestInit, Response } from 'node-fetch'\n\nexport const fetch = async (url: URL | RequestInfo, init?: RequestInit): Promise => {\n const { default: fetch } = await import('node-fetch')\n return fetch(url, init)\n}\n","import type { BodyInit } from 'node-fetch'\nimport { fetch } from '../patch/node-fetch'\nimport fs from 'node:fs'\nimport { ProxyAgent } from 'proxy-agent'\nimport type { FileOptions } from 'tmp'\n\nimport type {\n TimestampRequestAuthResult,\n TimestampRequestAuthTypes,\n TimestampRequestError,\n TimestampRequestOptions\n} from './types/timestamp-request.type'\nimport type {\n TimestampProviderAuth,\n TimestampProviderBody,\n TimestampProviderOAuthUrl,\n TimestampProviderProxyConfig,\n TimestampProviderUrl\n} from './types/timestamp-provider.type'\nimport type { TempFileService } from '../util/TempFileService'\n\n/**\n * TimestampRequest class implements timestamp request\n * */\nexport class TimestampRequest {\n private tsRequest: TimestampRequestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/timestamp-query'\n }\n }\n\n constructor(\n private readonly tempFileService: TempFileService,\n private readonly tmpOptions: FileOptions,\n private readonly cleanupTempFns: ((...args: unknown[]) => unknown)[]\n ) {}\n\n /**\n * set request header\n * */\n setHeader(headers: Record): void {\n this.tsRequest = {\n ...this.tsRequest,\n headers\n }\n }\n\n /**\n * set request body\n * */\n setBody(body: BodyInit): void {\n this.tsRequest.body = body\n }\n\n /**\n * set request proxy\n * */\n setProxy(proxy: TimestampProviderProxyConfig): void {\n this.tsRequest.agent = new ProxyAgent({\n getProxyForUrl: (): string => proxy.url,\n rejectUnauthorized: !(proxy.allowUnauthorized ?? false)\n })\n }\n\n /**\n * set request encoding\n * */\n setEncoding(encoding: string | null): void {\n this.tsRequest.encoding = encoding\n }\n\n /**\n * set request encoding\n * */\n setResolveWithFullResponse(resolveWithFullResponse: boolean): void {\n this.tsRequest.resolveWithFullResponse = resolveWithFullResponse\n }\n\n /**\n * return tsRequest\n * */\n get(): TimestampRequestOptions {\n return this.tsRequest\n }\n\n /**\n * authStrategy method that set no auth request\n * */\n async authStrategy(\n requestType: TimestampRequestAuthTypes | undefined,\n url: TimestampProviderUrl,\n auth: TimestampProviderAuth | undefined,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n switch (requestType) {\n case 'basic':\n return this._getTimestampRequestBasic(url as string, auth!, tsQuery)\n case 'oauth':\n return await this._getTimestampRequestOauth(url as TimestampProviderOAuthUrl, auth!, body, proxy, tsQuery)\n case 'noAuth':\n return this._getTimestampRequestNoAuth(url as string, tsQuery)\n default:\n return this._getTimestampRequestNoAuth(url as string, tsQuery)\n }\n }\n\n /**\n * _getTimestampRequestBasic method that set basic auth request\n * */\n private _getTimestampRequestBasic(\n url: string,\n auth: TimestampProviderAuth,\n tsQuery: string\n ): TimestampRequestAuthResult {\n this.setHeader({\n ...this.tsRequest.headers,\n Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`\n })\n\n this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily\n this.setResolveWithFullResponse(true)\n this.setBody(tsQuery)\n\n return { requestUrl: url, tsRequest: this.get() }\n }\n\n /**\n * _getTimestampRequestOauth method that set oauth request\n * */\n private async _getTimestampRequestOauth(\n url: TimestampProviderOAuthUrl,\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n const oauthResult = await this._getOauth<{\n access_token?: string\n error?: TimestampRequestError\n }>(url.getTokenUrl, auth, body, proxy)\n if (!oauthResult?.access_token) {\n return { requestUrl: null, tsRequest: null, error: null }\n }\n\n if (oauthResult?.error) {\n return { requestUrl: null, tsRequest: null, error: oauthResult?.error }\n }\n\n const accessToken = oauthResult?.access_token\n\n if (accessToken) {\n this.setHeader({\n ...this.tsRequest.headers,\n Authorization: `Bearer ${accessToken}`\n })\n\n const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(\n this.tmpOptions,\n Buffer.from(tsQuery)\n )\n this.cleanupTempFns.push(cleanupCallback)\n\n const stats = fs.statSync(tempPath)\n const fileSizeInBytes = stats.size\n this.setBody(fs.createReadStream(tempPath))\n this.setHeader({\n ...this.tsRequest.headers,\n 'Content-length': fileSizeInBytes.toString()\n })\n }\n\n return { requestUrl: url?.getTimestampUrl, tsRequest: this.get(), error: null }\n }\n\n /**\n * _getTimestampRequestNoAuth method that set no auth request\n * */\n private _getTimestampRequestNoAuth(url: string, tsQuery: string): TimestampRequestAuthResult {\n this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily\n this.setResolveWithFullResponse(true)\n this.setBody(tsQuery)\n\n return { requestUrl: url, tsRequest: this.get() }\n }\n\n /**\n * _getOauth method that get oauth access_token\n **/\n private async _getOauth(\n url: string,\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined\n ): Promise {\n const tsRequest = await this._getOauthRequestSettings(auth, body, proxy)\n try {\n const response = await fetch(url, tsRequest)\n return (await response.json()) as ResponseType\n } catch (error) {\n return {\n error: {\n message: (error as Error).message,\n trace: error as Error\n }\n } as ResponseType\n }\n }\n\n /**\n * _getOauthRequestSettings method that set the request oath settings\n **/\n private async _getOauthRequestSettings(\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined\n ): Promise> {\n const tsRequest: TimestampRequestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`\n },\n body: new URLSearchParams(body)\n }\n\n if (proxy?.url) {\n tsRequest.agent = new ProxyAgent({\n getProxyForUrl: (): string => proxy.url,\n rejectUnauthorized: !(proxy.allowUnauthorized ?? false)\n })\n }\n\n return tsRequest\n }\n}\n","import { FileOptions as TempFileOptions } from 'tmp'\nimport { fetch } from '../patch/node-fetch'\n\nimport { TimestampRequest } from './TimestampRequest'\nimport { TempFileService } from '../util/TempFileService'\nimport type { TimestampRequestAuthResult, TimestampRequestAuthTypes } from './types/timestamp-request.type'\nimport type {\n TimestampProvider,\n TimestampProviderAuth,\n TimestampProviderBody,\n TimestampProviderOAuthUrl,\n TimestampProviderProxyConfig,\n TimestampProviderUrl\n} from './types/timestamp-provider.type'\nimport type { TimestampLog } from './types/timestamp-log.type'\n\n/**\n * TrustedTimestampRequest service implements timestamp request and sorted providers\n * */\nexport class TrustedTimestampRequest {\n private readonly cleanupTempFns: (() => unknown)[] = []\n private readonly providers: TimestampProvider[]\n\n constructor(\n providers: TimestampProvider[],\n private readonly tempFileService: TempFileService,\n private readonly tmpOptions: TempFileOptions\n ) {\n this.providers = this._sortedProviders(providers)\n }\n\n /**\n * getTimestamp method that calls the service providers in sequence, requesting a timestamp\n **/\n async getTimestamp(\n tsQuery: string\n ): Promise<{ tsr: Buffer | null; providerName: string; logHistory: TimestampLog[] }> {\n let tsr = null\n let providerName = ''\n const logHistory: TimestampLog[] = []\n\n for (const provider of this.providers) {\n if (!tsr) {\n const { name, url, auth, body, proxy } = provider\n\n if (!name) {\n throw new Error('Provider name is missing')\n }\n if (!url) {\n throw new Error('Provider url is missing')\n }\n\n const { timestampToken, log } = await this._getTimeStampToken(name, url, auth, body, proxy, tsQuery)\n logHistory.push(log)\n tsr = timestampToken\n providerName = name\n }\n }\n\n return { tsr, providerName, logHistory }\n }\n\n /**\n * sortedProviders method that sorting the providers according to priority\n **/\n private _sortedProviders(providers: TimestampProvider[]): TimestampProvider[] {\n const priorityProviders: TimestampProvider[] = []\n const nonPriorityProviders: TimestampProvider[] = []\n\n providers.forEach(provider => {\n if (provider?.priority) {\n priorityProviders.push(provider)\n } else {\n nonPriorityProviders.push(provider)\n }\n })\n\n const sortedProviders = priorityProviders.toSorted((a, b) => a.priority! - b.priority!)\n\n return sortedProviders.concat(nonPriorityProviders)\n }\n\n /**\n * sendTimestampRequest method that calls the provider\n **/\n private async _getTimeStampToken(\n name: string,\n url: TimestampProviderUrl,\n auth: TimestampProviderAuth | undefined,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise<{\n timestampToken: null | Buffer\n log: TimestampLog\n }> {\n const { requestUrl, tsRequest, error } = await this._getTimestampRequest(url, body, auth, proxy, tsQuery)\n if (error) {\n return {\n timestampToken: null,\n log: {\n info: { name, info: null, date: new Date(), url, response: null, error: error?.message },\n errorTrace: error?.trace\n }\n }\n }\n try {\n const response = await fetch(requestUrl!, tsRequest!)\n if (response.status !== 200) {\n throw new Error(`TSA response unsatisfactory: ${response.status} ${response.statusText}`)\n }\n\n return {\n timestampToken: Buffer.from((await response.arrayBuffer()) as unknown as string, 'utf8'), // TODO: fix type\n log: {\n info: { name, date: new Date(), url, response: `${response.status}, ${response.statusText}`, error: null },\n errorTrace: null\n }\n }\n } catch (error) {\n return {\n timestampToken: null,\n log: {\n info: { name, date: new Date(), url, response: null, error: (error as Error).message },\n errorTrace: error as Error\n }\n }\n } finally {\n for (const cleanUpFn of this.cleanupTempFns) {\n if (typeof cleanUpFn === 'function') {\n cleanUpFn()\n }\n }\n }\n }\n\n /**\n * getTimestampRequestSettings method that set the request settings\n **/\n private async _getTimestampRequest(\n url: TimestampProviderUrl,\n body: TimestampProviderBody | undefined,\n auth: TimestampProviderAuth | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n // send the request to the TSA\n const tsRequest = new TimestampRequest(this.tempFileService, this.tmpOptions, this.cleanupTempFns)\n\n if (proxy?.url) {\n tsRequest.setProxy(proxy)\n }\n\n let requestType: TimestampRequestAuthTypes | undefined\n if ((url as TimestampProviderOAuthUrl)?.getTokenUrl && tsQuery) {\n requestType = 'oauth'\n }\n if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && auth?.user && auth?.pass && tsQuery) {\n requestType = 'basic'\n }\n if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && !auth?.user) {\n requestType = 'noAuth'\n }\n\n return await tsRequest.authStrategy(requestType, url, auth, body, proxy, tsQuery)\n }\n}\n","import * as childProcess from 'node:child_process'\nimport type { ExecOptions } from 'node:child_process'\n\ninterface Logger {\n info: (log: string, ...args: unknown[]) => unknown\n error: (log: string, ...args: unknown[]) => unknown\n}\n\nexport function exec(\n command: string,\n options: {\n encoding?: 'buffer'\n } & ExecOptions = {},\n logger?: Logger\n): Promise {\n return new Promise((resolve, reject) => {\n const process = childProcess.exec(command, options, (err, stdout, stderr) => {\n if (err) {\n return reject(err || new Error(stderr.toString() || `Failed to execute command: ${command}`))\n }\n\n return resolve(stdout as ReturnType)\n })\n\n if (logger) {\n process.stdout!.on('data', message => {\n message = message.trim()\n if (message) {\n logger.info(message)\n }\n })\n\n process.stderr!.on('data', message => {\n message = message.trim()\n if (message) {\n logger.error(message)\n }\n })\n }\n })\n}\n\nexport class ExecFileError extends Error {\n public stdout?: string\n public stderr?: string\n}\n\nexport function execFile(command: string, args: string[], options = {}): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n childProcess.execFile(command, args, options, (err, stdout, stderr) => {\n if (err) {\n const error = new ExecFileError(err ? err.message : stderr.toString() || `Failed to execute file: ${command}`)\n error.stdout = stdout\n error.stderr = stderr\n return reject(error)\n }\n\n resolve({ stdout, stderr })\n })\n })\n}\n","import { exec } from '../util/child_process_promise'\n\nexport async function getTsQuery(digest: string, digestFormat: string): Promise {\n // create a time stamp request based on the hash of a data file\n const queryCommand = `openssl ts -query -digest ${digest} -no_nonce -${digestFormat} -cert`\n\n return await exec(queryCommand, { encoding: 'buffer' }).catch(err => {\n throw new Error(`Failed to execute openssl ts -query command \"${queryCommand}\" ${err.message}`)\n })\n}\n\nexport function getTsVerify(\n digest: string,\n tempPath: string,\n isToken: boolean,\n certsLocation: string\n): Promise {\n // verify the response with openssl\n const verifyCommand = isToken\n ? `openssl ts -verify -digest ${digest} -token_in -in ${tempPath} -CApath ${certsLocation}`\n : `openssl ts -verify -digest ${digest} -in ${tempPath} -CApath ${certsLocation}`\n\n return exec(verifyCommand).catch(err => {\n throw new Error(`Failed to verify tsr \"${verifyCommand}\" ${err.message}`)\n })\n}\n\nexport async function getTsReply(inputTempPath: string, isToken: boolean): Promise {\n // get token info\n const replyCommand = isToken\n ? `openssl ts -reply -token_in -in ${inputTempPath} -text`\n : `openssl ts -reply -in ${inputTempPath} -text`\n return await exec(replyCommand).catch(err => {\n throw new Error(`Error executing openssl ts -reply command \"${replyCommand}\" ${err.message}`)\n })\n}\n\nexport async function generateTsReply(inputTempPath: string, tempPath: string): Promise {\n await exec(`openssl ts -reply -in \"${inputTempPath}\" -token_out -out \"${tempPath}\"`).catch(err => {\n throw new Error(`Error executing openssl ts -reply command \"${inputTempPath}\" ${err.message}`)\n })\n}\n\nexport async function extractCertFromToken(tstPath: string): Promise {\n return await exec(`openssl pkcs7 -inform der -in \"${tstPath}\" -print_certs`).catch(err => {\n throw new Error(`Error executing openssl pkcs7 command ${err.message}`)\n })\n}\n\nexport async function checkSslPath(): Promise {\n try {\n const stdout = await exec('which openssl')\n if (!stdout.toString()) {\n throw new Error('openssl is unavailable')\n }\n return stdout\n } catch (error) {\n throw new Error(`Unable to verify openssl installation ${(error as Error).message}`)\n }\n}\n","const supportedDigestForamts = [\n 'sha',\n 'sha1',\n 'mdc2',\n 'ripemd160',\n 'sha224',\n 'sha256',\n 'sha384',\n 'sha512',\n 'md2',\n 'md4',\n 'md5',\n 'dss1'\n]\n\nexport function checkDigestFormat(format: string): boolean {\n return supportedDigestForamts.includes(format)\n}\n\nexport function checkDigest(digest: string): boolean {\n return /^([0-9A-F])+$/i.test(digest)\n}\n\nexport function normalizeDigestFormat(format: string): string {\n return format\n .replace(/^-/, '') // -sha256\n .replace(/-/g, '') // sha-256\n}\n","import fs from 'node:fs/promises'\nimport util from 'node:util'\nimport tmp from 'tmp'\n\ntmp.setGracefulCleanup()\n\nconst tmpFile = util.promisify(\n (\n options: tmp.FileOptions,\n cb: (error: Error | null, results: [string, number | undefined, () => void]) => unknown\n ) => {\n tmp.file(options, (err, ...results) => cb(err, results))\n }\n)\n\nexport class TempFileService {\n /**\n * Utility to create a temp file with content\n * */\n async createTempFile(\n options: tmp.FileOptions,\n content?: Buffer\n ): Promise<{ tempPath: string; fd: number | undefined; cleanupCallback: () => void }> {\n try {\n const [tempPath, fd, cleanupCallback] = await tmpFile(options)\n if (content) {\n await fs.writeFile(tempPath, content as unknown as string)\n }\n return { tempPath, fd, cleanupCallback }\n } catch (err) {\n throw new Error(`Failed to create temp file ${err}`)\n }\n }\n}\n","import { CreatedTimestampToken } from '../types/timestamp-token.type'\n\nexport type CreateTimestampTokenErrorContext = Partial>\n\n/**\n * Custom error class that encapsulates context about token creation, including the provider used and the associated log history\n */\nexport class CreateTimestampTokenError extends Error {\n constructor(\n message: string,\n readonly context: CreateTimestampTokenErrorContext = {},\n options?: ErrorOptions\n ) {\n super(message, options)\n }\n}\n","import { CertService } from '@techteamer/cert-utils'\nimport { FileOptions as TempFileOptions } from 'tmp'\n\nimport { TimestampInfo } from './TrustedTimestampInfo'\nimport { TrustedTimestampRequest } from './TrustedTimestampRequest'\nimport {\n checkSslPath,\n extractCertFromToken,\n generateTsReply,\n getTsQuery,\n getTsReply,\n getTsVerify\n} from './TrustedTimestampCommand'\nimport { checkDigest, checkDigestFormat, normalizeDigestFormat } from './TrustedTimestampCheck'\nimport { TempFileService } from '../util/TempFileService'\nimport { CreateTimestampTokenError } from './error/create-timestamp-token.error'\nimport type { TimestampConfig } from './types/timestamp-config.type'\nimport type { TimestampProvider } from './types/timestamp-provider.type'\nimport type { CreatedTimestampToken, Timestamp } from './types/timestamp-token.type'\n\n/**\n * OpenSSL docs: https://www.openssl.org/docs/manmaster/man1/ts.html\n *\n * Certificate Installation with OpenSSL: http://gagravarr.org/writing/openssl-certs/others.shtml\n *\n * Trustedtimestamp service implements the generate, import and verification of timestamps\n *\n * */\nexport class TrustedTimestampService {\n private readonly tmpOptions: TempFileOptions = { prefix: 'request-', postfix: '.tsr' }\n private tempFileService!: TempFileService\n private certService!: CertService\n private providers!: TimestampProvider[]\n private certsLocation!: string\n private timestampRequest!: TrustedTimestampRequest\n\n constructor(\n private readonly timestampInfoType: 'normal' | 'short' = 'normal',\n private readonly config: TimestampConfig = {} as TimestampConfig,\n private readonly encoding = 'latin1'\n ) {\n this._init()\n }\n\n /**\n * init method that sets the config and instantiates the required services\n * */\n private _init(): void {\n if (this.config) {\n if (!this.config?.certsLocation) {\n throw new Error('trustedTimestamp config \"certsLocation\" missing!')\n }\n\n if (!this.config?.providers?.length) {\n throw new Error('trustedTimestamp config \"providers\" missing or empty!')\n }\n\n this.tempFileService = new TempFileService()\n this.certService = new CertService(this.encoding)\n this.providers = this.config.providers\n this.certsLocation = this.config.certsLocation\n this.timestampRequest = new TrustedTimestampRequest(this.providers, this.tempFileService, this.tmpOptions)\n }\n }\n\n /**\n * Utility method that resolves to a TimestampInfo object containing parsed info from the tsr\n * */\n async getTimestampInfo(tsr: Buffer, isToken = false): Promise {\n const cleanupTempFns: (() => unknown)[] = []\n let inputTempPath = ''\n\n try {\n const tsrtmp = await this.tempFileService.createTempFile(this.tmpOptions, tsr)\n inputTempPath = tsrtmp.tempPath\n cleanupTempFns.push(tsrtmp.cleanupCallback)\n\n const responseText = await getTsReply(inputTempPath, isToken)\n const timestampInfo = new TimestampInfo(this.timestampInfoType, responseText)\n\n // get cert info\n\n try {\n // get raw token if the input was a whole response (TimestampResponse->TimestampToken)\n let tstPath\n if (isToken) {\n tstPath = inputTempPath\n } else {\n const tmp = await this.tempFileService.createTempFile(this.tmpOptions)\n await generateTsReply(inputTempPath, tmp.tempPath)\n tstPath = tmp.tempPath\n cleanupTempFns.push(tmp.cleanupCallback)\n }\n\n // extract cert from token\n const x509Cert = await extractCertFromToken(tstPath)\n // parse cert\n const certInfo = await this.certService.parseCert(Buffer.from(x509Cert), '', this.certService.CertType.PEM)\n\n if (this.timestampInfoType === 'normal') {\n timestampInfo.setCertInfo(certInfo)\n }\n } catch (err) {\n throw new Error('Unable to get cert info from timestamp token', err as Error)\n }\n\n return timestampInfo\n } catch (err) {\n return new TimestampInfo(this.timestampInfoType, null!, (err as Error).message)\n } finally {\n for (const cleanUpFn of cleanupTempFns) {\n if (typeof cleanUpFn === 'function') {\n cleanUpFn()\n }\n }\n }\n }\n\n /**\n * Returns a TimestampToken instance for a hash digest and a hash algorithm.\n * It requests a token from the TSA and verifies the received response.\n * The returned timestamp token represents the token\n * and contains the tsr with the verification result.\n * */\n async createTimestampToken(digest: string, hashAlgorithm: string, dataSize: number): Promise {\n const digestFormat = normalizeDigestFormat(hashAlgorithm)\n\n try {\n if (!checkDigestFormat(digestFormat)) {\n throw new Error(`Unknown digest format: ${hashAlgorithm}`)\n }\n if (!checkDigest(digest)) {\n throw new Error(`Invalid digest: ${digest}`)\n }\n\n const tsQuery = await getTsQuery(digest, digestFormat)\n console.log('!!!!!!!!!!!!!!!')\n console.log(tsQuery)\n const { tsr, providerName, logHistory } = await this.timestampRequest.getTimestamp(tsQuery)\n if (!tsr) {\n throw new CreateTimestampTokenError('Failed to create trusted timestamp, no provider was available', {\n providerName,\n logHistory\n })\n }\n const timestampInfo = await this.getTimestampInfo(tsr, false)\n const certExpiry = timestampInfo.certInfo?.notAfter || null\n const tt: Timestamp = {\n digest,\n hashAlgorithm,\n dataSize,\n tsr,\n isToken: false,\n certExpiry,\n verified: null // not yet\n }\n\n tt.verified = await this.verifyToken(tt, digest, dataSize)\n\n return { timestamp: tt, providerName, logHistory }\n } catch (error) {\n if (error instanceof CreateTimestampTokenError) {\n throw error\n }\n\n throw new CreateTimestampTokenError(`Failed to create trusted timestamp ${(error as Error).message}`)\n }\n }\n\n /**\n * Verify if a timestamp token corresponds to a particular hash of data\n * */\n async verifyToken(timestampToken: Timestamp, digest: string, dataSize: number): Promise {\n if (timestampToken.dataSize !== dataSize) {\n throw new Error(\n `Timestamp token verification failed: The provided data size (${dataSize}) does not match the time stamped size (${timestampToken.dataSize}).`\n )\n }\n\n if (timestampToken.digest !== digest) {\n throw new Error(\n `Timestamp token verification failed: The provided digest (${digest}) does not match the time stamped digest (${timestampToken.digest}).`\n )\n }\n\n // verify token\n return await this.verifyTsr(digest, timestampToken.tsr, timestampToken.isToken)\n }\n\n /**\n * Verify a hash digest against a timestamp response file\n * */\n async verifyTsr(digest: string, tsr: Buffer, isToken = false): Promise {\n let cleanupTempFile = null\n\n try {\n if (!checkDigest(digest)) {\n throw new Error(`Invalid digest: ${digest}`)\n }\n\n // save the tsr on disk because openssl can only read it from file\n const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(this.tmpOptions, tsr)\n cleanupTempFile = cleanupCallback\n\n const stdout = await getTsVerify(digest, tempPath, isToken, this.certsLocation)\n\n const verificationResult = /Verification: OK/i.test(stdout)\n\n if (cleanupTempFile) {\n cleanupTempFile()\n }\n\n return verificationResult\n } catch (err) {\n if (typeof cleanupTempFile === 'function') {\n cleanupTempFile()\n }\n\n throw new Error(`Failed to verify tsr ${(err as Error).message}`)\n }\n }\n\n /**\n * testService method that check the ssl installation\n * */\n async testService(): Promise {\n return await checkSslPath()\n }\n}\n"],"names":["ProxyAgent","childProcess","fs","CertService"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"timestamp_config.cjs","sources":["../../src/util/regexParser.ts","../../src/trustedTimestamp/TrustedTimestampInfo.ts","../../src/patch/node-fetch.ts","../../src/trustedTimestamp/TimestampRequest.ts","../../src/trustedTimestamp/TrustedTimestampRequest.ts","../../src/util/child_process_promise.ts","../../src/trustedTimestamp/TrustedTimestampCommand.ts","../../src/trustedTimestamp/TrustedTimestampCheck.ts","../../src/util/TempFileService.ts","../../src/trustedTimestamp/error/create-timestamp-token.error.ts","../../src/trustedTimestamp/TrustedTimestampService.ts"],"sourcesContent":["function parseRegex(\n text: string,\n regex: RegExp,\n groups: Groups,\n revive: (\n parameter: Groups extends number\n ? string\n : Groups extends (string | number)[]\n ? Record\n : RegExpMatchArray\n ) => ReviveResult = value => value as unknown as ReviveResult\n): ReviveResult | null | undefined {\n const result = text.match(regex)\n if (!result) {\n return null\n }\n\n if (!groups) {\n return (revive as (parameter: RegExpMatchArray) => ReviveResult)(result)\n }\n\n if (typeof groups === 'number') {\n return (revive as (parameter: string) => ReviveResult)(result[groups])\n }\n\n if (Array.isArray(groups)) {\n const ret: Record = {}\n groups.forEach((name, i) => {\n ret[name] = result[i + 1]\n })\n return (revive as (parameter: Record) => ReviveResult)(ret)\n }\n}\n\nfunction createParser(\n regex: RegExp,\n groups: number | number[],\n revive: (value: unknown) => ReviveResult\n): (text: string) => ReviveResult | null | undefined {\n return (text: string) => {\n return parseRegex(text, regex, groups, revive)\n }\n}\n\nexport { createParser as create }\nexport { parseRegex }\n","import { CertService } from '@techteamer/cert-utils'\nimport { parseRegex } from '../util/regexParser'\n\ninterface TSA {\n C: string | null\n L: string | null\n O: string | null\n OU: string | null\n CN: string | null\n}\n\n/**\n *\n * Status info:\n * Status: Granted.\n * Status description: unspecified\n * Failure info: unspecified\n *\n * TST info:\n * Version: 1\n * Policy OID: 1.3.6.1.4.1.21528.2.2.99\n * Hash Algorithm: sha256\n * Message data:\n * 0000 - c5 3e 94 56 aa 61 ed 56-49 69 74 29 1e 01 d7 2a .>.V.a.VIit)...*\n * 0010 - 64 cc 24 84 d2 a2 31 4d-33 b6 ca c8 98 23 03 b9 d.$...1M3....#..\n * Serial number: 0x0308441E\n * Time stamp: Jan 30 13:45:20 2018 GMT\n * Accuracy: 0x01 seconds, unspecified millis, unspecified micros\n * Ordering: no\n * Nonce: unspecified\n * TSA: DirName:/C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=e-Szigno Test TSA2\n * Extensions:\n * */\nexport class TimestampInfo {\n error: string | null = null\n version: number | null = null\n policyOID: string | null = null\n hashAlgorithm: string | null = null\n hash: string | null = null\n serialNumber: string | null = null\n timeStamp: Date | null = null\n timeStampDate: Date | null = null\n accuracy: number | null = null\n ordering: boolean | null = null\n nonce: string | null = null\n issuer: string | null = null\n tsa: TSA | null = null\n certInfo: CertService['CertInfo'] | null = null\n\n constructor(timestampInfoType: 'normal' | 'short' = 'normal', tsText: string, error: string | null = null) {\n this.error = null\n this.version = null\n this.policyOID = null\n this.hashAlgorithm = null\n this.serialNumber = null\n this.timeStamp = null\n this.accuracy = null\n this.ordering = null\n this.nonce = null\n this.tsa = null\n\n if (error) {\n this.error = error\n } else {\n if (timestampInfoType === 'short') {\n this.parseOpensslOutputShort(tsText)\n } else {\n this.hash = null\n this.timeStampDate = null\n this.issuer = null\n this.certInfo = null\n this.parseOpensslOutput(tsText)\n }\n }\n }\n\n setCertInfo(certInfo: CertService['CertInfo'] | null): void {\n this.certInfo = certInfo\n }\n\n parseOpensslOutput(tsText: string): void {\n this.version = parseRegex(tsText, /Version:\\s*([^\\n\\r]+)/, 1, parseInt)!\n this.policyOID = parseRegex(tsText, /Policy OID:\\s*([^\\n\\r]+)/, 1)!\n this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\\s*([^\\n\\r]+)/, 1)!\n this.hash = tsText\n .match(/\\d{4} - .*?\\s{2}/g)!\n .map(line => {\n return line.replace(/\\d{4} - /g, '').replace(/[\\s*-]/g, '')\n })\n .join('')\n this.serialNumber = parseRegex(tsText, /Serial number:\\s*([^\\n\\r]+)/, 1)!\n this.timeStamp = parseRegex(tsText, /Time stamp:\\s*([^\\n\\r]+)/, 1)!\n this.timeStampDate = new Date(this.timeStamp)\n this.accuracy = parseRegex(\n tsText,\n /Accuracy:\\s*(.+) seconds, (.+) millis, (.+) micros/,\n ['s', 'm', 'u'],\n ({ s, m, u }) => {\n const _s = Number(s === 'unspecified' ? 0 : s)\n const _m = Number(m === 'unspecified' ? 0 : m)\n const _u = Number(u === 'unspecified' ? 0 : u)\n return _s * 1000 + _m + _u / 1000\n }\n )!\n this.ordering = parseRegex(tsText, /Ordering:\\s*([^\\n\\r]+)/, 1, ordering => ordering !== 'no')!\n this.nonce = parseRegex(tsText, /Nonce:\\s*([^\\n\\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))!\n this.issuer = parseRegex(tsText, /TSA:\\s*DirName:\\s*([^\\n\\r]+)/, 1)!\n this.tsa = parseRegex(tsText, /TSA:\\s*DirName:\\s*([^\\n\\r]+)/, 1, (result): TSA => {\n const m = result.match(/\\/\\w{1,2}=[^/]+/g) || []\n\n return m.reduce(\n (obj, part) => {\n const [, label, value] = part.match(/\\/(\\w{1,2})=([^/]+)/) || []\n if (!label || !value) {\n return obj\n }\n obj[label as keyof TSA] = value\n return obj\n },\n { C: null, L: null, O: null, OU: null, CN: null } as TSA\n )\n })!\n }\n\n parseOpensslOutputShort(tsText: string): void {\n this.version = parseRegex(tsText, /Version:\\s*([^\\n\\r]+)/, 1, parseInt)!\n this.policyOID = parseRegex(tsText, /Policy OID:\\s*([^\\n\\r]+)/, 1)!\n this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\\s*([^\\n\\r]+)/, 1)!\n this.serialNumber = parseRegex(tsText, /Serial number:\\s*([^\\n\\r]+)/, 1)!\n this.timeStamp = parseRegex(tsText, /Time stamp:\\s*([^\\n\\r]+)/, 1, dateString => new Date(dateString))!\n this.accuracy = parseRegex(\n tsText,\n /Accuracy:\\s*(.+) seconds, (.+) millis, (.+) micros/,\n ['s', 'm', 'u'],\n ({ s, m, u }) => {\n const _s = Number(s === 'unspecified' ? 0 : s)\n const _m = Number(m === 'unspecified' ? 0 : m)\n const _u = Number(u === 'unspecified' ? 0 : u)\n return _s * 1000 + _m + _u / 1000\n }\n )!\n this.ordering = parseRegex(tsText, /Ordering:\\s*([^\\n\\r]+)/, 1, ordering => ordering !== 'no')!\n this.nonce = parseRegex(tsText, /Nonce:\\s*([^\\n\\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))!\n this.tsa = parseRegex(tsText, /TSA:\\s*([^\\n\\r]+)/, 1, v => {\n const m = v.match(/\\/\\w{1,2}=[^/]+/g) || []\n\n return m.reduce(\n (obj, part) => {\n const [, label, value] = part.match(/\\/(\\w{1,2})=([^/]+)/) || []\n if (!label || !value) {\n return obj\n }\n obj[label as keyof TSA] = value\n return obj\n },\n { C: null, L: null, O: null, OU: null, CN: null } as TSA\n )\n })!\n }\n}\n","import type { RequestInfo, RequestInit, Response } from 'node-fetch'\n\nexport const fetch = async (url: URL | RequestInfo, init?: RequestInit): Promise => {\n const { default: fetch } = await import('node-fetch')\n return fetch(url, init)\n}\n","import type { BodyInit } from 'node-fetch'\nimport { fetch } from '../patch/node-fetch'\nimport fs from 'node:fs'\nimport { ProxyAgent } from 'proxy-agent'\nimport type { FileOptions } from 'tmp'\n\nimport type {\n TimestampRequestAuthResult,\n TimestampRequestAuthTypes,\n TimestampRequestError,\n TimestampRequestOptions\n} from './types/timestamp-request.type'\nimport type {\n TimestampProviderAuth,\n TimestampProviderBody,\n TimestampProviderOAuthUrl,\n TimestampProviderProxyConfig,\n TimestampProviderUrl\n} from './types/timestamp-provider.type'\nimport type { TempFileService } from '../util/TempFileService'\n\n/**\n * TimestampRequest class implements timestamp request\n * */\nexport class TimestampRequest {\n private tsRequest: TimestampRequestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/timestamp-query'\n }\n }\n\n constructor(\n private readonly tempFileService: TempFileService,\n private readonly tmpOptions: FileOptions,\n private readonly cleanupTempFns: ((...args: unknown[]) => unknown)[]\n ) {}\n\n /**\n * set request header\n * */\n setHeader(headers: Record): void {\n this.tsRequest = {\n ...this.tsRequest,\n headers\n }\n }\n\n /**\n * set request body\n * */\n setBody(body: BodyInit): void {\n this.tsRequest.body = body\n }\n\n /**\n * set request proxy\n * */\n setProxy(proxy: TimestampProviderProxyConfig): void {\n this.tsRequest.agent = new ProxyAgent({\n getProxyForUrl: (): string => proxy.url,\n rejectUnauthorized: !(proxy.allowUnauthorized ?? false)\n })\n }\n\n /**\n * set request encoding\n * */\n setEncoding(encoding: string | null): void {\n this.tsRequest.encoding = encoding\n }\n\n /**\n * set request encoding\n * */\n setResolveWithFullResponse(resolveWithFullResponse: boolean): void {\n this.tsRequest.resolveWithFullResponse = resolveWithFullResponse\n }\n\n /**\n * return tsRequest\n * */\n get(): TimestampRequestOptions {\n return this.tsRequest\n }\n\n /**\n * authStrategy method that set no auth request\n * */\n async authStrategy(\n requestType: TimestampRequestAuthTypes | undefined,\n url: TimestampProviderUrl,\n auth: TimestampProviderAuth | undefined,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n switch (requestType) {\n case 'basic':\n return this._getTimestampRequestBasic(url as string, auth!, tsQuery)\n case 'oauth':\n return await this._getTimestampRequestOauth(url as TimestampProviderOAuthUrl, auth!, body, proxy, tsQuery)\n case 'noAuth':\n return this._getTimestampRequestNoAuth(url as string, tsQuery)\n default:\n return this._getTimestampRequestNoAuth(url as string, tsQuery)\n }\n }\n\n /**\n * _getTimestampRequestBasic method that set basic auth request\n * */\n private _getTimestampRequestBasic(\n url: string,\n auth: TimestampProviderAuth,\n tsQuery: string\n ): TimestampRequestAuthResult {\n this.setHeader({\n ...this.tsRequest.headers,\n Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`\n })\n\n this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily\n this.setResolveWithFullResponse(true)\n this.setBody(tsQuery)\n\n return { requestUrl: url, tsRequest: this.get() }\n }\n\n /**\n * _getTimestampRequestOauth method that set oauth request\n * */\n private async _getTimestampRequestOauth(\n url: TimestampProviderOAuthUrl,\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n const oauthResult = await this._getOauth<{\n access_token?: string\n error?: TimestampRequestError\n }>(url.getTokenUrl, auth, body, proxy)\n if (!oauthResult?.access_token) {\n return { requestUrl: null, tsRequest: null, error: null }\n }\n\n if (oauthResult?.error) {\n return { requestUrl: null, tsRequest: null, error: oauthResult?.error }\n }\n\n const accessToken = oauthResult?.access_token\n\n if (accessToken) {\n this.setHeader({\n ...this.tsRequest.headers,\n Authorization: `Bearer ${accessToken}`\n })\n\n const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(\n this.tmpOptions,\n Buffer.from(tsQuery)\n )\n this.cleanupTempFns.push(cleanupCallback)\n\n const stats = fs.statSync(tempPath)\n const fileSizeInBytes = stats.size\n this.setBody(fs.createReadStream(tempPath))\n this.setHeader({\n ...this.tsRequest.headers,\n 'Content-length': fileSizeInBytes.toString()\n })\n }\n\n return { requestUrl: url?.getTimestampUrl, tsRequest: this.get(), error: null }\n }\n\n /**\n * _getTimestampRequestNoAuth method that set no auth request\n * */\n private _getTimestampRequestNoAuth(url: string, tsQuery: string): TimestampRequestAuthResult {\n this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily\n this.setResolveWithFullResponse(true)\n this.setBody(tsQuery)\n\n return { requestUrl: url, tsRequest: this.get() }\n }\n\n /**\n * _getOauth method that get oauth access_token\n **/\n private async _getOauth(\n url: string,\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined\n ): Promise {\n const tsRequest = await this._getOauthRequestSettings(auth, body, proxy)\n try {\n const response = await fetch(url, tsRequest)\n return (await response.json()) as ResponseType\n } catch (error) {\n return {\n error: {\n message: (error as Error).message,\n trace: error as Error\n }\n } as ResponseType\n }\n }\n\n /**\n * _getOauthRequestSettings method that set the request oath settings\n **/\n private async _getOauthRequestSettings(\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined\n ): Promise> {\n const tsRequest: TimestampRequestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`\n },\n body: new URLSearchParams(body)\n }\n\n if (proxy?.url) {\n tsRequest.agent = new ProxyAgent({\n getProxyForUrl: (): string => proxy.url,\n rejectUnauthorized: !(proxy.allowUnauthorized ?? false)\n })\n }\n\n return tsRequest\n }\n}\n","import { FileOptions as TempFileOptions } from 'tmp'\nimport { fetch } from '../patch/node-fetch'\n\nimport { TimestampRequest } from './TimestampRequest'\nimport { TempFileService } from '../util/TempFileService'\nimport type { TimestampRequestAuthResult, TimestampRequestAuthTypes } from './types/timestamp-request.type'\nimport type {\n TimestampProvider,\n TimestampProviderAuth,\n TimestampProviderBody,\n TimestampProviderOAuthUrl,\n TimestampProviderProxyConfig,\n TimestampProviderUrl\n} from './types/timestamp-provider.type'\nimport type { TimestampLog } from './types/timestamp-log.type'\n\n/**\n * TrustedTimestampRequest service implements timestamp request and sorted providers\n * */\nexport class TrustedTimestampRequest {\n private readonly cleanupTempFns: (() => unknown)[] = []\n private readonly providers: TimestampProvider[]\n\n constructor(\n providers: TimestampProvider[],\n private readonly tempFileService: TempFileService,\n private readonly tmpOptions: TempFileOptions\n ) {\n this.providers = this._sortedProviders(providers)\n }\n\n /**\n * getTimestamp method that calls the service providers in sequence, requesting a timestamp\n **/\n async getTimestamp(\n tsQuery: string\n ): Promise<{ tsr: Buffer | null; providerName: string; logHistory: TimestampLog[] }> {\n let tsr = null\n let providerName = ''\n const logHistory: TimestampLog[] = []\n\n for (const provider of this.providers) {\n if (!tsr) {\n const { name, url, auth, body, proxy } = provider\n\n if (!name) {\n throw new Error('Provider name is missing')\n }\n if (!url) {\n throw new Error('Provider url is missing')\n }\n\n const { timestampToken, log } = await this._getTimeStampToken(name, url, auth, body, proxy, tsQuery)\n logHistory.push(log)\n tsr = timestampToken\n providerName = name\n }\n }\n\n return { tsr, providerName, logHistory }\n }\n\n /**\n * sortedProviders method that sorting the providers according to priority\n **/\n private _sortedProviders(providers: TimestampProvider[]): TimestampProvider[] {\n const priorityProviders: TimestampProvider[] = []\n const nonPriorityProviders: TimestampProvider[] = []\n\n providers.forEach(provider => {\n if (provider?.priority) {\n priorityProviders.push(provider)\n } else {\n nonPriorityProviders.push(provider)\n }\n })\n\n const sortedProviders = priorityProviders.toSorted((a, b) => a.priority! - b.priority!)\n\n return sortedProviders.concat(nonPriorityProviders)\n }\n\n /**\n * sendTimestampRequest method that calls the provider\n **/\n private async _getTimeStampToken(\n name: string,\n url: TimestampProviderUrl,\n auth: TimestampProviderAuth | undefined,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise<{\n timestampToken: null | Buffer\n log: TimestampLog\n }> {\n const { requestUrl, tsRequest, error } = await this._getTimestampRequest(url, body, auth, proxy, tsQuery)\n if (error) {\n return {\n timestampToken: null,\n log: {\n info: { name, info: null, date: new Date(), url, response: null, error: error?.message },\n errorTrace: error?.trace\n }\n }\n }\n try {\n const response = await fetch(requestUrl!, tsRequest!)\n if (response.status !== 200) {\n throw new Error(`TSA response unsatisfactory: ${response.status} ${response.statusText}`)\n }\n\n return {\n timestampToken: Buffer.from((await response.arrayBuffer()) as unknown as string, 'utf8'), // TODO: fix type\n log: {\n info: { name, date: new Date(), url, response: `${response.status}, ${response.statusText}`, error: null },\n errorTrace: null\n }\n }\n } catch (error) {\n return {\n timestampToken: null,\n log: {\n info: { name, date: new Date(), url, response: null, error: (error as Error).message },\n errorTrace: error as Error\n }\n }\n } finally {\n for (const cleanUpFn of this.cleanupTempFns) {\n if (typeof cleanUpFn === 'function') {\n cleanUpFn()\n }\n }\n }\n }\n\n /**\n * getTimestampRequestSettings method that set the request settings\n **/\n private async _getTimestampRequest(\n url: TimestampProviderUrl,\n body: TimestampProviderBody | undefined,\n auth: TimestampProviderAuth | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n // send the request to the TSA\n const tsRequest = new TimestampRequest(this.tempFileService, this.tmpOptions, this.cleanupTempFns)\n\n if (proxy?.url) {\n tsRequest.setProxy(proxy)\n }\n\n let requestType: TimestampRequestAuthTypes | undefined\n if ((url as TimestampProviderOAuthUrl)?.getTokenUrl && tsQuery) {\n requestType = 'oauth'\n }\n if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && auth?.user && auth?.pass && tsQuery) {\n requestType = 'basic'\n }\n if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && !auth?.user) {\n requestType = 'noAuth'\n }\n\n return await tsRequest.authStrategy(requestType, url, auth, body, proxy, tsQuery)\n }\n}\n","import * as childProcess from 'node:child_process'\nimport type { ExecOptions } from 'node:child_process'\n\ninterface Logger {\n info: (log: string, ...args: unknown[]) => unknown\n error: (log: string, ...args: unknown[]) => unknown\n}\n\nexport function exec(\n command: string,\n options: {\n encoding?: 'buffer'\n } & ExecOptions = {},\n logger?: Logger\n): Promise {\n return new Promise((resolve, reject) => {\n const process = childProcess.exec(command, options, (err, stdout, stderr) => {\n if (err) {\n return reject(err || new Error(stderr.toString() || `Failed to execute command: ${command}`))\n }\n\n return resolve(stdout as ReturnType)\n })\n\n if (logger) {\n process.stdout!.on('data', message => {\n message = message.trim()\n if (message) {\n logger.info(message)\n }\n })\n\n process.stderr!.on('data', message => {\n message = message.trim()\n if (message) {\n logger.error(message)\n }\n })\n }\n })\n}\n\nexport class ExecFileError extends Error {\n public stdout?: string\n public stderr?: string\n}\n\nexport function execFile(command: string, args: string[], options = {}): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n childProcess.execFile(command, args, options, (err, stdout, stderr) => {\n if (err) {\n const error = new ExecFileError(err ? err.message : stderr.toString() || `Failed to execute file: ${command}`)\n error.stdout = stdout\n error.stderr = stderr\n return reject(error)\n }\n\n resolve({ stdout, stderr })\n })\n })\n}\n","import { exec } from '../util/child_process_promise'\n\nexport async function getTsQuery(digest: string, digestFormat: string): Promise {\n // create a time stamp request based on the hash of a data file\n const queryCommand = `openssl ts -query -digest ${digest} -no_nonce -${digestFormat} -cert`\n\n return await exec(queryCommand, { encoding: 'buffer' }).catch(err => {\n throw new Error(`Failed to execute openssl ts -query command \"${queryCommand}\" ${err.message}`)\n })\n}\n\nexport function getTsVerify(\n digest: string,\n tempPath: string,\n isToken: boolean,\n certsLocation: string\n): Promise {\n // verify the response with openssl\n const verifyCommand = isToken\n ? `openssl ts -verify -digest ${digest} -token_in -in ${tempPath} -CApath ${certsLocation}`\n : `openssl ts -verify -digest ${digest} -in ${tempPath} -CApath ${certsLocation}`\n\n return exec(verifyCommand).catch(err => {\n throw new Error(`Failed to verify tsr \"${verifyCommand}\" ${err.message}`)\n })\n}\n\nexport async function getTsReply(inputTempPath: string, isToken: boolean): Promise {\n // get token info\n const replyCommand = isToken\n ? `openssl ts -reply -token_in -in ${inputTempPath} -text`\n : `openssl ts -reply -in ${inputTempPath} -text`\n return await exec(replyCommand).catch(err => {\n throw new Error(`Error executing openssl ts -reply command \"${replyCommand}\" ${err.message}`)\n })\n}\n\nexport async function generateTsReply(inputTempPath: string, tempPath: string): Promise {\n await exec(`openssl ts -reply -in \"${inputTempPath}\" -token_out -out \"${tempPath}\"`).catch(err => {\n throw new Error(`Error executing openssl ts -reply command \"${inputTempPath}\" ${err.message}`)\n })\n}\n\nexport async function extractCertFromToken(tstPath: string): Promise {\n return await exec(`openssl pkcs7 -inform der -in \"${tstPath}\" -print_certs`).catch(err => {\n throw new Error(`Error executing openssl pkcs7 command ${err.message}`)\n })\n}\n\nexport async function checkSslPath(): Promise {\n try {\n const stdout = await exec('which openssl')\n if (!stdout.toString()) {\n throw new Error('openssl is unavailable')\n }\n return stdout\n } catch (error) {\n throw new Error(`Unable to verify openssl installation ${(error as Error).message}`)\n }\n}\n","const supportedDigestForamts = [\n 'sha',\n 'sha1',\n 'mdc2',\n 'ripemd160',\n 'sha224',\n 'sha256',\n 'sha384',\n 'sha512',\n 'md2',\n 'md4',\n 'md5',\n 'dss1'\n]\n\nexport function checkDigestFormat(format: string): boolean {\n return supportedDigestForamts.includes(format)\n}\n\nexport function checkDigest(digest: string): boolean {\n return /^([0-9A-F])+$/i.test(digest)\n}\n\nexport function normalizeDigestFormat(format: string): string {\n return format\n .replace(/^-/, '') // -sha256\n .replace(/-/g, '') // sha-256\n}\n","import fs from 'node:fs/promises'\nimport util from 'node:util'\nimport tmp from 'tmp'\n\ntmp.setGracefulCleanup()\n\nconst tmpFile = util.promisify(\n (\n options: tmp.FileOptions,\n cb: (error: Error | null, results: [string, number | undefined, () => void]) => unknown\n ) => {\n tmp.file(options, (err, ...results) => cb(err, results))\n }\n)\n\nexport class TempFileService {\n /**\n * Utility to create a temp file with content\n * */\n async createTempFile(\n options: tmp.FileOptions,\n content?: Buffer\n ): Promise<{ tempPath: string; fd: number | undefined; cleanupCallback: () => void }> {\n try {\n const [tempPath, fd, cleanupCallback] = await tmpFile(options)\n if (content) {\n await fs.writeFile(tempPath, content as unknown as string)\n }\n return { tempPath, fd, cleanupCallback }\n } catch (err) {\n throw new Error(`Failed to create temp file ${err}`)\n }\n }\n}\n","import { CreatedTimestampToken } from '../types/timestamp-token.type'\n\nexport type CreateTimestampTokenErrorContext = Partial>\n\n/**\n * Custom error class that encapsulates context about token creation, including the provider used and the associated log history\n */\nexport class CreateTimestampTokenError extends Error {\n constructor(\n message: string,\n readonly context: CreateTimestampTokenErrorContext = {},\n options?: ErrorOptions\n ) {\n super(message, options)\n }\n}\n","import { CertService } from '@techteamer/cert-utils'\nimport { FileOptions as TempFileOptions } from 'tmp'\n\nimport { TimestampInfo } from './TrustedTimestampInfo'\nimport { TrustedTimestampRequest } from './TrustedTimestampRequest'\nimport {\n checkSslPath,\n extractCertFromToken,\n generateTsReply,\n getTsQuery,\n getTsReply,\n getTsVerify\n} from './TrustedTimestampCommand'\nimport { checkDigest, checkDigestFormat, normalizeDigestFormat } from './TrustedTimestampCheck'\nimport { TempFileService } from '../util/TempFileService'\nimport { CreateTimestampTokenError } from './error/create-timestamp-token.error'\nimport type { TimestampConfig } from './types/timestamp-config.type'\nimport type { TimestampProvider } from './types/timestamp-provider.type'\nimport type { CreatedTimestampToken, Timestamp } from './types/timestamp-token.type'\n\n/**\n * OpenSSL docs: https://www.openssl.org/docs/manmaster/man1/ts.html\n *\n * Certificate Installation with OpenSSL: http://gagravarr.org/writing/openssl-certs/others.shtml\n *\n * Trustedtimestamp service implements the generate, import and verification of timestamps\n *\n * */\nexport class TrustedTimestampService {\n private readonly tmpOptions: TempFileOptions = { prefix: 'request-', postfix: '.tsr' }\n private tempFileService!: TempFileService\n private certService!: CertService\n private providers!: TimestampProvider[]\n private certsLocation!: string\n private timestampRequest!: TrustedTimestampRequest\n\n constructor(\n private readonly timestampInfoType: 'normal' | 'short' = 'normal',\n private readonly config: TimestampConfig = {} as TimestampConfig,\n private readonly encoding = 'latin1'\n ) {\n this._init()\n }\n\n /**\n * init method that sets the config and instantiates the required services\n * */\n private _init(): void {\n if (this.config) {\n if (!this.config?.certsLocation) {\n throw new Error('trustedTimestamp config \"certsLocation\" missing!')\n }\n\n if (!this.config?.providers?.length) {\n throw new Error('trustedTimestamp config \"providers\" missing or empty!')\n }\n\n this.tempFileService = new TempFileService()\n this.certService = new CertService(this.encoding)\n this.providers = this.config.providers\n this.certsLocation = this.config.certsLocation\n this.timestampRequest = new TrustedTimestampRequest(this.providers, this.tempFileService, this.tmpOptions)\n }\n }\n\n /**\n * Utility method that resolves to a TimestampInfo object containing parsed info from the tsr\n * */\n async getTimestampInfo(tsr: Buffer, isToken = false): Promise {\n const cleanupTempFns: (() => unknown)[] = []\n let inputTempPath = ''\n\n try {\n const tsrtmp = await this.tempFileService.createTempFile(this.tmpOptions, tsr)\n inputTempPath = tsrtmp.tempPath\n cleanupTempFns.push(tsrtmp.cleanupCallback)\n\n const responseText = await getTsReply(inputTempPath, isToken)\n const timestampInfo = new TimestampInfo(this.timestampInfoType, responseText)\n\n // get cert info\n\n try {\n // get raw token if the input was a whole response (TimestampResponse->TimestampToken)\n let tstPath\n if (isToken) {\n tstPath = inputTempPath\n } else {\n const tmp = await this.tempFileService.createTempFile(this.tmpOptions)\n await generateTsReply(inputTempPath, tmp.tempPath)\n tstPath = tmp.tempPath\n cleanupTempFns.push(tmp.cleanupCallback)\n }\n\n // extract cert from token\n const x509Cert = await extractCertFromToken(tstPath)\n // parse cert\n const certInfo = await this.certService.parseCert(Buffer.from(x509Cert), '', this.certService.CertType.PEM)\n\n if (this.timestampInfoType === 'normal') {\n timestampInfo.setCertInfo(certInfo)\n }\n } catch (err) {\n throw new Error('Unable to get cert info from timestamp token', err as Error)\n }\n\n return timestampInfo\n } catch (err) {\n return new TimestampInfo(this.timestampInfoType, null!, (err as Error).message)\n } finally {\n for (const cleanUpFn of cleanupTempFns) {\n if (typeof cleanUpFn === 'function') {\n cleanUpFn()\n }\n }\n }\n }\n\n /**\n * Returns a TimestampToken instance for a hash digest and a hash algorithm.\n * It requests a token from the TSA and verifies the received response.\n * The returned timestamp token represents the token\n * and contains the tsr with the verification result.\n * */\n async createTimestampToken(digest: string, hashAlgorithm: string, dataSize: number): Promise {\n const digestFormat = normalizeDigestFormat(hashAlgorithm)\n\n try {\n if (!checkDigestFormat(digestFormat)) {\n throw new Error(`Unknown digest format: ${hashAlgorithm}`)\n }\n if (!checkDigest(digest)) {\n throw new Error(`Invalid digest: ${digest}`)\n }\n\n const tsQuery = await getTsQuery(digest, digestFormat)\n const { tsr, providerName, logHistory } = await this.timestampRequest.getTimestamp(tsQuery)\n if (!tsr) {\n throw new CreateTimestampTokenError('Failed to create trusted timestamp, no provider was available', {\n providerName,\n logHistory\n })\n }\n const timestampInfo = await this.getTimestampInfo(tsr, false)\n const certExpiry = timestampInfo.certInfo?.notAfter || null\n const tt: Timestamp = {\n digest,\n hashAlgorithm,\n dataSize,\n tsr,\n isToken: false,\n certExpiry,\n verified: null // not yet\n }\n\n tt.verified = await this.verifyToken(tt, digest, dataSize)\n\n return { timestamp: tt, providerName, logHistory }\n } catch (error) {\n if (error instanceof CreateTimestampTokenError) {\n throw error\n }\n\n throw new CreateTimestampTokenError(`Failed to create trusted timestamp ${(error as Error).message}`)\n }\n }\n\n /**\n * Verify if a timestamp token corresponds to a particular hash of data\n * */\n async verifyToken(timestampToken: Timestamp, digest: string, dataSize: number): Promise {\n if (timestampToken.dataSize !== dataSize) {\n throw new Error(\n `Timestamp token verification failed: The provided data size (${dataSize}) does not match the time stamped size (${timestampToken.dataSize}).`\n )\n }\n\n if (timestampToken.digest !== digest) {\n throw new Error(\n `Timestamp token verification failed: The provided digest (${digest}) does not match the time stamped digest (${timestampToken.digest}).`\n )\n }\n\n // verify token\n return await this.verifyTsr(digest, timestampToken.tsr, timestampToken.isToken)\n }\n\n /**\n * Verify a hash digest against a timestamp response file\n * */\n async verifyTsr(digest: string, tsr: Buffer, isToken = false): Promise {\n let cleanupTempFile = null\n\n try {\n if (!checkDigest(digest)) {\n throw new Error(`Invalid digest: ${digest}`)\n }\n\n // save the tsr on disk because openssl can only read it from file\n const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(this.tmpOptions, tsr)\n cleanupTempFile = cleanupCallback\n\n const stdout = await getTsVerify(digest, tempPath, isToken, this.certsLocation)\n\n const verificationResult = /Verification: OK/i.test(stdout)\n\n if (cleanupTempFile) {\n cleanupTempFile()\n }\n\n return verificationResult\n } catch (err) {\n if (typeof cleanupTempFile === 'function') {\n cleanupTempFile()\n }\n\n throw new Error(`Failed to verify tsr ${(err as Error).message}`)\n }\n }\n\n /**\n * testService method that check the ssl installation\n * */\n async testService(): Promise {\n return await checkSslPath()\n }\n}\n"],"names":["ProxyAgent","childProcess","fs","CertService"],"mappings":"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"} \ No newline at end of file diff --git a/package/timestamp_service/build/timestamp_config.mjs b/package/timestamp_service/build/timestamp_config.mjs index 548ad8a..a672a62 100644 --- a/package/timestamp_service/build/timestamp_config.mjs +++ b/package/timestamp_service/build/timestamp_config.mjs @@ -672,8 +672,6 @@ class TrustedTimestampService { throw new Error(`Invalid digest: ${digest}`); } const tsQuery = await getTsQuery(digest, digestFormat); - console.log('!!!!!!!!!!!!!!!'); - console.log(tsQuery); const { tsr, providerName, logHistory } = await this.timestampRequest.getTimestamp(tsQuery); if (!tsr) { throw new CreateTimestampTokenError('Failed to create trusted timestamp, no provider was available', { diff --git a/package/timestamp_service/build/timestamp_config.mjs.map b/package/timestamp_service/build/timestamp_config.mjs.map index 7f980ac..792d0b1 100644 --- a/package/timestamp_service/build/timestamp_config.mjs.map +++ b/package/timestamp_service/build/timestamp_config.mjs.map @@ -1 +1 @@ -{"version":3,"file":"timestamp_config.mjs","sources":["../../src/util/regexParser.ts","../../src/trustedTimestamp/TrustedTimestampInfo.ts","../../src/patch/node-fetch.ts","../../src/trustedTimestamp/TimestampRequest.ts","../../src/trustedTimestamp/TrustedTimestampRequest.ts","../../src/util/child_process_promise.ts","../../src/trustedTimestamp/TrustedTimestampCommand.ts","../../src/trustedTimestamp/TrustedTimestampCheck.ts","../../src/util/TempFileService.ts","../../src/trustedTimestamp/error/create-timestamp-token.error.ts","../../src/trustedTimestamp/TrustedTimestampService.ts"],"sourcesContent":["function parseRegex(\n text: string,\n regex: RegExp,\n groups: Groups,\n revive: (\n parameter: Groups extends number\n ? string\n : Groups extends (string | number)[]\n ? Record\n : RegExpMatchArray\n ) => ReviveResult = value => value as unknown as ReviveResult\n): ReviveResult | null | undefined {\n const result = text.match(regex)\n if (!result) {\n return null\n }\n\n if (!groups) {\n return (revive as (parameter: RegExpMatchArray) => ReviveResult)(result)\n }\n\n if (typeof groups === 'number') {\n return (revive as (parameter: string) => ReviveResult)(result[groups])\n }\n\n if (Array.isArray(groups)) {\n const ret: Record = {}\n groups.forEach((name, i) => {\n ret[name] = result[i + 1]\n })\n return (revive as (parameter: Record) => ReviveResult)(ret)\n }\n}\n\nfunction createParser(\n regex: RegExp,\n groups: number | number[],\n revive: (value: unknown) => ReviveResult\n): (text: string) => ReviveResult | null | undefined {\n return (text: string) => {\n return parseRegex(text, regex, groups, revive)\n }\n}\n\nexport { createParser as create }\nexport { parseRegex }\n","import { CertService } from '@techteamer/cert-utils'\nimport { parseRegex } from '../util/regexParser'\n\ninterface TSA {\n C: string | null\n L: string | null\n O: string | null\n OU: string | null\n CN: string | null\n}\n\n/**\n *\n * Status info:\n * Status: Granted.\n * Status description: unspecified\n * Failure info: unspecified\n *\n * TST info:\n * Version: 1\n * Policy OID: 1.3.6.1.4.1.21528.2.2.99\n * Hash Algorithm: sha256\n * Message data:\n * 0000 - c5 3e 94 56 aa 61 ed 56-49 69 74 29 1e 01 d7 2a .>.V.a.VIit)...*\n * 0010 - 64 cc 24 84 d2 a2 31 4d-33 b6 ca c8 98 23 03 b9 d.$...1M3....#..\n * Serial number: 0x0308441E\n * Time stamp: Jan 30 13:45:20 2018 GMT\n * Accuracy: 0x01 seconds, unspecified millis, unspecified micros\n * Ordering: no\n * Nonce: unspecified\n * TSA: DirName:/C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=e-Szigno Test TSA2\n * Extensions:\n * */\nexport class TimestampInfo {\n error: string | null = null\n version: number | null = null\n policyOID: string | null = null\n hashAlgorithm: string | null = null\n hash: string | null = null\n serialNumber: string | null = null\n timeStamp: Date | null = null\n timeStampDate: Date | null = null\n accuracy: number | null = null\n ordering: boolean | null = null\n nonce: string | null = null\n issuer: string | null = null\n tsa: TSA | null = null\n certInfo: CertService['CertInfo'] | null = null\n\n constructor(timestampInfoType: 'normal' | 'short' = 'normal', tsText: string, error: string | null = null) {\n this.error = null\n this.version = null\n this.policyOID = null\n this.hashAlgorithm = null\n this.serialNumber = null\n this.timeStamp = null\n this.accuracy = null\n this.ordering = null\n this.nonce = null\n this.tsa = null\n\n if (error) {\n this.error = error\n } else {\n if (timestampInfoType === 'short') {\n this.parseOpensslOutputShort(tsText)\n } else {\n this.hash = null\n this.timeStampDate = null\n this.issuer = null\n this.certInfo = null\n this.parseOpensslOutput(tsText)\n }\n }\n }\n\n setCertInfo(certInfo: CertService['CertInfo'] | null): void {\n this.certInfo = certInfo\n }\n\n parseOpensslOutput(tsText: string): void {\n this.version = parseRegex(tsText, /Version:\\s*([^\\n\\r]+)/, 1, parseInt)!\n this.policyOID = parseRegex(tsText, /Policy OID:\\s*([^\\n\\r]+)/, 1)!\n this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\\s*([^\\n\\r]+)/, 1)!\n this.hash = tsText\n .match(/\\d{4} - .*?\\s{2}/g)!\n .map(line => {\n return line.replace(/\\d{4} - /g, '').replace(/[\\s*-]/g, '')\n })\n .join('')\n this.serialNumber = parseRegex(tsText, /Serial number:\\s*([^\\n\\r]+)/, 1)!\n this.timeStamp = parseRegex(tsText, /Time stamp:\\s*([^\\n\\r]+)/, 1)!\n this.timeStampDate = new Date(this.timeStamp)\n this.accuracy = parseRegex(\n tsText,\n /Accuracy:\\s*(.+) seconds, (.+) millis, (.+) micros/,\n ['s', 'm', 'u'],\n ({ s, m, u }) => {\n const _s = Number(s === 'unspecified' ? 0 : s)\n const _m = Number(m === 'unspecified' ? 0 : m)\n const _u = Number(u === 'unspecified' ? 0 : u)\n return _s * 1000 + _m + _u / 1000\n }\n )!\n this.ordering = parseRegex(tsText, /Ordering:\\s*([^\\n\\r]+)/, 1, ordering => ordering !== 'no')!\n this.nonce = parseRegex(tsText, /Nonce:\\s*([^\\n\\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))!\n this.issuer = parseRegex(tsText, /TSA:\\s*DirName:\\s*([^\\n\\r]+)/, 1)!\n this.tsa = parseRegex(tsText, /TSA:\\s*DirName:\\s*([^\\n\\r]+)/, 1, (result): TSA => {\n const m = result.match(/\\/\\w{1,2}=[^/]+/g) || []\n\n return m.reduce(\n (obj, part) => {\n const [, label, value] = part.match(/\\/(\\w{1,2})=([^/]+)/) || []\n if (!label || !value) {\n return obj\n }\n obj[label as keyof TSA] = value\n return obj\n },\n { C: null, L: null, O: null, OU: null, CN: null } as TSA\n )\n })!\n }\n\n parseOpensslOutputShort(tsText: string): void {\n this.version = parseRegex(tsText, /Version:\\s*([^\\n\\r]+)/, 1, parseInt)!\n this.policyOID = parseRegex(tsText, /Policy OID:\\s*([^\\n\\r]+)/, 1)!\n this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\\s*([^\\n\\r]+)/, 1)!\n this.serialNumber = parseRegex(tsText, /Serial number:\\s*([^\\n\\r]+)/, 1)!\n this.timeStamp = parseRegex(tsText, /Time stamp:\\s*([^\\n\\r]+)/, 1, dateString => new Date(dateString))!\n this.accuracy = parseRegex(\n tsText,\n /Accuracy:\\s*(.+) seconds, (.+) millis, (.+) micros/,\n ['s', 'm', 'u'],\n ({ s, m, u }) => {\n const _s = Number(s === 'unspecified' ? 0 : s)\n const _m = Number(m === 'unspecified' ? 0 : m)\n const _u = Number(u === 'unspecified' ? 0 : u)\n return _s * 1000 + _m + _u / 1000\n }\n )!\n this.ordering = parseRegex(tsText, /Ordering:\\s*([^\\n\\r]+)/, 1, ordering => ordering !== 'no')!\n this.nonce = parseRegex(tsText, /Nonce:\\s*([^\\n\\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))!\n this.tsa = parseRegex(tsText, /TSA:\\s*([^\\n\\r]+)/, 1, v => {\n const m = v.match(/\\/\\w{1,2}=[^/]+/g) || []\n\n return m.reduce(\n (obj, part) => {\n const [, label, value] = part.match(/\\/(\\w{1,2})=([^/]+)/) || []\n if (!label || !value) {\n return obj\n }\n obj[label as keyof TSA] = value\n return obj\n },\n { C: null, L: null, O: null, OU: null, CN: null } as TSA\n )\n })!\n }\n}\n","import type { RequestInfo, RequestInit, Response } from 'node-fetch'\n\nexport const fetch = async (url: URL | RequestInfo, init?: RequestInit): Promise => {\n const { default: fetch } = await import('node-fetch')\n return fetch(url, init)\n}\n","import type { BodyInit } from 'node-fetch'\nimport { fetch } from '../patch/node-fetch'\nimport fs from 'node:fs'\nimport { ProxyAgent } from 'proxy-agent'\nimport type { FileOptions } from 'tmp'\n\nimport type {\n TimestampRequestAuthResult,\n TimestampRequestAuthTypes,\n TimestampRequestError,\n TimestampRequestOptions\n} from './types/timestamp-request.type'\nimport type {\n TimestampProviderAuth,\n TimestampProviderBody,\n TimestampProviderOAuthUrl,\n TimestampProviderProxyConfig,\n TimestampProviderUrl\n} from './types/timestamp-provider.type'\nimport type { TempFileService } from '../util/TempFileService'\n\n/**\n * TimestampRequest class implements timestamp request\n * */\nexport class TimestampRequest {\n private tsRequest: TimestampRequestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/timestamp-query'\n }\n }\n\n constructor(\n private readonly tempFileService: TempFileService,\n private readonly tmpOptions: FileOptions,\n private readonly cleanupTempFns: ((...args: unknown[]) => unknown)[]\n ) {}\n\n /**\n * set request header\n * */\n setHeader(headers: Record): void {\n this.tsRequest = {\n ...this.tsRequest,\n headers\n }\n }\n\n /**\n * set request body\n * */\n setBody(body: BodyInit): void {\n this.tsRequest.body = body\n }\n\n /**\n * set request proxy\n * */\n setProxy(proxy: TimestampProviderProxyConfig): void {\n this.tsRequest.agent = new ProxyAgent({\n getProxyForUrl: (): string => proxy.url,\n rejectUnauthorized: !(proxy.allowUnauthorized ?? false)\n })\n }\n\n /**\n * set request encoding\n * */\n setEncoding(encoding: string | null): void {\n this.tsRequest.encoding = encoding\n }\n\n /**\n * set request encoding\n * */\n setResolveWithFullResponse(resolveWithFullResponse: boolean): void {\n this.tsRequest.resolveWithFullResponse = resolveWithFullResponse\n }\n\n /**\n * return tsRequest\n * */\n get(): TimestampRequestOptions {\n return this.tsRequest\n }\n\n /**\n * authStrategy method that set no auth request\n * */\n async authStrategy(\n requestType: TimestampRequestAuthTypes | undefined,\n url: TimestampProviderUrl,\n auth: TimestampProviderAuth | undefined,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n switch (requestType) {\n case 'basic':\n return this._getTimestampRequestBasic(url as string, auth!, tsQuery)\n case 'oauth':\n return await this._getTimestampRequestOauth(url as TimestampProviderOAuthUrl, auth!, body, proxy, tsQuery)\n case 'noAuth':\n return this._getTimestampRequestNoAuth(url as string, tsQuery)\n default:\n return this._getTimestampRequestNoAuth(url as string, tsQuery)\n }\n }\n\n /**\n * _getTimestampRequestBasic method that set basic auth request\n * */\n private _getTimestampRequestBasic(\n url: string,\n auth: TimestampProviderAuth,\n tsQuery: string\n ): TimestampRequestAuthResult {\n this.setHeader({\n ...this.tsRequest.headers,\n Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`\n })\n\n this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily\n this.setResolveWithFullResponse(true)\n this.setBody(tsQuery)\n\n return { requestUrl: url, tsRequest: this.get() }\n }\n\n /**\n * _getTimestampRequestOauth method that set oauth request\n * */\n private async _getTimestampRequestOauth(\n url: TimestampProviderOAuthUrl,\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n const oauthResult = await this._getOauth<{\n access_token?: string\n error?: TimestampRequestError\n }>(url.getTokenUrl, auth, body, proxy)\n if (!oauthResult?.access_token) {\n return { requestUrl: null, tsRequest: null, error: null }\n }\n\n if (oauthResult?.error) {\n return { requestUrl: null, tsRequest: null, error: oauthResult?.error }\n }\n\n const accessToken = oauthResult?.access_token\n\n if (accessToken) {\n this.setHeader({\n ...this.tsRequest.headers,\n Authorization: `Bearer ${accessToken}`\n })\n\n const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(\n this.tmpOptions,\n Buffer.from(tsQuery)\n )\n this.cleanupTempFns.push(cleanupCallback)\n\n const stats = fs.statSync(tempPath)\n const fileSizeInBytes = stats.size\n this.setBody(fs.createReadStream(tempPath))\n this.setHeader({\n ...this.tsRequest.headers,\n 'Content-length': fileSizeInBytes.toString()\n })\n }\n\n return { requestUrl: url?.getTimestampUrl, tsRequest: this.get(), error: null }\n }\n\n /**\n * _getTimestampRequestNoAuth method that set no auth request\n * */\n private _getTimestampRequestNoAuth(url: string, tsQuery: string): TimestampRequestAuthResult {\n this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily\n this.setResolveWithFullResponse(true)\n this.setBody(tsQuery)\n\n return { requestUrl: url, tsRequest: this.get() }\n }\n\n /**\n * _getOauth method that get oauth access_token\n **/\n private async _getOauth(\n url: string,\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined\n ): Promise {\n const tsRequest = await this._getOauthRequestSettings(auth, body, proxy)\n try {\n const response = await fetch(url, tsRequest)\n return (await response.json()) as ResponseType\n } catch (error) {\n return {\n error: {\n message: (error as Error).message,\n trace: error as Error\n }\n } as ResponseType\n }\n }\n\n /**\n * _getOauthRequestSettings method that set the request oath settings\n **/\n private async _getOauthRequestSettings(\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined\n ): Promise> {\n const tsRequest: TimestampRequestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`\n },\n body: new URLSearchParams(body)\n }\n\n if (proxy?.url) {\n tsRequest.agent = new ProxyAgent({\n getProxyForUrl: (): string => proxy.url,\n rejectUnauthorized: !(proxy.allowUnauthorized ?? false)\n })\n }\n\n return tsRequest\n }\n}\n","import { FileOptions as TempFileOptions } from 'tmp'\nimport { fetch } from '../patch/node-fetch'\n\nimport { TimestampRequest } from './TimestampRequest'\nimport { TempFileService } from '../util/TempFileService'\nimport type { TimestampRequestAuthResult, TimestampRequestAuthTypes } from './types/timestamp-request.type'\nimport type {\n TimestampProvider,\n TimestampProviderAuth,\n TimestampProviderBody,\n TimestampProviderOAuthUrl,\n TimestampProviderProxyConfig,\n TimestampProviderUrl\n} from './types/timestamp-provider.type'\nimport type { TimestampLog } from './types/timestamp-log.type'\n\n/**\n * TrustedTimestampRequest service implements timestamp request and sorted providers\n * */\nexport class TrustedTimestampRequest {\n private readonly cleanupTempFns: (() => unknown)[] = []\n private readonly providers: TimestampProvider[]\n\n constructor(\n providers: TimestampProvider[],\n private readonly tempFileService: TempFileService,\n private readonly tmpOptions: TempFileOptions\n ) {\n this.providers = this._sortedProviders(providers)\n }\n\n /**\n * getTimestamp method that calls the service providers in sequence, requesting a timestamp\n **/\n async getTimestamp(\n tsQuery: string\n ): Promise<{ tsr: Buffer | null; providerName: string; logHistory: TimestampLog[] }> {\n let tsr = null\n let providerName = ''\n const logHistory: TimestampLog[] = []\n\n for (const provider of this.providers) {\n if (!tsr) {\n const { name, url, auth, body, proxy } = provider\n\n if (!name) {\n throw new Error('Provider name is missing')\n }\n if (!url) {\n throw new Error('Provider url is missing')\n }\n\n const { timestampToken, log } = await this._getTimeStampToken(name, url, auth, body, proxy, tsQuery)\n logHistory.push(log)\n tsr = timestampToken\n providerName = name\n }\n }\n\n return { tsr, providerName, logHistory }\n }\n\n /**\n * sortedProviders method that sorting the providers according to priority\n **/\n private _sortedProviders(providers: TimestampProvider[]): TimestampProvider[] {\n const priorityProviders: TimestampProvider[] = []\n const nonPriorityProviders: TimestampProvider[] = []\n\n providers.forEach(provider => {\n if (provider?.priority) {\n priorityProviders.push(provider)\n } else {\n nonPriorityProviders.push(provider)\n }\n })\n\n const sortedProviders = priorityProviders.toSorted((a, b) => a.priority! - b.priority!)\n\n return sortedProviders.concat(nonPriorityProviders)\n }\n\n /**\n * sendTimestampRequest method that calls the provider\n **/\n private async _getTimeStampToken(\n name: string,\n url: TimestampProviderUrl,\n auth: TimestampProviderAuth | undefined,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise<{\n timestampToken: null | Buffer\n log: TimestampLog\n }> {\n const { requestUrl, tsRequest, error } = await this._getTimestampRequest(url, body, auth, proxy, tsQuery)\n if (error) {\n return {\n timestampToken: null,\n log: {\n info: { name, info: null, date: new Date(), url, response: null, error: error?.message },\n errorTrace: error?.trace\n }\n }\n }\n try {\n const response = await fetch(requestUrl!, tsRequest!)\n if (response.status !== 200) {\n throw new Error(`TSA response unsatisfactory: ${response.status} ${response.statusText}`)\n }\n\n return {\n timestampToken: Buffer.from((await response.arrayBuffer()) as unknown as string, 'utf8'), // TODO: fix type\n log: {\n info: { name, date: new Date(), url, response: `${response.status}, ${response.statusText}`, error: null },\n errorTrace: null\n }\n }\n } catch (error) {\n return {\n timestampToken: null,\n log: {\n info: { name, date: new Date(), url, response: null, error: (error as Error).message },\n errorTrace: error as Error\n }\n }\n } finally {\n for (const cleanUpFn of this.cleanupTempFns) {\n if (typeof cleanUpFn === 'function') {\n cleanUpFn()\n }\n }\n }\n }\n\n /**\n * getTimestampRequestSettings method that set the request settings\n **/\n private async _getTimestampRequest(\n url: TimestampProviderUrl,\n body: TimestampProviderBody | undefined,\n auth: TimestampProviderAuth | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n // send the request to the TSA\n const tsRequest = new TimestampRequest(this.tempFileService, this.tmpOptions, this.cleanupTempFns)\n\n if (proxy?.url) {\n tsRequest.setProxy(proxy)\n }\n\n let requestType: TimestampRequestAuthTypes | undefined\n if ((url as TimestampProviderOAuthUrl)?.getTokenUrl && tsQuery) {\n requestType = 'oauth'\n }\n if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && auth?.user && auth?.pass && tsQuery) {\n requestType = 'basic'\n }\n if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && !auth?.user) {\n requestType = 'noAuth'\n }\n\n return await tsRequest.authStrategy(requestType, url, auth, body, proxy, tsQuery)\n }\n}\n","import * as childProcess from 'node:child_process'\nimport type { ExecOptions } from 'node:child_process'\n\ninterface Logger {\n info: (log: string, ...args: unknown[]) => unknown\n error: (log: string, ...args: unknown[]) => unknown\n}\n\nexport function exec(\n command: string,\n options: {\n encoding?: 'buffer'\n } & ExecOptions = {},\n logger?: Logger\n): Promise {\n return new Promise((resolve, reject) => {\n const process = childProcess.exec(command, options, (err, stdout, stderr) => {\n if (err) {\n return reject(err || new Error(stderr.toString() || `Failed to execute command: ${command}`))\n }\n\n return resolve(stdout as ReturnType)\n })\n\n if (logger) {\n process.stdout!.on('data', message => {\n message = message.trim()\n if (message) {\n logger.info(message)\n }\n })\n\n process.stderr!.on('data', message => {\n message = message.trim()\n if (message) {\n logger.error(message)\n }\n })\n }\n })\n}\n\nexport class ExecFileError extends Error {\n public stdout?: string\n public stderr?: string\n}\n\nexport function execFile(command: string, args: string[], options = {}): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n childProcess.execFile(command, args, options, (err, stdout, stderr) => {\n if (err) {\n const error = new ExecFileError(err ? err.message : stderr.toString() || `Failed to execute file: ${command}`)\n error.stdout = stdout\n error.stderr = stderr\n return reject(error)\n }\n\n resolve({ stdout, stderr })\n })\n })\n}\n","import { exec } from '../util/child_process_promise'\n\nexport async function getTsQuery(digest: string, digestFormat: string): Promise {\n // create a time stamp request based on the hash of a data file\n const queryCommand = `openssl ts -query -digest ${digest} -no_nonce -${digestFormat} -cert`\n\n return await exec(queryCommand, { encoding: 'buffer' }).catch(err => {\n throw new Error(`Failed to execute openssl ts -query command \"${queryCommand}\" ${err.message}`)\n })\n}\n\nexport function getTsVerify(\n digest: string,\n tempPath: string,\n isToken: boolean,\n certsLocation: string\n): Promise {\n // verify the response with openssl\n const verifyCommand = isToken\n ? `openssl ts -verify -digest ${digest} -token_in -in ${tempPath} -CApath ${certsLocation}`\n : `openssl ts -verify -digest ${digest} -in ${tempPath} -CApath ${certsLocation}`\n\n return exec(verifyCommand).catch(err => {\n throw new Error(`Failed to verify tsr \"${verifyCommand}\" ${err.message}`)\n })\n}\n\nexport async function getTsReply(inputTempPath: string, isToken: boolean): Promise {\n // get token info\n const replyCommand = isToken\n ? `openssl ts -reply -token_in -in ${inputTempPath} -text`\n : `openssl ts -reply -in ${inputTempPath} -text`\n return await exec(replyCommand).catch(err => {\n throw new Error(`Error executing openssl ts -reply command \"${replyCommand}\" ${err.message}`)\n })\n}\n\nexport async function generateTsReply(inputTempPath: string, tempPath: string): Promise {\n await exec(`openssl ts -reply -in \"${inputTempPath}\" -token_out -out \"${tempPath}\"`).catch(err => {\n throw new Error(`Error executing openssl ts -reply command \"${inputTempPath}\" ${err.message}`)\n })\n}\n\nexport async function extractCertFromToken(tstPath: string): Promise {\n return await exec(`openssl pkcs7 -inform der -in \"${tstPath}\" -print_certs`).catch(err => {\n throw new Error(`Error executing openssl pkcs7 command ${err.message}`)\n })\n}\n\nexport async function checkSslPath(): Promise {\n try {\n const stdout = await exec('which openssl')\n if (!stdout.toString()) {\n throw new Error('openssl is unavailable')\n }\n return stdout\n } catch (error) {\n throw new Error(`Unable to verify openssl installation ${(error as Error).message}`)\n }\n}\n","const supportedDigestForamts = [\n 'sha',\n 'sha1',\n 'mdc2',\n 'ripemd160',\n 'sha224',\n 'sha256',\n 'sha384',\n 'sha512',\n 'md2',\n 'md4',\n 'md5',\n 'dss1'\n]\n\nexport function checkDigestFormat(format: string): boolean {\n return supportedDigestForamts.includes(format)\n}\n\nexport function checkDigest(digest: string): boolean {\n return /^([0-9A-F])+$/i.test(digest)\n}\n\nexport function normalizeDigestFormat(format: string): string {\n return format\n .replace(/^-/, '') // -sha256\n .replace(/-/g, '') // sha-256\n}\n","import fs from 'node:fs/promises'\nimport util from 'node:util'\nimport tmp from 'tmp'\n\ntmp.setGracefulCleanup()\n\nconst tmpFile = util.promisify(\n (\n options: tmp.FileOptions,\n cb: (error: Error | null, results: [string, number | undefined, () => void]) => unknown\n ) => {\n tmp.file(options, (err, ...results) => cb(err, results))\n }\n)\n\nexport class TempFileService {\n /**\n * Utility to create a temp file with content\n * */\n async createTempFile(\n options: tmp.FileOptions,\n content?: Buffer\n ): Promise<{ tempPath: string; fd: number | undefined; cleanupCallback: () => void }> {\n try {\n const [tempPath, fd, cleanupCallback] = await tmpFile(options)\n if (content) {\n await fs.writeFile(tempPath, content as unknown as string)\n }\n return { tempPath, fd, cleanupCallback }\n } catch (err) {\n throw new Error(`Failed to create temp file ${err}`)\n }\n }\n}\n","import { CreatedTimestampToken } from '../types/timestamp-token.type'\n\nexport type CreateTimestampTokenErrorContext = Partial>\n\n/**\n * Custom error class that encapsulates context about token creation, including the provider used and the associated log history\n */\nexport class CreateTimestampTokenError extends Error {\n constructor(\n message: string,\n readonly context: CreateTimestampTokenErrorContext = {},\n options?: ErrorOptions\n ) {\n super(message, options)\n }\n}\n","import { CertService } from '@techteamer/cert-utils'\nimport { FileOptions as TempFileOptions } from 'tmp'\n\nimport { TimestampInfo } from './TrustedTimestampInfo'\nimport { TrustedTimestampRequest } from './TrustedTimestampRequest'\nimport {\n checkSslPath,\n extractCertFromToken,\n generateTsReply,\n getTsQuery,\n getTsReply,\n getTsVerify\n} from './TrustedTimestampCommand'\nimport { checkDigest, checkDigestFormat, normalizeDigestFormat } from './TrustedTimestampCheck'\nimport { TempFileService } from '../util/TempFileService'\nimport { CreateTimestampTokenError } from './error/create-timestamp-token.error'\nimport type { TimestampConfig } from './types/timestamp-config.type'\nimport type { TimestampProvider } from './types/timestamp-provider.type'\nimport type { CreatedTimestampToken, Timestamp } from './types/timestamp-token.type'\n\n/**\n * OpenSSL docs: https://www.openssl.org/docs/manmaster/man1/ts.html\n *\n * Certificate Installation with OpenSSL: http://gagravarr.org/writing/openssl-certs/others.shtml\n *\n * Trustedtimestamp service implements the generate, import and verification of timestamps\n *\n * */\nexport class TrustedTimestampService {\n private readonly tmpOptions: TempFileOptions = { prefix: 'request-', postfix: '.tsr' }\n private tempFileService!: TempFileService\n private certService!: CertService\n private providers!: TimestampProvider[]\n private certsLocation!: string\n private timestampRequest!: TrustedTimestampRequest\n\n constructor(\n private readonly timestampInfoType: 'normal' | 'short' = 'normal',\n private readonly config: TimestampConfig = {} as TimestampConfig,\n private readonly encoding = 'latin1'\n ) {\n this._init()\n }\n\n /**\n * init method that sets the config and instantiates the required services\n * */\n private _init(): void {\n if (this.config) {\n if (!this.config?.certsLocation) {\n throw new Error('trustedTimestamp config \"certsLocation\" missing!')\n }\n\n if (!this.config?.providers?.length) {\n throw new Error('trustedTimestamp config \"providers\" missing or empty!')\n }\n\n this.tempFileService = new TempFileService()\n this.certService = new CertService(this.encoding)\n this.providers = this.config.providers\n this.certsLocation = this.config.certsLocation\n this.timestampRequest = new TrustedTimestampRequest(this.providers, this.tempFileService, this.tmpOptions)\n }\n }\n\n /**\n * Utility method that resolves to a TimestampInfo object containing parsed info from the tsr\n * */\n async getTimestampInfo(tsr: Buffer, isToken = false): Promise {\n const cleanupTempFns: (() => unknown)[] = []\n let inputTempPath = ''\n\n try {\n const tsrtmp = await this.tempFileService.createTempFile(this.tmpOptions, tsr)\n inputTempPath = tsrtmp.tempPath\n cleanupTempFns.push(tsrtmp.cleanupCallback)\n\n const responseText = await getTsReply(inputTempPath, isToken)\n const timestampInfo = new TimestampInfo(this.timestampInfoType, responseText)\n\n // get cert info\n\n try {\n // get raw token if the input was a whole response (TimestampResponse->TimestampToken)\n let tstPath\n if (isToken) {\n tstPath = inputTempPath\n } else {\n const tmp = await this.tempFileService.createTempFile(this.tmpOptions)\n await generateTsReply(inputTempPath, tmp.tempPath)\n tstPath = tmp.tempPath\n cleanupTempFns.push(tmp.cleanupCallback)\n }\n\n // extract cert from token\n const x509Cert = await extractCertFromToken(tstPath)\n // parse cert\n const certInfo = await this.certService.parseCert(Buffer.from(x509Cert), '', this.certService.CertType.PEM)\n\n if (this.timestampInfoType === 'normal') {\n timestampInfo.setCertInfo(certInfo)\n }\n } catch (err) {\n throw new Error('Unable to get cert info from timestamp token', err as Error)\n }\n\n return timestampInfo\n } catch (err) {\n return new TimestampInfo(this.timestampInfoType, null!, (err as Error).message)\n } finally {\n for (const cleanUpFn of cleanupTempFns) {\n if (typeof cleanUpFn === 'function') {\n cleanUpFn()\n }\n }\n }\n }\n\n /**\n * Returns a TimestampToken instance for a hash digest and a hash algorithm.\n * It requests a token from the TSA and verifies the received response.\n * The returned timestamp token represents the token\n * and contains the tsr with the verification result.\n * */\n async createTimestampToken(digest: string, hashAlgorithm: string, dataSize: number): Promise {\n const digestFormat = normalizeDigestFormat(hashAlgorithm)\n\n try {\n if (!checkDigestFormat(digestFormat)) {\n throw new Error(`Unknown digest format: ${hashAlgorithm}`)\n }\n if (!checkDigest(digest)) {\n throw new Error(`Invalid digest: ${digest}`)\n }\n\n const tsQuery = await getTsQuery(digest, digestFormat)\n console.log('!!!!!!!!!!!!!!!')\n console.log(tsQuery)\n const { tsr, providerName, logHistory } = await this.timestampRequest.getTimestamp(tsQuery)\n if (!tsr) {\n throw new CreateTimestampTokenError('Failed to create trusted timestamp, no provider was available', {\n providerName,\n logHistory\n })\n }\n const timestampInfo = await this.getTimestampInfo(tsr, false)\n const certExpiry = timestampInfo.certInfo?.notAfter || null\n const tt: Timestamp = {\n digest,\n hashAlgorithm,\n dataSize,\n tsr,\n isToken: false,\n certExpiry,\n verified: null // not yet\n }\n\n tt.verified = await this.verifyToken(tt, digest, dataSize)\n\n return { timestamp: tt, providerName, logHistory }\n } catch (error) {\n if (error instanceof CreateTimestampTokenError) {\n throw error\n }\n\n throw new CreateTimestampTokenError(`Failed to create trusted timestamp ${(error as Error).message}`)\n }\n }\n\n /**\n * Verify if a timestamp token corresponds to a particular hash of data\n * */\n async verifyToken(timestampToken: Timestamp, digest: string, dataSize: number): Promise {\n if (timestampToken.dataSize !== dataSize) {\n throw new Error(\n `Timestamp token verification failed: The provided data size (${dataSize}) does not match the time stamped size (${timestampToken.dataSize}).`\n )\n }\n\n if (timestampToken.digest !== digest) {\n throw new Error(\n `Timestamp token verification failed: The provided digest (${digest}) does not match the time stamped digest (${timestampToken.digest}).`\n )\n }\n\n // verify token\n return await this.verifyTsr(digest, timestampToken.tsr, timestampToken.isToken)\n }\n\n /**\n * Verify a hash digest against a timestamp response file\n * */\n async verifyTsr(digest: string, tsr: Buffer, isToken = false): Promise {\n let cleanupTempFile = null\n\n try {\n if (!checkDigest(digest)) {\n throw new Error(`Invalid digest: ${digest}`)\n }\n\n // save the tsr on disk because openssl can only read it from file\n const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(this.tmpOptions, tsr)\n cleanupTempFile = cleanupCallback\n\n const stdout = await getTsVerify(digest, tempPath, isToken, this.certsLocation)\n\n const verificationResult = /Verification: OK/i.test(stdout)\n\n if (cleanupTempFile) {\n cleanupTempFile()\n }\n\n return verificationResult\n } catch (err) {\n if (typeof cleanupTempFile === 'function') {\n cleanupTempFile()\n }\n\n throw new Error(`Failed to verify tsr ${(err as Error).message}`)\n }\n }\n\n /**\n * testService method that check the ssl installation\n * */\n async testService(): Promise {\n return await checkSslPath()\n }\n}\n"],"names":["fs"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"timestamp_config.mjs","sources":["../../src/util/regexParser.ts","../../src/trustedTimestamp/TrustedTimestampInfo.ts","../../src/patch/node-fetch.ts","../../src/trustedTimestamp/TimestampRequest.ts","../../src/trustedTimestamp/TrustedTimestampRequest.ts","../../src/util/child_process_promise.ts","../../src/trustedTimestamp/TrustedTimestampCommand.ts","../../src/trustedTimestamp/TrustedTimestampCheck.ts","../../src/util/TempFileService.ts","../../src/trustedTimestamp/error/create-timestamp-token.error.ts","../../src/trustedTimestamp/TrustedTimestampService.ts"],"sourcesContent":["function parseRegex(\n text: string,\n regex: RegExp,\n groups: Groups,\n revive: (\n parameter: Groups extends number\n ? string\n : Groups extends (string | number)[]\n ? Record\n : RegExpMatchArray\n ) => ReviveResult = value => value as unknown as ReviveResult\n): ReviveResult | null | undefined {\n const result = text.match(regex)\n if (!result) {\n return null\n }\n\n if (!groups) {\n return (revive as (parameter: RegExpMatchArray) => ReviveResult)(result)\n }\n\n if (typeof groups === 'number') {\n return (revive as (parameter: string) => ReviveResult)(result[groups])\n }\n\n if (Array.isArray(groups)) {\n const ret: Record = {}\n groups.forEach((name, i) => {\n ret[name] = result[i + 1]\n })\n return (revive as (parameter: Record) => ReviveResult)(ret)\n }\n}\n\nfunction createParser(\n regex: RegExp,\n groups: number | number[],\n revive: (value: unknown) => ReviveResult\n): (text: string) => ReviveResult | null | undefined {\n return (text: string) => {\n return parseRegex(text, regex, groups, revive)\n }\n}\n\nexport { createParser as create }\nexport { parseRegex }\n","import { CertService } from '@techteamer/cert-utils'\nimport { parseRegex } from '../util/regexParser'\n\ninterface TSA {\n C: string | null\n L: string | null\n O: string | null\n OU: string | null\n CN: string | null\n}\n\n/**\n *\n * Status info:\n * Status: Granted.\n * Status description: unspecified\n * Failure info: unspecified\n *\n * TST info:\n * Version: 1\n * Policy OID: 1.3.6.1.4.1.21528.2.2.99\n * Hash Algorithm: sha256\n * Message data:\n * 0000 - c5 3e 94 56 aa 61 ed 56-49 69 74 29 1e 01 d7 2a .>.V.a.VIit)...*\n * 0010 - 64 cc 24 84 d2 a2 31 4d-33 b6 ca c8 98 23 03 b9 d.$...1M3....#..\n * Serial number: 0x0308441E\n * Time stamp: Jan 30 13:45:20 2018 GMT\n * Accuracy: 0x01 seconds, unspecified millis, unspecified micros\n * Ordering: no\n * Nonce: unspecified\n * TSA: DirName:/C=HU/L=Budapest/O=Microsec Ltd./OU=e-Szigno CA/CN=e-Szigno Test TSA2\n * Extensions:\n * */\nexport class TimestampInfo {\n error: string | null = null\n version: number | null = null\n policyOID: string | null = null\n hashAlgorithm: string | null = null\n hash: string | null = null\n serialNumber: string | null = null\n timeStamp: Date | null = null\n timeStampDate: Date | null = null\n accuracy: number | null = null\n ordering: boolean | null = null\n nonce: string | null = null\n issuer: string | null = null\n tsa: TSA | null = null\n certInfo: CertService['CertInfo'] | null = null\n\n constructor(timestampInfoType: 'normal' | 'short' = 'normal', tsText: string, error: string | null = null) {\n this.error = null\n this.version = null\n this.policyOID = null\n this.hashAlgorithm = null\n this.serialNumber = null\n this.timeStamp = null\n this.accuracy = null\n this.ordering = null\n this.nonce = null\n this.tsa = null\n\n if (error) {\n this.error = error\n } else {\n if (timestampInfoType === 'short') {\n this.parseOpensslOutputShort(tsText)\n } else {\n this.hash = null\n this.timeStampDate = null\n this.issuer = null\n this.certInfo = null\n this.parseOpensslOutput(tsText)\n }\n }\n }\n\n setCertInfo(certInfo: CertService['CertInfo'] | null): void {\n this.certInfo = certInfo\n }\n\n parseOpensslOutput(tsText: string): void {\n this.version = parseRegex(tsText, /Version:\\s*([^\\n\\r]+)/, 1, parseInt)!\n this.policyOID = parseRegex(tsText, /Policy OID:\\s*([^\\n\\r]+)/, 1)!\n this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\\s*([^\\n\\r]+)/, 1)!\n this.hash = tsText\n .match(/\\d{4} - .*?\\s{2}/g)!\n .map(line => {\n return line.replace(/\\d{4} - /g, '').replace(/[\\s*-]/g, '')\n })\n .join('')\n this.serialNumber = parseRegex(tsText, /Serial number:\\s*([^\\n\\r]+)/, 1)!\n this.timeStamp = parseRegex(tsText, /Time stamp:\\s*([^\\n\\r]+)/, 1)!\n this.timeStampDate = new Date(this.timeStamp)\n this.accuracy = parseRegex(\n tsText,\n /Accuracy:\\s*(.+) seconds, (.+) millis, (.+) micros/,\n ['s', 'm', 'u'],\n ({ s, m, u }) => {\n const _s = Number(s === 'unspecified' ? 0 : s)\n const _m = Number(m === 'unspecified' ? 0 : m)\n const _u = Number(u === 'unspecified' ? 0 : u)\n return _s * 1000 + _m + _u / 1000\n }\n )!\n this.ordering = parseRegex(tsText, /Ordering:\\s*([^\\n\\r]+)/, 1, ordering => ordering !== 'no')!\n this.nonce = parseRegex(tsText, /Nonce:\\s*([^\\n\\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))!\n this.issuer = parseRegex(tsText, /TSA:\\s*DirName:\\s*([^\\n\\r]+)/, 1)!\n this.tsa = parseRegex(tsText, /TSA:\\s*DirName:\\s*([^\\n\\r]+)/, 1, (result): TSA => {\n const m = result.match(/\\/\\w{1,2}=[^/]+/g) || []\n\n return m.reduce(\n (obj, part) => {\n const [, label, value] = part.match(/\\/(\\w{1,2})=([^/]+)/) || []\n if (!label || !value) {\n return obj\n }\n obj[label as keyof TSA] = value\n return obj\n },\n { C: null, L: null, O: null, OU: null, CN: null } as TSA\n )\n })!\n }\n\n parseOpensslOutputShort(tsText: string): void {\n this.version = parseRegex(tsText, /Version:\\s*([^\\n\\r]+)/, 1, parseInt)!\n this.policyOID = parseRegex(tsText, /Policy OID:\\s*([^\\n\\r]+)/, 1)!\n this.hashAlgorithm = parseRegex(tsText, /Hash Algorithm:\\s*([^\\n\\r]+)/, 1)!\n this.serialNumber = parseRegex(tsText, /Serial number:\\s*([^\\n\\r]+)/, 1)!\n this.timeStamp = parseRegex(tsText, /Time stamp:\\s*([^\\n\\r]+)/, 1, dateString => new Date(dateString))!\n this.accuracy = parseRegex(\n tsText,\n /Accuracy:\\s*(.+) seconds, (.+) millis, (.+) micros/,\n ['s', 'm', 'u'],\n ({ s, m, u }) => {\n const _s = Number(s === 'unspecified' ? 0 : s)\n const _m = Number(m === 'unspecified' ? 0 : m)\n const _u = Number(u === 'unspecified' ? 0 : u)\n return _s * 1000 + _m + _u / 1000\n }\n )!\n this.ordering = parseRegex(tsText, /Ordering:\\s*([^\\n\\r]+)/, 1, ordering => ordering !== 'no')!\n this.nonce = parseRegex(tsText, /Nonce:\\s*([^\\n\\r]+)/, 1, nonce => (nonce === 'unspecified' ? null : nonce))!\n this.tsa = parseRegex(tsText, /TSA:\\s*([^\\n\\r]+)/, 1, v => {\n const m = v.match(/\\/\\w{1,2}=[^/]+/g) || []\n\n return m.reduce(\n (obj, part) => {\n const [, label, value] = part.match(/\\/(\\w{1,2})=([^/]+)/) || []\n if (!label || !value) {\n return obj\n }\n obj[label as keyof TSA] = value\n return obj\n },\n { C: null, L: null, O: null, OU: null, CN: null } as TSA\n )\n })!\n }\n}\n","import type { RequestInfo, RequestInit, Response } from 'node-fetch'\n\nexport const fetch = async (url: URL | RequestInfo, init?: RequestInit): Promise => {\n const { default: fetch } = await import('node-fetch')\n return fetch(url, init)\n}\n","import type { BodyInit } from 'node-fetch'\nimport { fetch } from '../patch/node-fetch'\nimport fs from 'node:fs'\nimport { ProxyAgent } from 'proxy-agent'\nimport type { FileOptions } from 'tmp'\n\nimport type {\n TimestampRequestAuthResult,\n TimestampRequestAuthTypes,\n TimestampRequestError,\n TimestampRequestOptions\n} from './types/timestamp-request.type'\nimport type {\n TimestampProviderAuth,\n TimestampProviderBody,\n TimestampProviderOAuthUrl,\n TimestampProviderProxyConfig,\n TimestampProviderUrl\n} from './types/timestamp-provider.type'\nimport type { TempFileService } from '../util/TempFileService'\n\n/**\n * TimestampRequest class implements timestamp request\n * */\nexport class TimestampRequest {\n private tsRequest: TimestampRequestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/timestamp-query'\n }\n }\n\n constructor(\n private readonly tempFileService: TempFileService,\n private readonly tmpOptions: FileOptions,\n private readonly cleanupTempFns: ((...args: unknown[]) => unknown)[]\n ) {}\n\n /**\n * set request header\n * */\n setHeader(headers: Record): void {\n this.tsRequest = {\n ...this.tsRequest,\n headers\n }\n }\n\n /**\n * set request body\n * */\n setBody(body: BodyInit): void {\n this.tsRequest.body = body\n }\n\n /**\n * set request proxy\n * */\n setProxy(proxy: TimestampProviderProxyConfig): void {\n this.tsRequest.agent = new ProxyAgent({\n getProxyForUrl: (): string => proxy.url,\n rejectUnauthorized: !(proxy.allowUnauthorized ?? false)\n })\n }\n\n /**\n * set request encoding\n * */\n setEncoding(encoding: string | null): void {\n this.tsRequest.encoding = encoding\n }\n\n /**\n * set request encoding\n * */\n setResolveWithFullResponse(resolveWithFullResponse: boolean): void {\n this.tsRequest.resolveWithFullResponse = resolveWithFullResponse\n }\n\n /**\n * return tsRequest\n * */\n get(): TimestampRequestOptions {\n return this.tsRequest\n }\n\n /**\n * authStrategy method that set no auth request\n * */\n async authStrategy(\n requestType: TimestampRequestAuthTypes | undefined,\n url: TimestampProviderUrl,\n auth: TimestampProviderAuth | undefined,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n switch (requestType) {\n case 'basic':\n return this._getTimestampRequestBasic(url as string, auth!, tsQuery)\n case 'oauth':\n return await this._getTimestampRequestOauth(url as TimestampProviderOAuthUrl, auth!, body, proxy, tsQuery)\n case 'noAuth':\n return this._getTimestampRequestNoAuth(url as string, tsQuery)\n default:\n return this._getTimestampRequestNoAuth(url as string, tsQuery)\n }\n }\n\n /**\n * _getTimestampRequestBasic method that set basic auth request\n * */\n private _getTimestampRequestBasic(\n url: string,\n auth: TimestampProviderAuth,\n tsQuery: string\n ): TimestampRequestAuthResult {\n this.setHeader({\n ...this.tsRequest.headers,\n Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`\n })\n\n this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily\n this.setResolveWithFullResponse(true)\n this.setBody(tsQuery)\n\n return { requestUrl: url, tsRequest: this.get() }\n }\n\n /**\n * _getTimestampRequestOauth method that set oauth request\n * */\n private async _getTimestampRequestOauth(\n url: TimestampProviderOAuthUrl,\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n const oauthResult = await this._getOauth<{\n access_token?: string\n error?: TimestampRequestError\n }>(url.getTokenUrl, auth, body, proxy)\n if (!oauthResult?.access_token) {\n return { requestUrl: null, tsRequest: null, error: null }\n }\n\n if (oauthResult?.error) {\n return { requestUrl: null, tsRequest: null, error: oauthResult?.error }\n }\n\n const accessToken = oauthResult?.access_token\n\n if (accessToken) {\n this.setHeader({\n ...this.tsRequest.headers,\n Authorization: `Bearer ${accessToken}`\n })\n\n const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(\n this.tmpOptions,\n Buffer.from(tsQuery)\n )\n this.cleanupTempFns.push(cleanupCallback)\n\n const stats = fs.statSync(tempPath)\n const fileSizeInBytes = stats.size\n this.setBody(fs.createReadStream(tempPath))\n this.setHeader({\n ...this.tsRequest.headers,\n 'Content-length': fileSizeInBytes.toString()\n })\n }\n\n return { requestUrl: url?.getTimestampUrl, tsRequest: this.get(), error: null }\n }\n\n /**\n * _getTimestampRequestNoAuth method that set no auth request\n * */\n private _getTimestampRequestNoAuth(url: string, tsQuery: string): TimestampRequestAuthResult {\n this.setEncoding(null) // we expect binary data in a buffer: ensure that the response is not decoded unnecessarily\n this.setResolveWithFullResponse(true)\n this.setBody(tsQuery)\n\n return { requestUrl: url, tsRequest: this.get() }\n }\n\n /**\n * _getOauth method that get oauth access_token\n **/\n private async _getOauth(\n url: string,\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined\n ): Promise {\n const tsRequest = await this._getOauthRequestSettings(auth, body, proxy)\n try {\n const response = await fetch(url, tsRequest)\n return (await response.json()) as ResponseType\n } catch (error) {\n return {\n error: {\n message: (error as Error).message,\n trace: error as Error\n }\n } as ResponseType\n }\n }\n\n /**\n * _getOauthRequestSettings method that set the request oath settings\n **/\n private async _getOauthRequestSettings(\n auth: TimestampProviderAuth,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined\n ): Promise> {\n const tsRequest: TimestampRequestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Basic ${Buffer.from(auth.user + ':' + auth.pass).toString('base64')}`\n },\n body: new URLSearchParams(body)\n }\n\n if (proxy?.url) {\n tsRequest.agent = new ProxyAgent({\n getProxyForUrl: (): string => proxy.url,\n rejectUnauthorized: !(proxy.allowUnauthorized ?? false)\n })\n }\n\n return tsRequest\n }\n}\n","import { FileOptions as TempFileOptions } from 'tmp'\nimport { fetch } from '../patch/node-fetch'\n\nimport { TimestampRequest } from './TimestampRequest'\nimport { TempFileService } from '../util/TempFileService'\nimport type { TimestampRequestAuthResult, TimestampRequestAuthTypes } from './types/timestamp-request.type'\nimport type {\n TimestampProvider,\n TimestampProviderAuth,\n TimestampProviderBody,\n TimestampProviderOAuthUrl,\n TimestampProviderProxyConfig,\n TimestampProviderUrl\n} from './types/timestamp-provider.type'\nimport type { TimestampLog } from './types/timestamp-log.type'\n\n/**\n * TrustedTimestampRequest service implements timestamp request and sorted providers\n * */\nexport class TrustedTimestampRequest {\n private readonly cleanupTempFns: (() => unknown)[] = []\n private readonly providers: TimestampProvider[]\n\n constructor(\n providers: TimestampProvider[],\n private readonly tempFileService: TempFileService,\n private readonly tmpOptions: TempFileOptions\n ) {\n this.providers = this._sortedProviders(providers)\n }\n\n /**\n * getTimestamp method that calls the service providers in sequence, requesting a timestamp\n **/\n async getTimestamp(\n tsQuery: string\n ): Promise<{ tsr: Buffer | null; providerName: string; logHistory: TimestampLog[] }> {\n let tsr = null\n let providerName = ''\n const logHistory: TimestampLog[] = []\n\n for (const provider of this.providers) {\n if (!tsr) {\n const { name, url, auth, body, proxy } = provider\n\n if (!name) {\n throw new Error('Provider name is missing')\n }\n if (!url) {\n throw new Error('Provider url is missing')\n }\n\n const { timestampToken, log } = await this._getTimeStampToken(name, url, auth, body, proxy, tsQuery)\n logHistory.push(log)\n tsr = timestampToken\n providerName = name\n }\n }\n\n return { tsr, providerName, logHistory }\n }\n\n /**\n * sortedProviders method that sorting the providers according to priority\n **/\n private _sortedProviders(providers: TimestampProvider[]): TimestampProvider[] {\n const priorityProviders: TimestampProvider[] = []\n const nonPriorityProviders: TimestampProvider[] = []\n\n providers.forEach(provider => {\n if (provider?.priority) {\n priorityProviders.push(provider)\n } else {\n nonPriorityProviders.push(provider)\n }\n })\n\n const sortedProviders = priorityProviders.toSorted((a, b) => a.priority! - b.priority!)\n\n return sortedProviders.concat(nonPriorityProviders)\n }\n\n /**\n * sendTimestampRequest method that calls the provider\n **/\n private async _getTimeStampToken(\n name: string,\n url: TimestampProviderUrl,\n auth: TimestampProviderAuth | undefined,\n body: TimestampProviderBody | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise<{\n timestampToken: null | Buffer\n log: TimestampLog\n }> {\n const { requestUrl, tsRequest, error } = await this._getTimestampRequest(url, body, auth, proxy, tsQuery)\n if (error) {\n return {\n timestampToken: null,\n log: {\n info: { name, info: null, date: new Date(), url, response: null, error: error?.message },\n errorTrace: error?.trace\n }\n }\n }\n try {\n const response = await fetch(requestUrl!, tsRequest!)\n if (response.status !== 200) {\n throw new Error(`TSA response unsatisfactory: ${response.status} ${response.statusText}`)\n }\n\n return {\n timestampToken: Buffer.from((await response.arrayBuffer()) as unknown as string, 'utf8'), // TODO: fix type\n log: {\n info: { name, date: new Date(), url, response: `${response.status}, ${response.statusText}`, error: null },\n errorTrace: null\n }\n }\n } catch (error) {\n return {\n timestampToken: null,\n log: {\n info: { name, date: new Date(), url, response: null, error: (error as Error).message },\n errorTrace: error as Error\n }\n }\n } finally {\n for (const cleanUpFn of this.cleanupTempFns) {\n if (typeof cleanUpFn === 'function') {\n cleanUpFn()\n }\n }\n }\n }\n\n /**\n * getTimestampRequestSettings method that set the request settings\n **/\n private async _getTimestampRequest(\n url: TimestampProviderUrl,\n body: TimestampProviderBody | undefined,\n auth: TimestampProviderAuth | undefined,\n proxy: TimestampProviderProxyConfig | undefined,\n tsQuery: string\n ): Promise {\n // send the request to the TSA\n const tsRequest = new TimestampRequest(this.tempFileService, this.tmpOptions, this.cleanupTempFns)\n\n if (proxy?.url) {\n tsRequest.setProxy(proxy)\n }\n\n let requestType: TimestampRequestAuthTypes | undefined\n if ((url as TimestampProviderOAuthUrl)?.getTokenUrl && tsQuery) {\n requestType = 'oauth'\n }\n if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && auth?.user && auth?.pass && tsQuery) {\n requestType = 'basic'\n }\n if (!(url as TimestampProviderOAuthUrl)?.getTokenUrl && !auth?.user) {\n requestType = 'noAuth'\n }\n\n return await tsRequest.authStrategy(requestType, url, auth, body, proxy, tsQuery)\n }\n}\n","import * as childProcess from 'node:child_process'\nimport type { ExecOptions } from 'node:child_process'\n\ninterface Logger {\n info: (log: string, ...args: unknown[]) => unknown\n error: (log: string, ...args: unknown[]) => unknown\n}\n\nexport function exec(\n command: string,\n options: {\n encoding?: 'buffer'\n } & ExecOptions = {},\n logger?: Logger\n): Promise {\n return new Promise((resolve, reject) => {\n const process = childProcess.exec(command, options, (err, stdout, stderr) => {\n if (err) {\n return reject(err || new Error(stderr.toString() || `Failed to execute command: ${command}`))\n }\n\n return resolve(stdout as ReturnType)\n })\n\n if (logger) {\n process.stdout!.on('data', message => {\n message = message.trim()\n if (message) {\n logger.info(message)\n }\n })\n\n process.stderr!.on('data', message => {\n message = message.trim()\n if (message) {\n logger.error(message)\n }\n })\n }\n })\n}\n\nexport class ExecFileError extends Error {\n public stdout?: string\n public stderr?: string\n}\n\nexport function execFile(command: string, args: string[], options = {}): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n childProcess.execFile(command, args, options, (err, stdout, stderr) => {\n if (err) {\n const error = new ExecFileError(err ? err.message : stderr.toString() || `Failed to execute file: ${command}`)\n error.stdout = stdout\n error.stderr = stderr\n return reject(error)\n }\n\n resolve({ stdout, stderr })\n })\n })\n}\n","import { exec } from '../util/child_process_promise'\n\nexport async function getTsQuery(digest: string, digestFormat: string): Promise {\n // create a time stamp request based on the hash of a data file\n const queryCommand = `openssl ts -query -digest ${digest} -no_nonce -${digestFormat} -cert`\n\n return await exec(queryCommand, { encoding: 'buffer' }).catch(err => {\n throw new Error(`Failed to execute openssl ts -query command \"${queryCommand}\" ${err.message}`)\n })\n}\n\nexport function getTsVerify(\n digest: string,\n tempPath: string,\n isToken: boolean,\n certsLocation: string\n): Promise {\n // verify the response with openssl\n const verifyCommand = isToken\n ? `openssl ts -verify -digest ${digest} -token_in -in ${tempPath} -CApath ${certsLocation}`\n : `openssl ts -verify -digest ${digest} -in ${tempPath} -CApath ${certsLocation}`\n\n return exec(verifyCommand).catch(err => {\n throw new Error(`Failed to verify tsr \"${verifyCommand}\" ${err.message}`)\n })\n}\n\nexport async function getTsReply(inputTempPath: string, isToken: boolean): Promise {\n // get token info\n const replyCommand = isToken\n ? `openssl ts -reply -token_in -in ${inputTempPath} -text`\n : `openssl ts -reply -in ${inputTempPath} -text`\n return await exec(replyCommand).catch(err => {\n throw new Error(`Error executing openssl ts -reply command \"${replyCommand}\" ${err.message}`)\n })\n}\n\nexport async function generateTsReply(inputTempPath: string, tempPath: string): Promise {\n await exec(`openssl ts -reply -in \"${inputTempPath}\" -token_out -out \"${tempPath}\"`).catch(err => {\n throw new Error(`Error executing openssl ts -reply command \"${inputTempPath}\" ${err.message}`)\n })\n}\n\nexport async function extractCertFromToken(tstPath: string): Promise {\n return await exec(`openssl pkcs7 -inform der -in \"${tstPath}\" -print_certs`).catch(err => {\n throw new Error(`Error executing openssl pkcs7 command ${err.message}`)\n })\n}\n\nexport async function checkSslPath(): Promise {\n try {\n const stdout = await exec('which openssl')\n if (!stdout.toString()) {\n throw new Error('openssl is unavailable')\n }\n return stdout\n } catch (error) {\n throw new Error(`Unable to verify openssl installation ${(error as Error).message}`)\n }\n}\n","const supportedDigestForamts = [\n 'sha',\n 'sha1',\n 'mdc2',\n 'ripemd160',\n 'sha224',\n 'sha256',\n 'sha384',\n 'sha512',\n 'md2',\n 'md4',\n 'md5',\n 'dss1'\n]\n\nexport function checkDigestFormat(format: string): boolean {\n return supportedDigestForamts.includes(format)\n}\n\nexport function checkDigest(digest: string): boolean {\n return /^([0-9A-F])+$/i.test(digest)\n}\n\nexport function normalizeDigestFormat(format: string): string {\n return format\n .replace(/^-/, '') // -sha256\n .replace(/-/g, '') // sha-256\n}\n","import fs from 'node:fs/promises'\nimport util from 'node:util'\nimport tmp from 'tmp'\n\ntmp.setGracefulCleanup()\n\nconst tmpFile = util.promisify(\n (\n options: tmp.FileOptions,\n cb: (error: Error | null, results: [string, number | undefined, () => void]) => unknown\n ) => {\n tmp.file(options, (err, ...results) => cb(err, results))\n }\n)\n\nexport class TempFileService {\n /**\n * Utility to create a temp file with content\n * */\n async createTempFile(\n options: tmp.FileOptions,\n content?: Buffer\n ): Promise<{ tempPath: string; fd: number | undefined; cleanupCallback: () => void }> {\n try {\n const [tempPath, fd, cleanupCallback] = await tmpFile(options)\n if (content) {\n await fs.writeFile(tempPath, content as unknown as string)\n }\n return { tempPath, fd, cleanupCallback }\n } catch (err) {\n throw new Error(`Failed to create temp file ${err}`)\n }\n }\n}\n","import { CreatedTimestampToken } from '../types/timestamp-token.type'\n\nexport type CreateTimestampTokenErrorContext = Partial>\n\n/**\n * Custom error class that encapsulates context about token creation, including the provider used and the associated log history\n */\nexport class CreateTimestampTokenError extends Error {\n constructor(\n message: string,\n readonly context: CreateTimestampTokenErrorContext = {},\n options?: ErrorOptions\n ) {\n super(message, options)\n }\n}\n","import { CertService } from '@techteamer/cert-utils'\nimport { FileOptions as TempFileOptions } from 'tmp'\n\nimport { TimestampInfo } from './TrustedTimestampInfo'\nimport { TrustedTimestampRequest } from './TrustedTimestampRequest'\nimport {\n checkSslPath,\n extractCertFromToken,\n generateTsReply,\n getTsQuery,\n getTsReply,\n getTsVerify\n} from './TrustedTimestampCommand'\nimport { checkDigest, checkDigestFormat, normalizeDigestFormat } from './TrustedTimestampCheck'\nimport { TempFileService } from '../util/TempFileService'\nimport { CreateTimestampTokenError } from './error/create-timestamp-token.error'\nimport type { TimestampConfig } from './types/timestamp-config.type'\nimport type { TimestampProvider } from './types/timestamp-provider.type'\nimport type { CreatedTimestampToken, Timestamp } from './types/timestamp-token.type'\n\n/**\n * OpenSSL docs: https://www.openssl.org/docs/manmaster/man1/ts.html\n *\n * Certificate Installation with OpenSSL: http://gagravarr.org/writing/openssl-certs/others.shtml\n *\n * Trustedtimestamp service implements the generate, import and verification of timestamps\n *\n * */\nexport class TrustedTimestampService {\n private readonly tmpOptions: TempFileOptions = { prefix: 'request-', postfix: '.tsr' }\n private tempFileService!: TempFileService\n private certService!: CertService\n private providers!: TimestampProvider[]\n private certsLocation!: string\n private timestampRequest!: TrustedTimestampRequest\n\n constructor(\n private readonly timestampInfoType: 'normal' | 'short' = 'normal',\n private readonly config: TimestampConfig = {} as TimestampConfig,\n private readonly encoding = 'latin1'\n ) {\n this._init()\n }\n\n /**\n * init method that sets the config and instantiates the required services\n * */\n private _init(): void {\n if (this.config) {\n if (!this.config?.certsLocation) {\n throw new Error('trustedTimestamp config \"certsLocation\" missing!')\n }\n\n if (!this.config?.providers?.length) {\n throw new Error('trustedTimestamp config \"providers\" missing or empty!')\n }\n\n this.tempFileService = new TempFileService()\n this.certService = new CertService(this.encoding)\n this.providers = this.config.providers\n this.certsLocation = this.config.certsLocation\n this.timestampRequest = new TrustedTimestampRequest(this.providers, this.tempFileService, this.tmpOptions)\n }\n }\n\n /**\n * Utility method that resolves to a TimestampInfo object containing parsed info from the tsr\n * */\n async getTimestampInfo(tsr: Buffer, isToken = false): Promise {\n const cleanupTempFns: (() => unknown)[] = []\n let inputTempPath = ''\n\n try {\n const tsrtmp = await this.tempFileService.createTempFile(this.tmpOptions, tsr)\n inputTempPath = tsrtmp.tempPath\n cleanupTempFns.push(tsrtmp.cleanupCallback)\n\n const responseText = await getTsReply(inputTempPath, isToken)\n const timestampInfo = new TimestampInfo(this.timestampInfoType, responseText)\n\n // get cert info\n\n try {\n // get raw token if the input was a whole response (TimestampResponse->TimestampToken)\n let tstPath\n if (isToken) {\n tstPath = inputTempPath\n } else {\n const tmp = await this.tempFileService.createTempFile(this.tmpOptions)\n await generateTsReply(inputTempPath, tmp.tempPath)\n tstPath = tmp.tempPath\n cleanupTempFns.push(tmp.cleanupCallback)\n }\n\n // extract cert from token\n const x509Cert = await extractCertFromToken(tstPath)\n // parse cert\n const certInfo = await this.certService.parseCert(Buffer.from(x509Cert), '', this.certService.CertType.PEM)\n\n if (this.timestampInfoType === 'normal') {\n timestampInfo.setCertInfo(certInfo)\n }\n } catch (err) {\n throw new Error('Unable to get cert info from timestamp token', err as Error)\n }\n\n return timestampInfo\n } catch (err) {\n return new TimestampInfo(this.timestampInfoType, null!, (err as Error).message)\n } finally {\n for (const cleanUpFn of cleanupTempFns) {\n if (typeof cleanUpFn === 'function') {\n cleanUpFn()\n }\n }\n }\n }\n\n /**\n * Returns a TimestampToken instance for a hash digest and a hash algorithm.\n * It requests a token from the TSA and verifies the received response.\n * The returned timestamp token represents the token\n * and contains the tsr with the verification result.\n * */\n async createTimestampToken(digest: string, hashAlgorithm: string, dataSize: number): Promise {\n const digestFormat = normalizeDigestFormat(hashAlgorithm)\n\n try {\n if (!checkDigestFormat(digestFormat)) {\n throw new Error(`Unknown digest format: ${hashAlgorithm}`)\n }\n if (!checkDigest(digest)) {\n throw new Error(`Invalid digest: ${digest}`)\n }\n\n const tsQuery = await getTsQuery(digest, digestFormat)\n const { tsr, providerName, logHistory } = await this.timestampRequest.getTimestamp(tsQuery)\n if (!tsr) {\n throw new CreateTimestampTokenError('Failed to create trusted timestamp, no provider was available', {\n providerName,\n logHistory\n })\n }\n const timestampInfo = await this.getTimestampInfo(tsr, false)\n const certExpiry = timestampInfo.certInfo?.notAfter || null\n const tt: Timestamp = {\n digest,\n hashAlgorithm,\n dataSize,\n tsr,\n isToken: false,\n certExpiry,\n verified: null // not yet\n }\n\n tt.verified = await this.verifyToken(tt, digest, dataSize)\n\n return { timestamp: tt, providerName, logHistory }\n } catch (error) {\n if (error instanceof CreateTimestampTokenError) {\n throw error\n }\n\n throw new CreateTimestampTokenError(`Failed to create trusted timestamp ${(error as Error).message}`)\n }\n }\n\n /**\n * Verify if a timestamp token corresponds to a particular hash of data\n * */\n async verifyToken(timestampToken: Timestamp, digest: string, dataSize: number): Promise {\n if (timestampToken.dataSize !== dataSize) {\n throw new Error(\n `Timestamp token verification failed: The provided data size (${dataSize}) does not match the time stamped size (${timestampToken.dataSize}).`\n )\n }\n\n if (timestampToken.digest !== digest) {\n throw new Error(\n `Timestamp token verification failed: The provided digest (${digest}) does not match the time stamped digest (${timestampToken.digest}).`\n )\n }\n\n // verify token\n return await this.verifyTsr(digest, timestampToken.tsr, timestampToken.isToken)\n }\n\n /**\n * Verify a hash digest against a timestamp response file\n * */\n async verifyTsr(digest: string, tsr: Buffer, isToken = false): Promise {\n let cleanupTempFile = null\n\n try {\n if (!checkDigest(digest)) {\n throw new Error(`Invalid digest: ${digest}`)\n }\n\n // save the tsr on disk because openssl can only read it from file\n const { tempPath, cleanupCallback } = await this.tempFileService.createTempFile(this.tmpOptions, tsr)\n cleanupTempFile = cleanupCallback\n\n const stdout = await getTsVerify(digest, tempPath, isToken, this.certsLocation)\n\n const verificationResult = /Verification: OK/i.test(stdout)\n\n if (cleanupTempFile) {\n cleanupTempFile()\n }\n\n return verificationResult\n } catch (err) {\n if (typeof cleanupTempFile === 'function') {\n cleanupTempFile()\n }\n\n throw new Error(`Failed to verify tsr ${(err as Error).message}`)\n }\n }\n\n /**\n * testService method that check the ssl installation\n * */\n async testService(): Promise {\n return await checkSslPath()\n }\n}\n"],"names":["fs"],"mappings":";;;;;;;;AAAA,SAAS,UAAU,CACjB,IAAY,EACZ,KAAa,EACb,MAAc,EACd,MAAA,GAMoB,KAAK,IAAI,KAAgC,EAAA;IAE7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,IAAI;IACb;IAEA,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAQ,MAAwD,CAAC,MAAM,CAAC;IAC1E;AAEA,IAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,QAAA,OAAQ,MAA8C,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxE;AAEA,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACzB,MAAM,GAAG,GAAoC,EAAE;QAC/C,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;YACzB,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AAC3B,QAAA,CAAC,CAAC;AACF,QAAA,OAAQ,MAAuE,CAAC,GAAG,CAAC;IACtF;AACF;;ACrBA;;;;;;;;;;;;;;;;;;;;;AAqBK;MACQ,aAAa,CAAA;IACxB,KAAK,GAAkB,IAAI;IAC3B,OAAO,GAAkB,IAAI;IAC7B,SAAS,GAAkB,IAAI;IAC/B,aAAa,GAAkB,IAAI;IACnC,IAAI,GAAkB,IAAI;IAC1B,YAAY,GAAkB,IAAI;IAClC,SAAS,GAAgB,IAAI;IAC7B,aAAa,GAAgB,IAAI;IACjC,QAAQ,GAAkB,IAAI;IAC9B,QAAQ,GAAmB,IAAI;IAC/B,KAAK,GAAkB,IAAI;IAC3B,MAAM,GAAkB,IAAI;IAC5B,GAAG,GAAe,IAAI;IACtB,QAAQ,GAAmC,IAAI;AAE/C,IAAA,WAAA,CAAY,oBAAwC,QAAQ,EAAE,MAAc,EAAE,QAAuB,IAAI,EAAA;AACvG,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACjB,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI;QAEf,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QACpB;aAAO;AACL,YAAA,IAAI,iBAAiB,KAAK,OAAO,EAAE;AACjC,gBAAA,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC;YACtC;iBAAO;AACL,gBAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,gBAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;YACjC;QACF;IACF;AAEA,IAAA,WAAW,CAAC,QAAwC,EAAA;AAClD,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;IAC1B;AAEA,IAAA,kBAAkB,CAAC,MAAc,EAAA;AAC/B,QAAA,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,uBAAuB,EAAE,CAAC,EAAE,QAAQ,CAAE;QACxE,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAAE;QACnE,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAM,EAAE,8BAA8B,EAAE,CAAC,CAAE;QAC3E,IAAI,CAAC,IAAI,GAAG;aACT,KAAK,CAAC,mBAAmB;aACzB,GAAG,CAAC,IAAI,IAAG;AACV,YAAA,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;AAC7D,QAAA,CAAC;aACA,IAAI,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,6BAA6B,EAAE,CAAC,CAAE;QACzE,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAAE;QACnE,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,UAAU,CACxB,MAAM,EACN,oDAAoD,EACpD,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACf,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAI;AACd,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9C,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9C,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9C,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;AACnC,QAAA,CAAC,CACD;AACF,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,EAAE,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAE;AAC/F,QAAA,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAAE,KAAK,KAAK,KAAK,KAAK,aAAa,GAAG,IAAI,GAAG,KAAK,CAAC,CAAE;QAC7G,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,8BAA8B,EAAE,CAAC,CAAE;AACpE,QAAA,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,8BAA8B,EAAE,CAAC,EAAE,CAAC,MAAM,KAAS;YAC/E,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE;YAEhD,OAAO,CAAC,CAAC,MAAM,CACb,CAAC,GAAG,EAAE,IAAI,KAAI;AACZ,gBAAA,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,EAAE;AAChE,gBAAA,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE;AACpB,oBAAA,OAAO,GAAG;gBACZ;AACA,gBAAA,GAAG,CAAC,KAAkB,CAAC,GAAG,KAAK;AAC/B,gBAAA,OAAO,GAAG;YACZ,CAAC,EACD,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAS,CACzD;AACH,QAAA,CAAC,CAAE;IACL;AAEA,IAAA,uBAAuB,CAAC,MAAc,EAAA;AACpC,QAAA,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,uBAAuB,EAAE,CAAC,EAAE,QAAQ,CAAE;QACxE,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAAE;QACnE,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAM,EAAE,8BAA8B,EAAE,CAAC,CAAE;QAC3E,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,6BAA6B,EAAE,CAAC,CAAE;QACzE,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,0BAA0B,EAAE,CAAC,EAAE,UAAU,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,CAAE;QACvG,IAAI,CAAC,QAAQ,GAAG,UAAU,CACxB,MAAM,EACN,oDAAoD,EACpD,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACf,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAI;AACd,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9C,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9C,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,KAAK,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9C,OAAO,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;AACnC,QAAA,CAAC,CACD;AACF,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,EAAE,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAE;AAC/F,QAAA,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAAE,KAAK,KAAK,KAAK,KAAK,aAAa,GAAG,IAAI,GAAG,KAAK,CAAC,CAAE;AAC7G,QAAA,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC,IAAG;YACxD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE;YAE3C,OAAO,CAAC,CAAC,MAAM,CACb,CAAC,GAAG,EAAE,IAAI,KAAI;AACZ,gBAAA,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,EAAE;AAChE,gBAAA,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE;AACpB,oBAAA,OAAO,GAAG;gBACZ;AACA,gBAAA,GAAG,CAAC,KAAkB,CAAC,GAAG,KAAK;AAC/B,gBAAA,OAAO,GAAG;YACZ,CAAC,EACD,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAS,CACzD;AACH,QAAA,CAAC,CAAE;IACL;AACD;;AC7JM,MAAM,KAAK,GAAG,OAAO,GAAsB,EAAE,IAAkB,KAAuB;IAC3F,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,YAAY,CAAC;AACrD,IAAA,OAAO,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC;AACzB,CAAC;;ACgBD;;AAEK;MACQ,gBAAgB,CAAA;AASR,IAAA,eAAA;AACA,IAAA,UAAA;AACA,IAAA,cAAA;AAVX,IAAA,SAAS,GAA4B;AAC3C,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,OAAO,EAAE;AACP,YAAA,cAAc,EAAE;AACjB;KACF;AAED,IAAA,WAAA,CACmB,eAAgC,EAChC,UAAuB,EACvB,cAAmD,EAAA;QAFnD,IAAA,CAAA,eAAe,GAAf,eAAe;QACf,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,cAAc,GAAd,cAAc;IAC9B;AAEH;;AAEK;AACL,IAAA,SAAS,CAAC,OAA+B,EAAA;QACvC,IAAI,CAAC,SAAS,GAAG;YACf,GAAG,IAAI,CAAC,SAAS;YACjB;SACD;IACH;AAEA;;AAEK;AACL,IAAA,OAAO,CAAC,IAAc,EAAA;AACpB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI;IAC5B;AAEA;;AAEK;AACL,IAAA,QAAQ,CAAC,KAAmC,EAAA;AAC1C,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC;AACpC,YAAA,cAAc,EAAE,MAAc,KAAK,CAAC,GAAG;YACvC,kBAAkB,EAAE,EAAE,KAAK,CAAC,iBAAiB,IAAI,KAAK;AACvD,SAAA,CAAC;IACJ;AAEA;;AAEK;AACL,IAAA,WAAW,CAAC,QAAuB,EAAA;AACjC,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,QAAQ;IACpC;AAEA;;AAEK;AACL,IAAA,0BAA0B,CAAC,uBAAgC,EAAA;AACzD,QAAA,IAAI,CAAC,SAAS,CAAC,uBAAuB,GAAG,uBAAuB;IAClE;AAEA;;AAEK;IACL,GAAG,GAAA;QACD,OAAO,IAAI,CAAC,SAAS;IACvB;AAEA;;AAEK;AACL,IAAA,MAAM,YAAY,CAChB,WAAkD,EAClD,GAAyB,EACzB,IAAuC,EACvC,IAAuC,EACvC,KAA+C,EAC/C,OAAe,EAAA;QAEf,QAAQ,WAAW;AACjB,YAAA,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,yBAAyB,CAAC,GAAa,EAAE,IAAK,EAAE,OAAO,CAAC;AACtE,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,GAAgC,EAAE,IAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;AAC5G,YAAA,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,0BAA0B,CAAC,GAAa,EAAE,OAAO,CAAC;AAChE,YAAA;gBACE,OAAO,IAAI,CAAC,0BAA0B,CAAC,GAAa,EAAE,OAAO,CAAC;;IAEpE;AAEA;;AAEK;AACG,IAAA,yBAAyB,CAC/B,GAAW,EACX,IAA2B,EAC3B,OAAe,EAAA;QAEf,IAAI,CAAC,SAAS,CAAC;AACb,YAAA,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO;YACzB,aAAa,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AACpF,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;AACtB,QAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AAErB,QAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;IACnD;AAEA;;AAEK;IACG,MAAM,yBAAyB,CACrC,GAA8B,EAC9B,IAA2B,EAC3B,IAAuC,EACvC,KAA+C,EAC/C,OAAe,EAAA;AAEf,QAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAGrC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC;AACtC,QAAA,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE;AAC9B,YAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QAC3D;AAEA,QAAA,IAAI,WAAW,EAAE,KAAK,EAAE;AACtB,YAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE;QACzE;AAEA,QAAA,MAAM,WAAW,GAAG,WAAW,EAAE,YAAY;QAE7C,IAAI,WAAW,EAAE;YACf,IAAI,CAAC,SAAS,CAAC;AACb,gBAAA,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO;gBACzB,aAAa,EAAE,CAAA,OAAA,EAAU,WAAW,CAAA;AACrC,aAAA,CAAC;YAEF,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAC7E,IAAI,CAAC,UAAU,EACf,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CACrB;AACD,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC;YAEzC,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACnC,YAAA,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI;YAClC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,SAAS,CAAC;AACb,gBAAA,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO;AACzB,gBAAA,gBAAgB,EAAE,eAAe,CAAC,QAAQ;AAC3C,aAAA,CAAC;QACJ;AAEA,QAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;IACjF;AAEA;;AAEK;IACG,0BAA0B,CAAC,GAAW,EAAE,OAAe,EAAA;AAC7D,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;AACtB,QAAA,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AAErB,QAAA,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;IACnD;AAEA;;AAEI;IACI,MAAM,SAAS,CACrB,GAAW,EACX,IAA2B,EAC3B,IAAuC,EACvC,KAA+C,EAAA;AAE/C,QAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC;AACxE,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC;AAC5C,YAAA,QAAQ,MAAM,QAAQ,CAAC,IAAI,EAAE;QAC/B;QAAE,OAAO,KAAK,EAAE;YACd,OAAO;AACL,gBAAA,KAAK,EAAE;oBACL,OAAO,EAAG,KAAe,CAAC,OAAO;AACjC,oBAAA,KAAK,EAAE;AACR;aACc;QACnB;IACF;AAEA;;AAEI;AACI,IAAA,MAAM,wBAAwB,CACpC,IAA2B,EAC3B,IAAuC,EACvC,KAA+C,EAAA;AAE/C,QAAA,MAAM,SAAS,GAAwC;AACrD,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,mCAAmC;gBACnD,aAAa,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AACpF,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,eAAe,CAAC,IAAI;SAC/B;AAED,QAAA,IAAI,KAAK,EAAE,GAAG,EAAE;AACd,YAAA,SAAS,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC;AAC/B,gBAAA,cAAc,EAAE,MAAc,KAAK,CAAC,GAAG;gBACvC,kBAAkB,EAAE,EAAE,KAAK,CAAC,iBAAiB,IAAI,KAAK;AACvD,aAAA,CAAC;QACJ;AAEA,QAAA,OAAO,SAAS;IAClB;AACD;;AC7ND;;AAEK;MACQ,uBAAuB,CAAA;AAMf,IAAA,eAAA;AACA,IAAA,UAAA;IANF,cAAc,GAAsB,EAAE;AACtC,IAAA,SAAS;AAE1B,IAAA,WAAA,CACE,SAA8B,EACb,eAAgC,EAChC,UAA2B,EAAA;QAD3B,IAAA,CAAA,eAAe,GAAf,eAAe;QACf,IAAA,CAAA,UAAU,GAAV,UAAU;QAE3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;IACnD;AAEA;;AAEI;IACJ,MAAM,YAAY,CAChB,OAAe,EAAA;QAEf,IAAI,GAAG,GAAG,IAAI;QACd,IAAI,YAAY,GAAG,EAAE;QACrB,MAAM,UAAU,GAAmB,EAAE;AAErC,QAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;YACrC,IAAI,CAAC,GAAG,EAAE;AACR,gBAAA,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ;gBAEjD,IAAI,CAAC,IAAI,EAAE;AACT,oBAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;gBAC7C;gBACA,IAAI,CAAC,GAAG,EAAE;AACR,oBAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;gBAC5C;gBAEA,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;AACpG,gBAAA,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;gBACpB,GAAG,GAAG,cAAc;gBACpB,YAAY,GAAG,IAAI;YACrB;QACF;AAEA,QAAA,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE;IAC1C;AAEA;;AAEI;AACI,IAAA,gBAAgB,CAAC,SAA8B,EAAA;QACrD,MAAM,iBAAiB,GAAwB,EAAE;QACjD,MAAM,oBAAoB,GAAwB,EAAE;AAEpD,QAAA,SAAS,CAAC,OAAO,CAAC,QAAQ,IAAG;AAC3B,YAAA,IAAI,QAAQ,EAAE,QAAQ,EAAE;AACtB,gBAAA,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;YAClC;iBAAO;AACL,gBAAA,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACrC;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,eAAe,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAS,GAAG,CAAC,CAAC,QAAS,CAAC;AAEvF,QAAA,OAAO,eAAe,CAAC,MAAM,CAAC,oBAAoB,CAAC;IACrD;AAEA;;AAEI;AACI,IAAA,MAAM,kBAAkB,CAC9B,IAAY,EACZ,GAAyB,EACzB,IAAuC,EACvC,IAAuC,EACvC,KAA+C,EAC/C,OAAe,EAAA;QAKf,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;QACzG,IAAI,KAAK,EAAE;YACT,OAAO;AACL,gBAAA,cAAc,EAAE,IAAI;AACpB,gBAAA,GAAG,EAAE;oBACH,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;oBACxF,UAAU,EAAE,KAAK,EAAE;AACpB;aACF;QACH;AACA,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAW,EAAE,SAAU,CAAC;AACrD,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;AAC3B,gBAAA,MAAM,IAAI,KAAK,CAAC,CAAA,6BAAA,EAAgC,QAAQ,CAAC,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAC,UAAU,CAAA,CAAE,CAAC;YAC3F;YAEA,OAAO;AACL,gBAAA,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,QAAQ,CAAC,WAAW,EAAE,GAAwB,MAAM,CAAC;AACxF,gBAAA,GAAG,EAAE;oBACH,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA,EAAG,QAAQ,CAAC,MAAM,CAAA,EAAA,EAAK,QAAQ,CAAC,UAAU,CAAA,CAAE,EAAE,KAAK,EAAE,IAAI,EAAE;AAC1G,oBAAA,UAAU,EAAE;AACb;aACF;QACH;QAAE,OAAO,KAAK,EAAE;YACd,OAAO;AACL,gBAAA,cAAc,EAAE,IAAI;AACpB,gBAAA,GAAG,EAAE;oBACH,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE;AACtF,oBAAA,UAAU,EAAE;AACb;aACF;QACH;gBAAU;AACR,YAAA,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,cAAc,EAAE;AAC3C,gBAAA,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;AACnC,oBAAA,SAAS,EAAE;gBACb;YACF;QACF;IACF;AAEA;;AAEI;IACI,MAAM,oBAAoB,CAChC,GAAyB,EACzB,IAAuC,EACvC,IAAuC,EACvC,KAA+C,EAC/C,OAAe,EAAA;;AAGf,QAAA,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC;AAElG,QAAA,IAAI,KAAK,EAAE,GAAG,EAAE;AACd,YAAA,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC3B;AAEA,QAAA,IAAI,WAAkD;AACtD,QAAA,IAAK,GAAiC,EAAE,WAAW,IAAI,OAAO,EAAE;YAC9D,WAAW,GAAG,OAAO;QACvB;AACA,QAAA,IAAI,CAAE,GAAiC,EAAE,WAAW,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,OAAO,EAAE;YAC3F,WAAW,GAAG,OAAO;QACvB;QACA,IAAI,CAAE,GAAiC,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YACnE,WAAW,GAAG,QAAQ;QACxB;AAEA,QAAA,OAAO,MAAM,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;IACnF;AACD;;AC9JK,SAAU,IAAI,CAClB,OAAe,EACf,OAAA,GAEkB,EAAE,EACpB,MAAe,EAAA;IAEf,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,KAAI;AACjD,QAAgB,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,KAAI;YAC1E,IAAI,GAAG,EAAE;AACP,gBAAA,OAAO,MAAM,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAA,2BAAA,EAA8B,OAAO,CAAA,CAAE,CAAC,CAAC;YAC/F;AAEA,YAAA,OAAO,OAAO,CAAC,MAAoB,CAAC;AACtC,QAAA,CAAC;AAiBH,IAAA,CAAC,CAAC;AACJ;;ACtCO,eAAe,UAAU,CAAC,MAAc,EAAE,YAAoB,EAAA;;AAEnE,IAAA,MAAM,YAAY,GAAG,CAAA,0BAAA,EAA6B,MAAM,CAAA,YAAA,EAAe,YAAY,QAAQ;AAE3F,IAAA,OAAO,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,IAAG;QAClE,MAAM,IAAI,KAAK,CAAC,CAAA,6CAAA,EAAgD,YAAY,CAAA,EAAA,EAAK,GAAG,CAAC,OAAO,CAAA,CAAE,CAAC;AACjG,IAAA,CAAC,CAAC;AACJ;AAEM,SAAU,WAAW,CACzB,MAAc,EACd,QAAgB,EAChB,OAAgB,EAChB,aAAqB,EAAA;;IAGrB,MAAM,aAAa,GAAG;AACpB,UAAE,CAAA,2BAAA,EAA8B,MAAM,kBAAkB,QAAQ,CAAA,SAAA,EAAY,aAAa,CAAA;UACvF,8BAA8B,MAAM,CAAA,KAAA,EAAQ,QAAQ,CAAA,SAAA,EAAY,aAAa,EAAE;IAEnF,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,IAAG;QACrC,MAAM,IAAI,KAAK,CAAC,CAAA,sBAAA,EAAyB,aAAa,CAAA,EAAA,EAAK,GAAG,CAAC,OAAO,CAAA,CAAE,CAAC;AAC3E,IAAA,CAAC,CAAC;AACJ;AAEO,eAAe,UAAU,CAAC,aAAqB,EAAE,OAAgB,EAAA;;IAEtE,MAAM,YAAY,GAAG;UACjB,CAAA,gCAAA,EAAmC,aAAa,CAAA,MAAA;AAClD,UAAE,CAAA,sBAAA,EAAyB,aAAa,CAAA,MAAA,CAAQ;IAClD,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,IAAG;QAC1C,MAAM,IAAI,KAAK,CAAC,CAAA,2CAAA,EAA8C,YAAY,CAAA,EAAA,EAAK,GAAG,CAAC,OAAO,CAAA,CAAE,CAAC;AAC/F,IAAA,CAAC,CAAC;AACJ;AAEO,eAAe,eAAe,CAAC,aAAqB,EAAE,QAAgB,EAAA;AAC3E,IAAA,MAAM,IAAI,CAAC,CAAA,uBAAA,EAA0B,aAAa,CAAA,mBAAA,EAAsB,QAAQ,CAAA,CAAA,CAAG,CAAC,CAAC,KAAK,CAAC,GAAG,IAAG;QAC/F,MAAM,IAAI,KAAK,CAAC,CAAA,2CAAA,EAA8C,aAAa,CAAA,EAAA,EAAK,GAAG,CAAC,OAAO,CAAA,CAAE,CAAC;AAChG,IAAA,CAAC,CAAC;AACJ;AAEO,eAAe,oBAAoB,CAAC,OAAe,EAAA;AACxD,IAAA,OAAO,MAAM,IAAI,CAAC,CAAA,+BAAA,EAAkC,OAAO,CAAA,cAAA,CAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,IAAG;QACvF,MAAM,IAAI,KAAK,CAAC,CAAA,sCAAA,EAAyC,GAAG,CAAC,OAAO,CAAA,CAAE,CAAC;AACzE,IAAA,CAAC,CAAC;AACJ;AAEO,eAAe,YAAY,GAAA;AAChC,IAAA,IAAI;AACF,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC;AAC1C,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE;AACtB,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;QAC3C;AACA,QAAA,OAAO,MAAM;IACf;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,CAAA,sCAAA,EAA0C,KAAe,CAAC,OAAO,CAAA,CAAE,CAAC;IACtF;AACF;;AC3DA,MAAM,sBAAsB,GAAG;IAC7B,KAAK;IACL,MAAM;IACN,MAAM;IACN,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,KAAK;IACL,KAAK;IACL;CACD;AAEK,SAAU,iBAAiB,CAAC,MAAc,EAAA;AAC9C,IAAA,OAAO,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC;AAChD;AAEM,SAAU,WAAW,CAAC,MAAc,EAAA;AACxC,IAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;AACtC;AAEM,SAAU,qBAAqB,CAAC,MAAc,EAAA;AAClD,IAAA,OAAO;AACJ,SAAA,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;AACjB,SAAA,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AACtB;;ACvBA,GAAG,CAAC,kBAAkB,EAAE;AAExB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAC5B,CACE,OAAwB,EACxB,EAAuF,KACrF;IACF,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,OAAO,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC1D,CAAC,CACF;MAEY,eAAe,CAAA;AAC1B;;AAEK;AACL,IAAA,MAAM,cAAc,CAClB,OAAwB,EACxB,OAAgB,EAAA;AAEhB,QAAA,IAAI;AACF,YAAA,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;YAC9D,IAAI,OAAO,EAAE;gBACX,MAAMA,IAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAA4B,CAAC;YAC5D;AACA,YAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,eAAe,EAAE;QAC1C;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAA,CAAE,CAAC;QACtD;IACF;AACD;;AC7BD;;AAEG;AACG,MAAO,yBAA0B,SAAQ,KAAK,CAAA;AAGvC,IAAA,OAAA;AAFX,IAAA,WAAA,CACE,OAAe,EACN,OAAA,GAA4C,EAAE,EACvD,OAAsB,EAAA;AAEtB,QAAA,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;QAHd,IAAA,CAAA,OAAO,GAAP,OAAO;IAIlB;AACD;;ACKD;;;;;;;AAOK;MACQ,uBAAuB,CAAA;AASf,IAAA,iBAAA;AACA,IAAA,MAAA;AACA,IAAA,QAAA;IAVF,UAAU,GAAoB,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE;AAC9E,IAAA,eAAe;AACf,IAAA,WAAW;AACX,IAAA,SAAS;AACT,IAAA,aAAa;AACb,IAAA,gBAAgB;AAExB,IAAA,WAAA,CACmB,oBAAwC,QAAQ,EAChD,SAA0B,EAAqB,EAC/C,WAAW,QAAQ,EAAA;QAFnB,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;QACjB,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAEzB,IAAI,CAAC,KAAK,EAAE;IACd;AAEA;;AAEK;IACG,KAAK,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE;AAC/B,gBAAA,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC;YACrE;YAEA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;AACnC,gBAAA,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC;YAC1E;AAEA,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE;YAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;YACjD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;YACtC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa;AAC9C,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,uBAAuB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC;QAC5G;IACF;AAEA;;AAEK;AACL,IAAA,MAAM,gBAAgB,CAAC,GAAW,EAAE,OAAO,GAAG,KAAK,EAAA;QACjD,MAAM,cAAc,GAAsB,EAAE;QAC5C,IAAI,aAAa,GAAG,EAAE;AAEtB,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;AAC9E,YAAA,aAAa,GAAG,MAAM,CAAC,QAAQ;AAC/B,YAAA,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;YAE3C,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC;YAC7D,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC;;AAI7E,YAAA,IAAI;;AAEF,gBAAA,IAAI,OAAO;gBACX,IAAI,OAAO,EAAE;oBACX,OAAO,GAAG,aAAa;gBACzB;qBAAO;AACL,oBAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;oBACtE,MAAM,eAAe,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC;AAClD,oBAAA,OAAO,GAAG,GAAG,CAAC,QAAQ;AACtB,oBAAA,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC;gBAC1C;;AAGA,gBAAA,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC;;gBAEpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC;AAE3G,gBAAA,IAAI,IAAI,CAAC,iBAAiB,KAAK,QAAQ,EAAE;AACvC,oBAAA,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC;gBACrC;YACF;YAAE,OAAO,GAAG,EAAE;AACZ,gBAAA,MAAM,IAAI,KAAK,CAAC,8CAA8C,EAAE,GAAY,CAAC;YAC/E;AAEA,YAAA,OAAO,aAAa;QACtB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAK,EAAG,GAAa,CAAC,OAAO,CAAC;QACjF;gBAAU;AACR,YAAA,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE;AACtC,gBAAA,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE;AACnC,oBAAA,SAAS,EAAE;gBACb;YACF;QACF;IACF;AAEA;;;;;AAKK;AACL,IAAA,MAAM,oBAAoB,CAAC,MAAc,EAAE,aAAqB,EAAE,QAAgB,EAAA;AAChF,QAAA,MAAM,YAAY,GAAG,qBAAqB,CAAC,aAAa,CAAC;AAEzD,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE;AACpC,gBAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,aAAa,CAAA,CAAE,CAAC;YAC5D;AACA,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;AACxB,gBAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAA,CAAE,CAAC;YAC9C;YAEA,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC;AACtD,YAAA,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,OAAO,CAAC;YAC3F,IAAI,CAAC,GAAG,EAAE;AACR,gBAAA,MAAM,IAAI,yBAAyB,CAAC,+DAA+D,EAAE;oBACnG,YAAY;oBACZ;AACD,iBAAA,CAAC;YACJ;YACA,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC;YAC7D,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,EAAE,QAAQ,IAAI,IAAI;AAC3D,YAAA,MAAM,EAAE,GAAc;gBACpB,MAAM;gBACN,aAAa;gBACb,QAAQ;gBACR,GAAG;AACH,gBAAA,OAAO,EAAE,KAAK;gBACd,UAAU;gBACV,QAAQ,EAAE,IAAI;aACf;AAED,YAAA,EAAE,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC;YAE1D,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE;QACpD;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,KAAK,YAAY,yBAAyB,EAAE;AAC9C,gBAAA,MAAM,KAAK;YACb;YAEA,MAAM,IAAI,yBAAyB,CAAC,CAAA,mCAAA,EAAuC,KAAe,CAAC,OAAO,CAAA,CAAE,CAAC;QACvG;IACF;AAEA;;AAEK;AACL,IAAA,MAAM,WAAW,CAAC,cAAyB,EAAE,MAAc,EAAE,QAAgB,EAAA;AAC3E,QAAA,IAAI,cAAc,CAAC,QAAQ,KAAK,QAAQ,EAAE;YACxC,MAAM,IAAI,KAAK,CACb,CAAA,6DAAA,EAAgE,QAAQ,CAAA,wCAAA,EAA2C,cAAc,CAAC,QAAQ,CAAA,EAAA,CAAI,CAC/I;QACH;AAEA,QAAA,IAAI,cAAc,CAAC,MAAM,KAAK,MAAM,EAAE;YACpC,MAAM,IAAI,KAAK,CACb,CAAA,0DAAA,EAA6D,MAAM,CAAA,0CAAA,EAA6C,cAAc,CAAC,MAAM,CAAA,EAAA,CAAI,CAC1I;QACH;;AAGA,QAAA,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC;IACjF;AAEA;;AAEK;IACL,MAAM,SAAS,CAAC,MAAc,EAAE,GAAW,EAAE,OAAO,GAAG,KAAK,EAAA;QAC1D,IAAI,eAAe,GAAG,IAAI;AAE1B,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;AACxB,gBAAA,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAA,CAAE,CAAC;YAC9C;;AAGA,YAAA,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;YACrG,eAAe,GAAG,eAAe;AAEjC,YAAA,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;YAE/E,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;YAE3D,IAAI,eAAe,EAAE;AACnB,gBAAA,eAAe,EAAE;YACnB;AAEA,YAAA,OAAO,kBAAkB;QAC3B;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,OAAO,eAAe,KAAK,UAAU,EAAE;AACzC,gBAAA,eAAe,EAAE;YACnB;YAEA,MAAM,IAAI,KAAK,CAAC,CAAA,qBAAA,EAAyB,GAAa,CAAC,OAAO,CAAA,CAAE,CAAC;QACnE;IACF;AAEA;;AAEK;AACL,IAAA,MAAM,WAAW,GAAA;QACf,OAAO,MAAM,YAAY,EAAE;IAC7B;AACD;;;;"} \ No newline at end of file diff --git a/package/timestamp_service/package.json b/package/timestamp_service/package.json index d5ea358..587b7f3 100644 --- a/package/timestamp_service/package.json +++ b/package/timestamp_service/package.json @@ -31,7 +31,8 @@ "lint": "eslint ./src ./test && echo 'npm run lint: OK'", "lint:fix": "eslint . --fix", "format": "prettier -w .", - "test": "npm run lint --silent && echo 'npm test: OK'" + "test": "npm run lint --silent && echo 'npm test: OK'", + "release": "rm -rf ./build && yarn build && npm publish" }, "type": "module", "dependencies": { @@ -60,9 +61,5 @@ }, "resolutions": { "strip-ansi": "6.0.1" - }, - "workspaces": [ - "app/*", - "project/*" - ] + } }