diff --git a/.changeset/fast-zoos-decide.md b/.changeset/fast-zoos-decide.md new file mode 100644 index 0000000000..cfb79c4978 --- /dev/null +++ b/.changeset/fast-zoos-decide.md @@ -0,0 +1,5 @@ +--- +'@api3/airnode-node': minor +--- + +Import processing implementation from @api3/commons diff --git a/packages/airnode-node/package.json b/packages/airnode-node/package.json index 99b80ba7c6..3df4b3123c 100644 --- a/packages/airnode-node/package.json +++ b/packages/airnode-node/package.json @@ -29,6 +29,7 @@ "@api3/airnode-protocol": "^0.12.0", "@api3/airnode-utilities": "^0.12.0", "@api3/airnode-validator": "^0.12.0", + "@api3/commons": "^0.3.0", "@api3/ois": "2.2.1", "@api3/promise-utils": "^0.4.0", "@aws-sdk/client-lambda": "^3.418.0", diff --git a/packages/airnode-node/src/api/index.test.ts b/packages/airnode-node/src/api/index.test.ts deleted file mode 100644 index 6d5061f335..0000000000 --- a/packages/airnode-node/src/api/index.test.ts +++ /dev/null @@ -1,762 +0,0 @@ -import * as adapter from '@api3/airnode-adapter'; -import { ethers } from 'ethers'; -import { AxiosError, AxiosHeaders } from 'axios'; -import * as fixtures from '../../test/fixtures'; -import { getExpectedTemplateIdV0 } from '../evm/templates'; -import { ApiCallErrorResponse, RequestErrorMessage } from '../types'; -import { FIRST_API_CALL_TIMEOUT, SECOND_API_CALL_TIMEOUT } from '../constants'; -import { callApi, verifyTemplateId } from '.'; - -describe('callApi', () => { - fixtures.setEnvVariables({ AIRNODE_WALLET_PRIVATE_KEY: fixtures.getAirnodeWalletPrivateKey() }); - - it('calls the adapter with the given parameters', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - spy.mockResolvedValueOnce({ data: { price: 1000 } }); - const requestedGasPrice = '100000000'; - const requestedMinConfirmations = '0'; - const parameters = { - _type: 'int256', - _path: 'price', - from: 'ETH', - _gasPrice: requestedGasPrice, - _minConfirmations: requestedMinConfirmations, - }; - - const [logs, res] = await callApi({ - type: 'regular', - config: fixtures.buildConfig(), - aggregatedApiCall: fixtures.buildAggregatedRegularApiCall({ parameters }), - }); - - expect(logs).toEqual([]); - expect(res).toEqual({ - success: true, - data: { - encodedValue: '0x0000000000000000000000000000000000000000000000000000000005f5e100', - signature: - '0xe92f5ee40ddb5aa42cab65fcdc025008b2bc026af80a7c93a9aac4e474f8a88f4f2bd861b9cf9a2b050bf0fd13e9714c4575cebbea658d7501e98c0963a5a38b1c', - }, - // _minConfirmations is processed before making API calls - reservedParameterOverrides: { - gasPrice: requestedGasPrice, - }, - }); - expect(spy).toHaveBeenCalledTimes(1); - expect(spy).toHaveBeenCalledWith( - { - endpointName: 'convertToUSD', - ois: fixtures.buildOIS(), - parameters: { from: 'ETH', amount: '1' }, - metadata: { - chainId: '31337', - chainType: 'evm', - requestId: '0xf40127616f09d41b20891bcfd326957a0e3d5a5ecf659cff4d8106c04b024374', - requesterAddress: '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512', - sponsorAddress: '0x2479808b1216E998309A727df8A0A98A1130A162', - sponsorWalletAddress: '0x1C1CEEF1a887eDeAB20219889971e1fd4645b55D', - }, - apiCredentials: [ - { - securitySchemeName: 'myApiSecurityScheme', - securitySchemeValue: 'supersecret', - }, - ], - }, - { timeout: FIRST_API_CALL_TIMEOUT } - ); - }); - - it('calls the adapter with the given parameters even if config.chains cannot be found', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - spy.mockResolvedValueOnce({ data: { price: 1000 } }); - const parameters = { _type: 'int256', _path: 'price', from: 'ETH' }; - - const [logs, res] = await callApi({ - type: 'regular', - config: fixtures.buildConfig({ chains: [] }), - aggregatedApiCall: fixtures.buildAggregatedRegularApiCall({ parameters }), - }); - - expect(logs).toEqual([]); - expect(res).toEqual({ - success: true, - data: { - encodedValue: '0x0000000000000000000000000000000000000000000000000000000005f5e100', - signature: - '0xe92f5ee40ddb5aa42cab65fcdc025008b2bc026af80a7c93a9aac4e474f8a88f4f2bd861b9cf9a2b050bf0fd13e9714c4575cebbea658d7501e98c0963a5a38b1c', - }, - }); - expect(spy).toHaveBeenCalledTimes(1); - expect(spy).toHaveBeenCalledWith( - { - endpointName: 'convertToUSD', - ois: fixtures.buildOIS(), - parameters: { from: 'ETH', amount: '1' }, - metadata: { - chainId: '31337', - chainType: 'evm', - requestId: '0xf40127616f09d41b20891bcfd326957a0e3d5a5ecf659cff4d8106c04b024374', - requesterAddress: '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512', - sponsorAddress: '0x2479808b1216E998309A727df8A0A98A1130A162', - sponsorWalletAddress: '0x1C1CEEF1a887eDeAB20219889971e1fd4645b55D', - }, - apiCredentials: [ - { - securitySchemeName: 'myApiSecurityScheme', - securitySchemeValue: 'supersecret', - }, - ], - }, - { timeout: FIRST_API_CALL_TIMEOUT } - ); - }); - - it('calls the adapter with the given parameters with when request type is http-gateway and config just has ois and apiCredentials props', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - spy.mockResolvedValueOnce({ data: { price: 1000 } }); - const parameters = { _type: 'int256', _path: 'price', from: 'ETH' }; - - const [logs, res] = await callApi({ - type: 'http-gateway', - config: { ois: [fixtures.buildOIS()], apiCredentials: [fixtures.buildApiCredentials()] }, - aggregatedApiCall: fixtures.buildAggregatedHttpGatewayApiCall({ parameters }), - }); - - expect(logs).toEqual([]); - expect(res).toEqual({ - success: true, - data: { - encodedValue: '0x0000000000000000000000000000000000000000000000000000000005f5e100', - rawValue: { price: 1000 }, - values: ['100000000'], - }, - }); - expect(spy).toHaveBeenCalledTimes(1); - expect(spy).toHaveBeenCalledWith( - { - endpointName: 'convertToUSD', - ois: fixtures.buildOIS(), - parameters: { from: 'ETH', amount: '1' }, - metadata: null, - apiCredentials: [ - { - securitySchemeName: 'myApiSecurityScheme', - securitySchemeValue: 'supersecret', - }, - ], - }, - { timeout: FIRST_API_CALL_TIMEOUT } - ); - }); - - it('calls the adapter with the given parameters with when request type is http-signed-data-gateway and config just has ois and apiCredentials props', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - spy.mockResolvedValueOnce({ data: { price: 1000 } }); - const parameters = { _type: 'int256', _path: 'price', from: 'ETH' }; - const encodedParameters = - '0x317373730000000000000000000000000000000000000000000000000000000066726f6d0000000000000000000000000000000000000000000000000000000045544800000000000000000000000000000000000000000000000000000000005f74797065000000000000000000000000000000000000000000000000000000696e7432353600000000000000000000000000000000000000000000000000005f706174680000000000000000000000000000000000000000000000000000007072696365000000000000000000000000000000000000000000000000000000'; - const endpointId = '0x13dea3311fe0d6b84f4daeab831befbc49e19e6494c41e9e065a09c3c68f43b6'; - const templateId = '0xaa1525fe964092a826934ff09c75e1db395b947543a4ca3eb4a19628bad6c6d5'; - const [logs, res] = await callApi({ - type: 'http-signed-data-gateway', - config: { ois: [fixtures.buildOIS()], apiCredentials: [fixtures.buildApiCredentials()] }, - aggregatedApiCall: fixtures.buildAggregatedHttpSignedDataApiCall({ - endpointId, - parameters, - templateId, - template: { - airnodeAddress: '0xA30CA71Ba54E83127214D3271aEA8F5D6bD4Dace', - endpointId, - id: templateId, - encodedParameters, - }, - }), - }); - - expect(logs).toEqual([]); - expect(res).toEqual({ - success: true, - data: { - encodedValue: '0x0000000000000000000000000000000000000000000000000000000005f5e100', - signature: expect.any(String), - timestamp: expect.any(String), - }, - }); - expect(spy).toHaveBeenCalledTimes(1); - expect(spy).toHaveBeenCalledWith( - { - endpointName: 'convertToUSD', - ois: fixtures.buildOIS(), - parameters: { from: 'ETH', amount: '1' }, - metadata: null, - apiCredentials: [ - { - securitySchemeName: 'myApiSecurityScheme', - securitySchemeValue: 'supersecret', - }, - ], - }, - { timeout: FIRST_API_CALL_TIMEOUT } - ); - }); - - it('uses the default endpoint parameters if no user value is provided', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - spy.mockResolvedValueOnce({ data: { price: 1000 } }); - - await callApi({ - type: 'regular', - config: fixtures.buildConfig(), - aggregatedApiCall: fixtures.buildAggregatedRegularApiCall(), - }); - - expect(spy).toHaveBeenCalledTimes(1); - expect(spy).toHaveBeenCalledWith( - expect.objectContaining({ - parameters: { from: 'ETH', amount: '1' }, - }), - { timeout: FIRST_API_CALL_TIMEOUT } - ); - }); - - it('retries the API call if the first attempt fails', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - spy.mockRejectedValueOnce(new Error('First attempt failed')); - spy.mockResolvedValueOnce({ data: { price: 1000 } }); - const requestedGasPrice = '100000000'; - const requestedMinConfirmations = '0'; - const parameters = { - _type: 'int256', - _path: 'price', - from: 'ETH', - _gasPrice: requestedGasPrice, - _minConfirmations: requestedMinConfirmations, - }; - - const [logs, res] = await callApi({ - type: 'regular', - config: fixtures.buildConfig(), - aggregatedApiCall: fixtures.buildAggregatedRegularApiCall({ parameters }), - }); - - expect(logs).toEqual([]); - expect(res).toEqual({ - success: true, - data: { - encodedValue: '0x0000000000000000000000000000000000000000000000000000000005f5e100', - signature: - '0xe92f5ee40ddb5aa42cab65fcdc025008b2bc026af80a7c93a9aac4e474f8a88f4f2bd861b9cf9a2b050bf0fd13e9714c4575cebbea658d7501e98c0963a5a38b1c', - }, - // _minConfirmations is processed before making API calls - reservedParameterOverrides: { - gasPrice: requestedGasPrice, - }, - }); - expect(spy).toHaveBeenCalledTimes(2); - expect(spy).toHaveBeenCalledWith( - { - endpointName: 'convertToUSD', - ois: fixtures.buildOIS(), - parameters: { from: 'ETH', amount: '1' }, - metadata: { - chainId: '31337', - chainType: 'evm', - requestId: '0xf40127616f09d41b20891bcfd326957a0e3d5a5ecf659cff4d8106c04b024374', - requesterAddress: '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512', - sponsorAddress: '0x2479808b1216E998309A727df8A0A98A1130A162', - sponsorWalletAddress: '0x1C1CEEF1a887eDeAB20219889971e1fd4645b55D', - }, - apiCredentials: [ - { - securitySchemeName: 'myApiSecurityScheme', - securitySchemeValue: 'supersecret', - }, - ], - }, - { timeout: SECOND_API_CALL_TIMEOUT } - ); - }); - - it('returns an error if the API call fails to execute', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - const nonAxiosError = new Error('A non-axios error'); - spy.mockRejectedValueOnce(nonAxiosError); - spy.mockRejectedValueOnce(nonAxiosError); - const parameters = { _type: 'int256', _path: 'unknown', from: 'ETH' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - const [logs, res] = await callApi({ type: 'regular', config: fixtures.buildConfig(), aggregatedApiCall }); - expect(logs).toEqual([{ level: 'ERROR', message: 'Failed to call Endpoint:convertToUSD', error: nonAxiosError }]); - expect(res).toEqual({ - errorMessage: `${RequestErrorMessage.ApiCallFailed}`, - success: false, - }); - }); - - const internalAxiosRequestConfig = { headers: new AxiosHeaders() }; - test.each([ - { e: new AxiosError('Error!', 'CODE', internalAxiosRequestConfig, {}, undefined), msg: 'with no response' }, - { - e: new AxiosError('Error!', 'CODE', internalAxiosRequestConfig, undefined, undefined), - msg: 'in building the HTTP request', - }, - { - e: new AxiosError( - 'Error!', - 'CODE', - internalAxiosRequestConfig, - {}, - { status: 404, data: {}, statusText: '', headers: {}, config: internalAxiosRequestConfig } - ), - msg: 'with status code 404', - }, - ])(`returns an error containing "$msg" for the respective axios API call failure`, async ({ e, msg }) => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - const axiosError = e; - spy.mockRejectedValueOnce(axiosError); - spy.mockRejectedValueOnce(axiosError); - - const parameters = { _type: 'int256', _path: 'unknown', from: 'ETH' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - const [logs, res] = await callApi({ type: 'regular', config: fixtures.buildConfig(), aggregatedApiCall }); - expect(logs).toEqual([{ level: 'ERROR', message: 'Failed to call Endpoint:convertToUSD', error: axiosError }]); - expect(res).toEqual({ - errorMessage: `${RequestErrorMessage.ApiCallFailed} ${msg}`, - success: false, - }); - }); - - it('returns an error if the value cannot be found with the _path', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - spy.mockResolvedValueOnce({ data: { price: 1000 } }); - const parameters = { _type: 'int256', _path: 'unknown', from: 'ETH' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - const [logs, res] = await callApi({ type: 'regular', config: fixtures.buildConfig(), aggregatedApiCall }); - expect(logs).toEqual([{ level: 'ERROR', message: `Unable to find value at path: 'unknown'` }]); - expect(res).toEqual({ - errorMessage: `Unable to find value at path: 'unknown'`, - success: false, - }); - }); - - it('returns an error if the value encoding fails', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - spy.mockResolvedValueOnce({ data: { price: -1000 } }); - const parameters = { _type: 'uint256', _path: 'price', from: 'ETH' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - const [logs, res] = await callApi({ - type: 'regular', - config: fixtures.buildConfig(), - aggregatedApiCall, - }); - - expect(logs[0].level).toEqual('ERROR'); - expect(logs[0].message).toContain('value out-of-bounds'); - - const { errorMessage, success } = res as ApiCallErrorResponse; - - expect(errorMessage).toContain('value out-of-bounds'); - expect(success).toEqual(false); - }); - - it('returns an error if the parameter type is invalid', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - spy.mockResolvedValueOnce({ data: { price: '1000' } }); - const parameters = { _type: 'string', _path: 'price', from: 'ETH', test: 'new' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - const [logs, res] = await callApi({ - type: 'regular', - config: fixtures.buildConfig(), - aggregatedApiCall, - }); - expect(logs).toEqual([ - { - level: 'ERROR', - message: `Parameter "_times" can only be used with numeric types, but "_type" was "${parameters._type}"`, - }, - ]); - expect(res).toEqual({ - errorMessage: `Parameter "_times" can only be used with numeric types, but "_type" was "${parameters._type}"`, - success: false, - }); - }); - - it('returns an error if the parameter type cannot be converted', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - spy.mockResolvedValueOnce({ data: { price: 'string' } }); - const parameters = { _type: 'int256', _path: 'price', from: 'ETH', test: 'new' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - const [logs, res] = await callApi({ - type: 'regular', - config: fixtures.buildConfig(), - aggregatedApiCall, - }); - expect(logs).toEqual([ - { - level: 'ERROR', - message: `Unable to cast value to int256`, - }, - ]); - expect(res).toEqual({ - errorMessage: `Unable to cast value to int256`, - success: false, - }); - }); - - describe('pre-processing', () => { - const createEncodedValue = (value: ethers.BigNumber, times = 100_000) => - `0x${value.mul(times).toHexString().substring(2).padStart(64, '0')}`; - - it('pre-processes parameters - valid processing code', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - spy.mockResolvedValueOnce({ data: { price: 123 } }); - const parameters = { _type: 'int256', _path: 'price', from: 'TBD' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - const config = fixtures.buildConfig(); - const preProcessingSpecifications = [ - { - environment: 'Node' as const, - value: 'const output = {...input, from: "BTC"};', - timeoutMs: 5_000, - }, - { - environment: 'Node' as const, - value: 'const output = {...input, source: "airnode"};', - timeoutMs: 5_000, - }, - ]; - config.ois[0].endpoints[0] = { ...config.ois[0].endpoints[0], preProcessingSpecifications }; - - const [logs, res] = await callApi({ - type: 'regular', - config, - aggregatedApiCall, - }); - - expect(logs).toEqual([]); - expect(res).toEqual({ - success: true, - data: { - encodedValue: createEncodedValue(ethers.BigNumber.from(123)), - signature: - '0xf884749942af38ef69735fcbabd1a521f7ac3b87e9988f1a57bdba10cca57f811fd43492aace34674c374a26518855c33bfb322bf5a567bac65453e67c0a4e401c', - }, - }); - expect(spy).toHaveBeenCalledTimes(1); - expect(spy).toHaveBeenCalledWith( - expect.objectContaining({ - parameters: { from: 'BTC', source: 'airnode', amount: '1' }, - }), - { timeout: FIRST_API_CALL_TIMEOUT } - ); - }); - - it('post-processes parameters - valid processing code', async () => { - const spy = jest.spyOn(adapter, 'buildAndExecuteRequest') as any; - spy.mockResolvedValueOnce({ data: { price: 123 } }); - const parameters = { _type: 'int256', _path: '', from: 'ETH' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - const config = fixtures.buildConfig(); - const postProcessingSpecifications = [ - { - environment: 'Node' as const, - value: 'const output = parseInt(input.price)*1000;', - timeoutMs: 5_000, - }, - { - environment: 'Node' as const, - value: 'const output = parseInt(input)*2;', - timeoutMs: 5_000, - }, - ]; - config.ois[0].endpoints[0] = { ...config.ois[0].endpoints[0], postProcessingSpecifications }; - - const [logs, res] = await callApi({ - type: 'regular', - config, - aggregatedApiCall, - }); - - expect(logs).toEqual([]); - expect(res).toEqual({ - success: true, - data: { - encodedValue: createEncodedValue(ethers.BigNumber.from(123 * 1000 * 2)), - signature: - '0xb32600a43cf9f93445c9fb478ba355efa773e841b498c61218ed1a5a81a43e3d0ade6fb1a0083506c7ab3426bce45dd92d6198c136a80cdfacde839f3fcf5c8a1b', - }, - }); - expect(spy).toHaveBeenCalledTimes(1); - expect(spy).toHaveBeenCalledWith( - expect.objectContaining({ - parameters: { from: 'ETH', amount: '1' }, - }), - { timeout: FIRST_API_CALL_TIMEOUT } - ); - }); - }); - describe('skip API call', () => { - const createEncodedValue = (value: ethers.BigNumber, times = 100_000) => - `0x${value.mul(times).toHexString().substring(2).padStart(64, '0')}`; - - it('skips the API call with preProcessingSpecifications', async () => { - const config = fixtures.buildConfig(); - const parameters = { _type: 'int256', _path: 'result', parameter1: '25' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - const preProcessingSpecifications = [ - { - environment: 'Node' as const, - value: 'const output = { result: (parseInt(input.parameter1) * 2).toString() }', - timeoutMs: 5000, - }, - ]; - - config.ois[0].endpoints[0].operation = undefined; - config.ois[0].endpoints[0].fixedOperationParameters = []; - config.ois[0].endpoints[0].preProcessingSpecifications = preProcessingSpecifications; - - const [logs, res] = await callApi({ - type: 'regular', - config, - aggregatedApiCall, - }); - - expect(logs).toEqual([]); - expect(res).toEqual({ - success: true, - data: { - encodedValue: createEncodedValue(ethers.BigNumber.from(25 * 2)), - signature: - '0x148d65210b201c3ddd6f8e08cfc29032e9f3c781919eeb80b950dbb984ebbbee289105ea8b591ace166d04b65e334801ea0177bb431775db2b4268d55fa4e2a81c', - }, - }); - }); - - it('skips the API call with postProcessingSpecifications', async () => { - const config = fixtures.buildConfig(); - const parameters = { _type: 'int256', _path: 'result', parameter1: '25' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - const postProcessingSpecifications = [ - { - environment: 'Node' as const, - value: 'const output = { result: (parseInt(input.parameter1) * 2).toString() }', - timeoutMs: 5000, - }, - ]; - - config.ois[0].endpoints[0].operation = undefined; - config.ois[0].endpoints[0].fixedOperationParameters = []; - config.ois[0].endpoints[0].postProcessingSpecifications = postProcessingSpecifications; - - const [logs, res] = await callApi({ - type: 'regular', - config, - aggregatedApiCall, - }); - - expect(logs).toEqual([]); - expect(res).toEqual({ - success: true, - data: { - encodedValue: createEncodedValue(ethers.BigNumber.from(25 * 2)), - signature: - '0x148d65210b201c3ddd6f8e08cfc29032e9f3c781919eeb80b950dbb984ebbbee289105ea8b591ace166d04b65e334801ea0177bb431775db2b4268d55fa4e2a81c', - }, - }); - }); - - it('skips API call with both preProcessingSpecifications and postProcessingSpecifications', async () => { - const config = fixtures.buildConfig(); - const parameters = { _type: 'int256', _path: 'result', parameter1: '25' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - const preProcessingSpecifications = [ - { - environment: 'Node' as const, - value: 'const output = {...input, addThis: "5" }', - timeoutMs: 5000, - }, - ]; - const postProcessingSpecifications = [ - { - environment: 'Node' as const, - value: 'const output = { result: (parseInt(input.parameter1) * 2 + parseInt(input.addThis)).toString() }', - timeoutMs: 5000, - }, - ]; - - config.ois[0].endpoints[0].operation = undefined; - config.ois[0].endpoints[0].fixedOperationParameters = []; - config.ois[0].endpoints[0].preProcessingSpecifications = preProcessingSpecifications; - config.ois[0].endpoints[0].postProcessingSpecifications = postProcessingSpecifications; - - const [logs, res] = await callApi({ - type: 'regular', - config, - aggregatedApiCall, - }); - - expect(logs).toEqual([]); - expect(res).toEqual({ - success: true, - data: { - encodedValue: createEncodedValue(ethers.BigNumber.from(25 * 2 + 5)), - signature: - '0x9796e8ba07c517a43b2ca1416b9c975541345c5b7bf73613738ed84216c4573d1656cbc385acb9111b7077fba65418b59cfe3f59ee81109523664bbc25efcfd71b', - }, - }); - }); - - it('fails when both preProcessingSpecifications and postProcessingSpecifications are empty', async () => { - const config = fixtures.buildConfig(); - const parameters = { _type: 'int256', _path: 'result', parameter1: '25' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - - config.ois[0].endpoints[0].operation = undefined; - config.ois[0].endpoints[0].fixedOperationParameters = []; - config.ois[0].endpoints[0].preProcessingSpecifications = []; - config.ois[0].endpoints[0].postProcessingSpecifications = []; - - const [logs, res] = await callApi({ - type: 'regular', - config, - aggregatedApiCall, - }); - - expect(logs).toEqual([ - { - level: 'ERROR', - message: - "Failed to skip API call. Ensure at least one of 'preProcessingSpecifications' or 'postProcessingSpecifications' is defined and is not an empty array at ois 'Currency Converter API', endpoint 'convertToUSD'.", - }, - ]); - expect(res).toEqual({ - success: false, - errorMessage: `Failed to skip API call. Ensure at least one of 'preProcessingSpecifications' or 'postProcessingSpecifications' is defined and is not an empty array at ois 'Currency Converter API', endpoint 'convertToUSD'.`, - }); - }); - - it('fails when both preProcessingSpecifications and postProcessingSpecifications are undefined', async () => { - const config = fixtures.buildConfig(); - const parameters = { _type: 'int256', _path: 'result', parameter1: '25' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - - config.ois[0].endpoints[0].operation = undefined; - config.ois[0].endpoints[0].fixedOperationParameters = []; - config.ois[0].endpoints[0].preProcessingSpecifications = undefined; - config.ois[0].endpoints[0].postProcessingSpecifications = undefined; - - const [logs, res] = await callApi({ - type: 'regular', - config, - aggregatedApiCall, - }); - - expect(logs).toEqual([ - { - level: 'ERROR', - message: - "Failed to skip API call. Ensure at least one of 'preProcessingSpecifications' or 'postProcessingSpecifications' is defined and is not an empty array at ois 'Currency Converter API', endpoint 'convertToUSD'.", - }, - ]); - expect(res).toEqual({ - success: false, - errorMessage: `Failed to skip API call. Ensure at least one of 'preProcessingSpecifications' or 'postProcessingSpecifications' is defined and is not an empty array at ois 'Currency Converter API', endpoint 'convertToUSD'.`, - }); - }); - }); -}); - -describe('verifyTemplateId', () => { - const validTemplateFields = { - airnodeAddress: '0x5FbDB2315678afecb367f032d93F642f64180aa3', - endpointId: '0x2f3a3adf6daf5a3bb00ab83aa82262a6a84b59b0a89222386135330a1819ab48', - encodedParameters: '0x6466726f6d63455448', - }; - - const TEMPLATE_ID = '0xb2f063157fcc3c986daf4c2cf1b8ac8b8843f2b1a54c5de5e1ebdf12fb85a927'; - - it('returns API calls not linked to templates', () => { - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ templateId: null }); - const config = fixtures.buildConfig(); - - const response = verifyTemplateId({ type: 'regular', aggregatedApiCall, config }); - - expect(response).toEqual(null); - }); - - it('ignores API calls where the template cannot be found', () => { - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ - templateId: TEMPLATE_ID, - template: undefined, - }); - const config = fixtures.buildConfig(); - - const response = verifyTemplateId({ type: 'regular', aggregatedApiCall, config }); - - expect(response).toEqual([ - [ - { - level: 'ERROR', - message: `Ignoring Request:${aggregatedApiCall.id} as the template could not be found for verification`, - }, - ], - { - errorMessage: `Ignoring Request:${aggregatedApiCall.id} as the template could not be found for verification`, - success: false, - }, - ]); - }); - - it('does nothing where API calls are linked to a valid templated', () => { - const template = fixtures.requests.buildApiCallTemplate({ - ...validTemplateFields, - id: TEMPLATE_ID, - }); - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ - templateId: TEMPLATE_ID, - template, - }); - const config = fixtures.buildConfig(); - - const response = verifyTemplateId({ type: 'regular', aggregatedApiCall, config }); - - expect(response).toEqual(null); - }); - - describe('invalid fields', () => { - const validTemplate = fixtures.requests.buildApiCallTemplate({ - ...validTemplateFields, - id: TEMPLATE_ID, - }); - const config = fixtures.buildConfig(); - const invalidFields = { - airnodeAddress: '0x69e2B095fbAc6C3f9E528Ef21882b86BF1595181', - endpointId: '0x05218bc3e2497776d24b7da2890e12c910d07ce647cc45bd565cbb167e620df3', - encodedParameters: '0x1234', - }; - - Object.keys(invalidFields).forEach((field) => { - it(`is invalid if ${field} has been changed`, () => { - const invalidTemplate = { ...validTemplate, [field]: (invalidFields as any)[field] }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ - templateId: TEMPLATE_ID, - template: invalidTemplate, - }); - const expectedTemplateId = getExpectedTemplateIdV0(invalidTemplate); - const response = verifyTemplateId({ type: 'regular', aggregatedApiCall, config }); - expect(response).toEqual([ - [ - { - level: 'ERROR', - message: `Invalid template ID:${TEMPLATE_ID} found for Request:${aggregatedApiCall.id}. Expected template ID:${expectedTemplateId}`, - }, - ], - { - errorMessage: `Invalid template ID:${TEMPLATE_ID} found for Request:${aggregatedApiCall.id}. Expected template ID:${expectedTemplateId}`, - success: false, - }, - ]); - }); - }); - }); -}); diff --git a/packages/airnode-node/src/api/index.ts b/packages/airnode-node/src/api/index.ts index ecc01d014c..f180868d43 100644 --- a/packages/airnode-node/src/api/index.ts +++ b/packages/airnode-node/src/api/index.ts @@ -1,15 +1,15 @@ import * as adapter from '@api3/airnode-adapter'; import isEmpty from 'lodash/isEmpty'; -import { OIS, RESERVED_PARAMETERS, Endpoint } from '@api3/ois'; +import { RESERVED_PARAMETERS } from '@api3/ois'; +import { preProcessApiCallParameters, postProcessApiCallResponse } from '@api3/commons'; import { logger, removeKeys, removeKey } from '@api3/airnode-utilities'; import { go, goSync } from '@api3/promise-utils'; import axios, { AxiosError } from 'axios'; import { ethers } from 'ethers'; import compact from 'lodash/compact'; -import { postProcessApiSpecifications, preProcessApiSpecifications } from './processing'; import { getAirnodeWalletFromPrivateKey } from '../evm'; import { getReservedParameters } from '../adapters/http/parameters'; -import { FIRST_API_CALL_TIMEOUT, SECOND_API_CALL_TIMEOUT } from '../constants'; +import { FIRST_API_CALL_TIMEOUT, PROCESSING_TIMEOUT, SECOND_API_CALL_TIMEOUT } from '../constants'; import { isValidRequestId } from '../evm/verification'; import { getExpectedTemplateIdV0, getExpectedTemplateIdV1 } from '../evm/templates'; import { @@ -223,7 +223,9 @@ export async function processSuccessfulApiCall( const { _type, _path, _times, _gasPrice } = getReservedParameters(endpoint, parameters); const goPostProcessApiSpecifications = await go(() => - postProcessApiSpecifications(rawResponse.data, endpoint, payload) + postProcessApiCallResponse(rawResponse.data, endpoint, aggregatedApiCall.parameters, { + totalTimeoutMs: PROCESSING_TIMEOUT, + }) ); if (!goPostProcessApiSpecifications.success) { const log = logger.pend('ERROR', goPostProcessApiSpecifications.error.message); @@ -240,7 +242,7 @@ export async function processSuccessfulApiCall( if (!goExtractAndEncodeResponse.success) { const log = logger.pend('ERROR', goExtractAndEncodeResponse.error.message); // The HTTP gateway is a special case for ChainAPI where we return data from a successful API call that failed processing - if (payload.type === 'http-gateway') { + if (type === 'http-gateway') { return [ [log], { success: true, errorMessage: goExtractAndEncodeResponse.error.message, data: { rawValue: rawResponse.data } }, @@ -295,9 +297,14 @@ export async function callApi(payload: ApiCallPayload): Promise o.title === payload.aggregatedApiCall.oisTitle)!; - const endpoint = ois.endpoints.find((e: Endpoint) => e.name === payload.aggregatedApiCall.endpointName)!; + const { + aggregatedApiCall: { parameters }, + } = payload; + const ois = payload.config.ois.find((o) => o.title === payload.aggregatedApiCall.oisTitle)!; + const endpoint = ois.endpoints.find((e) => e.name === payload.aggregatedApiCall.endpointName)!; + const processedParameters = await preProcessApiCallParameters(endpoint, parameters, { + totalTimeoutMs: PROCESSING_TIMEOUT, + }); // skip API call if operation is undefined and fixedOperationParameters is empty array if (!endpoint.operation && isEmpty(endpoint.fixedOperationParameters)) { @@ -309,10 +316,13 @@ export async function callApi(payload: ApiCallPayload): Promise { - it('valid processing code', async () => { - const config = fixtures.buildConfig(); - const preProcessingSpecifications = [ - { - environment: 'Node' as const, - value: 'const output = {...input, from: "ETH"};', - timeoutMs: 5_000, - }, - { - environment: 'Node' as const, - value: 'const output = {...input, newProp: "airnode"};', - timeoutMs: 5_000, - }, - ]; - config.ois[0].endpoints[0] = { ...config.ois[0].endpoints[0], preProcessingSpecifications }; - - const parameters = { _type: 'int256', _path: 'price' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - - const result = await preProcessApiSpecifications({ type: 'regular', config, aggregatedApiCall }); - - expect(result.aggregatedApiCall.parameters).toEqual({ - _path: 'price', - _type: 'int256', - from: 'ETH', - newProp: 'airnode', - }); - }); - - it('invalid processing code', async () => { - const config = fixtures.buildConfig(); - const preProcessingSpecifications = [ - { - environment: 'Node' as const, - value: 'something invalid; const output = {...input, from: `ETH`};', - timeoutMs: 5_000, - }, - { - environment: 'Node' as const, - value: 'const output = {...input, newProp: "airnode"};', - timeoutMs: 5_000, - }, - ]; - config.ois[0].endpoints[0] = { ...config.ois[0].endpoints[0], preProcessingSpecifications }; - - const parameters = { _type: 'int256', _path: 'price', from: 'TBD' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - - const throwingFunc = () => preProcessApiSpecifications({ type: 'regular', config, aggregatedApiCall }); - - await expect(throwingFunc).rejects.toEqual(new Error('SyntaxError: Unexpected identifier')); - }); - - it('demonstrates access to endPointParameters, but reserved parameters are inaccessible', async () => { - const config = fixtures.buildConfig(); - const preProcessingSpecifications = [ - { - environment: 'Node' as const, - // pretend the user is trying to 1) override _path and 2) set a new parameter based on - // the presence of the reserved parameter _type (which is inaccessible) - value: - 'const output = {...input, from: "ETH", _path: "price.newpath", myVal: input._type ? "123" : "456", newTo: endpointParameters.to };', - timeoutMs: 5_000, - }, - ]; - config.ois[0].endpoints[0] = { ...config.ois[0].endpoints[0], preProcessingSpecifications }; - - const parameters = { _type: 'int256', _path: 'price', to: 'USD' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - - const result = await preProcessApiSpecifications({ type: 'http-gateway', config, aggregatedApiCall }); - - expect(result.aggregatedApiCall.parameters).toEqual({ - _path: 'price', // is not overridden - _type: 'int256', - from: 'ETH', // originates from the processing code - to: 'USD', // should be unchanged from the original parameters - myVal: '456', // is set to "456" because _type is not present in the environment - newTo: 'USD', // demonstrates access to endpointParameters - }); - }); -}); - -describe('post-processing', () => { - it('processes valid code', async () => { - const config = fixtures.buildConfig(); - const postProcessingSpecifications = [ - { - environment: 'Node' as const, - value: 'const output = parseInt(input.price)*2;', - timeoutMs: 5_000, - }, - { - environment: 'Node' as const, - value: 'const output = parseInt(input)*2;', - timeoutMs: 5_000, - }, - ]; - const endpoint = { ...config.ois[0].endpoints[0], postProcessingSpecifications }; - const parameters = { _type: 'int256', _path: 'price' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - - const result = await postProcessApiSpecifications({ price: 1000 }, endpoint, { - type: 'http-gateway', - config, - aggregatedApiCall, - }); - - expect(result).toEqual(4000); - }); - - it('demonstrates access to endPointParameters, but reserved parameters are inaccessible', async () => { - const config = fixtures.buildConfig(); - const postProcessingSpecifications = [ - { - environment: 'Node' as const, - value: - 'const reservedMultiplier = endpointParameters._times ? 1 : 2; const output = parseInt(input.price) * endpointParameters.myMultiplier * reservedMultiplier;', - timeoutMs: 5_000, - }, - ]; - const endpoint = { ...config.ois[0].endpoints[0], postProcessingSpecifications }; - const myMultiplier = 10; - const parameters = { _type: 'int256', _path: 'price', myMultiplier }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - - const price = 1000; - const result = await postProcessApiSpecifications({ price }, endpoint, { - type: 'http-gateway', - config, - aggregatedApiCall, - }); - - // reserved parameters (_times) should be inaccessible to post-processing for the - // http-gateway, hence multiplication by 2 instead of 1 - expect(result).toEqual(price * myMultiplier * 2); - }); - - it('throws on invalid code', async () => { - const config = fixtures.buildConfig(); - const postProcessingSpecifications = [ - { - environment: 'Node' as const, - value: 'const output = parseInt(input.price)*1000;', - timeoutMs: 5_000, - }, - { - environment: 'Node' as const, - value: 'Something Unexpected; const output = parseInt(input)*2;', - timeoutMs: 5_000, - }, - ]; - const endpoint = { ...config.ois[0].endpoints[0], postProcessingSpecifications }; - const parameters = { _type: 'int256', _path: 'price' }; - const aggregatedApiCall = fixtures.buildAggregatedRegularApiCall({ parameters }); - - const throwingFunc = () => - postProcessApiSpecifications({ price: 1000 }, endpoint, { - type: 'http-gateway', - config, - aggregatedApiCall, - }); - - await expect(throwingFunc).rejects.toEqual(new Error('SyntaxError: Unexpected identifier')); - }); -}); diff --git a/packages/airnode-node/src/api/processing.ts b/packages/airnode-node/src/api/processing.ts deleted file mode 100644 index 06727a2c6b..0000000000 --- a/packages/airnode-node/src/api/processing.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Endpoint, ProcessingSpecification, RESERVED_PARAMETERS } from '@api3/ois'; -import { go } from '@api3/promise-utils'; -import { unsafeEvaluate, unsafeEvaluateAsync } from './unsafe-evaluate'; -import { apiCallParametersSchema } from '../validation'; -import { PROCESSING_TIMEOUT } from '../constants'; -import { ApiCallParameters, ApiCallPayload } from '../types'; - -const reservedParameters = RESERVED_PARAMETERS as string[]; - -const removeReservedParameters = (parameters: ApiCallParameters): ApiCallParameters => { - return Object.fromEntries(Object.entries(parameters).filter(([key]) => !reservedParameters.includes(key))); -}; - -/** - * Re-inserts reserved parameters from the initial parameters object into the modified parameters object. - */ -const reInsertReservedParameters = ( - initialParameters: ApiCallParameters, - modifiedParameters: ApiCallParameters -): ApiCallParameters => { - return Object.entries(initialParameters).reduce( - (params, [key, value]) => (reservedParameters.includes(key) ? { ...params, [key]: value } : params), - modifiedParameters - ); -}; - -export const preProcessApiSpecifications = async (payload: ApiCallPayload): Promise => { - const { config, aggregatedApiCall } = payload; - const { endpointName, oisTitle } = aggregatedApiCall; - const ois = config.ois.find((o) => o.title === oisTitle)!; - const { preProcessingSpecifications } = ois.endpoints.find((e) => e.name === endpointName)!; - - if (!preProcessingSpecifications || preProcessingSpecifications.length === 0) { - return payload; - } - - const inputParameters = removeReservedParameters(aggregatedApiCall.parameters); - - const goProcessedParameters = await go( - () => - preProcessingSpecifications.reduce(async (input: Promise, currentValue: ProcessingSpecification) => { - // provide endpoint parameters without reserved parameters immutably between steps - const endpointParameters = removeReservedParameters( - JSON.parse(JSON.stringify(payload.aggregatedApiCall.parameters)) - ); - switch (currentValue.environment) { - case 'Node': - return unsafeEvaluate(await input, currentValue.value, currentValue.timeoutMs, endpointParameters); - case 'Node async': - return unsafeEvaluateAsync(await input, currentValue.value, currentValue.timeoutMs, endpointParameters); - default: - throw new Error(`Environment ${currentValue.environment} is not supported`); - } - }, Promise.resolve(inputParameters)), - { retries: 0, totalTimeoutMs: PROCESSING_TIMEOUT } - ); - - if (!goProcessedParameters.success) { - throw goProcessedParameters.error; - } - - // Let this throw if the processed parameters are invalid - const parsedParameters = apiCallParametersSchema.parse(goProcessedParameters.data); - - // Having removed reserved parameters for pre-processing, we need to re-insert them for the API call - const parameters = reInsertReservedParameters(aggregatedApiCall.parameters, parsedParameters); - - return { - ...payload, - aggregatedApiCall: { - ...aggregatedApiCall, - parameters, - }, - } as ApiCallPayload; -}; - -export const postProcessApiSpecifications = async (input: unknown, endpoint: Endpoint, payload: ApiCallPayload) => { - const { postProcessingSpecifications } = endpoint; - - if (!postProcessingSpecifications || postProcessingSpecifications?.length === 0) { - return input; - } - - const goResult = await go( - () => - postProcessingSpecifications.reduce(async (input: any, currentValue: ProcessingSpecification) => { - // provide endpoint parameters without reserved parameters immutably between steps - const endpointParameters = removeReservedParameters( - JSON.parse(JSON.stringify(payload.aggregatedApiCall.parameters)) - ); - switch (currentValue.environment) { - case 'Node': - return unsafeEvaluate(await input, currentValue.value, currentValue.timeoutMs, endpointParameters); - case 'Node async': - return unsafeEvaluateAsync(await input, currentValue.value, currentValue.timeoutMs, endpointParameters); - default: - throw new Error(`Environment ${currentValue.environment} is not supported`); - } - }, Promise.resolve(input)), - - { retries: 0, totalTimeoutMs: PROCESSING_TIMEOUT } - ); - - if (!goResult.success) { - throw goResult.error; - } - - return goResult.data; -}; diff --git a/packages/airnode-node/src/api/unsafe-evaluate.test.ts b/packages/airnode-node/src/api/unsafe-evaluate.test.ts deleted file mode 100644 index 752685938f..0000000000 --- a/packages/airnode-node/src/api/unsafe-evaluate.test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { unsafeEvaluate, unsafeEvaluateAsync } from './unsafe-evaluate'; - -describe('unsafe evaluate - sync', () => { - it('executes harmless code', () => { - const result = unsafeEvaluate({ a: true, b: 123 }, "const output = {...input, c: 'some-value'}", 5_000); - - expect(result).toEqual({ a: true, b: 123, c: 'some-value' }); - }); - - it('throws on exception', () => { - expect(() => unsafeEvaluate({}, "throw new Error('unexpected')", 5_000)).toThrow('unexpected'); - }); -}); - -describe('unsafe evaluate - async', () => { - it('executes harmless code', async () => { - const result = unsafeEvaluateAsync( - { a: true, b: 123 }, - "const output = {...input, c: 'some-value'}; resolve(output);", - 5_000 - ); - - await expect(result).resolves.toEqual({ a: true, b: 123, c: 'some-value' }); - }); - - it('can use setTimeout and setInterval', async () => { - const result = unsafeEvaluateAsync( - [], - ` - const fn = async () => { - const output = input; - output.push('start') - - const tickMs = 35 - const bufferMs = 25 - setInterval(() => output.push('ping interval'), tickMs) - await new Promise((res) => setTimeout(res, tickMs * 4 + bufferMs)); - - output.push('end') - resolve(output); - }; - - fn() - `, - 200 - ); - - await expect(result).resolves.toEqual([ - 'start', - 'ping interval', - 'ping interval', - 'ping interval', - 'ping interval', - 'end', - ]); - }); - - it('applies timeout when using setTimeout', async () => { - await expect(() => - unsafeEvaluateAsync( - {}, - ` - const fn = () => { - setTimeout(() => console.log('ping timeout'), 100) - }; - - fn() - `, - 50 - ) - ).rejects.toEqual(new Error('Timeout exceeded')); - }); - - it('applies timeout when using setInterval', async () => { - await expect(() => - unsafeEvaluateAsync( - {}, - ` - const fn = () => { - const someFn = () => {} - setInterval(someFn, 10) - }; - - fn() - `, - 50 - ) - ).rejects.toEqual(new Error('Timeout exceeded')); - }); - - it('processing can call reject', async () => { - await expect(() => - unsafeEvaluateAsync({}, `reject(new Error('Rejected by processing snippet.'))`, 50) - ).rejects.toEqual(new Error('Rejected by processing snippet.')); - }); - - it('throws on exception', async () => { - await expect(() => unsafeEvaluateAsync({}, "throw new Error('unexpected')", 5_000)).rejects.toEqual( - new Error('unexpected') - ); - }); -}); diff --git a/packages/airnode-node/src/api/unsafe-evaluate.ts b/packages/airnode-node/src/api/unsafe-evaluate.ts deleted file mode 100644 index 79f416aa35..0000000000 --- a/packages/airnode-node/src/api/unsafe-evaluate.ts +++ /dev/null @@ -1,146 +0,0 @@ -import assert from 'assert'; -import async_hooks from 'async_hooks'; -import buffer from 'buffer'; -import child_process from 'child_process'; -import cluster from 'cluster'; -import console from 'console'; -import constants from 'constants'; -import crypto from 'crypto'; -import dgram from 'dgram'; -import dns from 'dns'; -import events from 'events'; -import fs from 'fs'; -import http from 'http'; -import http2 from 'http2'; -import https from 'https'; -import inspector from 'inspector'; -import module from 'module'; -import net from 'net'; -import os from 'os'; -import path from 'path'; -import perf_hooks from 'perf_hooks'; -import process from 'process'; -import readline from 'readline'; -import repl from 'repl'; -import stream from 'stream'; -import string_decoder from 'string_decoder'; -import timers from 'timers'; -import tls from 'tls'; -import trace_events from 'trace_events'; -import tty from 'tty'; -import url from 'url'; -import util from 'util'; -import v8 from 'v8'; -import vm from 'vm'; -import worker_threads from 'worker_threads'; -import zlib from 'zlib'; -import { createTimers } from './vm-timers'; - -const builtInNodeModules = { - assert, - async_hooks, - buffer, - child_process, - cluster, - console, - constants, - crypto, - dgram, - dns, - events, - fs, - http, - http2, - https, - inspector, - module, - net, - os, - path, - perf_hooks, - process, - readline, - repl, - stream, - string_decoder, - timers, - tls, - trace_events, - tty, - url, - util, - v8, - vm, - worker_threads, - zlib, -}; - -/** - * This function is dangerous. Make sure to use it only with Trusted code. - */ -export const unsafeEvaluate = (input: any, code: string, timeout: number, endpointParameters?: any) => { - const vmContext = { - input, - endpointParameters, - ...builtInNodeModules, - deferredOutput: undefined, - }; - - vm.runInNewContext(`${code}; deferredOutput = output;`, vmContext, { - displayErrors: true, - timeout, - }); - - return vmContext.deferredOutput; -}; - -/** - * This function runs asynchronous code in a Node VM. - - * @code should be written as ({input, resolve}) => {something; resolve({...input, something: 1})}; - * Refer to vmContext here for what's available. - * - * Some libraries one might expect to be available may not necessarily be available in cloud environments due to - * being stripped out by webpack. In these cases these libraries may need to be minified and included in the `code` - * payload. - * - * The value given to `resolve` is expected to be the equivalent of `output` above. - */ -export const unsafeEvaluateAsync = (input: any, code: string, timeout: number, endpointParameters?: any) => { - let vmReject: (reason: unknown) => void; - - // Make sure the timeout is applied. When the processing snippet uses setTimeout or setInterval, the timeout option - // from VM is broken. See: https://github.com/nodejs/node/issues/3020. - // - // We need to manually clear all timers and reject the processing manually. - const timeoutTimer = setTimeout(() => { - vmReject(new Error('Timeout exceeded')); - }, timeout); - - return new Promise((evaluateResolve, evaluateReject) => { - const timers = createTimers(); - const vmResolve = (value: unknown) => { - timers.clearAll(); - clearTimeout(timeoutTimer); - evaluateResolve(value); - }; - vmReject = (reason: unknown) => { - timers.clearAll(); - clearTimeout(timeoutTimer); - evaluateReject(reason); - }; - - const vmContext = { - input, - endpointParameters, - resolve: vmResolve, - reject: vmReject, - setTimeout: timers.customSetTimeout, - setInterval: timers.customSetInterval, - clearTimeout: timers.customClearTimeout, - clearInterval: timers.customClearInterval, - ...builtInNodeModules, - }; - vm.runInNewContext(code, vmContext, { displayErrors: true, timeout }); - }); -}; diff --git a/packages/airnode-node/src/api/vm-timers.ts b/packages/airnode-node/src/api/vm-timers.ts deleted file mode 100644 index fb271234c5..0000000000 --- a/packages/airnode-node/src/api/vm-timers.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Timers (setTimeout, setInterval) do not work in Node.js vm, see: https://github.com/nodejs/help/issues/1875 - * - * The API is wrapped in a "create" function so that every processing snippet keeps track of its timers and properly - * cleans them up after use. - */ -export const createTimers = () => { - let timeouts: NodeJS.Timeout[] = []; - - const customSetTimeout = (fn: () => void, ms: number) => { - timeouts.push(setTimeout(fn, ms)); - }; - - const customClearTimeout = (id: NodeJS.Timeout) => { - timeouts = timeouts.filter((timeoutId) => timeoutId !== id); - clearTimeout(id); - }; - - const clearAllTimeouts = () => { - timeouts.forEach(clearTimeout); - timeouts = []; - }; - - let intervals: NodeJS.Timeout[] = []; - - const customSetInterval = (fn: () => void, ms: number) => { - intervals.push(setInterval(fn, ms)); - }; - - const customClearInterval = (id: NodeJS.Timeout) => { - intervals = intervals.filter((intervalId) => intervalId !== id); - clearInterval(id); - }; - - const clearAllIntervals = () => { - intervals.forEach(clearInterval); - intervals = []; - }; - - const clearAll = () => { - clearAllTimeouts(); - clearAllIntervals(); - }; - - return { - customSetTimeout, - customClearTimeout, - clearAllTimeouts, - customSetInterval, - customClearInterval, - clearAllIntervals, - clearAll, - }; -}; diff --git a/yarn.lock b/yarn.lock index ec9c3635cd..9b96bd503e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,7 +29,34 @@ dependencies: zod "^3.22.2" -"@api3/ois@2.2.1": +"@api3/commons@^0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@api3/commons/-/commons-0.3.0.tgz#846dace14f8c1abed5df1a3e5415e8b3a28cfa21" + integrity sha512-27+UkW0qCWvQCJuO8vbyBhJ94IXELKhqCKjFxC5ZUQrJHRHWT4zz2wmdbsvgUHBZhuAuFPaz/78yjMCjzJ6S8Q== + dependencies: + "@api3/ois" "^2.2.1" + "@api3/promise-utils" "^0.4.0" + "@typescript-eslint/eslint-plugin" "^6.2.1" + "@typescript-eslint/parser" "^6.2.1" + eslint-config-next "^13.1.6" + eslint-plugin-check-file "^2.6.2" + eslint-plugin-cypress "^2.14.0" + eslint-plugin-deprecation "^2.0.0" + eslint-plugin-functional "^6.0.0" + eslint-plugin-import "^2.28.1" + eslint-plugin-jest "^27.4.2" + eslint-plugin-jest-formatting "^3.1.0" + eslint-plugin-lodash "^7.4.0" + eslint-plugin-no-only-tests "^3.1.0" + eslint-plugin-promise "^6.1.1" + eslint-plugin-react "^7.32.1" + eslint-plugin-react-hooks "^4.6.0" + eslint-plugin-unicorn "^48.0.1" + lodash "^4.17.21" + winston "^3.10.0" + winston-console-format "^1.0.8" + +"@api3/ois@2.2.1", "@api3/ois@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@api3/ois/-/ois-2.2.1.tgz#caa5c672c51b5572cf9bb30226a0647b3a51a57d" integrity sha512-C4tSMBccDlD8NkZMVATQXOKctI46fSOlzpbZmZoFknsIdYfQvGNU49StGRJZ6fJJkwXEX1TlkRC7rY2yHEJjqw== @@ -930,6 +957,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.20.7": + version "7.23.2" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" @@ -1227,6 +1261,11 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -1234,6 +1273,15 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -1349,7 +1397,7 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz#1205014625790c7ff0e471644a878a65d1e34ab0" integrity sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw== -"@eslint-community/eslint-utils@^4.2.0": +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== @@ -1361,6 +1409,11 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== +"@eslint-community/regexpp@^4.5.1": + version "4.9.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" + integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== + "@eslint/eslintrc@^2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" @@ -2452,6 +2505,13 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" +"@next/eslint-plugin-next@13.5.5": + version "13.5.5" + resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.5.tgz#b3418135efbfa04d64c2c54f93d09c5ea4de4610" + integrity sha512-S/32s4S+SCOpW58lHKdmILAAPRdnsSei7Y3L1oZSoe5Eh0QSlzbG1nYyIpnpwWgz3T7qe3imdq7cJ6Hf29epRA== + dependencies: + glob "7.1.7" + "@noble/curves@1.1.0", "@noble/curves@~1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" @@ -3184,6 +3244,11 @@ path-browserify "^1.0.0" url "^0.11.0" +"@rushstack/eslint-patch@^1.3.3": + version "1.5.1" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz#5f1b518ec5fa54437c0b7c4a821546c64fed6922" + integrity sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA== + "@scure/base@~1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" @@ -4286,6 +4351,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== +"@types/json-schema@^7.0.12": + version "7.0.13" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" + integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -4496,6 +4566,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/triple-beam@^1.3.2": + version "1.3.3" + resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.3.tgz#726ae98a5f6418c8f24f9b0f2a9f81a8664876ae" + integrity sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g== + "@types/ws@*": version "8.5.5" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" @@ -4538,6 +4613,34 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/eslint-plugin@^6.2.1": + version "6.8.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz#06abe4265e7c82f20ade2dcc0e3403c32d4f148b" + integrity sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.8.0" + "@typescript-eslint/type-utils" "6.8.0" + "@typescript-eslint/utils" "6.8.0" + "@typescript-eslint/visitor-keys" "6.8.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^5.4.2 || ^6.0.0", "@typescript-eslint/parser@^6.2.1": + version "6.8.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz#bb2a969d583db242f1ee64467542f8b05c2e28cb" + integrity sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg== + dependencies: + "@typescript-eslint/scope-manager" "6.8.0" + "@typescript-eslint/types" "6.8.0" + "@typescript-eslint/typescript-estree" "6.8.0" + "@typescript-eslint/visitor-keys" "6.8.0" + debug "^4.3.4" + "@typescript-eslint/parser@^5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" @@ -4556,6 +4659,14 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" +"@typescript-eslint/scope-manager@6.8.0": + version "6.8.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz#5cac7977385cde068ab30686889dd59879811efd" + integrity sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g== + dependencies: + "@typescript-eslint/types" "6.8.0" + "@typescript-eslint/visitor-keys" "6.8.0" + "@typescript-eslint/type-utils@5.62.0", "@typescript-eslint/type-utils@^5.50.0", "@typescript-eslint/type-utils@^5.55.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" @@ -4566,11 +4677,26 @@ debug "^4.3.4" tsutils "^3.21.0" +"@typescript-eslint/type-utils@6.8.0", "@typescript-eslint/type-utils@^6.0.0": + version "6.8.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz#50365e44918ca0fd159844b5d6ea96789731e11f" + integrity sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g== + dependencies: + "@typescript-eslint/typescript-estree" "6.8.0" + "@typescript-eslint/utils" "6.8.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" + "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== +"@typescript-eslint/types@6.8.0": + version "6.8.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz#1ab5d4fe1d613e3f65f6684026ade6b94f7e3ded" + integrity sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ== + "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" @@ -4584,6 +4710,19 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@6.8.0": + version "6.8.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz#9565f15e0cd12f55cf5aa0dfb130a6cb0d436ba1" + integrity sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg== + dependencies: + "@typescript-eslint/types" "6.8.0" + "@typescript-eslint/visitor-keys" "6.8.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + "@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.50.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" @@ -4598,6 +4737,19 @@ eslint-scope "^5.1.1" semver "^7.3.7" +"@typescript-eslint/utils@6.8.0", "@typescript-eslint/utils@^6.0.0", "@typescript-eslint/utils@^6.2.0": + version "6.8.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz#d42939c2074c6b59844d0982ce26a51d136c4029" + integrity sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.8.0" + "@typescript-eslint/types" "6.8.0" + "@typescript-eslint/typescript-estree" "6.8.0" + semver "^7.5.4" + "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" @@ -4606,6 +4758,14 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@6.8.0": + version "6.8.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz#cffebed56ae99c45eba901c378a6447b06be58b8" + integrity sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg== + dependencies: + "@typescript-eslint/types" "6.8.0" + eslint-visitor-keys "^3.4.1" + "@vercel/ncc@^0.38.0": version "0.38.0" resolved "https://registry.yarnpkg.com/@vercel/ncc/-/ncc-0.38.0.tgz#5210def0dcf0c79640bfaf16eecce54beed58fa6" @@ -5094,6 +5254,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +aria-query@^5.1.3: + version "5.3.0" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + array-back@^3.0.1, array-back@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" @@ -5195,6 +5362,17 @@ array.prototype.reduce@^1.0.5: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +array.prototype.tosorted@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + arraybuffer.prototype.slice@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" @@ -5207,6 +5385,19 @@ arraybuffer.prototype.slice@^1.0.1: is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -5244,6 +5435,11 @@ ast-parents@^0.0.1: resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + ast-types@^0.13.4: version "0.13.4" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" @@ -5295,6 +5491,13 @@ async@^3.2.0, async@^3.2.3, async@~3.2.0: resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -5345,6 +5548,11 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== +axe-core@^4.6.2: + version "4.8.2" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae" + integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== + axios@^0.21.0, axios@^0.21.1: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -5386,6 +5594,13 @@ axios@^1.5.1: form-data "^4.0.0" proxy-from-env "^1.1.0" +axobject-query@^3.1.1: + version "3.2.1" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" @@ -5760,6 +5975,11 @@ bufferutil@4.0.5: dependencies: node-gyp-build "^4.3.0" +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -5989,6 +6209,11 @@ ci-info@^3.1.0, ci-info@^3.2.0, ci-info@^3.6.1: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== +ci-info@^3.8.0: + version "3.9.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -6013,6 +6238,13 @@ classic-level@^1.2.0: napi-macros "^2.2.2" node-gyp-build "^4.3.0" +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw== + dependencies: + escape-string-regexp "^1.0.5" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -6143,7 +6375,7 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -6162,26 +6394,50 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== +color@^3.1.3: + version "3.2.1" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + colorette@^2.0.14: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -colors@1.4.0, colors@^1.1.2: +colors@1.4.0, colors@^1.1.2, colors@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + columnify@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" @@ -6581,6 +6837,11 @@ culvert@^0.1.2: resolved "https://registry.yarnpkg.com/culvert/-/culvert-0.1.2.tgz#9502f5f0154a2d5a22a023e79f71cc936fa6ef6f" integrity sha512-yi1x3EAWKjQTreYWeSd98431AV+IEE0qoDyOoaHJ7KJ21gv6HtBXHVLX74opVSGqcR8/AbjJBHAHpcOy2bj5Gg== +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" @@ -6708,7 +6969,7 @@ deep-is@^0.1.3, 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== -deepmerge-ts@^5.0.0: +deepmerge-ts@^5.0.0, deepmerge-ts@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz#c55206cc4c7be2ded89b9c816cf3608884525d7a" integrity sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw== @@ -6733,6 +6994,15 @@ deferred-leveldown@~5.3.0: abstract-leveldown "~6.2.1" inherits "^2.0.3" +define-data-property@^1.0.1: + version "1.1.1" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -6746,6 +7016,15 @@ define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, de has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/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" @@ -6775,6 +7054,11 @@ deprecation@^2.0.0: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -7000,6 +7284,11 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + encode-utf8@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" @@ -7034,7 +7323,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enhanced-resolve@^5.15.0: +enhanced-resolve@^5.12.0, enhanced-resolve@^5.15.0: version "5.15.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== @@ -7141,11 +7430,76 @@ es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: unbox-primitive "^1.0.2" which-typed-array "^1.1.10" +es-abstract@^1.22.1: + version "1.22.2" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" + integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.1" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.11" + es-array-method-boxes-properly@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-iterator-helpers@^1.0.12: + version "1.0.15" + resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.1" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" + es-module-lexer@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" @@ -7262,7 +7616,22 @@ escodegen@^2.1.0: optionalDependencies: source-map "~0.6.1" -eslint-import-resolver-node@^0.3.7: +eslint-config-next@^13.1.6: + version "13.5.5" + resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.5.5.tgz#50ec30b62458f0cae4127308ed354d02211a3c32" + integrity sha512-kQr/eevFyzeVt0yCKTchQp3MTIx8ZmBsAKLW+7bzmAXHcf2vvxIqAt2N/afb9SZpuXXhSb/8yrKQGVUVpYmafQ== + dependencies: + "@next/eslint-plugin-next" "13.5.5" + "@rushstack/eslint-patch" "^1.3.3" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.28.1" + eslint-plugin-jsx-a11y "^6.7.1" + eslint-plugin-react "^7.33.2" + eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: 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== @@ -7271,13 +7640,50 @@ eslint-import-resolver-node@^0.3.7: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.8.0: +eslint-import-resolver-typescript@^3.5.2: + version "3.6.1" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" +eslint-plugin-check-file@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/eslint-plugin-check-file/-/eslint-plugin-check-file-2.6.2.tgz#2e60d567ce7d087727d19c7e7b5b9def1e5b693e" + integrity sha512-z3Rur4JjOdNH0fia1IH7JQseo9NLuFVtw9j8P6z2c5XmXWemH7/qGpmMB8XbOt9bJBNpmPlNAGJty9b3EervPw== + dependencies: + is-glob "^4.0.3" + micromatch "^4.0.5" + +eslint-plugin-cypress@^2.14.0: + version "2.15.1" + resolved "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.15.1.tgz#336afa7e8e27451afaf65aa359c9509e0a4f3a7b" + integrity sha512-eLHLWP5Q+I4j2AWepYq0PgFEei9/s5LvjuSqWrxurkg1YZ8ltxdvMNmdSf0drnsNo57CTgYY/NIHHLRSWejR7w== + dependencies: + globals "^13.20.0" + +eslint-plugin-deprecation@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/eslint-plugin-deprecation/-/eslint-plugin-deprecation-2.0.0.tgz#9804707a4c19f3a53615c6babc0ced3d429d69cf" + integrity sha512-OAm9Ohzbj11/ZFyICyR5N6LbOIvQMp7ZU2zI7Ej0jIc8kiGUERXPNMfw2QqqHD1ZHtjMub3yPZILovYEYucgoQ== + dependencies: + "@typescript-eslint/utils" "^6.0.0" + tslib "^2.3.1" + tsutils "^3.21.0" + eslint-plugin-functional@^5.0.8: version "5.0.8" resolved "https://registry.yarnpkg.com/eslint-plugin-functional/-/eslint-plugin-functional-5.0.8.tgz#3b49718b2a717f196a3d077f970b6b698ccbe925" @@ -7290,6 +7696,18 @@ eslint-plugin-functional@^5.0.8: is-immutable-type "^1.2.5" semver "^7.3.8" +eslint-plugin-functional@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/eslint-plugin-functional/-/eslint-plugin-functional-6.0.0.tgz#37c32dd78443f156bb0b45febaa5d19f596cd7e7" + integrity sha512-jOUHUMA9cN2CIpgPj93fW1vTI3c95ZYUHMPJxEJL4KAtFkJDcT/9/YlfyrLOBxHkAcwBhJ29HSmeC/CUnN0k3g== + dependencies: + "@typescript-eslint/utils" "^6.2.0" + deepmerge-ts "^5.1.0" + escape-string-regexp "^4.0.0" + is-immutable-type "^2.0.1" + semver "^7.5.4" + ts-api-utils "^1.0.1" + eslint-plugin-import@^2.28.1: version "2.28.1" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" @@ -7313,6 +7731,11 @@ eslint-plugin-import@^2.28.1: semver "^6.3.1" tsconfig-paths "^3.14.2" +eslint-plugin-jest-formatting@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/eslint-plugin-jest-formatting/-/eslint-plugin-jest-formatting-3.1.0.tgz#b26dd5a40f432b642dcc880021a771bb1c93dcd2" + integrity sha512-XyysraZ1JSgGbLSDxjj5HzKKh0glgWf+7CkqxbTqb7zEhW7X2WHo5SBQ8cGhnszKN+2Lj3/oevBlHNbHezoc/A== + eslint-plugin-jest@^27.4.2: version "27.4.2" resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.4.2.tgz#181d999ac67a9b6040db1d27935887cf5a2882ed" @@ -7320,6 +7743,93 @@ eslint-plugin-jest@^27.4.2: dependencies: "@typescript-eslint/utils" "^5.10.0" +eslint-plugin-jsx-a11y@^6.7.1: + version "6.7.1" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + +eslint-plugin-lodash@^7.4.0: + version "7.4.0" + resolved "https://registry.npmjs.org/eslint-plugin-lodash/-/eslint-plugin-lodash-7.4.0.tgz#14a761547f126c92ff56789662a20a44f8bb6290" + integrity sha512-Tl83UwVXqe1OVeBRKUeWcfg6/pCW1GTRObbdnbEJgYwjxp5Q92MEWQaH9+dmzbRt6kvYU1Mp893E79nJiCSM8A== + dependencies: + lodash "^4.17.21" + +eslint-plugin-no-only-tests@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz#f38e4935c6c6c4842bf158b64aaa20c366fe171b" + integrity sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw== + +eslint-plugin-promise@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" + integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== + +"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705", eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.32.1, eslint-plugin-react@^7.33.2: + version "7.33.2" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.1" + string.prototype.matchall "^4.0.8" + +eslint-plugin-unicorn@^48.0.1: + version "48.0.1" + resolved "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-48.0.1.tgz#a6573bc1687ae8db7121fdd8f92394b6549a6959" + integrity sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + "@eslint-community/eslint-utils" "^4.4.0" + ci-info "^3.8.0" + clean-regexp "^1.0.0" + esquery "^1.5.0" + indent-string "^4.0.0" + is-builtin-module "^3.2.1" + jsesc "^3.0.2" + lodash "^4.17.21" + pluralize "^8.0.0" + read-pkg-up "^7.0.1" + regexp-tree "^0.1.27" + regjsparser "^0.10.0" + semver "^7.5.4" + strip-indent "^3.0.0" + eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -7403,7 +7913,7 @@ esprima@^4.0.0, esprima@^4.0.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2: +esquery@^1.4.2, esquery@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== @@ -7427,7 +7937,7 @@ estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== @@ -7896,6 +8406,11 @@ fclone@1.0.11, fclone@~1.0.11: resolved "https://registry.yarnpkg.com/fclone/-/fclone-1.0.11.tgz#10e85da38bfea7fc599341c296ee1d77266ee640" integrity sha512-GDqVQezKzRABdeqflsgMr7ktzgF9CyS+p2oe0jJqUY6izSSbhPIQJDpoU4PtGcD7VPM9xh/dVrTu6z1nwgmEGw== +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + figures@3.2.0, figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -8014,6 +8529,11 @@ fmix@^0.1.0: dependencies: imul "^1.0.0" +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.14.4, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" @@ -8196,6 +8716,16 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/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" + functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" @@ -8323,6 +8853,13 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +get-tsconfig@^4.5.0: + version "4.7.2" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce" + integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== + dependencies: + resolve-pkg-maps "^1.0.0" + get-tsconfig@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.0.tgz#06ce112a1463e93196aa90320c35df5039147e34" @@ -8573,6 +9110,13 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" +globals@^13.20.0: + version "13.23.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + dependencies: + type-fest "^0.20.2" + globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" @@ -9217,6 +9761,18 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -9244,6 +9800,13 @@ is-buffer@^2.0.5, is-buffer@~2.0.3: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -9256,14 +9819,14 @@ is-ci@3.0.1, is-ci@^3.0.1: dependencies: ci-info "^3.2.0" -is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1: +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.8.1: version "2.13.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -9280,6 +9843,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -9295,7 +9865,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.7: +is-generator-function@^1.0.10, 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== @@ -9321,6 +9891,14 @@ is-immutable-type@^1.2.5: dependencies: "@typescript-eslint/type-utils" "^5.55.0" +is-immutable-type@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-immutable-type/-/is-immutable-type-2.0.1.tgz#5a968a045689d5094d553802d2282a83cfa2ba13" + integrity sha512-SNO0yWLzSN+oYb8adM4AvsPYSCqElmjcXUNemryDLo0r5M54oMs/6R4cvKLc9QtIs/nRuc3ahlgJoMdGfcHLwQ== + dependencies: + "@typescript-eslint/type-utils" "^6.0.0" + ts-api-utils "^1.0.1" + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" @@ -9331,6 +9909,11 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-map@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -9388,6 +9971,11 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-set@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -9440,7 +10028,7 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-array@^1.1.9: version "1.1.12" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== @@ -9462,6 +10050,11 @@ is-url@^1.2.4: resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -9469,6 +10062,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-windows@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -9569,6 +10170,17 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + jackspeak@^2.0.3: version "2.2.3" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.3.tgz#ac63c57c18d254dc78a1f4ecd1cdeb4daeb6e616" @@ -10098,7 +10710,7 @@ js-sha3@0.8.0, js-sha3@^0.8.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -10136,6 +10748,16 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + json-bigint@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" @@ -10243,6 +10865,16 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.5" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + just-extend@^4.0.2: version "4.2.1" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" @@ -10313,6 +10945,23 @@ kleur@^4.1.5: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + lazy@~1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/lazy/-/lazy-1.0.11.tgz#daa068206282542c088288e975c297c1ae77b690" @@ -10716,6 +11365,25 @@ log-symbols@4.1.0, log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +logform@^2.2.0, logform@^2.3.2, logform@^2.4.0: + version "2.6.0" + resolved "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" + integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + loupe@^2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" @@ -10949,7 +11617,7 @@ micro-ftch@^0.3.1: resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== -micromatch@^4.0.2, micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -11739,7 +12407,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.1.0: +object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -11774,6 +12442,15 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" +object.entries@^1.1.6: + version "1.1.7" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + object.fromentries@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" @@ -11804,6 +12481,14 @@ object.groupby@^1.0.0: es-abstract "^1.21.2" get-intrinsic "^1.2.1" +object.hasown@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + object.values@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" @@ -11844,6 +12529,13 @@ once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -12478,6 +13170,15 @@ promzard@^1.0.0: dependencies: read "^2.0.0" +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + protocols@^2.0.0, protocols@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" @@ -12609,6 +13310,11 @@ raw-body@2.5.2, raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + react-is@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" @@ -12777,11 +13483,28 @@ reduce-flatten@^2.0.0: resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerator-runtime@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== +regexp-tree@^0.1.27: + version "0.1.27" + resolved "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== + regexp.prototype.flags@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" @@ -12791,6 +13514,22 @@ regexp.prototype.flags@^1.5.0: define-properties "^1.2.0" functions-have-names "^1.2.3" +regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + +regjsparser@^0.10.0: + version "0.10.0" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz#b1ed26051736b436f22fdec1c8f72635f9f44892" + integrity sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA== + dependencies: + jsesc "~0.5.0" + reinterval@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/reinterval/-/reinterval-1.1.0.tgz#3361ecfa3ca6c18283380dd0bb9546f390f5ece7" @@ -12934,6 +13673,15 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.4: + version "2.0.0-next.5" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -13066,6 +13814,16 @@ safe-array-concat@^1.0.0: has-symbols "^1.0.3" isarray "^2.0.5" +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -13085,6 +13843,11 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -13230,6 +13993,15 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + setimmediate@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" @@ -13336,6 +14108,13 @@ sigstore@^1.3.0, sigstore@^1.4.0: "@sigstore/tuf" "^1.0.3" make-fetch-happen "^11.0.1" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + sinon@^14.0.2: version "14.0.2" resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.2.tgz#585a81a3c7b22cf950762ac4e7c28eb8b151c46f" @@ -13621,6 +14400,11 @@ ssri@^9.0.1: dependencies: minipass "^3.1.1" +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -13717,6 +14501,21 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string.prototype.matchall@^4.0.8: + version "4.0.10" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" + side-channel "^1.0.4" + string.prototype.trim@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" @@ -13726,6 +14525,15 @@ string.prototype.trim@^1.2.7: define-properties "^1.1.4" es-abstract "^1.20.4" +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + string.prototype.trimend@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" @@ -13735,6 +14543,15 @@ string.prototype.trimend@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + string.prototype.trimstart@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" @@ -13744,6 +14561,15 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -14027,6 +14853,11 @@ text-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -14116,6 +14947,16 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + ts-command-line-args@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" @@ -14755,6 +15596,34 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" @@ -14768,7 +15637,7 @@ which-pm@2.0.0: load-yaml-file "^0.2.0" path-exists "^4.0.0" -which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.2: +which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.2, which-typed-array@^1.1.9: version "1.1.11" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== @@ -14819,6 +15688,41 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== +winston-console-format@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/winston-console-format/-/winston-console-format-1.0.8.tgz#591adc8e9567c3397a3fa2e29e596d56e48db840" + integrity sha512-dq7t/E0D0QRi4XIOwu6HM1+5e//WPqylH88GVjKEhQVrzGFg34MCz+G7pMJcXFBen9C0kBsu5GYgbYsE2LDwKw== + dependencies: + colors "^1.4.0" + logform "^2.2.0" + triple-beam "^1.3.0" + +winston-transport@^4.5.0: + version "4.6.0" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz#f1c1a665ad1b366df72199e27892721832a19e1b" + integrity sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg== + dependencies: + logform "^2.3.2" + readable-stream "^3.6.0" + triple-beam "^1.3.0" + +winston@^3.10.0: + version "3.11.0" + resolved "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz#2d50b0a695a2758bb1c95279f0a88e858163ed91" + integrity sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.5.0" + word-wrap@~1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"